強烈推薦先閱讀這篇文章 Android 組件化最佳實踐 java
本文是閱讀實踐後的思考總結,更傾向實踐步驟。android
組件化開發大致就是這樣的架構,最關鍵的是base
和 base_custom
組件內容的區別化。git
這裏涉及兩個概念 模塊化 和 組件化,這兩個本質上是同樣的,都是爲了下降代碼耦合性,區別就在於內容,組件化都是單一功能的集合,模塊化就是獨立業務線的集合,其實咱們均可以稱之爲組件化。github
File——>New——>New Moudle——>Phone & Tablet Moudleapi
建立後是一個工程,相似app,會默認建立好相關資源文件。「業務模塊首選」安全
File——>New——>New Moudle——>Android Librarybash
建立後是一個moudle「組件首選」markdown
編碼過程當中須要注意的就是 資源和代碼的聚合,仍是遵循 本身的事情本身作 的原則,下降耦合性。網絡
資源架構
圖片資源 drawable
,須要用到的放在本身目錄下,相似共用的返回鍵這種,放在基礎組件中;
顏色值 color
,不要共用,沒多少,寫在本身組件中;
尺寸 dp
,這個基本沒啥變化,能夠放到基礎組件中;
樣式 style,涉及到Activity主題的,這個能夠在基礎組件中定義,組件中繼承,這樣既保證了整個app風格,也能夠特殊化。
爲了保證 組件內資源 的 充分隔離,咱們能夠 規範命名,以模塊化命名,這樣的外部調用時,不容易出錯。
例如 登陸模塊 ic_login_phone
login_phone_hint_text
...
嚴格一點,能夠在 build.gradle
文件中配置 命名前綴,這樣編碼時 不按照這種格式,就會飄紅。只針對xml文件,圖片還需本身規範命名。
android { resourcePrefix "login_" // 其餘配置 ... } 複製代碼
代碼
runtimeOnly
dependencies { ... runtimeOnly project(':moudle_shop') } 複製代碼
代碼寫好後,須要 單獨調試 或 集成到app中調試,那就須要配置兩種模式。
gradle.properties
文件,定義屬性用來區分兩種模式//例如 false表示集成調試,true表示單獨調試 isSingleRun = false 複製代碼
在 build.gradle
文件中配置
if (isSingleRun.toBoolean()) { //單獨調試 應該是工程類型 apply plugin: 'com.android.application' } else { //集成調試 則做爲library集成到app中 apply plugin: 'com.android.library' } android{ ... } ... 複製代碼
applicationId
android{ defaultConfig { //單獨測試 須要配置applicationId if (isSingleRun.toBoolean()) { applicationId "com.xx.moudle_xx" } } } 複製代碼
AndroidManifest.xml
單獨測試是須要一個啓動頁入口的,因此清單文件也須要配置
android{ sourceSets { main { if (isSingleRun.toBoolean()) { //單獨測試 新建一個文件夾manifest,存放清單文件,設置啓動頁入口 manifest.srcFile 'src/main/manifest/AndroidManifest.xml' } else { manifest.srcFile 'src/main/AndroidManifest.xml' } } } } 複製代碼
Applcation
每一個組件,都會有須要初始化的東西,共用的(好比:網絡框架,圖片框架)能夠在基礎組件中初始化,那麼一些本身模塊須要初始化的東西,該怎麼作?由於集成測試不會初始化 組件的Application
。
這裏咱們能夠在基礎組件中定義 BaseApp
4. 組件 Application 的動態配置
至此,調試配置完成,配置的目的就是爲了方便 組件 獨立開發時測試 以及 集成到app時測試。將 gradle.properties
文件中的 isSingleRun
屬性設置爲true
,測試一下配置是否成功。
將isSingleRun
設置爲true
,就能夠 單獨調試 了,像 app 工程那樣。
將isSingleRun
設置爲false
,而後集成到app
中就能夠 集成測試 了。
集成測試這裏有個問題,如何跳轉到組件中的 Activity呢?須要用到 Alibaba 開源的 ARouter
推薦閱讀 Android 組件化最佳實踐 中的 4、組件間界面跳轉。
ARouter配置步驟:
base組件中配置build.gradle
android { defaultConfig { ... javaCompileOptions { annotationProcessorOptions { arguments = [ moduleName : project.getName() ] } } } } dependencies { api 'com.alibaba:arouter-api:1.3.1' // arouter-compiler 的註解依賴須要全部使用 ARouter 的 module 都添加依賴 annotationProcessor 'com.alibaba:arouter-compiler:1.1.4' } 複製代碼
組件中配置
android { defaultConfig { ... javaCompileOptions { annotationProcessorOptions { arguments = [ moduleName : project.getName() ] } } } } dependencies { ... annotationProcessor 'com.alibaba:arouter-compiler:1.1.4' } 複製代碼
在app主程序 Application
中初始化
//這斷必須寫,不然不生效,本覺得我不須要打印日誌,沒寫這段,結果花費好長時間找bug if (BuildConfig.DEBUG) { // 這兩行必須寫在init以前,不然這些配置在init過程當中將無效 ARouter.openLog(); // 打印日誌 ARouter.openDebug(); // 開啓調試模式(若是在InstantRun模式下運行,必須開啓調試模式!線上版本須要關閉,不然有安全風險) } ARouter.init(this); 複製代碼
組件中被啓動Activity 配置 path,path 必須是 」/「 開頭,最少兩級
@Route(path = "/test/test") public class TestActivity extends BaseActivity {} 複製代碼
主程序啓動 組件中 Activity
ARouter.getInstance().build("/test/test").navigation(); 複製代碼
至此,單獨調試 和 簡單的集成調試 完結,接下來更多的就是 集成調試狀況下,如何保證組件在高度聚合的狀況下互通有無。
總體思路就是在基礎組件中定義接口,組件間經過接口傳遞數據,徹底解耦。