Android-APK瘦身实践:二次瘦身如何再减少大小?
[更多下载](()
最终,apk减小了188k。
4. 大图缩小
如果经过上面的步骤,依然存在大图的话,说明确实图有点大了,可能真的有点大了!
所以,要考虑的问题是,是否有必要保证如此的大小?能否缩小?如果这方面能减小的话,apk瘦身的效果必然又会上一个档次。
5. 覆盖aar里的一些默认的大图
一些aar库里面包含根本就没有用的图。最典型的是support-v4兼容库中包含一些“可能”用到的图片,实际上在你的app中不会用到。

我没有把所有图都替换掉,只是把几张大一点点的图(选中的那些图)用1×1的图片替换,如果9patch图的话,要做成3×3的9patch图替换。
support库可能还算好的,就怕有些库引用了一些大图而不自知,可以在/build/intermediates/exploded-aar/下的各个aar库的res目录查找检验。
apk减小了18k。
有问题可以加下[技术交流群](()一起来讨论~
6. 删除armable-v7包的so
感谢@杨辉__ ,@kymjs张涛的提醒,armable-v7和armable文件夹可以只保留armable。
当然,armable-v7a的库会对图形渲染方面有很大的改进,因为我们主要是一些业务上动态库,所以删掉无大碍。

apk减小了191k。
7. 微信资源压缩打包
这个方案网上一直在说,之前一直没有需求或者动力实践,在这里感谢一下@裸奔的凯子哥的推荐和交流,他那边的apk可以压小1M,效果还是比较惊人的。
这个步骤我是在后面很多步压缩之后测试的,每个阶段的压缩结果都会有些许出入,所以数据仅供参考。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DqtE7kNr-1650012987317)(https://upload-images.jianshu.io/upload_images/15233854-209fdba7978933e0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
通过正常压缩,apk包减小了464k。
如果开启7zip,apk包减小了594k。
apk减小了594k。
PS: 关于这个压缩,我集成到了gradle脚本中了,新建了一个Task,大概代码如下:
task compressReleaseApp {
// 在现有release的版本上生成到compressed目录下
def appid = “appid”
def channel = “abcdefghijkl”
def guardJarFile = file(’…/AndResGuard/andresguard-1.1.jar’)
def guardConfigFile = file(’…/AndResGuard/config.xml’)
def originApkFile = file("…/app. a p p i d / b u i l d / o u t p u t s / a p k / r e l e a s e / {appid}/build/outputs/apk/release/ appid/build/outputs/apk/release/{appid}-release- r o o t P r o j e c t . e x t . v e r s i o n N a m e − {rootProject.ext.versionName}- rootProject.ext.versionName−{rootProject.ext.versionCode}- c h a n n e l . a p k " ) d e f o u t p u t D i r = f i l e ( " . . / a p p . {channel}.apk") def outputDir = file("../app. channel.apk")defoutputDir=file("../app.{appid}/build/outputs/apk/compressed/")
def keystoreFile = file(RELEASE_STORE_FILE)
// 开始执行压缩命令
def proc = “java -jar ${guardJarFile} ${originApkFile} -config ${guardConfigFile} -out ${outputDir} -signature ${keystoreFile} ${RELEASE_STORE_PASSWORD} ${RELEASE_KEY_PASSWORD} ${RELEASE_KEY_ALIAS}”.execute();
proc.waitFor();
println “return code: ${ proc.exitValue()}” + “, stderr: ${proc.err.text}” + " stdout: ${proc.in.text}"
}
config开启了7zip, 部分配置如下:
[详情参考](()
[原理介绍](()
8. proguard深度混淆代码
之前为了简单起见,很多包都直接忽略了,现在启动严格模式,把能混淆的都混淆了:

采用微信压缩方案最终效果比较:

apk减小了215k。
PS:混淆后,一定要经过严格测试,有时候甚至很难发现错误,比如我开启严格混淆,用了一段时间之后慢慢发现了两个bug,排除了两个包程序才正常。
9. 深度清理代码和资源
有意思的是,无论何时何地去清理代码和资源,总能有新的发现:
- 新发现或者新引入的无用图片
- 这几张图怎么一样
- 这个类好像没有用
- 没用的类相关的图片也没用
- 有些图片可以用着色方案替换
- 有些图片可以用shape来代替
- hdpi里的ic_luancher.png好像也可以删掉
- …
apk减小了66k。
10. proguard去符号表
之前为了保留调试信息,我们是在Proguard保留了符号表的:
-keepattributes SourceFile,LineNumberTable
官方渠道我觉得还是尽量保留这个,现在针对推广渠道,只能采用特殊手段,注释这一行。
apk减小了230k。
ps:以后友盟上看推广渠道的bug要辛苦一点,手动上传mapping.txt了。
####11. provided关键字
可以对仅在运行时需要的库设置provided关键字,实际并不被打包:
provided’com.android.support:support-annotations:22.0.0’
我没有发现这样的场景,如果说有的话,就是support-annotations,但是经过后来的测试验证,support-annotations本来就会在release版本中被minifyEnabled掉,所以对support-annotations设置provided是没有意义的。
如果有实际场景,欢迎留言说明,不甚感激。
apk没有减小。
12. 表情包在线化
虽然应用的表情不多,只有50来个,但是如果能把这部分表情放到网上,不仅能有效减小apk大小,还可以方便后期扩展支持:

打包成 《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》开源 emoji_v1.zip, 大小是202k。
现在把emoji_v1.zip放到网上,按需下载后使用,最终对比结果如下:

apk减小了193k。
13. 全版本兼容的着色方案
考虑着色方案主要目的是更方便支持多主题,减轻UI工作量,减少工程里一大堆selector文件等,然后才是,顺便的减小一下apk大小。
通过着色方案,我们去除了10多张纯色的按下状态图片和对应的xml等等。
最后
希望大家能有一个好心态,想进什么样的公司要想清楚,并不一定是大公司,我选的也不是特大厂。当然如果你不知道选或是没有规划,那就选大公司!希望我们能先选好想去的公司再投或内推,而不是有一个公司要我我就去!还有就是不要害怕,也不要有压力,平常心对待就行,但准备要充足。最后希望大家都能拿到一份满意的 offer !如果目前有一份工作也请好好珍惜好好努力,找工作其实挺累挺辛苦的。
这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。
由于篇幅有限,这里以图片的形式给大家展示一小部分。

珍惜好好努力,找工作其实挺累挺辛苦的。
这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。
由于篇幅有限,这里以图片的形式给大家展示一小部分。
[外链图片转存中…(img-LbUmq6Er-1650012987320)]
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
