瘦身的理由:
1、安装包变大,导致很多用户不愿意安装更新
2、安装包变大,导致新用户不愿意下载
3、安装包变大,流量使用增多,增加其他边际成本
图片优化:
使用矢量图片
矢量图片只需要放置一份
2、图片如果比较大,绘制的时候会很长,制作复杂度高
使用WebP
体积更小,4.2.1+支持透明度
使用png
有透明度,渐变,阴影的情况下选择png
png转WebP
Android Studio 选中图片-> 右键 ->convert to webp 即可
png转WebP的压缩比是很大的
WebP转换方式
采用转换工具
PNG压缩
采用压缩工具对png进行压缩
1、可以采用ImageOptim或者Pngyu对png进行压缩
2、AAPT会使用内置的压缩算法来优化res/drawable目录下的PNG图片,但也可能会导致本来已经优化过的图片体积变大,这里禁用aapt优化PNG图片
aaptOptions{
cruncherEnabled = false
}
png和jpg图片可以采用这个网站来压缩
其他图片优化
纯色图片代码实现
减少图片资源放置份数
放置xhdip,xxhdpi -如果只放一份会有什么问题
能用代码实现的图片尽量采用代码实现
圆形图片、环形图片,渐变等都可以采用代码实现
开启资源压缩
开启代码混淆与去除无用资源
android{
...
buildTypes {
release {
shrinkResources true
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
进一步资源混淆
微信开源了AndResGuard工具,对资源进一步混淆
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.3.2'
classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.0'
}
}
andResGuard {
// mappingFile = file("./resource_mapping.txt")
mappingFile = null
// 当你使用v2签名的时候,7zip压缩是无法生效的。
use7zip = true
useSign = true
// 打开这个开关,会keep住所有资源的原始路径,只混淆资源的名字
keepRoot = false
//保留不被混淆的资源文件
whiteList = [
// for your icon
"R.drawable.icon",
// for fabric
"R.string.com.crashlytics.*",
// for google-services
"R.string.google_app_id",
"R.string.gcm_defaultSenderId",
"R.string.default_web_client_id",
"R.string.ga_trackingId",
"R.string.firebase_database_url",
"R.string.google_api_key",
"R.string.google_crash_reporting_api_key"
]
compressFilePattern = [
"*.png",
"*.jpg",
"*.jpeg",
"*.gif",
"resources.arsc"
]
sevenzip {
artifact = 'com.tencent.mm:SevenZip:1.2.7'
//path = "/usr/local/bin/7za"
}
/**
* 可选: 如果不设置则会默认覆盖assemble输出的apk
**/
finalApkBackupPath = "${project.rootDir}/final.apk"
/**
* 可选: 指定v1签名时生成jar文件的摘要算法
* 默认值为“SHA1”
**/
digestalg = "SHA256"
}
冗余代码
产生的原因:
1、复制、粘贴
2、对项目不了解
冗余代码的定义:
- 完全一致的代码或者只修改了空格和评论
- 结构和句法上一致的代码,例如只修改了变量名
- 插入和删除了部分代码
- 功能和逻辑上一致的代码,语义上的拷贝
检测工具
1、使用工具,例如PMD
2、PMD下载地址:https://pmd.github.io/
如何检测
下载后输入:
./run.sh cpdgui
pmd -d /usr/src -R rulesets/java/quickstart.xml -f text
https://pmd.github.io/pmd-6.17.0/pmd_rules_java.html
Lint大法
未使用资源
1、检测未使用的资源并删除
2、Android Studio ->Analyze ->Run inspection by Name -> unused resource
无用代码优化
Analyze->Run Inspection by Name->unused declaration ->Moudule app ->OK
其他lint优化
压缩存储文件
1、导入7zip,压缩存储预置资源
2、使用时,解压到本地,比如assert中的资源
语言资源优化
在build配置中配置resConfigs指定需要的语言类型
defaultConfig{
resConfigs "zh","en"
}
```
#### Splits根据不同的ABI以及不同的屏幕密度分别打包
https://developer.android.com/studio/build/configure-apk-splits.html
#### 重复的String,color的优化
1 、过滤重复的String
2、定义唯一的color名
#### 减少Enum使用
每减少一个ENUM文件可以减少1K左右的大小
**采用常量定义**
#### 优化引用的库
> 去除不再使用的库
优化过时的库
仅仅提取使用的代码
选用更小的外部库
#### 音频资源压缩
采用音频压缩工具,压缩音频,降低采样率,通道数等在不明显影响效果的前提下压缩音频
#### So动态下发
So可以采用动态下方的方式加载。(需要考虑下载失败了怎么办?)
仅仅只需要加载对应abi下的so
指定abi
Gradle中指定abiFilter
ndk{
abiFilters "armeabi-v7a","x86"
}