將Android項目組件化是我的一個夙願,通過在網上不斷的搜尋,終於在簡書上找到一位朋友的文章,我的組件化方案完全按照他的文章和demo來進行,下面是這篇文章的鏈接:jianshu.com/p/1b1d77f58,這是一個系列,希望各位通讀。這閱讀這個系列的文章時,我也有一些困惑和不解的地方,在這篇文章裏都有解釋,希望對各位有幫助

下面附上我自己的項目的源碼:github.com/gongchenghao

具體的理論解釋在這位朋友的文章中已經說得很清楚了,這裡就不再贅述,本文主要是我總結的創建組件化項目的步驟,各位可以按照這個步驟來創建自己的組件化項目。

1:創建一個project,用創建project時自帶的app moudle作為host項目

2:創建一個名為basiclib的Android Library,用來放置公共類、工具類、以及一些公共的依賴等。

3:創建一個名為service的Android Library,用來為app、read、share互相調用提供服務支持

4:創建read項目和share項目

5:讓service依賴basiclib,app、share、read都依賴service,此時運行一下app、share、read,都能運行

6:配置工程下的build.gradle文件,注意,剛開始時先完全按照demo中的配置,等項目組件化做完之後,再根據自己的需求對不需要的引用進行刪減;build.gradle文件配置完成後,com.dd.comgradle插件就已經引入到的項目中。

7:修改read、share、app的build.gradle中的apply plugin: com.android.application為apply plugin: com.dd.comgradle,修改完後同步一下項目,會提示設置isRunAlone。

8:將工程下的gradle.properties文件複製到share和read項目的根目錄下,並在share和read項目的根目錄下的gradle.properties文件的最後一行加入isRunAlone=true

9:將工程下的gradle.properties文件複製到app項目的根目錄下,並進行如下設置:isRunAlone=truedebugComponent=read,sharecompileComponent=read,share設置完成後同步一下項目,會報錯:Error:(1, 0) Could not get unknown property mainmodulename for root project MyZuJianHuaDemo of type org.gradle.api.Project.解決辦法:在工程目錄下的gradle.properties文件中添加mainmodulename=app,報錯解決

10:解決後同步一下項目,會報錯:Error:Cannot read packageName from D:MyProjectMyZuJianHuaDemo
eadsrcmain
unaloneAndroidManifest.xml

(1)在read項目的main文件夾下創建runalone文件夾,在runalone文件夾下創建java文件夾,在java文件夾中創建runalone文件夾,在runalone文件夾下創建application文件夾,在application文件夾下創建ReadApplication類,並繼承BaseApplication

(2)複製read項目的AndroidManifest.xml文件到runalone文件夾下,然後將runalone文件夾外的AndroidManifest.xml文件去掉intent-filter標籤,即去掉其作為一個完整APP的入口,使read項目的入口變成runalone文件夾下的AndroidManifest.xml文件。

(3)對share項目進行同樣的操作同步一下項目,不會報錯

11:修改share項目和read項目的build.gradle文件

(1)修改share項目的build.gradle文件,在defaultConfig標籤的最後添加: //此處的"share"是跳轉URI中的host名稱,每個組件需要設置不同的host。 javaCompileOptions { annotationProcessorOptions { arguments = [host: "share"] } }

(2)在android標籤的最後添加:resourcePrefix "share_"

(3)在build.gradle文件的最後添加combuild { applicationName = application.ShareAppliaction isRegisterCompoAuto = true}repositories { mavenCentral()}注意:application.ShareAppliaction是runalone文件夾下ShareAppliaction的路徑

(4)在依賴中加入:annotationProcessor deps.jimu.router_anno_compiler,用於進行UI跳轉

(5)對read項目進行同樣的操作

12:在service的build.gradle中加入:resourcePrefix "service_"

13:修改app項目的build.gradle文件

(1)在defaultConfig標籤的最後添加:javaCompileOptions { annotationProcessorOptions {arguments = [host: "app"] }} vectorDrawables.useSupportLibrary = true

(2)在android標籤的最後添加: lintOptions {checkReleaseBuilds false// Or, if you prefer, you can continue to check for errors in release builds,// but continue the build even when errors are found:abortOnError false }

(3)在最後添加:combuild { applicationName = gch.youxin.com.myzujianhuademo.AppApplication isRegisterCompoAuto = true}

14:設置applike文件夾

(1)在basiclib中的build.gradle文件中添加依賴:compile deps.jimu.componentLib

(2)在share項目中創建applike文件夾,在該文件夾下創建ShareAppLike類實現IApplicationLike介面,並重寫onCreate和onStop方法,

(3)在read項目中進行同樣的操作

(4)在app項目中的AppApplication類中添加demo中對應的代碼

15:在BaseActivity中的onCreate()方法中加入以下代碼://依賴注入:如果想使用自動裝載功能,需要在Activity的onCreate中調用方法AutowiredService.Factory.getSingletonImpl().autowire(this);

16:去掉read、share中的build.gradle中的applicationId,保留app中的applicationId15:在app項目的清單文件中的application標籤中加上name欄位,否則註冊不了read和shareread和share的runalone文件夾中的清單文件也要在application標籤中加上name欄位

17:DDcomp的原理跳轉到哪個Activity,就在runalone文件夾外的清單文件中對應的Activity中添加一下代碼: "DDComp://share/share/edit/test"DDComp:就是scheme的值share:為在applike文件夾下註冊到路由時的參數名稱/share/edit/test:為在activity中聲明的該類的描述注意:經過實驗發現,不在清單文件中添加中的這段代碼也可以跳轉成功,

而且DDComp這個值可以隨便寫,甚至不寫都可以跳轉成功

18:添加卸載組件

//注意此處的參數為:該組件java文件夾下該類的全路徑

Router.registerComponent("gch.youxin.com.share.applike.ShareAppLike");

Router.unregisterComponent("gch.youxin.com.share.applike.ShareAppLike");

19:將read組件作為host組件來調用share組件的方法

(1)在read組件的ReadApplication的onCreate()方法中註冊share組件

Router.registerComponent("gch.youxin.com.share.applike.ShareAppLike");

(2)在read組件的gradle.properties文件中加入以下代碼:

debugComponent=share

compileComponent=share

不加的話註冊share組件不成功;註冊share組件成功的標誌是ShareAppLike類的onCreate()方法執行了

(3)此處要注意ReadApplication類的onCreate()方法有無執行,此處要注意:runalone下的java文件夾下不能直接創建

application文件夾,需要在這二者之間再創建一個文件夾進行分隔

20:注意:runalone文件夾內外的兩個清單文件中都要聲明activity


推薦閱讀:
相關文章