升级Android Studio 3.1.1后APK体积翻倍原因及低SDK兼容方案问询
问题背景
近期将开发环境升级至Android Studio 3.1.1及
com.android.tools.build:gradle:3.1.2后,全平台签名发布APK的体积翻倍以上。通过Analyze APK工具查看显示“download size”与之前版本一致,但磁盘实际APK大小等于“size on disk / installed size”。项目中包含自研JNI库,minSDK=15,因新版本要求已移除armeabi平台构建。旧版本与新版本体积对比:
核心疑问
请问导致APK下载体积突然暴涨的可能原因是什么?
更新后的补充疑问
更新:将
minSDK升级至23并设置extractNativeLibs=true后,APK体积恢复至之前水平。能否在保留minSDK=15(至少19)的前提下维持该状态?设置extractNativeLibs=true后体积恢复对比:
问题原因拆解
咱们先把核心矛盾理清楚:你看到的download size是APK压缩后的理论下载体积,而磁盘上的实际APK大小是未压缩的原始体积——这差异的根源,是Android Gradle Plugin(AGP)3.x对Native库(.so文件)的打包逻辑变化:
- 在AGP 3.0之前,不管minSDK版本,.so文件默认都是以未压缩形式打包进APK,所以APK磁盘大小和安装后体积接近;
- 从AGP 3.0开始,官方针对Android 6.0(API 23+)做了优化:如果
minSDK >=23,AGP会自动压缩.so文件并允许系统直接从APK中加载压缩后的.so,这时候APK的磁盘大小(下载体积)会显著变小; - 但如果
minSDK <23,AGP默认会禁用.so文件的压缩——因为Android 6.0之前的系统不支持直接读取APK中压缩的.so文件,必须以未压缩形式存储才能正常加载。这就导致你的APK里所有自研JNI库的.so都以原始大小打包,直接让APK体积翻倍。
而你之前的旧版AGP没有这个严格的版本分支逻辑,所以体积一直保持正常;升级后触发了这个默认限制,才出现了体积暴涨的问题。
兼容解决方案(保留minSDK=15/19)
完全可以不用升级minSDK到23!只需要通过两个简单配置,就能让.so文件以压缩形式打包,同时兼容旧系统:
1. 在AndroidManifest.xml中配置extractNativeLibs
在<application>标签里添加android:extractNativeLibs="true":
<application android:name=".MyApplication" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:extractNativeLibs="true" <!-- 新增这个配置 --> ...>
这个属性的作用是告诉系统:安装APK时,自动把APK中压缩的.so文件解压到应用的私有目录。这样Android 6.0之前的系统就能从解压后的目录加载.so,完美解决兼容性问题。
2. 确认AGP的打包压缩配置正确
在Module级别的build.gradle中,确保release构建开启了资源压缩(默认开启,但可以明确配置):
android { ... buildTypes { release { minifyEnabled true // 开启代码混淆(可选但推荐) shrinkResources true // 开启资源压缩 crunchPngs true // 压缩PNG资源 } } // 可选:如果你的JNI库有特殊需求,可添加packaging配置 packagingOptions { // 禁止AGP自动剥离.so文件的调试信息(如果你的库需要调试) doNotStrip "*/armeabi-v7a/*.so" doNotStrip "*/x86/*.so" // 根据你支持的架构按需添加 } }
为什么这样有效?
当extractNativeLibs="true"时,不管minSDK版本是多少,AGP都会把.so文件以压缩形式打包进APK——既保证了APK的下载体积和之前一致,又通过安装时的自动解压,让旧系统能正常加载.so文件。
内容的提问来源于stack exchange,提问作者banerjk



