?
推薦閱讀:
滴滴Booster移動App質量優化框架-學習之旅 一
Android 模塊Api化演練
不一樣視角的Glide剖析(一)
?
滴滴Booster移動App質量優化框架-學習之旅 二對重復資源優化和無用資源優化進行了討論。這里對不可編譯無用assets資源優化進行討論。
?
先看微信Matrix-ApkChecker是怎樣檢索對無用assets資源。ApkCheckers是針對 android 安裝包的分析檢測工具,反匯編apk包中dex文件,在內存生產smali相關數據,檢索??const-string 指令 line,根據const-string指令 后面字符串常量值 與 assets資源名是否相等,找出usedAssetsResouces,比如:
//如果 能在assets文件夾booster_demo_1.png //則booster_demo_1.png為usedAssetsResources const-string v0, "booster_demo_1.png"
?
反匯編dex使用了如下兩個jar包:
implementation "org.smali:smali:2.2.7" implementation "org.smali:baksmali:2.2.7"
?
不過這種方式只能粗略的檢索出來,比如使用三方圖片加載庫,是鑒別不了的,比如使用Glide加載assets中圖片:
val url = "file:///android_asset/booster_demo_1.png" Glide.with(context).load(url).into(holder.image)
?
在構建過程中進行無用assets資源優化,需要考慮兩點
1.Hook點 即在哪個Task之后或者之前進行優化
2.inputFiles(dex、assets) 來源?
?
無用assets資源優化,肯定在apk生成之前進行,Hook點就選擇在packageDebug/packageRelease task之前
variant.packageAndroidTask.doFirst{... //unusedAssetsResources優化 variant.removeUnusedAssetsResources(it.logger,results)variant.generateReport(results)}
?
使用TaskTreePlugin插件查看packageDebug / packageRelease的task tree,cmdz終端執行如下命令:
gradlew :app:packageDebug :app:taskTree --task-depth 1 > log-debug.txt
?
可以看到packageDebug/packageRelease?tasktree如下圖:
?
打印mergedAssetsTask和dex相關task的outputFiles,如下圖:
?
如果之前成功地打過包,查看這個兩個task的outputFiles下的文件如下:
?
現在無用assets資源優化的inputFiles dex和assets都找到了。
?
無用assets資源優化實現
?
步驟如下:
1.找出assets資源
2.反匯編dex找出usedAssetsResources
3根據配置解析出無用assets白名單
4.根據前三步,得到unusedAssetsResources
5.刪除unusedAssetsResources文件?
?
詳見:doRemoveUnusedAssetsResources方法
?
驗證:分別在App module assets放入顯示如下圖片資源:
?
集成無用assets資源優化功能,打release包,插件輸出報告如下:
?
查看release.apk包中assets文件如下:
?
運行app,可以成功加載顯示assets圖片資源。
?
本篇文章比較簡短,只討論了無用assets資源優化,大佬們也許覺得寫得有些啰嗦,估計一句也可以表述清楚,但我這里重在表述實現的思路過程。沒有經過大量測試,僅供參考學習,共同成長。
?
源碼傳送門:BoosterStudy
?
參考資料:
官方公眾號-Apk 分析減包利器
?
?
如果您對博主的更新內容持續感興趣,請關注公眾號!
?