Android Apk瘦身实践
App增加新功能的时,打出apk文件,对比上一个版本,总是会发现增加了不少的体积。有时增加的比较多,就需要考虑给apk减少体积。下面就介绍如何减少apk的体积。
第一条:开启minifyEnabled混淆
在module的build.gradle文件中,开始混淆代码(开启混淆是减少字节最直接的方式,同时也能保护代码被剽窃)。如:
android {
defaultConfig {
minifyEnabled true
...
}
}
第二条:开启shrinkResources去除无用资源
因为有多个版本的迭代,可能会导致项目中会有不用的资源文件,因为时间的原因也不能一一找出去除,这是可以使用如下代码,过滤不使用的资源,减少apk的体积。
android {
defaultConfig {
...
shrinkResources true
}
}
开启shrinkResources压缩资源后,如果反射获取某个资源时,会导致异常。如果需要保持这个资源可以在res/raw/
目录下创建一个keep.xml
文件,如:
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
tools:shrinkMode="safe"
tools:discard="@layout/dialog_*,@drawable/close"
tools:keep="@layout/activity_*,@layout/fragment_*,@drawable/close" />
keep.xml中有3个属性,分别是:
- shrinkMode:压缩模式,分为safe
, strick
- discard:丢弃(移除)资源,中间使用逗号隔开。
- keep:保留资源,中间使用逗号隔开
第三条:过滤不需要使用的语言资源
在有些lib项目中可能会包含多语言的资源,而module项目不需要使用这些资源,那么可以使用如下代码:
android {
defaultConfig {
...
resConfigs "en","zh" //只使用en和zh资源
}
}
第四条:过滤不需要打包的屏幕分辨率下的资源
在module项目中,有多个drawable目录,但是我们的用户的分辨率是xhdpi级以上的,我们可以过滤低分辨率的资源(有时UI会每个分辨率都给,然后就不自觉的放进去了)。
android {
defaultConfig {
...
resConfigs "xhdpi","xxhdpi" //只支持xhdpi和xxhdpi屏幕的资源
}
}
第五条:过滤不需要的so文件
引用第三方的lib库或aar,lib库中包含各种so文件,然而我们的APP只支持arm架构的so,那么我们可以通过下面代码过滤:
android { //剔除aar包多余的依赖,保留arm的so packagingOptions { exclude 'lib/x86/*' exclude 'lib/x86_64/*' exclude 'lib/mips/*' exclude 'lib/mips64/*' } }
当项目中使用jni代码,我们只需要arm架构的so,我们可以:
android{ defaultConfig { ndk{ moduleName "module_name" ldLibs "log", "z", "m", "jnigraphics", "android" abiFilters "armeabi" // "x86","mips" cFlags "-std=c++11 -fexceptions" stl "gnustl_static" } } }
第六条:使用provided编译
provided依赖的库是在编译时期引用,是不会真正打包到apk中的,从而可以控制apk的大小。
第七条:避免使用重复的库
compile('com.facebook.android:audience-network-sdk:4.23.0', {
exclude group: 'com.android.support', module: 'appcompat-v7'// 因为项目引用了v7包,这里排除第三方库的v7包,避免重复
})
compile('com.google.firebase:firebase-ads:9.6.1', {
exclude group: 'com.android.support' // 因为项目引用了v7包,这里排除第三方库的v7包,避免重复
})
第八条:使用shape资源和layer-list的xml文件来推掉图片资源
第九条:使用压缩图片的工具tinypng压缩png图片
Tinypng使用智能有损压缩技术,以尽量少的失真换来图片大小的锐减,效果非常好,强烈推荐。
第十条:可以使用jpg格式图片,减少apk体积。
对于引导页面的图片,尺寸是比较大的,这是我们可以使用jpg的图片来替代,减少apk的体积。
第十一条:使用多个小图来替代大图
相信各位都非常清楚,大的图片是多么的令人头疼,不仅仅是让apk的体积增大,还容易导致OOM的问题。所以如果能拆成多个小图使用布局拼接,尽量采取这种方式。
第十二条:使用微信资源压缩打包工具
微信资源压缩打包工具通过短资源名称,采用7zip对APP进行极致压缩实现减小APP的目标,效果非常的好。
除此之外,代码的复用性也非常重要。