作为应用的使用者而言,apk的体积越小当然是越喜欢的。这样不仅能节省手机的存储空间,并且在应用市场下载的速度也快加快。所以,对于开发者来说,了解常用的apk瘦身技术是不可避免的。
一、图片瘦身
1、webP使用
先看一张截图
原始图片为png格式,大小为38.5kb,经过转换后大小为6.7kb,仅仅是原图的17%。但是使用webP要求手机最低支持版本为api18 计版本4.3。如果你需要从4.0版本开始,就不用了考虑方式了,高于4.3版本,这样图片格式应该优先选择。
webP批量转换工具下载地址:谷歌官网webp转换工具需要翻墙。其他方式可以自行百度。
2、png压缩
png图片相当于jpg图片多了透明通道,所以它会占用更大的内存,可以借助工具对它压缩
- 可以采用ImageOptim或者Pngyu对png进行压缩;
- aapt会使用内置的压缩算法来优化res/drawable/目录吓的PNG图片,单也可能会导致本来已经优化过的图片体积变大,这里需要禁用aapt优化png图片。
aaptOptions{
cruncherEnabled = false
}
3、jpg压缩
使用packJPG或者guetzli工具压缩jpg图片。
4、使用shape
对于纯色背景可以使用shape替换,萌购用代码实现的,尽量用代码实现
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="0dp"/>
<solid android:color="#f00"/>
</shape>
二、res资源压缩
1、开启代码混淆和去除无用资源
buildTypes {
release {
shrinkResources true
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
2、使用微信开源框架AndResGuard工具,对资源进一步混淆
配置参考github,微信AndResGuard资源混淆。
三、冗余代码优化
- 使用工具,可以使用PMD等
- 下载PMD 地址:pmd代码冗余检测下载地址。
- 配置及使用截图如下,可以根据官方指导
四、Lint使用
打开android studio。依次选择 Analyze-》Run Inspection By Name-》输入要检测的内容。
比如检测无用资源,输入unused resources
比如检测无用代码,输入unused declaration
五、其他优化
1、压缩存储文件
比如存放在assets下的文件可以采用7Zip压缩,在使用的时候进行解压。
2、语言资源优化
在build.gradle中配置指定需要的语言类型
defaultConfig {
...
...
// 只保留指定和默认资源 ,中文和英文
//当应用不需要支持几十种语言时,可以通过配置 resConfigs 去除无用的语言资源。
resConfigs('zh-rCN', 'en')
}
3、指定abi
defaultConfig {
...
...
ndk{
abiFilter("armeabi-v7a","x86")
}
}
4、减少Enum使用
没减少一个Enum的使用,可以减少1KB的大小,可以使用定义常量的替换方式。
六、split
使用split拆分包。比如我们的项目中在mdpi、hdpi、xhdpi…都有一份图片,当然这样做就是为了适配不同的屏幕尺寸,防止图片变形。但是如果我们需要对特定的屏幕尺寸,我们可能就只需要一个目录下的图片,这样就需要借助split了。如下,根据分辨率进行适配
android {
...
splits {
density {
enable true
exclude "ldpi", "hdpi", "xxxhdpi"
compatibleScreens 'small', 'normal', 'large', 'xlarge'
}
}
...
}
- exclude :包含的资源目录
- compatibleScreens :适配的屏幕尺寸
除了能够适配资源外,还可以根据支持cpu架构的so进行拆分。 如果你的apk中引入了第三方库比如推送类的服务,demo中一般会提供不同cpu架构的so库,我们一般的做法是把所有的so都放到libs下,这样做发现apk的体积瞬间暴涨。这样就需要使用split了。
android {
...
splits {
abi {
enable true
reset()
include 'x86', 'armeabi-v7a', 'mips'
universalApk true
}
}
}
七、总结:
针对以上优化,优化效率最高的应该是图片的压缩,所以图片的选择对于apk的大小影响很大。另外第三方库,so库的合理使用同样影响它的体积。针对混淆能够避免我们的代码没有那么容易被别人窃取。