上週四,Google 終於在經歷大半年的打磨錘鍊之後正式釋出 Android Studio 3.0 版本,給廣大安卓開發人員一份滿意的答卷。如往常一樣,每次新版開發工具的釋出,很多謹慎點的朋友仍擔心穩定性、是否存在坑等問題,選擇隔岸觀火,等一段時間再更新升級。
經過檢視官網對新版開發工具的新功能介紹之後,當天我就選擇了升級。事實上,我也的確折騰良久,但是截至目前,沒有發現所謂的坑。只是需要對舊的工程做一些配置上的調整而已。各方面響應速度和新功能的使用,總體還是覺得值得升級。這篇文章,就來介紹新版開發工具給我們帶來哪些實用的改變,並以實際操作經驗告訴大家,舊工程的配置需要如何做相容修改。
3.0 帶來的改變
Kotlin Support
在 Android Studio 3.0 之前,使用 Kotlin 語言開發安卓應用,需要額外配置 Kotlin 外掛。而新版本內建預設支援 Kotlin 語言,來減少我們在配置上的工作。
選擇工具欄 Code -> Convert Java File To Kotlin File,或者使用快捷鍵的形式,你可以一鍵實現 Java 檔案到 Kotlin 檔案的轉換。
備註:關於快捷鍵的使用,你可以使用 Command + Shift + A 這組快捷鍵開啟 Find Action 視窗,輸入關鍵字尋找對應功能及其快捷鍵,效果就像上面 Gif 圖展示的這樣。
Java 8 Support
3.0 對 Java 8 語言特性的預設支援使你不用在 build.gradle 配置檔案中新增 jackOptions 一項。如果你有使用到的話,記得刪除:
android {
...
defaultConfig {
...
// Remove this block.
jackOptions {
enabled true
...
}
}
}複製程式碼
選擇工具欄 File ——》Project Structure,修改 Source Compatibility 和 Target Compatibility 選項到 1.8 即可使我們的專案支援 Java 8 語言特性。
Android Profiler
過去我們使用的 Android Monitor 工具從 3.0 版本開始被 Android Profiler 替代掉了。如圖,run 按鈕一欄多了一個 Android Profiler 按鈕:
Android Profiler 提供有 CPU、Memory 和 Network 三大除錯分析利器,實時跟蹤 Apk 的執行狀態,可以幫助我們視覺化地做一些效能調優工作。
這三個工具在開發階段非常實用,比如 CPU Profiler 能夠分析應用中的執行緒使用情況,Memory Profiler 能夠檢測出記憶體洩漏,Network Profiler 能夠攔截網路請求實現抓包功能等。這裡列舉一些使用圖片,簡單預覽一下這三大工具的風采:
有關這幾個工具的詳細使用細節,可以參考官方的介紹:
Device File Explorer
這個功能厲害了。新版開發工具帶來的資源管理器允許我們訪問連線裝置的檔案系統,實現 PC 端到手機或模擬器端的便捷檔案傳輸。有了這個工具,從此就可以告別之前使用的「檔案傳輸助手」等第三方工具啦。
Adaptive Icons wizard
選擇 File -> New -> Image Asset,利用 Android Studio 提供的工具建立圖片資源一直以來也是開發利器之一。現在,這個工具開始支援 vector drawables 格式,並且能夠建立用於適配 Android 8.0 系統上各種形狀的桌面圖示。
URL intent-filter validator
這個功能也蠻貼心的。Manifest 清單檔案開始支援一個特殊的標籤,用於測試給定的 Url 字串是否符合 intent-filter 標籤內容所定義的規則。舉個例子:
如圖,這裡使用 data 標籤定義一個 Url 規則,並使用 tools:validation 標籤驗證一個錯誤的測試 Url 地址,檢測器能夠自動識別並給出錯誤提示。這個例子很簡單,肉眼一眼就能看出錯誤。那如果是比較複雜的規則呢,可能就不那麼容易看得出來。這個時候,這個工具就可以派上用場啦。
APK Analyzer
3.0 版本對 APK Analyzer 的功能做了進一步強化。主要在於:對於使用 ProGuard 混淆過的 APK 檔案,我們能夠上傳 mapping.txt 檔案進行程式碼還原;Dex 檔案提供顯示各個包目錄的大小;等等。
其他功能
除了上面介紹的這些變化,還有一些其他大大小小的變更。比如 Layout Inspector 和 Layout Editor 工具在 UI 上有所調整,比如 App Links Assistant 和 Firebase App Indexing Assistant 的強化使用,這些留著大家自己去探索發現吧。也可以訪問 Android Studio Release Notes 官網,瞭解 3.0 版本的更多釋出細節。
舊專案的適配
Android Studio 3.0 釋出的同時,Android Plugin for Gradle 3.0.0 也同時釋出。編譯速度整體都得到了大幅提升。升級完 Android Studio 之後,舊的工程需要做出部分改變,才能通過 Gradle 的編譯。這裡根據我的一個實際專案,介紹一下需要改變的內容。當然,也許你的專案用不上這些,也可能不止這些。
distributionUrl
Plugin 3.0.0+ 需要配置 Gradle 的最小版本是 4.1,我們可以通過 File -> Project Structure -> Project 的方式設定 Android Plugin 的版本,或者修改 gradle.properties 檔案的內容,新增 distributionUrl 屬性:
distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip複製程式碼
Google's Maven repository
新版 Android Studio 工具預設使用 Google’s Maven Repository 用於下載依賴 Android Support Library,替代了 Android SDK Manager 的本地依賴方式。所以,需要在工程根目錄下的 build.gradle 檔案中新增 google() 一行程式碼:
allprojects {
repositories {
google()
}
}複製程式碼
buildToolsVersion
Android Plugin For Gradle 3.0.0 預設自動新增外掛所需要用到的最小版本的編譯工具。所以,我們不需要再手動在 build.gradle 新增一行 buildToolsVersion 屬性的程式碼。對於舊的專案,可以去掉這行配置,比如:
android {
compileSdkVersion 26
// remote buildToolsVersion
buildToolsVersion "25.0.2"
...
}複製程式碼
flavor dimensions
Plugin 3.0.0 開始,如果 build.gradle 自定義有 productFlavors
配置的話,需要新增定義 flavorDimensions
(風味維度)。否則,編譯報錯:
rror:All flavors must now belong to a named flavor dimension.
The flavor 'flavor_name' is not assigned to a flavor dimension.複製程式碼
flavorDimensions
的出現使得構建變種型別更加多樣化:
可構建的變種數量 = 風味維度的數量 * 構建型別的數量
詳細使用可參考 配置構建變體。對於舊專案,簡單的話,可以隨意定義一個風味維度,保證編譯通過,如(這裡的“minApi”可自由定義):
flavorDimensions "minApi"
productFlavors {
beta {
dimension "minApi"
...
}
production {
dimension "minApi"
...
}
}複製程式碼
each() 和 outputFile()
Plugin 3.0.0 版本移除了一些用於編譯配置的 API,其中比較常見的就是 each() 和 outputFile(),兩個常用於修改輸出 Apk 檔名和路徑的方法。
在之前的文章 Android Gradle 常用使用場景實現方式的總結 中有提到,自定義輸出 APK 檔名可以這樣做:
android {
android.applicationVariants.all { variant ->
variant.outputs.each { output ->
output.outputFile = new File(output.outputFile.parent, rootProject.getName()
+ "-" + buildType.name
+ "-" + releaseTime()
+ "-v" + defaultConfig.versionName
+ "-" + defaultConfig.versionCode
+ ".apk");
}
}
}複製程式碼
但是使用 Plugin 3.0.0 時就會出現編譯報錯,我們需要修改 each() 和 outputFile() 方法為 all() 和 outputFileName,比如:
android {
android.applicationVariants.all { variant ->
variant.outputs.all {
outputFileName = rootProject.getName()
+ "-" + buildType.name
+ "-" + releaseTime()
+ "-v" + defaultConfig.versionName
+ "-" + defaultConfig.versionCode
+ ".apk";
}
}
}複製程式碼
對於舊的工程,基本上便是這些配置上的適配修改。如果你還遇到了別的問題,別緊張,按照編譯錯誤提示一步步操作,也能成功通過編譯。總體來說,這次 Android Studio 3.0 和 Plugin For Gradle 3.0.0 的釋出還是非常值得升級嘗試的,並沒有網上說的那麼多坑。何況,我們作為寫程式碼的程式設計師,本來不就是為了解決問題而來嘛。
關於我:亦楓,部落格地址:yifeng.studio/,新浪微博:IT亦楓
微信掃描二維碼,歡迎關注我的個人公眾號:安卓筆記俠
不僅分享我的原創技術文章,還有程式設計師的職場遐想