編輯:Android資訊
Android studio不僅允許你為你的app和依賴庫創建模塊,同時也可為Android wear,Android TV,Google App Engine等創建模塊,而這些單獨的模塊又可以在一個單獨的項目中使用。舉個栗子,在你的app開發後期階段,你可能需要用到Google Clound或者Android Wear。這種情況下,你可以在你的工程下擁有三個模塊:分別是app,google cloud,Android Wear整合。了解在一個工程下的多模塊構建將會加速你的開發周期。
Gradle for Android 第一篇( 從 Gradle 和 AS 開始 )
Gradle for Android 第二篇( Build.gradle入門 )
Gradle for Android 第三篇( 依賴管理 )
Gradle for Android 第四篇( 構建變體 )
在這一章,我們將學習到多模塊的構建,並且展示一些實際且有用的栗子:
通常情況下,一個工程包含多模塊,這些模塊會在一個父目錄文件夾下。為了告訴gradle,該項目的結構以及哪一個子文件夾包含模塊,你需要提供一個settings.gradle文件。每個模塊可以提供其獨立的build.gradle文件。我們已經學習了關於setting.gradle和build.gradle如何正常工作,現在我們只需要學習如何使用它們。
這是多模塊項目的結構圖:
project ├─── setting.gradle ├─── build.gradle ├─── app │ └─── build.gradle └─── library └─── build.gradle
這是最簡單最直接的方式來創建你的多模塊項目了。setting.gradle文件申明了該項目下的所有模塊,它應該是這樣:
include ':app', ':library'
這保證了app和library模塊都會包含在構建配置中。你需要做的僅僅只是為你的模塊添加子文件夾。
為了在你的app模塊中添加library模塊做為其依賴包,你需要在app的build.gradle文件中添加以下內容:
dependencies { compile project(':library') }
為了給app添加一個模塊作為依賴,你需要使用project()方法,該方法的參數為模塊路徑。
如果在你的模塊中還包含了子模塊,gradle可以滿足你得要求。舉個栗子,你可以把你的目錄結構定義為這樣:
project ├─── setting.gradle ├─── build.grade ├─── app │ └─── build.gradle └─── libraries ├─── library1 │ └─── build.gradle └─── library2 └─── build.gradle
該app模塊依然位於根目錄,但是現在項目有2個不同的依賴包。這些依賴模塊不位於項目的根目錄,而是在特定的依賴文件夾內。根據這一結構,你需要在settings.xml中這麼定義:
include ':app', ':libraries:library1', ':libraries:library2'
你會注意到在子目錄下申明模塊也非常的容易。所有的路徑都是圍繞著根目錄,即當你添加一個位於子文件夾下的模塊作為另外一個模塊的依賴包得實惠,你應該將路徑定為根目錄。這意味著如果在上例中app模塊想要依賴library1,build.gradle文件需要這麼申明:
dependencies { compile project(':libraries:library1') }
如果你在子目錄下申明了依賴,所有的路徑都應該與根目錄相關。這是因為gradle是根據你的項目的根目錄來定義你的依賴包的。
理解了構建過程讓你理解多模塊的構建變得容易。我們很早前談過關於構建的生命周期。所以現在你應該知道其基本的過程,但是一些很重要的細節可能你並不是很清楚。
在第一步驟中,即初始化階段,gradle會尋找到settings.grade文件。如果該文件不存在,那麼gradle就會假定你只有一個單獨的構建模塊。如果你有多個模塊,settings.gradle文件定義了這些模塊的位置。如果這些子目錄包含了其自己的build.gradle文件,gradle將會運行它們,並且將他們合並到構建任務中。這就解釋了為什麼你需要申明在一個模塊中申明的依賴是相對於根目錄。
一旦你理解了構建任務是如何將所有的模塊聚合在一起的時候,那關於幾種不同的構建多模塊策略就會變得簡單易懂。你可以配置所有的模塊在根目錄下的build.gradle。這讓你能夠簡單的浏覽到整個項目的配置,但是這將會變得一團亂麻,特別是當你的模塊需要不同的插件的時候。另外一種方式是將每個模塊的配置分隔開,這一策略保證了每個模塊之間的互不干擾。這也讓你跟蹤構建的改變變得容易,因為你不需要指出哪個改變導致了哪個模塊出現錯誤等。
gradle的最大策略是混合。你可以在根目錄下定義一個build文件去定義所有模塊相同的熟悉,然後在每個模塊中的build文件去配置只屬於該模塊的參數。Android studio遵循了該原則,其創建了一個build.gradle文件在根目錄,然後再每個模塊文件夾下創建了另外一個build文件。
當你在你的項目中有多個模塊的時候,你需要在運行任務之前想一想。當你在命令行界面運行一個task的時候,gradle將會找到哪個模塊將會執行這個任務。舉個栗子,當你有個mobile app模塊和一個Android Wear模塊,你運行了gradlew assembleDebug任務。當你改變其中一個模塊的文件夾位置,gradle將只會運行哪個特殊的模塊,縱使你使用了gradle wrapper在根目錄。舉個栗子,當你運行../gradlew assembleDebug在Android wear模塊的目錄下,其只會構建Android wear模塊。
切換不同的文件夾去執行不同的任務會讓人很不爽,幸運的是,我們有其他的辦法。你可以准備一個特別的task來執行你的模塊。舉個栗子,為了只構建Android Wear模塊,你僅僅只需在根目錄下運行 gradlew :wear:assembleDebug。
在Android studio中添加新模塊是很容易的一件事,該視圖同時也會為你創建build文件。如下圖所示:
當你新建了一個Java模塊,build.grade文件會是這樣:
apply plugin: 'java' dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) }
Java模塊使用了Java插件,這意味著很多Android特性在這兒不能使用,因為你不需要。
build文件也有基本的庫管理,你可以添加jar文件在libs文件夾下。你可以添加更多的依賴庫,根據第三章的內容。
給你的app模塊添加Java模塊,這很簡單,不是嗎?
dependencies { compile project(':javalib') }
這告訴了gradle去引入一個叫做javelin的模塊吧,如果你為你的app模塊添加了這個依賴,那麼javalib模塊將會總是在你的app模塊構建之前構建。
同樣的,我們利用Android studio的圖形化界面創建Android模塊,然後其構建文件如下:
apply plugin: 'com.android.library'
記住:Android依賴庫不僅僅包含了Java代碼,同樣也會包含Android資源,像manifest和strings,layout文件,在你引入該模塊後,你可以使用該模塊的所有類和資源文件。
我有點建議關於多模塊項目,並且有些東西你們應該了解清楚,知道這些將會節約你們的時間。
當你有多個模塊,Android studio會分析出來,並且展示在cradle中:
grade圖形化讓你運行模塊間的任務變得簡單,但是其沒有為所有模塊同時運行一個任務,所以如果你希望這麼做,最快的方式是使用命令行。
當你構建你的多模塊項目,gradle會依次執行所有的模塊。當你的電腦內存夠大的時候,讓你的構建過程多線程將會更快。該特性在gradle早已存在,但是其默認關閉。
所以如果你希望啟動parallel構建,你需要在grade.properties文件中配置如下屬性:
org.gradle.parallel=true
gradle會選擇盡可能多的線程去執行你的構建過程,每個線程都會執行一個模塊。parallel執行的是獨立的模塊,即你的模塊是獨立的。
即你可以在一個模塊中引用其他模塊的屬性,但是我不建議你們這麼做,我們完全可以在根目錄下的build文件中定義這些屬性。
我們學習了如何在一個項目中構建多個模塊,以及添加新模塊是如何影響到構建任務的執行。
我們學習了相關事例,並且給出了一些建議。
在下一章節,我們將會學習到測試,如何利用gradle讓你的測試更加簡單。我們將會學習到如何在jvm中運行你的單元測試,以及如何運行測試在你的手機上。
需求 產品上線了,項目差不多算是穩定下來了,接下來就是一個個的版本迭代了。這周又增加了幾個新功能,其中一個就是題目中講的,要仿新浪微博(如下圖)的輸入框裡的文字效
以前一直想寫一篇總結 Android 開發經驗的文章,估計當時的我還達不到某種水平,所以思路跟不上,下筆又捉襟見肘。近日,思路較為明朗,於是重新操起鍵盤開始碼字一
如果你還沒有聽說過Android Support Annotations 函數庫,你將錯過一個整潔的新軟件包,它有助於你捕獲程序中的bugs。該函數庫包含了許多的
除了Android系統自帶的Button按鈕以外,還提供了帶圖標的按鈕ImageButton 要制作帶圖標的按鈕,首先要在布局文件中定義ImageButton,然