本文主要从编译,图片压缩,平台等方面对App集成sdk后所带来的增量的减小优化方案进行分析。
清除无用代码和资源
-
Code Shrinking, 代码混淆,清除无用的代码
混淆可以删除一些没用的类,字段,方法和一些属性,包括我们引入的一些其它库,同时混淆器也优化了字节码,移除了一些用不到的字节码指令,并且用了更短的名称混淆了留下来的一些类的名称,字段名称和方法名称。
要想混淆你的代码,首先在你app的build.gradle文件中加入如下代码
android {
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile(‘proguard-android.txt'),
'proguard-rules.pro'
}
}
...
}
其中proguard-android.txt为系统SDK默认的混淆规则,在proguard-rules.pro文件中编辑你的混淆规则。
官方文档的提供了一点:
To add more ProGuard rules that are specific to each build variant, add another proguardFiles property in the corresponding productFlavor block.
具体到编译变量
这个目前没有试,官方给了个例子:
android {
...
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
}
productFlavors {
flavor1 {
}
flavor2 {
proguardFile 'flavor2-rules.pro'
}
}
}
这样flavor2总共用了三个混淆规则。
-
Resource Shringking 清除无用资源
无用的代码清除完之后,就会有很多无用的资源文件残留,在build.gradle文件中设置shrinkResources为true.
android {
...
buildTypes {
release {
shrinkResources true
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
}s
}
-
清除为使用的可替代资源
上面的Gradle resource shrinker只是删除掉代码中为引用的资源文件,但意味着不会删除不同配置设备的可替代资源,例如项目中依赖的v7、v4中包含的20种国家的语言,有很多都用不到,可以通过设置resconfigs删除这些可替代的资源文件:
android {
defaultConfig {
...
resConfigs "en"
}
}
图片压缩
apk中最占资源之一的就是这些资源图片了,而且一张稍微大点的图片,不但占空间,在差的手机上经常会出现OOM,
- WebP谷歌提供的一种图片数据格式,无损压缩后的 WebP 比 PNG 文件少了 45% 的文件大小,原生支持Android4.0以上的,其他版本需要官方的依赖库。
-
矢量图SVG
:一个字体TextView代替一张资源文件
目前只试过矢量图
使用Splits针对不同的设备编译不同的apk
- 针对不同的屏幕进行拆分
针对不同密度的屏幕,同一个应用程序拆分为hdpi版本和mdpi版本
android {
...
splits {
//Configures screen density split settings
density {
//Enables density APK splits
enable true
/*Specifies a list of screen densities Gradle should not create APK splits for**/
exclude "ldpi", "tvdpi", "xxxhdpi"
/** Specifies a list of compatible screen size settings for the manifest**/
compatibleScreens 'small', 'normal', 'large', 'xlarge'
}
}
构建完成后可以在out/apk/目录下看到多个版本的APK
- 针对不同的CPU进行拆分
按ABI拆分,根据不同的CPU类型,只用相应的.so库,之前测试的时候是只用的一个v7a的兼容的so库。
android {
...
splits {
// Configures screen ABI split settings
abi {
// Enable ABI APK splits
enable true
// By default all ABIs are included, so use reset() and include to specify that we only
// want APKs for x86, armeabi-v7a, and mips
// Resets the list of ABIs that Gradle should create APKs for to none
reset()
// Specifies a list of ABIs that Gradle should create APKs for
include "x86", "armeabi-v7a", "mips"
// Specify that we do not want to also generate a universal APK that includes all ABIs
universalApk false
}
}
}
其它
...
参考文献: