通过Gradle为APK瘦身

  

引言:在过去几年中,APK文件的大小曾急剧增长态势。一般来说,其原因如下:Android开发者获取了更多的依赖库,添加了更多的密度,应用增加了更多的功能,但实际上我们应该让APK尽可能的小,更小的APK意味着用户可以更快地下载和安装应用,并使它占用更小的内存只
本文选自《Gradle Android中文版》,将研究如何设置Gradle构建配置文件中的几个属性,以缩小APK文件。

混淆器

混淆器是一个Java工具,其不仅可以缩减APK文件大小,还可以在编译期优化,混淆和预校验你的代码。其通过你应用的所有代码路径,来找到未被使用的代码,并将其删除只
混淆器还会重命名你的类和字段。这一过程将保留应用的踪迹,让反编译工程师更加难以读懂代码只
在Gradle Android的插件中,其构建类型下面有一个叫作minifyEnabled的布尔类型属性,你需要将它设置为真正来激活混淆器:

android  {   ,buildTypes  {   ,,,,,,,release  {   ,,,,,,,,,,,,minifyEnabled 真实的   ,,,,,,,,,,,,proguardFiles  getDefaultProguardFile   ,,,,,,,,,,,,(“proguard-android.txt”),“proguard-rules.pro”   ,,,,,,,,,,,,}   ,,,,,,,}   以前,,}

当minifyEnabled被设置为真正的后,在构建过程中,proguardRelease任务会被执行,并调用混淆器只
在激活混淆器之后,应重新测试整个应用,因为混淆器可能会移除一些你仍需要使用的代码。这也是很多开发者不喜欢混淆器的原因。为了解决这个问题,你可以定义混淆器规则,排除那些被删除或混淆的类。我们可以使用proguardFiles属性来定义包含混淆器规则的文件,例如,为了保留一个类,你可以像下面这样添加一条简单的规则:

-keep  public  class  & lt; MyClass>

getDefaultProguardFile (proguard-android.txt)方法从Android SDK的工具/ProGuard文件夹下的proguard-android。txt文件中获取默认的混淆器设置只
在Android工作室中,proguard-rules。箴文件被默认添加到新的Android模块,所以你可以在该文件中简单地添加一些针对该模块的规则。

提示:你构建的每个应用或依赖库都有不同的混淆器规则,所以在本书中,我们不会考虑更多的细节。如果你想了解更多关于混淆器和混淆器规则的信息,则可以通过http://developer.android.com/tools/help/proguard.html。来查阅AndroidProGuard的官方文档。除了缩减Java代码外,还可以缩减使用过的资源。

缩减资源

当给程序打包时,它和它的Android的插件可以在构建期间删除所有未使用的资源。如果你有旧的资源忘记删除,那么这个功能可能非常有用。另外一个使用案例是当你导入一个拥有很多资源的依赖库,而你只使用了其中的一小部分时,你可以通过激活缩减资源来解决这个问题。缩减资源的方式有两种:自动和手动。

自动缩减

最简单的方式是在你的构建中设置shrinkResources属性。如果设置该属性为真,则Android构建工具将自动判定哪些资源没有被使用,并将它们排除在APK外。使用此功能有一个要求,即必须同时启动混淆器。这是因为缩减资源的工作方式是,直到代码引用这些资源被删除之前,Android构建工具不能指出哪些资源没有被用到只
下面的代码片段展示了在某个构建类型中,如何配置自动化资源缩减:

android  {   ,,,,,,buildTypes  {   ,,,,,,release  {   ,,,,,,,,,,,,minifyEnabled =,真的   ,,,,,,,,,,,,shrinkResources =,真的   ,,,,,,,,,,,,}   ,,,,,,}   }

如果你想看看在激活了自动化资源缩减之后,APK缩减了多少,则可以运行shrink-ReleaseResources任务。该任务会打印出包的大小缩小了多少:

:应用:shrinkReleaseResourcesRemoved  unused 资源:,Binary  resource  data  reduced 得到433 kb
  用354 kb: Removed  18% 

你可以通过在构建命令中添加信息标志,来获得的APK缩减资源的概览:

,美元gradlew  clean  assembleRelease  -nfo

当你使用该标志时,它会打印出许多关于构建过程的额外信息,包括最终构建不会输出的每个资源只
自动资源缩减有一个问题,即它可能移除了过多的资源,特别是那些被动态使用的资源可能被意外删除。为了防止这种情况的发生,你可以在res/生/下的一个叫作keep.xml的文件中定义这些例外。一个简单的。xml文件如下所示:

& lt; ? xml  version=" 1.0 ",编码=" utf - 8 " ?祝辞& lt; resources  xmlns:工具=" http://schemas.android.com/tools "工具:保持=癅layout/keep_me @layout/also_used_ *”/祝辞

通过Gradle为APK瘦身