首先貼出demo的github地址:GitHub - TenzLiu/TenzModuleDemo: android組件化demo
前段時(shí)間看到最近一直很火的Android組件化然后就自己擼了一個(gè)demo,期間遇到了不少問題以及坑,在此記錄一下,具體可以看項(xiàng)目源碼。
組件化無非就是將我們App項(xiàng)目下的幾個(gè)模塊在com.android.application與com.android.library之間切換。如下圖:分為modulelib(類庫模塊,一些基本工具類),modulemain(入口模塊),moduleone(模塊1),moduletwo(模塊2),而App只是擔(dān)當(dāng)一個(gè)空殼工程。

1:新建一個(gè)Android項(xiàng)目,但是這個(gè)App只是一個(gè)空殼工程

2:接下來就是創(chuàng)建這幾個(gè)module了,先都是以Android Library就行,然后就是在每個(gè)module的build.gradle下面修改

注意以為mudulelib只是作為一個(gè)根據(jù)庫,所以不需要改,然后就是isModule從何而來,就是在整個(gè)項(xiàng)目的gradle.properties

3:App項(xiàng)目App以及各個(gè)module之間的一來關(guān)系:
首先modulelib是負(fù)責(zé)引用一些第三方類庫以及一些基本代碼的負(fù)責(zé)和一些工具類

App:

就是說當(dāng)設(shè)置isModule=true的話各個(gè)模塊處理modulelib都可以獨(dú)立運(yùn)行測試,也就是可以交給多人分開開發(fā),最后只需要設(shè)置false就可以合并
各個(gè)模塊的module:

在這里需要注意,modulelib的引用類庫我們使用的是api,而不是implementation,因?yàn)閕mplementation只能在本module有效,但是你去到如App那里就無效了;有一些類庫引用是只有的比如butterknife:
implementation'com.jakewharton:butterknife:8.8.1'
annotationProcessor'com.jakewharton:butterknife-compiler:8.8.1'
implementation我們需要在modulelib里面,但是annotationProcessor卻需要在各個(gè)module里面都要寫上。
4:項(xiàng)目App怎么以modulemain為入口:
這里注意我們的App下面的minifest是沒有activity的

而在modulemain的minifest下面有一個(gè)聲明作為launcher的activity

這個(gè)程序已啟動(dòng)就會(huì)運(yùn)行modulemain下面的MainActivity了。
5:各個(gè)module之間的交互怎么處理呢,比如一些activity的跳轉(zhuǎn),還有不同歐冠module之間獲取fragment,這個(gè)上面也應(yīng)該看到我是用的阿里的ARouter路由了,用法也很簡單,官方鏈接:https://github.com/alibaba/ARouter。
如上面所說,在modulelib引用api'com.alibaba:arouter-api:1.3.1',然后在各個(gè)module下面annotationProcessor'com.alibaba:arouter-compiler:1.1.4'
然后在各個(gè)模塊的build.gradle下的defaultConfig下添加
javaCompileOptions {
annotationProcessorOptions {
arguments = [moduleName :project.getName() ]
}
}
這個(gè)官方文檔有說明的。
然后就是使用了,在module需要跳轉(zhuǎn)的activity或是需要獲取的fragment設(shè)置

接下來就是跳轉(zhuǎn)了,

至于fragment也是一樣,

以及fragment的獲取

6:在module里面的資源id在switch,case無法使用:

可以使用if,else代替

7:butterknife的使用問題
相信很多人都會(huì)用到butterknife注解,但是在module使用butterknife也會(huì)有坑,
如上面所說,在modulelib引用api'com.jakewharton:butterknife:8.5.1',然后在各個(gè)module下面annotationProcessor'com.jakewharton:butterknife-compiler:8.5.1'
在butterknife官方文檔也有說明,如果是在module里面使用的話還要在各個(gè)module添加
applyplugin:'com.jakewharton.butterknife'
當(dāng)然modulelib不需要,但是當(dāng)你使用butterknife最新版8.8.1的時(shí)候就會(huì)因?yàn)檫@個(gè)報(bào)錯(cuò),我也是在這里搞了很久馬波的,原來是butterknife最新版不兼容的問題吧應(yīng)該,只需要調(diào)低版本就好了,我這里是用了8.5.1
module使用butterknife還有一個(gè)R資源的問題,就是你butterknife注解使用的資源不能用R,而是要用butterknife提供的R2來尋找資源


8:之前說了每個(gè)module在設(shè)置isModule=true之后就可以單獨(dú)運(yùn)行調(diào)試了,那這個(gè)的monifest也需要有兩套吧,

資源文件:

再來看看內(nèi)容對比


剩下就擼碼吧。
完~