为什么APK要瘦身。APK越大,在下载安装过程中,他们耗费的流量会越多,安装等待时间也会越长;对于产品本身,意味着下载转化率会越低(因为竞品中,用户有更多机会选择那个体验最好,功能最多,性能最好,包最小的),所以apk的瘦身优化也很重要,本篇博客将讲述apk瘦身的相关内容。
包体分析在AndroidStudio工具栏里,打开build–AnalyzeAPK,选择要分析的APK包。
可以看到占用空间的主要是代码、图片、资源和lib和assert文件,主要方向精简代码、压缩图片、去除无用的库、减少asserts里面文件。
使用一套资源对于绝大对数APP来说,只需要取一套设计图就足够了。鉴于现在分辨率的趋势,建议取p的资源,放到xhdpi目录。相对于多套资源,只使用P的一套资源,在视觉上差别不大,很多大公司的产品也是如此,但却能显著的减少资源占用大小,顺便也能减轻设计师的出图工作量了。
开启minifyEnabled混淆代码在gradle使用minifyEnabled进行Proguard混淆的配置,可大大减小APP大小:
android{buildTypes{release{minifyEnabledtrue}}}
在proguard中,是否保留符号表对APP的大小是有显著的影响的,可酌情不保留,但是建议尽量保留用于调试。参数说明:
-include{filename}从给定的文件中读取配置参数-basedirectory{directoryname}指定基础目录为以后相对的档案名称-injars{class_path}指定要处理的应用程序jar,war,ear和目录-outjars{class_path}指定处理完后要输出的jar,war,ear和目录的名称-libraryjars{classpath}指定要处理的应用程序jar,war,ear和目录所需要的程序库文件-dontskipnonpubliclibraryclasses指定不去忽略非公共的库类。-dontskipnonpubliclibraryclassmembers指定不去忽略包可见的库类的成员。
保留选项
-keep{Modifier}{class_specification}保护指定的类文件和类的成员-keepclassmembers{modifier}{class_specification}保护指定类的成员,如果此类受到保护他们会保护的更好-keepclasseswithmembers{class_specification}保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。-keepnames{class_specification}保护指定的类和类的成员的名称(如果他们不会压缩步骤中删除)-keepclassmembernames{class_specification}保护指定的类的成员的名称(如果他们不会压缩步骤中删除)-keepclasseswithmembernames{class_specification}保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后)-printseeds{filename}列出类和类的成员-keep选项的清单,标准输出到给定的文件
压缩
-dontshrink不压缩输入的类文件-printusage{filename}-whyareyoukeeping{class_specification}
优化
-dontoptimize不优化输入的类文件-assumenosideeffects{class_specification}优化时假设指定的方法,没有任何副作用-allowaccessmodification优化时允许访问并修改有修饰符的类和类的成员
混淆
-dontobfuscate不混淆输入的类文件-printmapping{filename}-applymapping{filename}重用映射增加混淆-obfuscationdictionary{filename}使用给定文件中的关键字作为要混淆方法的名称-overloadaggressively混淆时应用侵入式重载-useuniqueclassmembernames确定统一的混淆类的成员名称来增加混淆-flattenpackagehierarchy{package_name}重新包装所有重命名的包并放在给定的单一包中-repackageclass{package_name}重新包装所有重命名的类文件中放在给定的单一包中-dontusemixedcaseclassnames混淆时不会产生形形色色的类名-keepattributes{attribute_name,...}保护给定的可选属性,例如LineNumberTable,LocalVariableTable,SourceFile,Deprecated,Synthetic,Signature,andInnerClasses.-renamesourcefileattribute{string}设置源文件中给定的字符串常量开启shrinkResources去除无用资源
在gradle使用shrinkResources去除无用资源,效果非常好。
android{buildTypes{release{shrinkResourcestrue}}}清理无用资源
版本迭代过程中,不但有废弃代码冗余,肯定会有无用的图片存在。在build.gradle里面配置shrinkResourcestrue,在打包的时候会自动清除掉无用的资源,但经过实验发现打出的包并不会,而是会把部分无用资源用更小的东西代替掉。注意,这里的“无用”是指调用图片的所有父级函数最终是废弃代码,而shrinkResourcestrue只能去除没有任何父函数调用的情况,真正起效果只能通过AndroidStudio自带的“RemoveUnusedResources”小插件来实现了,直接上图。
更人性化是该查找结果可以“一键删除”。当然,可能图片是经过反射或字符拼接等方式获取,所以这个检测列表也不是全对,删除后很大概率编译失败或部分页面挂死、无图等问题,这个无解,工具还没智能到这个地步,你只能一遍又一遍“编译—解决部分问题—再编译再”,别问我为什么知道。
删除无用的语言资源大部分应用其实并不需要支持几十种语言的国际化支持。还好强大的gradle支持语言的配置,比如国内应用只支持中文:
android{defaultConfig{resConfigs"zh"}}使用tinypng有损压缩
TinyPNG工具只支持上传PNG图片到北京哪个治疗白癜风医院好2017治疗白癜风最好的医院