1、基礎(chǔ)知識(shí):
1.1 apk結(jié)構(gòu)
lib :存放so文件,對(duì)應(yīng)不同的cpu架構(gòu)
res :資源文件,layout、drawable等,經(jīng)過(guò)aapt編譯
assets :資源文件,不經(jīng)過(guò)aapt編譯
classes.dex :dx編譯后的java文件,可執(zhí)行文件,可以直接在Android系統(tǒng)中運(yùn)行
resources.arsc :二進(jìn)制資源文件,經(jīng)過(guò)aapt打包res目錄下的文件后生成的文件
META-INF :簽名信息相關(guān)文件
CERT.RSA :簽名文件,存放公鑰和加密算法描述
CERT.SF :摘要加密,存放加密文件,是使用私鑰對(duì)摘要明文加密后得到的密文信息,只有使用與私鑰配對(duì)的公鑰才能解密該文件
MANIFEST.MF :文件摘要,存放程序清單文件,包含包中所有文件的摘要明文
AndroidManifest.xml :清單文件,包含組件的聲明和配置
kotlin :編譯后的kotlin文件
1.2 apk打包流程
精簡(jiǎn):資源文件、Java文件 > dex文件 > APK
2、優(yōu)化方案
2.1 常規(guī)操作
2.1.1 圖片體積壓縮
1)tinypng壓縮工具,在線壓縮、AS插件
2)Webp格式,png格式轉(zhuǎn)Webp格式,AS支持一鍵轉(zhuǎn)換
3)圖片著色器
針對(duì)相同圖片不同顏色的處理,原本使用兩個(gè)icon切換,可以使用android:tint=""代替
<ImageView
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@drawable/img_fallback"
android:tint="@color/color_000000_FFFFFF"/>
2.1.2 開啟混淆
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
注意:minifyEnabled true 默認(rèn)啟用R8代碼縮減功能,慎用R8,會(huì)忽略視圖修改默認(rèn)優(yōu)化行為的所有ProGuard規(guī)則,如:-optimizations 和 -optimizationpasses
解決方案:開啟混淆,但不啟用R8
android.enableR8=false
android.enableR8.libraries=false
2.1.3 資源縮減
1)Lint檢測(cè)工具
- 檢測(cè)無(wú)用的資源文件
AS Analyze -> Run Inspection by Name -> Unused resources
注意:這種方式不一定準(zhǔn)確,如:有些圖片,SDK有引用,但是在本地代碼中檢測(cè)不出來(lái)引用的地方。
檢測(cè)結(jié)果:
- 檢測(cè)
2)資源文件縮減
假如一些資源文件不確實(shí)是否還在使用,或者不確定需求是否變更,不敢刪除,先留著。這情況可以使用shrinkResources來(lái)縮減資源。
buildTypes {
release {
minifyEnabled true // 開啟混淆
shrinkResources true // 資源縮減
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
注意:要配合minifyEnabled一起使用,原理:先代碼移除,然后引用的資源變成無(wú)用,才可以進(jìn)一步縮減。
3)so文件縮減
一般集成第三方SDK時(shí),會(huì)提供各種架構(gòu)的so文件,可以做相應(yīng)的剔除
- 目前市面上手機(jī)cpu架構(gòu)以arm架構(gòu)為主,所以只保留arm的一種so文件即可,armeabi、armeabi-v7a的可直接刪除
- 如果需要模擬器調(diào)試,可以加上x86架構(gòu)
android {
defaultConfig {
ndk {
abiFilters 'armeabi-v7a'
}
}
}
4)移除未使用的備用資源
- 多語(yǔ)言項(xiàng)目,配置支持的語(yǔ)言
defaultConfig {
resConfigs("en", "zh", "zh-rCN")
}
- 資源文件,限制使用的目錄
defaultConfig {
resConfigs("xxhdpi", "xxxhdpi")
}
2.2 進(jìn)階
2.2.1 resources資源混淆
資源混淆就是將原本冗長(zhǎng)的資源路徑變短,如:res/drawable/abc 變成 r/d/a。開源工具AndResGuard
2.2.2 ReDex
dex文件是打包中的產(chǎn)物,redex是facebook開源的分包優(yōu)化方案。
2.2.3 so動(dòng)態(tài)加載
so文件按需加載,利用插件化的思想。
注意:風(fēng)險(xiǎn)大,要考慮周全,如:下載時(shí)機(jī)、網(wǎng)絡(luò)環(huán)境、加載失敗后的策略。
2.2.4 插件化
按需加載
2.3 高級(jí)
2.3.1 圖片網(wǎng)絡(luò)化
將圖片放到服務(wù)器,通過(guò)動(dòng)態(tài)下載的方式減小apk體積。
弊端:首次加載圖片,依賴網(wǎng)絡(luò)環(huán)境
注意:如果比較在意流量、加載速度,需要權(quán)衡
2.3.2 原生 -> H5
如促銷活動(dòng),需要加載大量圖片,且原生不夠動(dòng)態(tài)化,可以使用H5來(lái)實(shí)現(xiàn)
2.3.3 修改第三方庫(kù),剔除不需要的代碼
對(duì)于引用的第三方庫(kù),往往只是用到了其中某一兩項(xiàng)功能,對(duì)于多余的功能,可以考慮剔除。
注意:版本升級(jí)的時(shí)候,要注意
2.3.4 DebugItem
DebugItem里主要包含兩種信息:
- 調(diào)試信息,函數(shù)的參數(shù)變量和所以的局部變量
- 排查問(wèn)題信息,所有的指令集行號(hào)和源文件行號(hào)的對(duì)應(yīng)關(guān)系
注意:去除debug信息和行號(hào)信息,不是極致,不推薦
2.3.5 R Field內(nèi)聯(lián)
可以解決R文件過(guò)多導(dǎo)致MultiDex 65535的問(wèn)題,進(jìn)一步對(duì)代碼瘦身,
參考:字節(jié)的shrink-r-plugin,滴滴的booster
2.3.6 減少ENUM使用
每減少一個(gè)ENUM,大約可以減少1-1.4kb的大小文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-643634.html
3、總結(jié)
任重道遠(yuǎn) …文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-643634.html
到了這里,關(guān)于Android APK體積優(yōu)化(瘦身)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!