Android APK体积异常偏大,如何定位原因并缩减安装包大小?
问题描述
构建生成的release版APK体积高达20.009MB,体积异常偏大。
我基于Android Studio的项目模板开发了一款功能极简的Android应用,核心功能仅为条码扫描。
项目依赖配置
dependencies { implementation 'androidx.appcompat:appcompat:1.4.2' implementation 'com.google.android.material:material:1.6.1' implementation 'com.google.mlkit:barcode-scanning:17.0.2' def camerax_version = "1.1.0-beta01" implementation "androidx.camera:camera-camera2:${camerax_version}" implementation "androidx.camera:camera-lifecycle:${camerax_version}" implementation "androidx.camera:camera-view:${camerax_version}" implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'androidx.navigation:navigation-fragment:2.4.2' implementation 'androidx.navigation:navigation-ui:2.4.2' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' }
release构建配置
release { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' }
从依赖配置可见,我引入了ML Kit条码扫描库,根据官方文档说明,该库带来的体积增量不应超过3.2MB。我运行了size-analyzer工具进行体积分析,工具返回结果为:
No size saving suggestions found.
我已开启minifyEnabled代码混淆、shrinkResources资源压缩配置,但APK体积仍然过大,且体积分析工具未给出任何优化建议,咨询该问题的产生原因,以及有效缩减APK体积的方案。
原因分析与解决方案
核心原因
你当前构建的是包含全CPU架构native库的通用APK(Fat APK)。ML Kit条码扫描库、CameraX组件都携带了适配arm64-v8a、armeabi-v7a、x86、x86_64四种CPU架构的so本地库,官方标注的3.2MB增量是单架构下的体积,四种架构打包总和会直接涨到12MB以上,叠加AndroidX、Material组件的基础体积,就会达到20MB左右。
size-analyzer没有给出优化建议属于正常情况,该工具默认仅检测代码混淆、冗余资源、无用依赖类问题,多架构native库打包属于分发层配置,不在其默认检测规则范围内。
可落地的缩减方案
- 配置ABI架构过滤,剔除不必要的架构so文件
在模块级build.gradle的android.defaultConfig块中添加如下配置,仅保留覆盖绝大多数民用设备的CPU架构:
如果不需要兼容2018年之前发布的32位安卓设备,可仅保留ndk { // 两个架构覆盖99%以上在售安卓设备,剔除x86、x86_64架构的冗余so abiFilters 'arm64-v8a', 'armeabi-v7a' }arm64-v8a单架构,体积还能再缩减30%左右,改完后重新打包APK体积会直接降到6-8MB区间,符合官方标注的增量范围。 - 优先使用AAB(Android App Bundle)格式分发
国内外主流应用市场均已支持AAB格式分发,上传AAB包后,市场会根据用户设备的CPU架构、屏幕密度、系统语言自动下发对应资源,不需要手动过滤ABI,用户实际下载的安装包体积比通用APK小40%-60%,是官方推荐的分发方式。 - 按需选择ML Kit条码扫描的依赖版本
如果你的应用仅在预装GMS服务的地区分发,可以将ML Kit条码扫描依赖替换为动态下载版,识别模型不会打包进APK,而是在应用首次使用时从Google Play服务拉取,还能再减少3MB左右的体积;如果面向国内市场分发则不建议替换,国内设备普遍没有GMS环境,会导致扫描功能不可用。 - 排查依赖引入方式
确认所有调试、测试相关依赖均使用debugImplementation、testImplementation、androidTestImplementation引入,避免调试工具被打包进release版本,从你当前的依赖配置看这部分没有问题。
内容的提问来源于stack exchange,提问作者HelloWorld
相关产品推荐
相关产品推荐

