Android-APK瘦身实践:二次瘦身如何再减少大小?(4M—2-9M),思维导图+源代码+笔记+项目

通过正常压缩,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, 部分配置如下:

<?xmlversion="1.0"encoding="UTF-8"?>

<issueid=“property”>

<seventzipvalue=“true”/>

<issueid="whitelist"isactive=“true”>

<pathvalue=“com.xxx.yyy.R.drawable.emoji_*”/>

<pathvalue="com.xxx.yyy…
/>

详情参考
原理介绍

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大小,还可以方便后期扩展支持:

打包成emoji_v1.zip, 大小是202k。
现在把emoji_v1.zip放到网上,按需下载后使用,最终对比结果如下:

apk减小了193k。

13. 全版本兼容的着色方案

考虑着色方案主要目的是更方便支持多主题,减轻UI工作量,减少工程里一大堆selector文件等,然后才是,顺便的减小一下apk大小。
通过着色方案,我们去除了10多张纯色的按下状态图片和对应的xml等等。

apk减小了15k。

PS: 具体实现可以参考,而我也把它集成到了我的LessCode库中了:DrawableLess.java

14. 去除重复库

发现两个地方:

  • 现在发现七牛的SDK引用了android-async-http-1.4.6.jar,虽然不大,只有95.4k,但是感觉完全可以写一个轻量级的jar,控制在10~20k就足够了,具体可以在现有的网络库上实现。
  • 自己工程使用的是UIL,但是引入的第三方库引用了picasso,两个重复的图片下载库也是完全没用必要的。

现在还没有处理这块,新任务介入,延期优化,敬请期待。

15. 去除无用库

这是一个很基本的点,但是确很容易被人忽视,当你仔细回顾的时候,有一些鸡肋的功能或者库,是几无用处的。不如干脆去掉。

比如,在很早的时候,我就把我们app里的sharesdk删除了,因为对于我们的产品定位和推广来看,这毫无意义。

16. 去除百度统计

这个视具体情况决定。

因为我们的APP里面包含友盟和百度两套统计系统,早期老板要求,事实上后面已经很少看这方面的数据,百度统计的数据几乎没用人去看,可以暂时先去除。

原本的百度统计的jar有130多k,去除之后的apk的减小会远远没有这么多。

apk减小了20k。

####17. 使用更小的库
使用更小的库不应该成为你选择方案的决定性因素,但是可以作为参考因素(freso确实太大了,这个大小也可以成为决定性因素)。

图片下载,网络请求,json解析等等的库和它的竞品都有多大,你心里有数吗?

以工具库为例,网上有很多工具库,但是往往它们的大小很难控制。

  • xutils-3.2.6.aar – 843.8k
  • lite-common-1.1.3.jar – 148.1k
  • lesscode-core-0.8.2.aar – 64k

上面最后一个库LessCode是我自己收集的工具类集合,非常小:LessCode,混淆后只有不到50k大小。

不仅提高了开发效率,减少了冗余代码,而且能避免引用一些其他大型的库,有效避免包的增大。

比如,我们碰到过这样的一个bug,快速点击按钮多次触发跳转,现在RxJava结合RxBind有这样的一个场景解决方案,如果引入这些库的话必然会增大apk大小,实际上就几行代码,我把这样的解决方案集成到了LessCode,下次别的项目碰到这样的问题不用再犹豫是否要引入一个这么大的库了。

这些小的工具库,建议根据自己的经验人手总结一个,不求全,但求精!

18. 插件化

尴尬的是,我们所呈现的功能大部分都是重要的不可分割的功能,很难从业务上分离出来。

今年预计要实践一个轻量级的插件化方案,用别人的也好,自己写也好,希望能解决或者优化一些安装包加载多模块,或者主题切换,或者热修复的问题。

这里作为候选方案备用。

####19. 功能业务取舍
一开始考虑瘦身,领导是允许适当的砍掉一些功能,因为4M的目标我们已经实现了,所以现在还没有到砍功能的地步。

这里作为候选方案备用。

补充

文章发出后,收到了一些朋友的建议,补充几点。

####1. 去除无用的语言资源
感谢@牧志轩的建议,通过配置resConfigs可以选择只打包哪几种语言,进而去掉各种aar包中全世界的语言,尤其是support包中的。

选择保留什么语言要根据产品的用户和市场来定,如果只选择默认英语和中文语言,配置如下

android{

defaultConfig{

resConfigs"zh"

}

}

看看效果:

如果不采用微信压缩方案结果对比,apk减小了197k。
如果采用微信压缩(开启7zip)对比结果,apk只减小了16k,因为微信对resources.arsc进行了强力压缩,厉害!
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

尾声

开发是需要一定的基础的,我是08年开始进入Android这行的,在这期间经历了Android的鼎盛时期,和所谓的Android”凉了“。中间当然也有着,不可说的心酸,看着身边朋友,同事一个个转前端,换行业,其实当时我的心也有过犹豫,但是我还是坚持下来了,这次的疫情就是一个好的机会,大浪淘沙,优胜劣汰。再等等,说不定下一个黄金浪潮就被你等到了。

  • 330页 PDF Android核心笔记

  • 几十套阿里 、字节跳动、腾讯、华为、美团等公司2020年的面试题

  • PDF和思维脑图,包含知识脉络 + 诸多细节

  • Android进阶系统学习视频

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

1712367651644)]

  • PDF和思维脑图,包含知识脉络 + 诸多细节

[外链图片转存中…(img-9P9Pgyao-1712367651645)]

  • Android进阶系统学习视频

[外链图片转存中…(img-0V08h1Qq-1712367651645)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 28
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值