Android App包瘦身优化

时间: 2023-07-18 admin 互联网

Android App包瘦身优化

Android App包瘦身优化

Android App包瘦身优化

APK瘦身是对程序体验的优化,更大的APK需要占用更多的存储空间。

APK的构成

APK瘦身前通过Analyze app分析出来的图片(打开方式:Android Studio下 ——> Build——> Analyze app):

可以看到APK由以下主要部分组成:

文件/目录描述
lib/存放so文件,可能会有armeabi、armeabi-v7a、arm64-v8a、x86、x86_64、mips,大多数情况下只需要支持armabi与x86的架构即可,如果非必需,可以考虑拿掉x86的部分
res/存放编译后的资源文件,例如:drawable、layout等等
assets/应用程序的资源,应用程序可以使用AssetManager来检索该资源
META-INF/APK中所有文件的签名摘要等信息
classes.dexclasses文件是Java Class,被DEX编译后可供Dalvik/ART虚拟机所理解的文件格式
resources.arsc编译后的二进制资源文件
AndroidManifest.xml清单文件

优化方案

动态库优化

在Android系统中,每一种CPU架构对应一种ABI,主要有:arm64-v8a(最新),armeabi,armeabi-v7a,x86,x86_64,mips,mips64。现在我们只需要配置armeabi-v7a即可:

android{defaultConfig{ndk{abiFilters "armeabi-v7a"}}
}

国际化资源优化

android{defaultConfig{// 只适配需要的区域resConfigs 'zh'}
}

代码压缩/代码混淆

在主module的build.gradle里配置minifyEnabled 为true,即压缩了代码,也混淆了代码:

buildTypes{release{// 1、是否进行混淆minifyEnabled true// 2、开启zipAlign可以让安装包中的资源按4字节对齐,这样可以减少应用在运行时的内存消耗zipAlignEnabled true// 3、移除无用的resource文件:当ProGuard 把部分无用代码移除的时候,// 这些代码所引用的资源也会被标记为无用资源,然后// 系统通过资源压缩功能将它们移除。// 需要注意的是目前资源压缩器目前不会移除values/文件夹中// 定义的资源(例如字符串、尺寸、样式和颜色)// 开启后,Android构建工具会通过ResourceUsageAnalyzer来检查// 哪些资源是无用的,当检查到无用的资源时会把该资源替换// 成预定义的版本。主要是针对.png、.9.png、.xml提供了// TINY_PNG、TINY_9PNG、TINY_XML这3个byte数组的预定义版本。// 资源压缩工具默认是采用安全压缩模式来运行,可以通过开启严格压缩模式来达到更好的瘦身效果。shrinkResources trueproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}
}

图片压缩与更换格式

可以更换图片格式,比如webp,svg可以更小,android studio也提供了对应的支持,但是没有最好的格式,只是适用场景不同。图片压缩网站推荐/。1.12M png图片,选择webp格式后,优化后大小39.6 kB。

图片网络化

很多入口较深的高清大图,或者需要经常更新的图片,也许用户根本不看,就没有必要内置在apk中,看时加载即可,如果需要提前占位置,可以用缩略图代替,至于哪些图网络化,需要根据业务与用户体验来权衡。

无用资源优化

通过Android Studio提供的工具检索出项目未被使用的代码、资源。但删除的时候不能一键清除,因为java类有可能是通过反射来调用的,比如项目里有跟JS交互的相关java类,IDE提示未被使用,但实际有被用。还有,资源也可以动态获取来使用,比如getResources().getIdentifier(“name”,“defType”,getPackageName()),如果某个资源仅存在动态获取资源id的方式,那么这个资源也会被检测为未被使用。所以,AS提供的一键清除所有无用资源要慎重:

可以使用Lint来剔除无用资源:

选择Unused resource:

也可以使用Lint来检测无用代码:

三方库处理

选择第三方 SDK 的时候,可以将包大小作为选择的指标之一, 或只引入部分需要的代码,而不是将整个包的代码都引入进来。

小结

目前APK瘦身方面的做的一些尝试,apk从48.3M降低到30.9M。可以根据自身情况取舍使用。当然我们还可以采取一些按需加载的策略来减少安装包的体积。砍掉不必要的功能也能有效减少安装包的体积。