apk优化方案
1、采用SVG
不会因为缩放影响图片质量下降,同时可节约内存,常用用于简单图标,svg由xml定义,标准的svg是以<svg>为根节点,在Android中是以<vector>为根节点,需要进行转化,通过new->Vector Asset
https://developer.android.google.cn/studio/write/vector-asset-studio.html
//支持使用support-v7兼容
vectorDrawables.useSupportLibrary = true
//指定svg图片生成的不同密度类型
vectorDrawables.generatedDensities('xhdpi', 'xxhdpi')
在布局里 采用 app:srcCompat="@drawable/apple_aire"引用
2、使用tint着色器,进行上色,tint可以让图片变色,只需一张图片来显示不同颜色,能够减小apk体积,此外可以用在selector点击效果上
3、资源打包配置,resource.asrc 包含大量国际化资源,可保留知道和默认资源,string.xml中的描述都会翻译为不同国家的语言,可在指定某种语言和默认,譬如中文,在defaultConfig里进行resConfigs('zh-rCN')
4、动态库的打包配置,对so的库的指定,so文件比较大,影响apk体积明显,由于所有的x86/x86_64/armeabi-v7a/arm64-v8a设备都支持armeabi架构的.so文件,因此似乎移除其他ABIs的.so文件可以很明显减少APK大小,但事实上并会影响到函数库的性能和兼容性。 反编译某几个大厂的apk可以看到大家确实用了这个方法,所以可以用用,但是要在不同机子上进行测试看情况,来处理
5、移除无用资源(建议这类操作先来个备份,再删除)
一键移除 Refactor->Remove Unused Resources(此方法不建议,因为使用动态id资源或反射获取资源会出问题,系统不会检测出该资源被使用 也会被删除,)
https://developer.android.google.cn/studio/build/shrink-code
推荐使用Analyze->Run Inspection by Name->Unused Resources进行移除无用资源,
6、代码混淆
7、开启资源压缩 shrinkResources true 开启后 并不是删除掉,而是在打包过中,对未使用的资源进行特殊处理,一种占位,譬如,a.xml写了很多控件但未被使用,在打包后,它依然存在,但是a.xml基本为空内容,图片资源也类似 会做特殊压缩处理, 从而导致降低apk体积
8、资源混淆和7zip压缩 减小apk的大小,增加破解难度
通过resource.arsc文件格式,混淆步骤:1 解析resource.arsc文件(主要为全局与资源名称字符串池);2 修改字符串池中的字符串,用以无意义的a b c等替换; 3 修改apk中res目录资源文件名称;4 打包7zip,对齐,签名处理;
https://github.com/shwenzhang/AndResGuard
9、webp 采用webp图片,好处质量影响小 同时压缩效果明显
在Android 4.0(API level 14)中支持有损的WebP图像,在Android 4.3(API level 18)和更高版本中支持无损和透明的WebP图像
android {
compileSdkVersion 28
buildToolsVersion "29.0.0"
defaultConfig {
applicationId "com.superdesk.apptool"
minSdkVersion 19
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
//https://developer.android.google.cn/studio/write/vector-asset-studio.html
//指定svg图片生成的不同密度类型
// vectorDrawables.generatedDensities('xhdpi','xxhdpi','xxxhdpi')
//支持使用support-v7兼容
vectorDrawables.useSupportLibrary = true
//只保留指定和默认的资源, string.xml国际化语言很多种,根据实际使用范围,指定所需语言即可
resConfigs('zh-rCN')
//配置so库cpu架构
ndk {
abiFilter('armeabi')
}
flavorDimensions "default"
}
buildTypes {
debug {
minifyEnabled true
//开启资源压缩混淆
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
release {
//代码压缩 代码压缩通过 ProGuard 提供,ProGuard 会检测和移除封装应用中未使用的类、字段、方法和属性,
// 包括自带代码库中的未使用项(这使其成为以变通方式解决 64k 引用限制的有用工具)。ProGuard 还可优化字节码,
// 移除未使用的代码指令,以及用短名称混淆其余的类、字段和方法。混淆过的代码可令您的 APK 难以被逆向工程
minifyEnabled true
//开启资源压缩混淆
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
//修改资源id 更改appt源码,编译器修改pp段(资源id是由8位16进制数表示,表示为0xPPTTNNNNPP段)
aaptOptions {
additionalParameters "--allow-reserved-package-id", "--package-id", " 0x50"
}
//将so库 打包到apk中
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
//改applicationId
productFlavors {
free {
applicationIdSuffix ".free"
}
pro {
applicationIdSuffix ".pro"
}
}
}
10、扫描重复代码,进行处理Simian工具
下载地址http://www.harukizaemon.com/simian/get_it_now.html
java -jar simian-2.5.10.jar -ignoreVariableNames+ -threshold=5 H:\as_project\xxx\src\main\**.java>>E:\soft_tool\simian-2.5.10\bin\duplication.txt
-ignoreVariableNames+ 表示忽略变量名,+号表示要添加这个属性,-号表示不添加这个属性(也可以不写);
-threshold=10 表示10行以上的重复才统计;