安卓开发中,打包生成的APK大小对于开发者来说,其实并没有多大影响,但在面向用户时,APK的大小就很重要了,APK过大会导致用户下载需要耗费更多时间与流量,从而影响用户体验与产品推广,特别是那种频繁更新的应用。因此,减少APK大小很重要,下面我将介绍如何给APK瘦身:
1.APK资源组成
在对APK进行“瘦身‘前,我们先来了解下APK的组成,我们可以把一个apk解压,目录结构一般如下所示:
资源 | 说明 |
assets | 安卓项目需要打包到APK里面的静态资源 |
kotlin | kotlin相关的文件 |
META_INF | 存放程序签名和证书 |
okhttp3 | 第三方库okhttp生成的文件 |
res | 项目的图片drawable等资源 |
AndroidManifest.xml | 配置文件 |
androidsupportmultidexversion.txt | multidex分包记录文件 |
classes.dex | dex可执行文件,Android应用在打包时通过Android SDK 中的 dx 工具将 Java 字节码转换为 Dalvik 字节码 |
resources.arsc | 资源映射文件,记录各个资源的对应关系 |
从上图我们其实可以看出,apk内比较占大小的有assets、res、.dex和resources.arsc文件,那么我们在优化APK大小的时候就可以从这几个文件或目录入手。
2.减少APK大小
(1)代码混淆
使用IDE 自带的 ProGuard 代码混淆工具 ,可以压缩、优化、混淆你的java/kotlin代码,可以有效减少编译后字节码文件的大小。混淆方法可以参考我的另一篇博客:安卓代码混淆
(2)图片优化
针对项目中用到的图片资源,尽可能缩减图片的大小,例如使用PNG优化工具或者在TinyPNG对图片进行压缩。
(3)资源优化
针对不需要使用的资源,尽量不要引入到项目中,也可以使用Android Lint检查冗余资源,然后删除
也可以在build.gradle开启shrinkResources,移除无用资源
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
(4)引入尽量少的第三方库
有些第三方库的SDK会很庞大,使用前先考虑清楚是否有必要引入,或者考虑是否可以只引入部分功能的SDK,例如百度地图SDK,我只需要定位功能,就别引入其他无关功能的lib。针对so库,一般不需要引入X86架构的库,尽量使用armeabi架构的so。
(5)使用动态更新技术
这里说的动态更新技术包含热修复技术,hybrid技术等等,把app的核心功能集中在一起,其他功能可以通过插件、H5的形式在app启动时加载,可以有效减少原始apk的大小,也方便后续更新。