******** ******** 第一部分: 瘦身內容介紹 ******** ********
項目新版本的迭代接近尾聲, 因為歷史累積問題, 導致有很多無效的資源讓已經臃腫的APK變得更腫, 因此公司決定做一次Android APK的資源瘦身.
這次瘦身使用的是Lint審查工具, 用Android Studio的Generate Signed APK打包, 瘦身前APK為17.3M, 瘦身后為15.7M. 瘦身結果為APK大小減少了1.6M(9.x%)
1. 完全相同的一張圖片, 在項目中存在多份(不同的開發人員從UI資源文件夾里復制出來, 修改為不同的名字, 引入工程)
2. 版本多次迭代后, 許多XML文件已經不再使用了(包括布局文件, 自定義圖形文件, 動畫文件, 顏色文件, 字符文件strings.xml, 單位文件dimens.xml等).
3. 由於功能的迭代, 有些Activity, Fragment已經無效(好像Android Studio Lint無法查處這一類的無效資源)
******** ******** 第二部分: 瘦身工具介紹 ******** ********
1. 使用的是Android Studio工具做代碼審查(Inspect Code功能), 實際上使用到的是其中Android Lint部分
2. Inspect Code配置(可以單獨選擇Module 'app'部分, 個人感覺library部分審查的意義不大. 不過為了方便, 我還是選擇了 Whole project... 不過這樣的結果就是, 同事的紅點鍵盤電腦還沒有Inspect完... 我已經把150多個無效資源全部處理完了... 所以還是自行決定是否Fire The Whole吧...)
******** 第三部分: Android Studio Inspect Code 結果簡介 ********
zzzZZZ(Inspecting...)
1. 既然是瘦身, 那無效資源引用就是頭等重要的事了. 個人覺得這部分都在Inpsection模塊的Android Lint視圖里面了.
首先, 在Inspection模塊里找到Android Lint
然后, 在Inspection模塊的Android Lint里向下滑動找到Ununsed resources
來, 看一下Unused recources展開后的樣子(對不起, 重復圖片, 無效xml文件, 無效的strings.xml和dimens.xml都已經處理完了)...
( 說一下一個我自己的處理"技巧"吧, 對於無效的xml文件, 要刪除起來其實還比較麻煩, 因為Android Studio在xml頁面好像沒有刪除按鈕??? 我是這么做的:
在Inspect Code 的Android List結果展示區, 雙擊對應的xml無效提示(例如: The resource 'R.dimen.spacing_0_5' appears to be unused這一個item),
進入對應的xml文件后, 把所有內容刪除... 不要怕... 錯了git可以恢復的...
當你刪除的手酸的時候或者內心惶恐不安的時候, 在Android Studio里Clean一下工程[不懂的谷歌搜索: Android Studio Clean 工程...]
之后在Android Studio工程里遍歷所有的xml文件, 對於沒有內容的xml文件, Android Studio會用紅色的波浪線提示, 然后選中所有需要刪除的xml文件, 一次性刪除... 建議帶上引用審查)
安全刪除之引用審查
(說一下一個坑吧... 事情的起因是這樣的: android.content.res.Resources$NotFoundException
Android Lint信誓旦旦的說, R.dimen.spacing_0_5是沒用的(實際上他的名字是R.dimen.spacing_0.5...) 后刪之, 保留了values-1280x720目錄下diemns.xml里的R.dimen.spacing_0.5定義...
這樣看起來應該出現在分辨率為1280x720的HTC D816V完美不崩潰而其他分辨率可能崩潰的情況... 然而HTC D816V表示不服, 打開APP后崩潰,遂伙同Android Studio提示單身程序狗: Caused by: android.content.res.Resources$NotFoundException: File res/drawable/common_btn_grayf10.xml from drawable resource ID #0x7f0a0018
我找了一下, common_btn_grayf10.xml確實存在... HTC你"眼瞎"是不是!!! 還是Android Studio聰明, 在xml預覽圖里無預覽, 但是提示spacing_0.5 not in right format... 於是將spacing_0.5修改為spacing_1, 錯誤提示不記得在不在了, 但是程序依舊崩潰... 查了很久后, 嘗試將spacing_0.5也放到values/dimens.xml里試試... 結果崩潰問題解決...
總結: 在做適配的時候, 一定要保證values/dimens.xml文件是最大而全的.就是說values/dimens.xml = values-aaxbb U values-ccxdd U etc... 這里U是離散數學里的取並集的意思(打我吧... 很羅嗦對不對)
)
2. 實際上Android Studio的Inspect Code還蠻強大的, 會幫你審查無效的LinearLayout, xml布局里View過多, onDraw()函數中分配內存這一類的效率問題. 舉一個Code style的例子(實在無語了有沒有!)
代碼里是這么寫的:
Intent intent = getIntent();
if (null != intent) {
goToMainPageFlag = intent.getBooleanExtra(KEY_GO_TO_MAIN_PAGE_FLAG, false);
} else {
goToMainPageFlag = false;
}
Inspect Code提示:
就是說, Android Studio的Inspect Code告訴你, 你的代碼一點都不優雅... 應該改成醬:
Intent intent = getIntent();
goToMainPageFlag = (null != intent && intent.getBooleanExtra(KEY_GO_TO_MAIN_PAGE_FLAG, false));
結論: 把六行的代碼改成兩行, 確實是一個很好的Code Style實踐有沒有! 是的, Android Studio的Inspect Code功能我也是第一次用, 里面東西實在太多了, 大大小小事無巨細的, 沒事兒多看看長長見識也是極好的... 雖然有時候你可能不能在短時間內一下子把所有選項優化完, 不過多看才會有優化的意識, 在之后的Code實踐里就會逐漸的靠近最佳實踐. (完)