瘦身的理由:
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"
}