Android-APK瘦身实践:二次瘦身如何再减少大小?,2021年安卓开发进阶课程
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,效果还是比较惊人的。
这个步骤我是在后面很多步压缩之后测试的,每个阶段的压缩结果都会有些许出入,所以数据仅供参考。
通过正常压缩,apk包减小了464k。
如果开启7zip,apk包减
《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享
小了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.appid/build/outputs/apk/release/{appid}/build/outputs/apk/release/appid/build/outputs/apk/release/{appid}-release-rootProject.ext.versionName−{rootProject.ext.versionName}-rootProject.ext.versionName−{rootProject.ext.versionCode}-channel.apk")defoutputDir=file("../app.{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"
}
}
看看效果:
。
####1. 去除无用的语言资源
感谢@牧志轩的建议,通过配置resConfigs可以选择只打包哪几种语言,进而去掉各种aar包中全世界的语言,尤其是support包中的。
[外链图片转存中…(img-0yDZm6Do-1638256714798)]
选择保留什么语言要根据产品的用户和市场来定,如果只选择默认英语和中文语言,配置如下
android{
defaultConfig{
resConfigs"zh"
}
}
看看效果:
Android-APK瘦身实践:二次瘦身如何再减少大小?,2021年安卓开发进阶课程相关推荐
- 最新《微专业Android安卓开发工程师课程》
1.Android应用界面开发 资源下载 001 Android开发简介.flv 002 开始第一个应用.flv 003 Activity你必须知道的那些事(上).flv 004 Activity你必 ...
- android apk反编译(获取源码,资源文件等)
android apk反编译,是让你可以去借鉴别人的应用是怎么开发的,那些漂亮的动画和精致的布局是怎么实现的 一.当然我们也需要借助工具: apktool (资源文件获取,可以提取出图片文件和布局文件 ...
- 跨平台应用开发进阶(十二) :uni-app 实现应用桌面图标角标提示及应用跳转
文章目录 一.前言 二.实现 2.1 集成极光实现 2.1.1 通道支持 2.1.2 iOS 角标 2.1.3 华为角标 2.1.4 小米角标 2.1.5 vivo 角标 2.2 H5+实现 三.遇到 ...
- Android APK 瘦身 - JOOX Music项目实战
JOOX Music是腾讯海外布局的一个音乐产品,2014年发布以来已经成为5个国家和地区排名第一的音乐App.东南亚是JOOX Music的主要发行地区,由于JOOX Music所面对的市场存在很多 ...
- Android apk瘦身之使用TinyPng压缩图片
1 前言 Android apk太大了怎么办,有的时候需要减小apk的体积,例如上传到服务器的时候有文件大小的限制.百度一下,发现大致有以下几种方法: 使用混淆,减少代码体积 删除不使用的资源 减少使 ...
- Android Apk瘦身指南大全
Android Apk瘦身指南大全 前言 为什么Android应用Apk要瘦身?虽然安装包大小对应用使用没有影响,但应用的安装包越大,用户下载的门槛越高,安装等待时间也会越长,特别是在移动网络情况下, ...
- Android APK 瘦身
Android APK 瘦身的几个方法 将项目中的图片由png.jpg转为webp格式.如下操作: 1.1选中图片或者含有图片的文件夹 右键选择Convert toWebP.. 1.2根据自身情况选择 ...
- unity3d android包太大了,unity/unity3d编译成android apk包瘦身方法
unity/unity3d编译成android apk包瘦身方法 本文系原创,请转发的朋友带上我的链接. 相信用unity开发的同学都会遇到类似的经历:明明资源图片不大,但是发现打包后apk文件 ...
- Android-APK瘦身实践
[个人总结]APK瘦身实践 因为推广的需要,公司需要把APK的大小再"减小"一下,4M以内! 当达到4M以内之后,公司建议说,能否再压压?2M如何? 瘦身前 因为平时就考虑到大小的 ...
最新文章
- IBM会话设置和覆盖规则
- 明明是 64 位系统,为什么python sys.platform 显示 win 32 ?
- [Ubuntu] SVN常用的批量操作
- 甲骨文预言机平台(3) API Gateway
- python中系列的含义_python中四种组合数据类型的含义、声明、增删改查,遍历
- PHP+Mysql查询上一篇和下一篇文章实例
- 计算机知识产权 教学目标,计算机教学设计模板
- 安卓学习笔记08:常用布局 - 线性布局
- MediaPlayer控件的初探
- (12)自定义数据流(实战Docker事件推送的REST API)——响应式Spring的道法术器...
- 如果降低sbus总线的传输速率/帧率,sbus怎样转UART,sbus接到4G
- python爬虫什么意思-Python爬虫可以做什么?
- spring 获取一个包下的所有bean_面试官问我:为什么 Spring 中的 bean 默认为单例?...
- MySQL中的float和decimal类型有什么区别
- Python根据乐谱生成音乐
- ff删除httpwatch插件
- 相同名字比对公式,相似度对比算法
- STM32在线烧录程序的开发
- 刚刚,ChatGPT官宣数学能力再升级,网友:终于精通十以内加减法了
- token系统讲解及过期处理