前言
AndroidStudio在编译APK的过程中做了很多优化,包括删除无用的代码,无用的资源等。本文具体介绍了具体的优化过程,在遇到编译问题时可以快速分析问题,解决问题。
编译优化
当使用Gradle编译APK的版本时,通常会将以下配置添加到buildTypes的版本标记中:
发布{
minifyEnabledtrue
shrinkResources true
proguard files GetDefaultproguardfile(' proguard-Android . txt '),' proguard-rules.pro '
}
其中,minifyEnabled和shrinkResources是优化的交换机。当两个开关都打开时,将在编译APK时执行以下优化过程:
以下重点介绍在上述过程中进行的优化。
收缩代码
功能 shrink code为删除没有用的类,方法,变量和属性的过程,该过程能很大程度缩减APK体积,如当使用一个aar中部分功能接口,没有使用的那部分将被删除,如下例所示:其中,库中未被调用的类文件将被删除。
收缩代码过程需要知道入口点,换句话说,收缩代码需要知道哪些类是入口类,然后根据这个入口类构建一个调用链来确定哪些类、方法、属性和变量是未使用的。
入口的确定 shrink code的入口是根据proguard文件中keep标签的 以及代码中@keep的注解确定的,Android中的四大组件是默认的入口,如下两种情况代码可能被误删除:JNI中的native方法,没法找到调用链会被误删反射调用类或者方法 其中第一种情况Android已经意识到,所以在默认的proguard文件中已经处理了,代码如下:-keepclasseswithmembernames类* {
本地<。方法>。;
}
但是没有办法识别反射,所以如果在代码中使用了反射,需要自己处理,避免被删除。
收缩资源
功能 shrink code流程执行完后删除了无用的代码后,就能确认哪些资源文件没有使用,shrink resource流程就是确定哪些资源没有使用并且删除。特点 shrink resource流程比较简单,所有在字节码中出现的资源不会被删除,但是有如下两种注意点:1.通过Resources.getIdentifier动态获取资源当收缩资源删除资源时,会对API调用进行模糊匹配,但匹配的不会被删除,例如:
Stringname = String.format("img_%1d", angle + 1string name = String . format(" img _ % 1d ",角度+ 1
RES = GetReSources . GetIdentifier(name," drawable ",GetPackageName);
所有img_开头的图片资源都会被认为有调用,不会被删除img_开头的所有图片资源将被视为已调用,不会被删除
2.通过工具主动标记:保留标签以防止删除。通过创建res/raw/keep.xml文件并在该文件中主动标记来防止删除,如下所示:
& lt?xml version="1.0 "编码="utf-8 "?>。
& ltresources xmlns:tools = " http://schemas . Android . com/tools "
工具:keep="@layout/l_used*_c,@layout/l_used_a,@ layout/l _ used _ b * "/& gt;
使模糊
模糊将类、方法、属性和变量重命名为简短且无意义的名称,从而减小包的大小并保护代码。在Gradle 3.4之后,AndroidStudio不再为了混淆而使用ProGuard,而是使用R8插件,但保留了ProGuard的配置选项。
这里注意将反射调用的类和方法keep住,不然即使没被删除也无法调用到了optimize要优化代码流程,优化会直接修改代码逻辑。如果if判断始终为真,则将删除if判断和假代码块。当一个类只有一个方法和一个调用时,该类将被删除,该方法将被链接。
优化过程可以进一步减小数据包大小
总结
充分了解Gradle编译过程中的优化过程,对于我们APK的优化有很大的启发意义,比如微信对外开放混淆资源名称的功能,减少安装包的大小,同时可以快速定位问题,解决发布包不一致的问题。
链接:https://juejin.im/post/5d36eacee51d454f73356e18
如有侵权,请联系我们,谢谢。
1.《shrink Android Gradle 编译过程中的优化》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《shrink Android Gradle 编译过程中的优化》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/tiyu/1073942.html