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