提升AS編譯速度 [效率與工具]
提升編譯速度的操作
在"小步快跑快速迭代"的日常開發過程中,專案稍微大點,編譯一次就要好久,與開發ios的小夥伴相比,跑一次總感覺慢的不是一點半點,下面先看下我未優化前的耗時截圖:

優化前耗時
下面是優化後的耗時,可以看到效果是十分明顯的:

優化後耗時
究竟是做了些什麼呢?
程式員不需要看冗長的文章,直接上程式碼,拷貝到 app/build.gradle
中體驗下吧
tasks.whenTaskAdded{ task-> if(task.name.equals("lint")) { task.enabled=false } }
重要的事強調一遍,一定要寫到 apply plugin: 'com.android.application' 前面才生效
,之前看網上的部落格說直接拷貝上述程式碼到build.gradle就有明顯的速度提升,小編自己試了多次,無論拷貝到根目錄的build.gradle還是module的build.gradle都是沒起作用的,最後在Stack Overflow上看到了解決方案,實際上只需要注意放置的位置就解決了.
當我們用手機本地連線除錯的時候,debug打包很快就可以裝到手機上了.可以自己體驗這個速度.
效能檢測
對於我們Android+Studio/">Android Studio使用者來說,最大的痛點就是Gradle超慢的編譯速度,那麼究竟是什麼拖慢了編譯的速度呢?我們需要藉助Gradle內建的一個性能分析工具——profile來檢測效能
直接在AS提供的終端中執行build命令,只需追加 -profile
引數即可使用該功能.
➜qiangwo gradle build -profile
上面的命令編譯後,會在根目錄與app同級的Build目錄下就會生成一個profile檔案,如下圖

image
用瀏覽器開啟該檔案,顯示全部的Gradle編譯總耗時(如圖1),一般來說開發者最關心的是Task Execution的資料,我也貼一張部分耗時的Task資料:

image
看到這個lint是個耗時大戶,而 這個Lint Task一般在Debug的時候是不需要的 ,因此可以先禁用這個Task來完成Lint的禁用.
具體遮蔽Lint方法有兩種,貼下程式碼,任選其一:
// 方式一注意放置的位置 tasks.whenTaskAdded { task -> if (task.name.equals("lint")) { task.enabled = false } } // 方式二 app/build.gradle android{ ... buildTypes{ ... debug{ ... project.gradle.startParameter.excludedTaskNames.add('lint')// 遮蔽lint耗時檢查 } } ... }
同時我們看到 uploadReleaseSymtabFile
耗時也挺多的,我在檢視耗時的時候也是挺吃驚的,這個是專案中整合的bugly符號表自動上傳的外掛,果斷在Debug階段遮蔽掉先,記得上線時一定要放開.
通過profile工具,找到編譯耗時的Task,我們就可以有針對性的遮蔽掉來提高編譯速度.
除了Task的耗時以外,AAPT檢查也是一個耗時的大戶.在Debug版本中,建議使用如下程式碼提高AAPT的速度:
aaptOptions{ cruncherEnabled = false }
注意:可以通過這種方式提高編譯速度,但由於資源沒有經過AAPT優化,在Release的時候可能會導致一些執行的問題,所以建議在Debug階段採用這種方式,Release時記得遮蔽掉.
官網鎮樓: ofollow,noindex">AaptOptions
開啟多執行緒支援和增量編譯
在gradle.properties檔案中增加如下所示程式碼: 表示開啟Gradle的多執行緒和多核心支援.
org.gradle.daemon=true org.gradle.parallel=true org.gradle.configureondemand=true
在app/build.gradle android{} 閉包中新增如下程式碼:表示開啟Gradle的增量編譯,增加編譯的記憶體資源到4G
dexOptions{ // incremental true javaMaxHeapSize "4g" }
最好遮蔽 incremental true
,在編譯的時候可能會有一個警告資訊 WARNING: DSL element 'DexOptions.incremental' is obsolete and will be removed at the end of 2018.
因為在 AS 3.0這個已經是預設實現了.
最後就是開啟Instant Run
小總結:
- Debug階段遮蔽 Lint檢查
- Debug階段遮蔽AAPT檢查
- 開啟多執行緒支援和增量編譯
- 開啟Instant Run
下面會簡單介紹下Lint和aapt.
Lint
Lint是一個程式碼掃描工具,可以幫助我們發現並糾正程式碼結構質量的問題,而無需實際執行該應用也不必編寫測試用例.該工具會報告其檢測到的每個問題並提供該問題的描述資訊和嚴重級別,以便可以快速確定需要優先進行哪些關鍵改進.此外可以調低問題的嚴重級別,忽略與專案無關的問題,也可以調高嚴重級別,以突出特定問題.
Lint在AS中預設就整合好了,它會對我們的程式碼進行檢測給出警告提示,

image
Lint警告提示對於我們修改提高程式碼質量就很有幫助,舉一個小例子,在我自己和多人開發的過程中,對於程式碼的命名就很嚴格,力爭做到見名知意,好的命名甚至連註釋都省了.我們就可以讓lint對不規範的拼寫的提示優先順序由警告變為error醒目的紅色提示,先看效果:
修改提示優先順序前: 請忽略,完全是為了演示才這麼寫的

image
修改提示後:

image
我們看到預設的提示不明顯,修改後無論是拼寫錯誤還是沒有按照駝峰命名規則的不規範行為,都有一個特別的警醒提示.
具體說一下,我是怎麼修改的: Preference/Editor/Inspections/Spelling/Type
快捷鍵 " command + , "搜尋Inspections

image
Lint的警告等級類似於logcat的日誌級別和範圍,都可以自定義,有下面幾種:**

image
- Error: 錯誤,紅色 最顯眼的一個
- Warning:警告 黃色 稍微顯眼一點
- Weak Warning:
- Server Problem:
- Type: 拼寫問題 綠色波浪下劃線
- Unused Entry 沒有使用的屬性
Lint的功能遠不止這些,我們可以 手動執行檢查或從命令列執行Lint,配置Lint掃描範圍和檢測出問題的嚴重級別,配置Lint對Java和XML原始檔的檢查等等
,詳細資訊可以檢視 Lint官網 , 關鍵還是中文的 ,具體的使用就不再搬運了.
AATP
AAPT全稱 Android Asset Packaging Tool.該工具位於Android SDK的build-tools目錄下

image
這個工具主要用於Android編譯 打包.它可以檢視 建立 修改壓縮檔案(zip,jar包,apk檔案),也可以將資源編譯成二進位制檔案,AS在編譯時呼叫該工具進行資源打包,將所有檔案打包成一個apk檔案.
具體使用方法,我們可以把aapt所在的build-tools目錄加入到環境變數中,或者直接在該目錄下操作.
我們 可以執行 ./aapt
獲取所有的使用方法 ,只擷取部分結果如下, 有興趣可以先自行研究下.

image
後面可能會補一些效能優化和自定義控制元件的文章,敬請期待.