1.App瘦身经验总结
为什么apk越来越大?
1.项目不断发展,功能越多,代码量增加的同时,资源文件也在不断的增多
2.app支持的主流dpi越来越多,如ldpi、mdpi、hdpi、xh xxh xxxh等等,间接导致资源增多
3.引入的第三方sdk或开源库越来越多,增加了很多重复的资源或方法以及无效代码
4.用于体验要求高,图片资源为保证清晰度会使用分辨率更高的图片
apk瘦身的切入点
解压一个没有加固过的apk文件我们会看到下边的内容,相信你对这些文件或目录的含义都已经清楚,接下来我们将会从三个方面进行apk的瘦身操作:
1.Java代码,对应classes.dex文件,我们要剔除无效代码,减小dex文件大小
2.资源文件,对应res文件夹,assets目录
3.减小lib中引入的so大小
开始瘦身
接下来我们将分别针对上边的三个切入点进行apk瘦身
1.减小Java代码的体积
有人认为这个方面的处理很鸡肋,因为每一行代码都对应相应的功能,这里能有多大的精简空间,其实并非完全如此,随着项目的不断推进,编码过程中会产生很多的冗余代码,比如该删掉的没有删掉,过多的重复性功能的工具类,无效的引用等,这还是其次,比较大的一个问题是,随着你引入的开源库不断增多,无效代码的出现几乎是必然事件,过多的重复方法还会导致64k方法数的问题。接下来进入正题。
1.开启minifyEnable
它的作用不仅仅是混淆代码,还有压缩优化的功能,他会遍历所有代码并找出没有引用到的代码,这些代码不会生成在apk中;另外混淆的效果是使用简短的字母替代原来的类名属性名等,一定程度上也可以减小代码体积
2.定期review重构代码
对代码的不断优化是提升个人能力的有效手段,同时优化的结果也会间接的对apk进行精简
3.慎重选择你使用的开源库
很多开源库针对不同平台提供了精简版,目的就是移除在本平台上不需要的代码,例如fastJson,我们选择精简版就可以使开源代码缩小一倍左右,另外针对没有精简版的开源库,需要根据场景考虑是否使用源码依赖,手动移除不必要的文件资源。
2.资源文件瘦身
1.优先采用WebP图片
资源文件是apk中体积占用较大的一部分,尤其是图片资源,所以我们首要以图片的瘦身为主。首先要对图片编码格式有简单了解。Android平台支持的格式有:JPEG,PNG,GIF,BNP,WebP(4.0开始支持WebP),但是Android应用开发中,Bitmap所支持的只有三种JPEG,PNG,WebP,从Bitmap类的CompressFormat枚举可以看出(详见源码)。
JPEG:有损压缩,不支持透明通道和多帧动画(RGB)
PNG:无损压缩,支持透明通道(ARGB),PNG大小大于JPEG
WebP:支持有损和无损压缩,支持透明通道和多帧动画,4.0以上是开发首选,Google官方测试,WebP比PNG能减少45%大小,即便PNG经过压缩,也能相比PNG减小28%
2.PNG格式图片尽量使用NinePatch格式
.9图具有体积小,拉伸不变形的特点,并且Android studio可以一键转换,使用起来相当方便。
3.Lint查找无效资源
Lint可以检查res目录下的无效资源(无法检查assets),然后将其删除,但是有一点要注意,如果资源文件是通过反射机制调用的,Lint是无法知道的,所以使用lint检查出的每一个资源都需要人工进行确认,防止发生异常删除。
4.开启shrinkResources功能
shrinkResources标识是否去除无用的resource文件,它需要配合minifyEnable使用,同样存在反射机制引用的问题,这种情况会被误删
android { buildTypes { release { minifyEnable true shrinkResources true } } }
5.resConfigs剔除第三方库或者SDK中的资源
第三方库中包含的无效资源通常包含以下两点:
1.dpi目录,第三方库通常会提供所有的dpi目录以及对应的资源文件,因为它是针对大众使用的,而我们未必都需要,这时候需要选择性的移除。
2.很多第三方sdk是做了国际化,而我们可能用不到,此时也需要删除国际化资源
defaultConfig { 。。。 resConfigs "zh" //表示只使用中文 resConfigs "xxhdpi" // 表示只是用xxhdpi目录下的资源文件 }
libs目录瘦身
so文件最终会被打包到libs目录中,我们针对libs目录的瘦身主要是去除不必要的平台ABI的so文件,例如我们只保留v7a和x86平台的so
defaultConfig { ndk { abiFilters "armeabi-v7a","x86" } }
其他的一些优化
1.不涉及透明图层的图片可以转换为jpg格式,比如欢迎页的图片
2.使用shape(Vector)替换图片
3.删除或者替换兼容包中无用的一些图(v4.v7.v13)
4.删除第三方aar库中使用的大图
5.把so文件放置在网上或者sd卡内
总结
目前我所了解的瘦身方法只有这些

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
短视频APP开发,前辈告诫我一定要选择开源源码
开放源代码(开源源码)指的是该源码的软件著作权所有者将其所持有的原始码公开,允许大众使用、修改发行的软件或设计体。 可能有朋友会觉得“开源源码”这一名词与自己无关,是程序员才会在意的,其实不是,我们常用的安卓手机,它的系统“安卓”就是现在影响力最大的开源源码编写的原生软件之一,如果安卓不开源,现在我们所有的手机,恐怕不会像现在这样物美价廉。 开源源码对短视频APP开发者意味着什么 对于程序员而言,源码开源与不开源的最大区别在于,你是孤身一人在奋斗,还是与世界各地的优秀开发者紧密联系在一起,如果你使用的源码是开源源码,那么在你遇到问题时,你会有无数小伙伴可以一起交流沟通,你遇到的所有问题他们都遇到过,你可以在他们的帖子中寻找问题解决方法而不用被困难打击到焦头烂额。 开源源码的BUG通常会比不开源的源码BUG少,因为有世界各地的程序员的共同努力,开源源码的BUG会被不断发现和解决。可以说,流行的开源源码是经过大众检验的。 短视频APP开发常用的开源源码是什么 Linux 无疑是开源源码里最成功的一个,搭建短视频APP的操作系统时,我们通常会选择使用它来作为操作系统,除此之外,短视频APP系...
- 下一篇
Android的路接下来该怎么走?
其实想写这篇文章好久了,很多小伙伴们也经常在群里探讨android移动开发者的走向,一部分人都想多快好省,间歇性踌躇满志、持续性混吃等死 ,只想用CV的开发模式们快速完成工作,然后回家王者农药。其实这种现象很普遍,我想告诉你的是 ,只要你走对方向,不断地学习,android的春天依然是健在的。 很多小伙伴们问过好多次,Android还能活多久?这个真的不好说,但至少在五年以内,Android还是不灭的。Android 历程10年有余了,已经积累了太多的技术,知识点,技巧,思路,这些前人都会了,并且正在创造新的思路出来,对于广大的底层 coder 来说,仅仅是追赶就很难了,更别提去自己创造了,但是现实时我们尝尝学习了很多开源框架,落到实处就是仅仅会用而已,不说源码看没看过,甚至原理都不知道,不知道作者用什么技术实现的,这点就是广大 coder 的现状,没有成长。只做业务的小厂也同样如此! 同样,我们在专研一门技术的同时,也要多方面去发展,我想大家都有去思考过这个问题。多去了解其他语言,可能是公司需要,也可能是个人对技术的渴求。尤其是在面试中,很多公司要求会第二门语言。so,我们不得不去学...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7设置SWAP分区,小内存服务器的救世主
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS关闭SELinux安全模块