本文記錄自己之前做的一些apk瘦身措施叁巨,都是在網上搜索整理的通用方法
依據(jù)官方文檔進行瘦身
參考文章:
壓縮代碼和資源
- 啟用代碼壓縮
build.gradle文件中添加如下類似片段:
android {
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
}
...
}
每次構建后ProGuard 都會輸出下表的文件。它們都保存在 <module-name>/build/outputs/mapping/release/目錄下蛆楞。
文件名 | 作用 |
---|---|
dump.txt | APK 中所有類文件的內部結構 |
mapping.txt | 提供原始與混淆過的類、方法和字段名稱之間的轉換 |
seeds.txt | 列出未進行混淆的類和成員 |
usage.txt | 列出從 APK 移除的代碼 |
- 壓縮資源
壓縮資源將shrinkResources 屬性設置為 true即可傅蹂。gradle片段如下:
android {
...
buildTypes {
release {
shrinkResources true
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
}
}
通過以上方式兵迅,apk降低至35967969KB,減少了約1M的大小松嘶。
PS.
之前項目采用過該方式,但發(fā)現(xiàn)打開shrinkResources后挎扰,出現(xiàn)了OOM增多的現(xiàn)象翠订。雖然沒有明確與shrinkResources相關,但推測相關性極大遵倦。后續(xù)重新開啟shrinkResources后尽超,需要多做測試,先灰度小部分用戶梧躺,觀察反饋日志橙弱。在決定是否全面開啟。
利用AndResGuard瘦身
參考文章:
- Android資源混淆AndResGuard使用說明
-
安裝包立減1M--微信Android資源混淆打包工具
該方案出自微信燥狰,gradle配置微信也提供了棘脐,具體如下:
apply plugin: 'AndResGuard'
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.10'
}
}
andResGuard {
// mappingFile = file("./resource_mapping.txt")
mappingFile = null
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.10'
//path = "/usr/local/bin/7za"
}
/**
* 可選: 如果不設置則會默認覆蓋assemble輸出的apk
**/
// finalApkBackupPath = "${project.rootDir}/final.apk"
/**
* 可選: 指定v1簽名時生成jar文件的摘要算法
* 默認值為“SHA-1”
**/
// digestalg = "SHA-256"
}
通過該方式蛀缝,在官方文檔進行瘦身的基礎上apk大小減少至33552298KB,約32M目代。減少了2M屈梁,效果比較明顯。
so庫分離瘦身
參考文章:
Build Multiple APKs
Android芯片架構有多種榛了,常見的如x86,arm,arm64等在讶。如果apk本身依賴so庫,那么這些so庫勢必要適配多種芯片架構霜大,這些支持不同芯片的so庫往往會一起打包到apk中發(fā)布出去构哺。這就導致了so庫冗余。因此做到so庫分離打包也是apk瘦身的一種方案战坤。
gradle片段如下:
android{
...
splits {
abi {
enable true
reset()
include "x86", "armeabi-v7a", "arm64-v8a"
// Specifies that we do not want to also generate a universal APK that includes all ABIs.
universalApk false
}
}
}
這種方式如果so庫本身比較大曙强,瘦身效果明顯。應用減少到了26929590kb途茫,約26M.
壓縮圖片資源
參考文章:
Create WebP Images
PNG 圖片壓縮對比分析
android打包本身會對png進行無損壓縮碟嘴,而圖片資源是apk"肥胖"的一大原因。
依據(jù)官方提供的WebP image壓縮指南囊卜,可非常方便的在AS內進行壓縮圖片操作娜扇。
操作步驟如下圖:
最終AS會將原有的png圖片進行刪除错沃,保留壓縮后的webp.
通過該方案apk減小到26284239kb,約25M雀瓢,在之前的基礎上減小了1M大小捎废。
另外還有tinypng跟pngquant壓縮方案,但它們在批量處理時都需要自己提供封裝調用方法致燥。如果感覺AS 提供的webp壓縮方案無法滿足要求,可以在選擇這兩種方案排截。