业务方和开发都希望app尽量的小,本文会给出多个实用性的技巧来帮助开发者进行app的瘦身工作。瘦身和减负虽好,但需要注意瘦身对于项目可维护性的影响,建议根据自身的项目进行技巧的选取。
一、背景
目前app的大小越来越大,用户对于过大的app接受度不高,所以除了插件化和RN的方案外,我们只能老老实实的进行app的瘦身工作。
二、需求
-
我要利用混淆来让我的代码尽可能少
-
最好能用最少的切图完成功能
-
layout文件不要太多,太多了乱
-
能动态下载的就做动态
-
我希望能用大小最小的图片
-
如果能用svg,我就用svg
-
对于无用的资源,我要as能自动删除掉
-
中国文字博大精深,而我只要我需要的字的字体
-
最好能根据下载用户手机的cpu和分辨率来引入不同的资源
三、实现
分析app组成结构
做瘦身之前一定要了解自己app的组成结构,要有针对性的进行优化,并且要逐步记录比对,这样才能更好的完成此项工作。关于apk的大小,我推荐google的这个视频。目前as的2.2预览版中已经有了apk分析器,功能相当强大,此外你还可以利用nimbledroid来分析apk。
nimbledroid是一个强大的工具,推荐一试我们都知道apk是由:
-
asserts
-
lib
-
res
-
dex
-
META-INF
-
androidManifest
这几个部分构成的。
下面我会利用as的分析工具,以微信、微博、淘宝为例进行讲述。
分析完成后你还可以看到具体类目占的百分比,清晰明了。旁边的“对比”按钮提供了diff的功能,让你可以方便的进行apk优化前后的对比,简直利器。
assets
assets目录可以存放一些配置文件或资源文件,比如webview的本地html,react native的jsbundle等,微信的整个assets占用了13.4M。如果你的应用对本地资源要求很少的话,这个文件应该不会太大。
lib
lib目录下会有各种so文件,分析器会检查出项目自己的so和各种库的so。微博和微信一样只支持了arm一个平台,淘宝支持了arm和x86两个平台。
resources.arsc
这个文件是编译后的二进制资源文件,里面是id-name-value的一个map。因为微信做了资源的混淆,所以这里可以看到资源名称都是不可读的。
索性放个微博的图,易于大家理解:
META-INF
META-INF目录下存放的是签名信息,用来保证apk包的完整性和系统的安全性,帮助用户避免安装来历不明的盗版apk。
res
res目录存放的是资源文件,包括图片、字符串。raw文件夹下面是音频文件,各种xml文件等等。因为微信做了资源混淆,图片名字都不可读了。
微博就没有做资源混淆,所以可读性较好:
dex
dex文件是java代码打包后的字节码,一个dex文件最多只支持65535个方法,这也是为什么微信有了三个dex文件的原因。
因为dex分包是不均匀的,你可以理解为装箱,一个箱子的大小是固定的,但你代码的量是不确定的,微信把前两个箱子装满了,最后还剩了2m多的代码,这些代码也占用了一个箱子,最终产生了上图不均匀的情况。
现在,我们已经知道了apk中各个文件的大小和它们占的比例,下面就可以开始针对性的进行优化了。
优化assets
assets中会存放资源文件,这个目录中不同厂的app存放的内容各有不同,所以优化也比较难。自从引入RN以来,这个目录下还会有jsbundle的信息(可参考全民k歌)。如果你有地址选择的功能,这里还会存放地址的映射文件。
对于这块的资源,as是不会进行主动的删减的,所以一切都是需要靠开发者进行手动管理的。
删除无用字体