首先貼出demo的github地址:GitHub - TenzLiu/TenzModuleDemo: android組件化demo
前段時(shí)間看到最近一直很火的Android組件化然后就自己擼了一個(gè)demo端仰,期間遇到了不少問(wèn)題以及坑错沃,在此記錄一下,具體可以看項(xiàng)目源碼违寞。
組件化無(wú)非就是將我們App項(xiàng)目下的幾個(gè)模塊在com.android.application與com.android.library之間切換翎卓。如下圖:分為modulelib(類(lèi)庫(kù)模塊契邀,一些基本工具類(lèi)),modulemain(入口模塊)失暴,moduleone(模塊1)坯门,moduletwo(模塊2),而App只是擔(dān)當(dāng)一個(gè)空殼工程逗扒。
1:新建一個(gè)Android項(xiàng)目古戴,但是這個(gè)App只是一個(gè)空殼工程
2:接下來(lái)就是創(chuàng)建這幾個(gè)module了,先都是以Android Library就行矩肩,然后就是在每個(gè)module的build.gradle下面修改
注意以為mudulelib只是作為一個(gè)根據(jù)庫(kù)现恼,所以不需要改,然后就是isModule從何而來(lái)黍檩,就是在整個(gè)項(xiàng)目的gradle.properties
3:App項(xiàng)目App以及各個(gè)module之間的一來(lái)關(guān)系:
首先modulelib是負(fù)責(zé)引用一些第三方類(lèi)庫(kù)以及一些基本代碼的負(fù)責(zé)和一些工具類(lèi)
App:
就是說(shuō)當(dāng)設(shè)置isModule=true的話各個(gè)模塊處理modulelib都可以獨(dú)立運(yùn)行測(cè)試叉袍,也就是可以交給多人分開(kāi)開(kāi)發(fā),最后只需要設(shè)置false就可以合并
各個(gè)模塊的module:
在這里需要注意建炫,modulelib的引用類(lèi)庫(kù)我們使用的是api,而不是implementation畦韭,因?yàn)閕mplementation只能在本module有效,但是你去到如App那里就無(wú)效了肛跌;有一些類(lèi)庫(kù)引用是只有的比如butterknife:
implementation'com.jakewharton:butterknife:8.8.1'
annotationProcessor'com.jakewharton:butterknife-compiler:8.8.1'
implementation我們需要在modulelib里面艺配,但是annotationProcessor卻需要在各個(gè)module里面都要寫(xiě)上。
4:項(xiàng)目App怎么以modulemain為入口:
這里注意我們的App下面的minifest是沒(méi)有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路由了赠法,用法也很簡(jiǎn)單,官方鏈接:https://github.com/alibaba/ARouter。
如上面所說(shuō)砖织,在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è)官方文檔有說(shuō)明的。
然后就是使用了侧纯,在module需要跳轉(zhuǎn)的activity或是需要獲取的fragment設(shè)置
接下來(lái)就是跳轉(zhuǎn)了新锈,
至于fragment也是一樣,
以及fragment的獲取
6:在module里面的資源id在switch眶熬,case無(wú)法使用:
可以使用if,else代替
7:butterknife的使用問(wèn)題
相信很多人都會(huì)用到butterknife注解妹笆,但是在module使用butterknife也會(huì)有坑,
如上面所說(shuō)娜氏,在modulelib引用api'com.jakewharton:butterknife:8.5.1'拳缠,然后在各個(gè)module下面annotationProcessor'com.jakewharton:butterknife-compiler:8.5.1'
在butterknife官方文檔也有說(shuō)明,如果是在module里面使用的話還要在各個(gè)module添加
applyplugin:'com.jakewharton.butterknife'
當(dāng)然modulelib不需要贸弥,但是當(dāng)你使用butterknife最新版8.8.1的時(shí)候就會(huì)因?yàn)檫@個(gè)報(bào)錯(cuò)窟坐,我也是在這里搞了很久馬波的,原來(lái)是butterknife最新版不兼容的問(wèn)題吧應(yīng)該绵疲,只需要調(diào)低版本就好了狸涌,我這里是用了8.5.1
module使用butterknife還有一個(gè)R資源的問(wèn)題,就是你butterknife注解使用的資源不能用R最岗,而是要用butterknife提供的R2來(lái)尋找資源
8:之前說(shuō)了每個(gè)module在設(shè)置isModule=true之后就可以單獨(dú)運(yùn)行調(diào)試了,那這個(gè)的monifest也需要有兩套吧朝捆,
資源文件:
再來(lái)看看內(nèi)容對(duì)比
剩下就擼碼吧般渡。
完~