应用上架 阵前磨枪 2M-APK瘦身实测可行又便捷的方法

新项目上线,新应用原始apk大小在6.9M左右,然后公司和第三方运营公司合作,加入其提供的第三方SDK,瞬间apk体积增大3M;接着为了应用上线后的安全性,对应用进行了加固处理,套了一层壳之后,应用又增大了1.7M,最后上线之前包的体积已经超过10M,计算器这一工具类的应用包体积超过10M就没有很强的竞争力了,所以减小包体积的工作势在必行 。
下面是博主实际运用到的一些方法,没有囊括所有的方案,但都是有效的方案:
1).删除项目中无用的资源
Menu - > ->

应用上架 阵前磨枪  2M-APK瘦身实测可行又便捷的方法

文章插图
AS搜索一段时间之后会在下方弹出提示框,点击“do ”就可以将项目中无用的资源文件全部清除,包括图片,各种xml文件 。注意:机器没有智能到那种程度,所以直接删除可能会导致一些错误,使得之后编译不通过,所以建议在直接删除之前使用快捷键“alt + F7”检查该资源文件在项目中使用的地方,确定确实无用之后在进行删除 。
2).清除项目中无用的包
Menu - >Code ->| 项目根目录下右键->
应用上架 阵前磨枪  2M-APK瘦身实测可行又便捷的方法

文章插图
以上是直接去掉整个项目中的包,若在某个文件中去除可使用快捷键“ctrl+alt+o” 。
也可在设置里直接设置为自动清除无用的包(可自动导入包,当然也可以设置为自动删除包) 。
- > - > - >Auto- >on the fly
以上两步操作完之后,整个应用包减小0.7M 。
3)包体分析 (2.2以上)- 从内到外了解
Menu - >build-> APK
应用上架 阵前磨枪  2M-APK瘦身实测可行又便捷的方法

文章插图
①lib/-> 存放so文件,可能会有、-v7a、arm64-v8a、x86、、mips,大多数情况下只需要支持与x86的架构即可,如果非必需,可以考虑拿掉x86的部分;
②res/-> 存放编译后的资源文件,例如:、等等;
③/ -> 应用程序的资源,应用程序可以使用来检索该资源;
④META-INF/-> 该文件夹一般存放于已经签名的APK中,它包含了APK中所有文件的签名摘要等信息;
⑤(n).dex-> 文件是Java Class,被DEX编译后可供/ART虚拟机所理解的文件格式;
从上图apk 分析后可以看到占用空间多的主要是代码、图片、资源和lib和文件,主要方向精简代码、压缩图片、去除无用的库、减少里面文件 。
⑥.xml ->最终应用请求了哪些权限,不管是主项目工程的还是外部库的,最终以打出来的apk中申请的权限为准,通过 apk,可以准确地知道应用到底申请了哪些权限 。
有了方向之后,那么开始进行瘦身:
a.文件夹内去除占用空间较大的字体文件,既使得包的体积减小(一个字体文件100-200k),又使得应用字体变得更为统一;
b.开启资源压缩
android {...buildTypes {release {minifyEnabled trueshrinkResources trueproguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'}}}
设为true时会自动对代码进行清理,打包时去掉无用的代码部分,注意此时编译速度会受到影响(所以包打包速度比debug包要慢一些);
设为true时打包会自动根据 为true时去掉的代码部分再次去掉该代码部分相关的资源文件部分,注意二者是配合使用的 。
注:build.中配置二者时只是在打包文件中去掉了无用的部分,项目中还是实际存在的 。
c.语言资源优化,原项目中产品经理要求配置三种语言:中文 英文 法语,最终上线前为包体积做考虑,只启用英语一门语言配置(应用是发布在谷歌应用市场) 。
android {...defaultConfig {...resConfigs "en"}...}
如果不做任何配置的话,最终APK包中会包含项目中所有已翻译语言字符串,无论应用的其余部分是否翻译为同一语言,可以通过来配置使用哪些语言,从而让构建工具移除指定语言之外的所有资源 。
d.图片压缩,原本项目中使用的图片都是32*32的png图片,后来为清晰度的考虑将图片同一替换成72*72的png,结果每张图片都有200k左右,这里推荐使用网站进行图片无损压缩,下面这张图从190k压到1.6k,肉眼基本看不出任何区别;
应用上架 阵前磨枪  2M-APK瘦身实测可行又便捷的方法

文章插图
这两张图标一张被压缩了97%,你相信吗?
e.优化.dex,这里无定式方法,主要是提供一些思路 —— 时刻保持良好的编程习惯和对包体积敏锐的嗅觉,去除重复或者不用的代码,慎用第三方库,选用体积小的第三方SDK等等 。
以上四步操作完之后,整个应用包减小0.5M 。
4)APK瘦身放大招 - 的使用
①概念:是一个缩小APK大小的工具,它的原理类似Java,但是只针对资源 。它会将原本冗长的资源路径变短,例如将res//变为r/d/a(是的,如同混淆一样的abc,通过进一步混淆res资源夹来减小包体积) 。
②配置
项目根目录下build.中,添加插件的依赖:
dependencies {classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.10'}
项目根目录中build.中,再添加白名单配置:
apply plugin: 'AndResGuard'buildscript {repositories {jcenter()}dependencies {classpath 'com.android.tools.build:gradle:3.0.1'classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.10'}}andResGuard {mappingFile = nulluse7zip = trueuseSign = truekeepRoot = falsewhiteList = [// your icon"R.drawable.icon",// for fabric"R.string.com.crashlytics.*",// for umeng update"R.string.tb_*","R.layout.tb_*","R.drawable.tb_*","R.drawable.u1*","R.drawable.u2*","R.color.tb_*",// umeng share for sina"R.drawable.sina*",// for google-services.json"R.string.google_app_id","R.string.gcm_defaultSenderId","R.string.default_web_client_id","R.string.ga_trackingId","R.string.firebase_database_url","R.string.google_api_key","R.string.google_crash_reporting_api_key",//友盟"R.string.umeng*","R.string.UM*","R.layout.umeng*","R.drawable.umeng*","R.id.umeng*","R.anim.umeng*","R.color.umeng*","R.style.*UM*","R.style.umeng*",]compressFilePattern = ["*.png","*.jpg","*.jpeg","*.gif","resources.arsc"]sevenzip {artifact = 'com.tencent.mm:SevenZip:1.2.10'}}
其中(白名单)中指定不需要进行混淆的资源路径规则,主要是一些第三方SDK,因为有些SDK的代码中引用到对应的资源文件,如果对其进行混淆,会导致找不到对应资源文件,出现crash,所以不能对其资源文件进行混淆 。由于公司的项目中使用到了友盟和融云,所以将这两个SDK加入白名单,更多的白名单可以查看:
白名单
③build.文件中添加签名文件等信息
signingConfigs {release {keyAlias 'popstar'keyPassword 'popstar'storeFile file('star.jks')storePassword 'popstar'}}buildTypes {release {minifyEnabled trueshrinkResources truesigningConfig signingConfigs.releaseproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}}
④打包
不再使用AS自带打包方法,而是使用的打包方法,AS右侧点击打开任务列表:
应用上架 阵前磨枪  2M-APK瘦身实测可行又便捷的方法

文章插图
打包,只需要双击,开始打包(时间较长),执行完毕后,可以在app目录下的/build//apk//{}/ 文件夹中找到混淆后的Apk,其中app-ed.apk为进行混淆并签名过的apk 。
应用上架 阵前磨枪  2M-APK瘦身实测可行又便捷的方法

文章插图
双击查看该apk,再次打开res文件夹就会发现所有的文件名都已经再次混淆了 。
应用上架 阵前磨枪  2M-APK瘦身实测可行又便捷的方法

文章插图
操作完这一步之后,整个apk减小了0.8M
有疑问的读者可以自行查看库文档 中文文档
通过以上的一些apk瘦身常用方法,最终包减小了2M左右,值得一提的是,如果使用一种瘦身方法没有明显的效果时,就可以放弃再寻找其他方法,不要死磕(别问我为什么这样说) 。
PS:临时抱佛脚,应用上架前被附加了那么多东西,然后才开始做apk瘦身,博主多少有些无奈 。不过学到了很多!以后不会被弄的手忙脚乱的了 。
2020/06/02 补充:
如果按照上述步骤,使用微信压缩库时出现打包错误如下:
parse to get the exist names in the resouces.arsc firstcom.tencent.mm.androlib.AndrolibException: Could not decode arsc fileat com.tencent.mm.androlib.res.decoder.RawARSCDecoder.decode(RawARSCDecoder.java:74)at com.tencent.mm.androlib.ApkDecoder.decode(ApkDecoder.java:190)at com.tencent.mm.resourceproguard.Main.decodeResource(Main.java:96)
原因在于升级后,系统默认升级了版本到28.0.3 。从而导致对资源的解码出现问题 。项目当前版本为27.0.3,直接去除,采用AGP对应的默认版本配置 。
同时,最新版本已经解决了此问题,直接升级1.2.10版本到当前最新版本 。
classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.17'
博主亲测,解决问题 。
【应用上架 阵前磨枪2M-APK瘦身实测可行又便捷的方法】解决办法取自文章《项目版本从4.4升级到4.6》