Android 可能你想要的 APK 瘦身笔记,android2018 面试题
public static final class dimen {...}....}
这都是些常量,那我们有没有办法删除这个文件呢,引用的地方直接使用常量的值?事实是可以的. 根据 APK 打包的编译过程,在编译过程中使用 Android 的 Transform 替换所有的类里面的常量. BuildConfig, R
layout, R$string,AppConstans, etc
目前滴滴开源了一个 booster 可以直接使用,不用在自己造轮子
效果
组件化后或者依赖第三方 R 文件越来越多,常量比较多时,效果比较显著 据抖音的一哥们说,他们项目针对此项目优化后,包体积减少 2M 左右.
在我们项目上使用,不是很明显,优化体积 1M 左右.
注意事项
因为是删除常量,所有使用反射的地方也需要 keep 住,如果使用滴滴的 booster
,可以参考 issues
Res 资源
Android Lint 去除无用资源
当我们项目迭代不断迭代,总有些资源逐渐不在使用,成为了冗余,当很多时候又懒得删,或者怕删了出问题. Android Studio 自带 lint 工具可以帮助我们清楚这些无用资源.(这里的清楚和 shrinkResources 去除无用是不一样的)
使用方法入口
除了 Android Studio Analyze 下的 Android Lint(Inspect Code) 用来去除无用资源,包体积优化,对于我们的代码一些自动优化也有很明显的效果. (性能,安全,bug 预防等)
Android > Lint > Correctness (可能影响程序正确性)
Android > Lint > Performance (可能影响程序性能)
Android > Lint > Security (可能影响程序安全性)
Lint 详细使用说明:google.cn/studio/lint
还有 Code Cleanup 也很强大,可以减少一些人为代码 review 不规范的地方.
图片
针对图片的优化,主要有一下几点
.9 图片
使用.9 图片来代替一些可重复区域的大图,可以借助 Android Studio 或者 sdk 下的.9 工具来制作.9 图片
xh-dpi
国内应用除了应用的 icon,大部分应用只设置了一套资源 xh-dpi,所以推荐使用一套图片资源
Android 原生对于 WebP 的支持
我们知道 Webp 的压缩比例要比 png,jpg/jpeg 的压缩比高,使用 webp 能减少一些包体积.
Android 4.0 开始(sdk >= 14 ),原生的 ImageView 开始支持 Webp,但是未支持透明通道
Android 4.2 开始 (sdk >= 18)开始前面支持 Webp
也就是说你项目的 minSdk 是 4.2 以上 >= 18 那么恭喜你,你可以把所有图片转成 webp 格式,方法直接图片右键就可以转换.
如果只是在 4.0 与 4.2 之间的那么,你就只能转一些不带透明通道的图片,如果其他你还想要 Webp 接入一个库,那增大包体积,和原生 ImageView 不支持,带来的成本挺大.
图片压缩
图片压缩也是只要的一个环节. 图片压缩的工具很多,png,webp 都可以很容易的压缩,对于应用质量体积有较高要求的,建议使用有损压缩,对图片视觉上的效果影响不大.
这里还是推荐 使用 booster 的压缩工具,可以 png 和 webp 压缩,针对 webp 的压缩针对了不同 minSdk 版本,进行了不同压缩策略. booster-task-compression
resources.ars 优化
我们知道 res 里面的资源文件名引用一般是这样的,例如将 res/drawable/welcome.png 那么打包的时候,是不是可以改成这样 r/s/a.png. 事实是可以的,类似 java 的混淆规则去混淆资源,这样,所占用的字节数就会降低. 但是存在一个问题就是,这些资源资源 ID 已经被编译成 32 位 int 值,放入了 resources.arsc.那么混淆的同时就要修改 resources.arsc. 张绍文 tinker 作者,前微信的技术大年,开源了 AndResGuard,可以解决这样的方案,并且优化还可以.具体使用详解 AndResGuard
build.gradle 配置
com.android.tools.build:gradle 是 Android 打包的工具,在打包时也可以对生成的 APK 包,体积优化,这里列举了一些常见的优化策略.
buildTypes {release {buildConfigField 'String', 'TINKER_APP_ID', '"d499a164a6"'debuggable false //debug falseshrinkResources true //移除无用资源 zipAlignEnabled true //开启压缩 resConfigs "zh" //表示只使用中文 resConfigs "xhdpi" // 表示只是用 xhdpi 目录下的资源文件 minifyEnabled true //开启混淆 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'signingConfig signingConfigs.release
ndk {//选择要添加的对应 cpu 类型的.so 库。abiFilters 'armeabi-v7a'}}}
以上是一些常用的配置,其中需要注意的是
开启混淆,必须主要项目中的 keep 规则是否考虑全面
resConfigs 需要和产品设计协商后,在开启
ndk 中,目前国内大部分应用都只支持了 armabi-v7a(支持浮点类型,精度更高),我所在的应用也只使用了 aremabi-v7a 架构,这种架构几乎所有的 arm 手机都支持.文末==APP 瘦身就介绍完了,上述方案都在项目中实践过的.如果文中存在错误,请各路大神指教.推荐阅读
评论