Android 打包apk莫名变很大.SO问题

记录一下AS打包过程遇到的神奇事件。

同事需要最新的apk测试接口。于是快速打开项目打包。成功后直接右键show in Explorer。按住拖动到发送窗口ヽ( ̄ω ̄( ̄ω ̄〃)ゝ娴熟的一气呵成。

“这个apk怎么这么大!”

“40来M不大,不大”。╰( ̄ω ̄o)

“ ~.~!80M来着“

“怎么可能!!”

定睛一看傻了。上周五还40M左右,周一来怎么突然就80.6M了

深吸一口气开始探究:

可能原因:

1、检查配置文件:项目下的build.gradle、app下的build.gradle

查看混淆文件是否开启、ndk是否配置、无用资源是否去除。

2、版本比较,根据版本管理git,或者svn等查看提交的历史版本,对比俩个版本的差异。

3、打包方式差异。


很遗憾,相近的版本基本无差异,而且上个版本是半个月之前提交的。故,并非build配置上的差异所致。更改打包方式size依旧那么大。

在深吸一口气继续探究:

Build->Analyze APK:查看apk的内部构造


analyze-1

上图为大体app的构造,图中明显可以看到APK size为81.2M,上传谷歌后下载为40.5M。谷歌会对上传的apk做相应优化处理。lib为对应相应的.so库,等。一个apk可能看不出问题所在,那么来个之前的apk对比下。点击上面图中的右上角按钮选择旧的apk

analyze-2

很尬尴,一顿操作猛如虎,定睛一看,还是原地杵,结果很遗憾。除了第一项告诉你总大小不一样。其他几乎相同...莫得搞呀!!

沉思良久:

版本回退,在做打包比较。


analyze-3

对比两次的apk分析,终于发现两次的Raw File Size是不同的而且相差这么大。而RFS主要成分lib。lib由.so文件 不同所致。(心细的童鞋应该图一就想到了问题所在。)

产生原因:一个.so文件开启了压缩。另一个.os文件未进行压缩。

解决问题办法:

去掉AndroidManifest.xml文件中application下的:android:extractNativeLibs="false"  然后重新打包

总结:

网上也有因为添加了android:extractNativeLibs="false"导致加固后安装失败的情况。而extractNativeLibs对应的是native层设置。当设置为false,会防止安装时PackageManager将APK中的so文件拷贝解压到文件系统中。但是,目前要让该技巧生效还需要额外2个条件:一个是apk 中的 .so 文件不能被压缩;二个是 .so 必须用zipalign -p 4来对齐。这个但是很重要,所以优化使用时要慎重。

解决问题虽然很简单,但是花费在排查上的时间很久。同时也给自己一个警示:代码处理上需要慎重。

以上总结不到位,有误。望指正,Thanks!

你可能感兴趣的:(Android 打包apk莫名变很大.SO问题)