新建的Module以Android Library 的形式新建
-
main組件的gradle文件中,apply plugin使用的是com.android.application
image.png -
其他業(yè)務(wù)模塊(組件A猖毫、組件B泉哈、組件C璧榄、組件D、common組件等)督笆,apply plugin使用的是com.android.library
image.png
組件集成
- 各個(gè)組件都建立完成之后处渣,接下來(lái)可以把組件集成到main組件中伶贰,集成非常簡(jiǎn)單,只需在main組件的gradle文件中添加dependencies{}配置罐栈,添加如下語(yǔ)句:
組件資源共享
1黍衙、在common組件的build.gradle文件中,添加android 配置荠诬,如下:
android {
//common組件下面添加
repositories {
flatDir {
dirs 'libs'
}
}
}
在各個(gè)需要調(diào)用公共common組件的組件build.gradle文件中琅翻,也添加android 配置,如下:
android {
//common組件下面添加
repositories {
flatDir {
dirs '../common/libs/', 'libs'
}
}
}
2柑贞、common組件里引入各種類庫(kù)的時(shí)候必須用api方椎,而不是用implementation,原因:
implementation編譯的依賴只作用于當(dāng)前的module钧嘶,即common組件模塊中使用implementation編譯的三方庫(kù)只對(duì)common模塊起作用棠众,main組件模塊中無(wú)法使用該三方庫(kù)。
3有决、關(guān)于組件資源共享闸拿,舉個(gè)簡(jiǎn)單示例:例如圖片都是存放到公共的common組件的res里,那么如何在組件A疮薇、組件B胸墙、組件C里使用呢?
使用方法如下:
- 打開各組件的build.gradle文件按咒,在dependencies{}里添加如下代碼
dependencies {
...
implementation project(':common')
{
-如此一來(lái)迟隅,就能在組件A里調(diào)用common組件的圖片資源了
同樣的道理, 組件A励七、 組件B智袭、 組件C的顏色代碼也可以直接調(diào)用公共common組件里colors.xml的代碼
我們可以把其他第三方庫(kù)、自定義view掠抬、工具類吼野、公用資源都放進(jìn)公共common組件里,也就是說(shuō)組件A两波、組件B瞳步、組件C里build.gradle所引入的類庫(kù),都可以放到common組件里的dependencies{}里
所以各個(gè)業(yè)務(wù)組件里面的build.gradle文件的dependencies{}配置簡(jiǎn)化后腰奋,就變成了下面這樣:
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation project(':common')
}
通過(guò)以上解說(shuō)单起,大家應(yīng)該都明白了吧,圖片劣坊、xml這些(value目錄下的各種xml文件)嘀倒,都可以放到公共common組件里,然后再被其他組件引用。對(duì)于全局共用的style.xml文件测蘑,我們更應(yīng)該把它放在common組件中灌危,例如我們的項(xiàng)目theme,本來(lái)是放在main組件的style里面碳胳,我們可以把它移到common中勇蝙,這樣其他組件調(diào)試時(shí),作為一個(gè)單獨(dú)的項(xiàng)目固逗,也能和主項(xiàng)目有一樣的主題浅蚪。總而言之烫罩,所有你認(rèn)為可以被各個(gè)組件共享的資源,都可以放在common組件中洽故。
往組件里添加Fragment
1贝攒、以組件D為例,在組件D里添加一個(gè)包fragment
2时甚、在fragment包右鍵 → New → Fragment →Fragment(Blank)
3隘弊、 填寫Fragment碎片名稱,勾選創(chuàng)建xml文件荒适,如下:
各個(gè)組件單獨(dú)開發(fā)(測(cè)試)
組件單獨(dú)開發(fā)時(shí)梨熙,我們需要改build.gradle的apply plugin模式,等要集成到main組件時(shí)刀诬,又得改回來(lái)咽扇,如果這樣子手工去改,組件一多陕壹,修改起來(lái)比較麻煩质欲,也不優(yōu)雅。優(yōu)雅的解決辦法就是設(shè)置一個(gè)開關(guān)糠馆,打開時(shí)嘶伟,就是application模式,可以單獨(dú)開發(fā)又碌;關(guān)閉時(shí)九昧,就是library模式,可以集成到main組件中”显龋現(xiàn)在按我下面的步驟來(lái)實(shí)現(xiàn):
1铸鹰、在項(xiàng)目根目錄下,有一個(gè)build.gradle文件期揪,在這個(gè)文件最末尾添加一個(gè)ext {}配置掉奄,然后在ext配置里設(shè)定一個(gè)常量isDebug,值設(shè)為true
2、build.gradle里設(shè)置了isDebug常量后姓建,我們項(xiàng)目中的其他build.gradle文件都可以把這個(gè)常量讀取出來(lái)诞仓,所以我們可以在其他組件的build.gradle文件中,讀取該常量的值速兔,動(dòng)態(tài)設(shè)置apply plugin墅拭,代碼如下:
if(isDebug){
apply plugin: 'com.android.application'
}else {
apply plugin: 'com.android.library'
}
3、這樣子設(shè)置之后涣狗,當(dāng)我們需要切換模式時(shí)谍婉,只需要修改項(xiàng)目根目錄下build.gradle文件中isDebug常量的值,修改完成之后镀钓,點(diǎn)擊Project sync按鈕同步一下即可穗熬。如果有報(bào)錯(cuò),那么還有個(gè)地方需要修改一下丁溅,就是main組件的build.gradle文件唤蔗,我們把module的模式改成了application,main組件就不能引入application窟赏,引入的話就會(huì)報(bào)錯(cuò)妓柜,所以當(dāng)是debug調(diào)試模式時(shí),這里就不引入該組件涯穷,以免報(bào)錯(cuò)棍掐。所以在集成組件前,要先判斷是什么模式拷况,如下圖:
4作煌、接下來(lái)還得修改 AndroidManifest.xml,當(dāng)把一個(gè)module設(shè)置為application時(shí)蝠嘉,AndroidManifest.xml需要包含一個(gè)app所需要的屬性最疆,例如app的icon、theme蚤告、launch Activity這些屬性設(shè)置努酸,而當(dāng)module為library時(shí),這些屬性就都不需要用到杜恰,所以當(dāng)我們處于不同模式時(shí)获诈,AndroidManifest.xml文件的配置也得不同。方法如下:
(1)心褐、Android目錄模式切換到Project目錄模式
(2)舔涎、 在各個(gè)組件的src文件夾中新創(chuàng)建一個(gè)debug目錄,再把我們用于debug調(diào)試的AndroidManifest.xml文件放進(jìn)去
(3)逗爹、調(diào)試用的AndroidManifest.xml文件可以直接復(fù)制manifests目錄里的亡嫌,然后添加application的基本信息嚎于,如下:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.moudeld">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
</application>
</manifest>
以上內(nèi)容會(huì)有很多錯(cuò)誤提示,其實(shí)提示的無(wú)非就是資源找不到挟冠,既然前面我們已經(jīng)創(chuàng)建了公共的common組件于购,那么我們只需要把main組件中相應(yīng)的資源移動(dòng)到common組件中就可以了
5、接下來(lái)在各個(gè)組件的build.gradle文件中知染,指定不同模式下使用的AndroidManifest.xml文件肋僧,在android {}里添加如下代碼:
sourceSets {
main {
if (isDebug) {
manifest.srcFile 'src/debug/AndroidManifest.xml'
} else {
manifest.srcFile 'src/main/AndroidManifest.xml'
//集成開發(fā)模式下排除debug文件夾中的所有Java文件
java {
exclude 'debug/**'
}
}
}
}
統(tǒng)一項(xiàng)目版本號(hào)
各個(gè)組件的build.gradle文件中,有很多版本號(hào)控淡。為了避免每次修改都得同時(shí)修改多份build.gradle文件嫌吠,也避免不同的組件使用的版本不一樣,導(dǎo)致沖突掺炭,所以我們可以把這些版本號(hào)統(tǒng)一管理起來(lái)辫诅,方法如下:
1、在項(xiàng)目根目錄下的build.gradle文件中涧狮,定義版本號(hào)常量
2泥栖、然后在各個(gè)組件的build.gradle文件中,做這樣的修改:
android {
compileSdkVersion rootProject.ext.android.compileSdkVersion
buildToolsVersion rootProject.ext.android.buildToolsVersion
defaultConfig {
minSdkVersion rootProject.ext.android.minSdkVersion
targetSdkVersion rootProject.ext.android.targetSdkVersion
versionCode rootProject.ext.android.versionCode
versionName rootProject.ext.android.versionName
}
}