擁抱 Android Studio 之二:Android Studio 與 Gradle 深入
關於學習方式
曾經跟朋友討論過我們所接受過的大學工科教育,都是一上來先學基礎理論,最後再來一個金工實習。一開始不知道為什麼而學,學不進去,荒廢了基礎,等到金工實習的時候,又發現基礎不牢,後悔不已。
考慮到傳統教育方式的不足之處,筆者在組織本系列文章的時候是先講入門例項,進而學習 Gradle 和 Groovy 基礎原理,最後學習進階例項。
上篇文章介紹了從 ADT 遷移到 Android Studio,相信經過很短時間的使用之後,已經開始熟悉和愛上 Android Studio 了。基礎的功能我就不講了,下面列舉一些較為深入又比較實用的功能。
Android Studio 相關功能介紹
資料夾組織檢視
最常用的有 Project 和 Android 檢視,前者按照專案檔案樹進行組織,後者是以 Gradle 構建檔案作為核心進行組織:
Project 檢視與 Android 檢視
Gradle 相關檔案結構
讓我們來觀察一下Android Studio 中 Gradle 相關的結構:
. ├── gradle │ └── wrapper //所使用的 Gradle 包裝器配置 ├── .gradle //所使用 Gradle 版本 │ └── 2.8 ├── AsInDepth.iml ├── app //app module │ ├── app.iml │ ├── build │ ├── build.gradle //app module 的 build.gradle │ ├── libs │ ├── proguard-rules.pro │ └── src ├── build.gradle //專案 build.gradle,通常配置專案全域性配置,如 repositories 和 dependencies ├── gradle.properties //專案屬性檔案,通常可以放置一些常量 ├── gradlew //Gradle 包裝器可執行檔案 ├── gradlew.bat //Gradle 包裝器可執行檔案(Windows) ├── lib //lib module │ ├── build │ ├── build.gradle //lib module 的 build.gradle │ ├── lib.iml │ ├── libs │ ├── proguard-rules.pro │ └── src ├── local.properties //專案的本地屬性,通常是 sdk 所在位置 └── settings.gradle //專案總體設定,通常是配置專案中所有的 module
Invalidate Cache
Android Studio 會出現索引的問題,那可以從刪除 cache 重建索引,File->Invalidate Caches/Restart
Multiple Language Editor
多語言文字可以通過右擊檔案 Open Translation Editor,可以同時進行編輯,但是我發現如果把 strings.xml 改了別的名字,這個功能就不 work 了。
Gradle 相關功能介紹
Gradle View
點選紅色三角執行按鈕,其實是執行了 Gradle 的 一些列任務,如果你想分別執行一些任務,則可以從 Gradle View 裡面檢視:
gradle view
命令列
工作區下方,有一個叫做 Terminal 的 tab,點選之後,會自動 cd 到當前 project 根目錄下,可以輸入如下命令來嘗試下:
./gradlew build
Windows 下應該是 gradlew.bat build,下面均以 Mac 為例,不再贅述
可使用 help 引數來檢視有哪些選項:
./gradlew --help
下面介紹一些重要的選項:
- 檢視執行 log
有些時候,一個任務執行失敗,只給出一個錯誤,沒有給具體原因,你就需要檢視更多資訊,可以使用引數 --info 或者 --stacktrace:
./gradlew build --info
- 指定 module 或者 build.gradle
Gradle 預設是當前目錄下尋找 build.gradle 檔案執行任務,這樣執行 build 會使得整個 project 所有的 module 的 build 任務都會執行,浪費不必要的時間,可以指定 module (-p) 或者 build.gradle (-b)檔案以縮小作用範圍:
./gradlew -p app build
sync
正常情況下,修改了 build.gradle 檔案,檔案上方就會有一個 sync 的按鈕,點選之後會重新構建整個 build.gradle。但是某些特殊情況,這個同步可能會失敗。那就需要一個額外的觸發。
方法有四:
- 再修改一下檔案,便會再次出現 sync 按鈕
- 點選上方工作區的按鈕
sync button top
- 點選 Gradle View 中的同步按鈕
sync button top
- 命令列執行一次 build
Build Variant
首先要了解兩個概念:
Build Type
分為 debug 和 release,這個概念容易懂
Product Flavor
這個概念主要是為了滿足如下需求:同一份程式碼要打多個包,例如收費 pay 和免費 free,邏輯上有一些小區別,又不想通過邏輯判斷這種醜陋的方式。或者你要實現所謂多渠道打包。
Build Variant = Build Type x Product Flavor
配置好了Build Type 和 Product Flavor 之後,Gradle 會生成若干個包,分別為:
payDebug
payRelease
freeDebug
freeRelease
配置例項
build variant
假設這兩個版本的 app,有一個類 DiffBean 需要做大量的邏輯判斷,則可以通過在 build.gradle 中配置 product flavor,在程式碼中新增兩個與 main 平齊的資料夾,
把 DiffBean 從 main 中抽出來,分別放在兩個資料夾中,只關注對應的邏輯即可。
關於 Product Flavor 中都能定義哪些屬性,請參考 Android Gradle DSL。
後續引言
講到這裡,有些讀者可能會遇到跟我當時開始使用 Gradle 一樣的問題:遇到問題就 stackoverflow,找到 workaround 了但不知道為什麼,gradle 版本更新了,發現不 work 了,甚為惆悵。
究其原因,都是不理解基礎。
首先 Gradle 是一個構建平臺,它使用的是 Groovy 語言。
Groovy是一種基於 Java 的語言,提供了更好的動態特性,可以使用閉包使得程式設計更靈活,很適合做指令碼語言。
上面提到的 settings.gradle 和 build.gradle 在 Gradle 平臺中,其實都是一個 Groovy 物件。
Gradle 通過外掛(plugin)的方式來支援構建。外掛是很多工(task)的集合,task 中又包含了許多 action。
而例如 productFlavors 都是一個所謂的 DSL,外掛都定義了很多的 DSL,我理解的所謂的 DSL 就是讓指令碼看起來像指令碼。Android 的外掛的 DSL 文件在 Android Gradle DSL 有說明。
理解了以上基礎之後,你就會知其然,知其所以然了。
以上知識,下一篇將會詳細介紹。敬請留意。
有問題?在文章下留言或者加 qq 群:453503476,希望能幫到你。
參考文獻
系列導讀
本文是筆者《擁抱 Android Studio》系列第二篇,其他篇請點選:
擁抱 Android Studio 之三:溯源,Groovy 與 Gradle 基礎
擁抱 Android Studio 之四:Maven 庫,本地庫與釋出到 bintray 或者 mavenCentral
擁抱 Android Studio 之五:Gradle 外掛使用與開發
作者:秋風中的落葉
連結:https://www.jianshu.com/p/c8ae75760286
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。