首先貼出demo的github地址:GitHub - TenzLiu/TenzModuleDemo: android元件化demo
前言
前段時間看到最近一直很火的Android元件化然後就自己擼了一個demo,期間遇到了不少問題以及坑,在此記錄一下,具體可以看專案原始碼。
元件化無非就是將我們App專案下的幾個模組在com.android.application與com.android.library之間切換。如下圖:分為modulelib(類庫模組,一些基本工具類),modulemain(入口模組),moduleone(模組1),moduletwo(模組2),而App只是擔當一個空殼工程。
1:新建一個Android專案,但是這個App只是一個空殼工程
2:接下來就是建立這幾個module了,先都是以Android Library就行,然後就是在每個module的build.gradle下面修改
注意以為mudulelib只是作為一個根據庫,所以不需要改,然後就是isModule從何而來,就是在整個專案的gradle.properties
3:App專案App以及各個module之間的一來關係:
首先modulelib是負責引用一些第三方類庫以及一些基本程式碼的負責和一些工具類
App:
就是說當設定isModule=true的話各個模組處理modulelib都可以獨立執行測試,也就是可以交給多人分開開發,最後只需要設定false就可以合併
各個模組的module:
在這裡需要注意,modulelib的引用類庫我們使用的是api,而不是implementation,因為implementation只能在本module有效,但是你去到如App那裡就無效了;有一些類庫引用是隻有的比如butterknife:
implementation'com.jakewharton:butterknife:8.8.1'
annotationProcessor'com.jakewharton:butterknife-compiler:8.8.1'
implementation我們需要在modulelib裡面,但是annotationProcessor卻需要在各個module裡面都要寫上。
4:專案App怎麼以modulemain為入口:
這裡注意我們的App下面的minifest是沒有activity的
而在modulemain的minifest下面有一個宣告作為launcher的activity
這個程式已啟動就會執行modulemain下面的MainActivity了。
5:各個module之間的互動怎麼處理呢,比如一些activity的跳轉,還有不同歐冠module之間獲取fragment,這個上面也應該看到我是用的阿里的ARouter路由了,用法也很簡單,官方連結:https://github.com/alibaba/ARouter。
如上面所說,在modulelib引用api'com.alibaba:arouter-api:1.3.1',然後在各個module下面annotationProcessor'com.alibaba:arouter-compiler:1.1.4'
然後在各個模組的build.gradle下的defaultConfig下新增
javaCompileOptions {
annotationProcessorOptions {
arguments = [moduleName :project.getName() ]
}
}
複製程式碼
這個官方文件有說明的。
然後就是使用了,在module需要跳轉的activity或是需要獲取的fragment設定
接下來就是跳轉了,
至於fragment也是一樣,
以及fragment的獲取
6:在module裡面的資源id在switch,case無法使用:
可以使用if,else代替
7:butterknife的使用問題
相信很多人都會用到butterknife註解,但是在module使用bb utterknife也會有坑,
如上面所說,在modulelib引用api'com.jakewharton:butterknife:8.5.1',然後在各個module下面annotationProcessor'com.jakewharton:butterknife-compiler:8.5.1'
在butterknife官方文件也有說明,如果是在module裡面使用的話還要在各個module新增
applyplugin:'com.jakewharton.butterknife'
當然modulelib不需要,但是當你使用butterknife最新版8.8.1的時候就會因為這個報錯,我也是在這裡搞了很久馬波的,原來是butterknife最新版不相容的問題吧應該,只需要調低版本就好了,我這裡是用了8.5.1
module使用butterknife還有一個R資源的問題,就是你butterknife註解使用的資源不能用R,而是要用butterknife提供的R2來尋找資源
8:之前說了每個module在設定isModule=true之後就可以單獨執行除錯了,那這個的monifest也需要有兩套吧,
資原始檔:
再來看看內容對比
剩下就擼碼吧。
完~
作者:TenzLiu 原文連結:https://www.jianshu.com/p/416ca689ebc2
閱讀更多
相信自己,沒有做不到的,只有想不到的
在這裡獲得的不僅僅是技術!