Android性能优化之安装包性能优化

1 res资源优化

(1)只使用一套图片,使用高分辨率的图片。
(2)UI设计在ps安装TinyPNG插件,对图片进行无损压缩。
(3)svg图片:一些图片的描述,牺牲CPU的计算能力的,节省空间。使用的原则:简单的图标。
(4)图片使用WebP(https://developers.google.com/speed/webp/)的格式(Facebook、腾讯、淘宝在用。)缺点:加载相比于PNG要慢很多。 但是配置比较高。工具:http://isparta.github.io/
(5)使用tintcolor(android - Change drawable color programmatically)实现按钮反选效果。

2 代码优化

(1)实现功能模块的逻辑简化
(2)Lint工具检查无用文件将无用的资源列在“UnusedResources: Unused resources”,删除。
(3)移除无用的依赖库。
(4)使用第三方库是否值得。

3 lib资源优化

(1)动态下载的资源。
(2)一些模块的插件化动态添加。
(3)so文件的剪裁和压缩。

4 assets资源优化

(1)音频文件最好使用有损压缩的格式,比如采用opus、mp3等格式,但是最好不要使用无损压缩的音乐格式
(2)对ttf字体文件压缩,可以采用FontCreator工具只提取出你需要的文字。比如在做日期显示时,其实只需要数字字体,但是使用原有的字体库可能需要10MB大小,如果只是把你需要的字体提取出来生成的字体文件只有10KB。

5 Proguard混淆加固

5.1 概念

资源混淆简单来说希望实现将res/drawable/icon,png变成res/drawable/a.png,或我们甚至可以将文件路径也同时混淆,改成r/s/a.png。

注意:此时的混淆在AS自带的混淆做完后再压缩混淆。AS自带的混淆是做代码内容的混淆,我们这个混淆是文件名。

5.2 apk编译原理

5.2.1 编译原理图

Android性能优化之安装包性能优化_第1张图片

Android应用程序主要由两部分内容组成:代码和资源。资源主要就是指那些与UI相关的东西,例如UI布局、字符串和图片等。代码和资源分开可以使得应用程序在运行时根据实际需要来组织UI。这样就可使得应用程序只需要编译一次,就可以支持不同的UI布局。这种特性使得应用程序在运行时可以适应不同的屏幕大小和密度,以及不同的国家和语言等。

5.2.2 aapt编译

aapt即Android Asset Packaging Tool,在SDK的build-tools目录下。该工具可以查看,创建, 更新ZIP格式的文档附件(zip, jar, apk)。也可将资源文件编译成二进制文件。

Android性能优化之安装包性能优化_第2张图片

通过图我们就可以看出:
A. 除了assets和res/raw资源被原装不动地打包进APK之外,其它的资源都会被编译或者处理。
B. 除了assets资源之外,其它的资源都会被赋予一个资源ID。
C. 打包工具负责编译和打包资源,编译完成之后,会生成一个resources.arsc文件和一个R.java,前者保存的是一个资源索引表,后者定义了各个资源ID常量。
D. 应用程序配置文件AndroidManifest.xml同样会被编译成二进制的XML文件,然后再打包到APK里面去。
E. 应用程序在运行时通过AssetManager来访问资源,或通过资源ID来访问,或通过文件名来访问。

其中resources.arsc文件,这个文件记录了所有的应用程序资源目录的信息,包括每一个资源名称、类型、值、ID以及所配置的维度信息。我们可以将这个resources.arsc文件想象成是一个资源索引表,这个资源索引表在给定资源ID和设备配置信息的情况下,能够在应用程序的资源目录中快速地找到最匹配的资源。

5.2.3 resources.arsc文件解析

(1)Resource.arsc文件格式图

Android性能优化之安装包性能优化_第3张图片

resources.arsc一共有五种chunk类型,分别为TYPETABLE,TYPEPACKAGE,TYPE_STRING ,TYPETYPE,TYPECONFIG。

—table,是整个reousces table的开始,它的chunksize即是整个文件的大小。
—package,指的是一个package的开始,其实在resources,arsc是可以有多个package的。而packageID即是资源resID的最高八位,一般来说系统android的是1(0x01),普通的例如com.tencent.mm会是127(0x7f),剩下的是从2开始起步。当然这个我们在aapt也是可以指定的(1-127即八位的合法空间,一些混合编译就是改这个packageID)。
—string, 代表stringblock,我们一共有三种类型的stringblock。分别是table stringblock,typename stringblock, specsname stringblock。
—type,这里讲的是typename stringblock里面我们用到的各种type(用到多少种类型的type,就有多少个type chunk),例如attr, drawable, layout, id, color, anim等,Type ID是紧跟着Package ID。
—config, 即是Android用来描述资源维度,例如横竖屏,屏幕密度,语言等。对于每一种type,它定义了多少种config,它后面就紧跟着多少个config chunk,例如我们定义了drawable-mdpi,drawable-hdpi,那后面就会有两个config。

将Resource.arsc文件部分内容读出显示如下:

Android性能优化之安装包性能优化_第4张图片

(2)resources文件名混淆前后对比

Android性能优化之安装包性能优化_第5张图片

5.3 混淆过程

系统编译完成apk文件以后:
映射关系:res/drawable/ic_launcher.png —– > 0x7f020000

再做“混淆”:要实现将res/drawable/ic_launcher.png图片改成a.png
drawable文件的名字
String文件的名字
layout的名字
比如:R.string.description—>R.string.a
res/drawable/ic_launcher.png图片改成a.png

还可以更加夸张
res/drawable—>r/d
res/value–>r/v
res/drawable/ic_launcher.png图片改成r/d/a.png

读取resources.arsc二进制文件,然后修改某一段一段的字节。
有一段叫做:res/drawable/ic_launcher.png 在自己数组当中的第800位-810位
将这一段第800位-810位替换成改成r/d/a.png 的字节码。

6 与7z极限压缩结合

强制压缩类似resources.arsc、png、jpg等Android默认不会打包压缩的文件。混淆–>压缩–>重打包。

6.1 混淆压缩步骤

6.1.1 配置Config.xml的签名文件

Android性能优化之安装包性能优化_第6张图片

6.1.2 运行步骤

在dn_android_resproguard项目上(Main.java)右键–>Run as—>RunConfiguration,选择Arguments,在Program arguments里面填写如下:

Lsn10SearchView.apk -config config.xml -7zip 7za.exe -out outapk -mapping xxx/yyy.txt
//或者
Lsn10SearchView.apk -config config.xml -out outapk -7zip 7za.exe
//或者
Lsn10SearchView.apk -config config.xml -7zip 7za.exe

实现如图所示:
Android性能优化之安装包性能优化_第7张图片

6.1.3 输出结果

(1)压缩空间:1148-921=227kb(20%)
Android性能优化之安装包性能优化_第8张图片

(2)压缩后apk安装包说明
Android性能优化之安装包性能优化_第9张图片

6.1.4 混淆压缩对比

(1)混淆压缩前

Android性能优化之安装包性能优化_第10张图片
Android性能优化之安装包性能优化_第11张图片
Android性能优化之安装包性能优化_第12张图片

(2)混淆压缩后

Android性能优化之安装包性能优化_第13张图片
Android性能优化之安装包性能优化_第14张图片
Android性能优化之安装包性能优化_第15张图片

7 微信Android资源混淆打包工具方案

实现方式类似,原理类似。

微信Android资源混淆打包工具,如何让应用安装包立减1M

Mac下使用微信Android资源混淆打包工具

想让你的资源文件被混淆吗?快来试试AndResGuard吧

8 参考链接

如何优化Android/iOS应用安装包大小?

Android逆向之旅—反编译利器Apktool和Jadx源码分析以及错误纠正

你可能感兴趣的:(性能优化)