Android組件化/模塊化開發(fā)(二)

上一篇文章介紹了android組件化開發(fā)的意思邏輯和基本思路砸王,具體可以看這里攻旦。但是除了基本的思路外抖格,這種開發(fā)方式雖然對多人協(xié)同開發(fā)厢汹、項目管理和后期維護有很多好處螟深,但是同樣在開發(fā)過程中也有很多的坑。這一部分就主要介紹組件化開發(fā)需要注意的問題和解決方法烫葬。

1.module之間的引用

在AS 3.0之后界弧,gradle的compile已經(jīng)被廢棄,取而代之的是implementation和api搭综。這兩個的區(qū)別一般只需要記住一點:implementation引入的各種子模塊是無法被更高層的module使用的垢箕,而api可以。
舉個栗子:A module 引入了B module兑巾,B module引入了C module条获,如果使用的是implementation方式,那么C對于A來說是不可見的蒋歌;而使用api方式A是可以使用C中的方法的帅掘。同理,把C換成開源庫堂油、so文件修档、aar文件、jar包文件結(jié)論也適用府框。

2.不同module之間jar包的引用

這里再單獨說一下jar包文件吱窝,同樣舉個栗子:A module引入了B module,B module出于某種需求在lib中添加了c.jar包。這是如果A要使用相關(guān)的api院峡,必須在A module也聲明c.jar包兴使,不然一般情況下api會拋出異常。B module中對c.jar的聲明就是一般的gradle配置的常用方式照激,在對應(yīng)module的build.gradle文件中添加如下代碼:

...
repositories {
    flatDir {
        dirs 'libs'
    }
}

dependencies {
    api fileTree(dir: 'libs', include: ['*.jar'])
    ...
}

而在A module中发魄,c.jar的路徑需要變?yōu)橄鄬β窂?/p>

repositories {
    flatDir {
        dirs 'libs', '../moduleB/libs'//第一個表示A模塊本身的lib文件夾,第二個表示相對于A模塊俩垃,c.jar所在的路徑
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    ...
}

同時需要注意為了能讓A模塊使用c.jar欠母,Bmoudle的配置文件使用的是api方式引入。

3.不同module的build.gradle配置維護

對于不同的module吆寨,很多的gradle配置其實是比較重復(fù)的,比如SDK支持的版本號踩寇,一些常用的suppor包引入等啄清。以com.android.support:appcompat為例,不同的module如果引入的版本不同俺孙,輕則構(gòu)建時發(fā)出警告辣卒,嚴(yán)重時可能直接導(dǎo)致構(gòu)建失敗。所以睛榄,我們需要維護一個統(tǒng)一的全局版本荣茫。這里我門需要用到根目錄的config.gradle文件。沒有的話可以自行新建一個场靴。

代碼事例如下:

ext {
    android = [
            compileSdkVersion: 27,
            buildToolsVersion: "27.0.2",
            minSdkVersion    : 19,
            targetSdkVersion : 26
    ]
    dependencies = [
            project                  : [
                    moduleBase     : ':moduleSystem:moduleBase',
                    moduleCommon   : ':modulePublic:moduleCommon',
                    moduleUser     : ':moduleCore:moduleUser'
            ],
            "support:appcompat-v7"   : 'com.android.support:appcompat-v7:27.0.2',
            "support:design"         : 'com.android.support:design:27.0.2',
            "junit:4.12"             : 'junit:junit:4.12'
    ]
}

內(nèi)部的名稱和嵌套層級都是可以自定義的啡莉,使用的時候以rootProject.ext開頭,例如rootProject.ext.dependencies["support:appcompat-v7"]旨剥。這樣如果需要對配置做修改咧欣,只需要修改一處就可以了。

4.不同module之間的數(shù)據(jù)通訊

因為AS項目的機制問題轨帜,不同的module之間需要靠implementation和api的方式保持引入關(guān)系魄咕,而對于被引用或者平級之間的module,都是不可見的蚌父。這就導(dǎo)致這些module之間的數(shù)據(jù)交互出現(xiàn)了問題哮兰。

  • 不同module之間的頁面跳轉(zhuǎn)
    這里主要的解決方式是通過開源路由庫來解決,相關(guān)的庫可以在gayHub上去搜rout苟弛、router關(guān)鍵字喝滞。我在自己項目中使用的是阿里的ARouter
  • 不同module之間的事件響應(yīng)和消息傳遞
    這個沒啥好說的了嗡午,eventbus解決之囤躁。
    5. build.gradle buildType統(tǒng)一

這個其實應(yīng)該算作是AS 3.0的新版本的坑,不過在這兒用到了大量的module,用AS 3.0的同學(xué)也就必須要做這個工作了狸演。我們知道在主app模塊的buidl.gradle文件中可以修改buildTypes來配置不同的apk構(gòu)建方式:

buildTypes {
        debug {
        }

        //打包測試用(內(nèi)部非混淆打包測試服務(wù)器)
        debugTest.initWith(buildTypes.debug)
        debugTest {
        }

        releaseLocal {
        }

        //正式服務(wù)器(對外發(fā)布公開包)
        releaseFormal.initWith(buildTypes.releaseLocal)
        releaseFormal {
        }

新特性總結(jié)為一句話就是主app的buildTypes有多少言蛇,在每個子module的配置中也得保持一致。子module中不一定需要具體的配置宵距,但是得保證每個都得有腊尚。例如這里有debug、debugTest满哪、releaseLocal婿斥、releaseFormal 4種,那么所有的子模塊也得有對應(yīng)的4中配置哨鸭。

6. 系統(tǒng)層繼承和改寫

在項目中通常會有下面這種需求民宿。我們一般會在系統(tǒng)層的moduleBase中寫一個自定義的BaseApplication.class類。而在app中像鸡,我們通常會在Application中初始化一些額外的啟動配置活鹰,例如推送的初始化等,而很可能對于系統(tǒng)層而言只估,推送相關(guān)的module是不可見的志群,換言之,我們無法在moduleBase的BaseApplication.class類中完成對應(yīng)的初始化操作蛔钙。
對于這種情況锌云,我采用的是在app層再自定義一個SystemApplication.class類繼承BaseApplication.class,并實現(xiàn)BaseApplication.class的抽象方法的方式來對應(yīng)的操作吁脱。
另外桑涎,對于自定義的BaseActivity、BaseFragment也可以采用這種方式對自定義要求更高的動態(tài)權(quán)限進行類似的處理豫喧。

Android組件化/模塊化開發(fā)(一)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末石洗,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子紧显,更是在濱河造成了極大的恐慌讲衫,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件孵班,死亡現(xiàn)場離奇詭異涉兽,居然都是意外死亡,警方通過查閱死者的電腦和手機篙程,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門枷畏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人虱饿,你說我怎么就攤上這事拥诡〈ヅ浚” “怎么了?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵渴肉,是天一觀的道長冗懦。 經(jīng)常有香客問我,道長仇祭,這世上最難降的妖魔是什么披蕉? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮乌奇,結(jié)果婚禮上没讲,老公的妹妹穿的比我還像新娘。我一直安慰自己礁苗,他們只是感情好爬凑,可當(dāng)我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著试伙,像睡著了一般贰谣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上迁霎,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天,我揣著相機與錄音百宇,去河邊找鬼考廉。 笑死,一個胖子當(dāng)著我的面吹牛携御,可吹牛的內(nèi)容都是我干的昌粤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼啄刹,長吁一口氣:“原來是場噩夢啊……” “哼涮坐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起誓军,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤袱讹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后昵时,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捷雕,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年壹甥,在試婚紗的時候發(fā)現(xiàn)自己被綠了救巷。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡句柠,死狀恐怖浦译,靈堂內(nèi)的尸體忽然破棺而出棒假,到底是詐尸還是另有隱情,我是刑警寧澤精盅,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布帽哑,位于F島的核電站,受9級特大地震影響渤弛,放射性物質(zhì)發(fā)生泄漏祝拯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一她肯、第九天 我趴在偏房一處隱蔽的房頂上張望佳头。 院中可真熱鬧,春花似錦晴氨、人聲如沸康嘉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽亭珍。三九已至,卻和暖如春枝哄,著一層夾襖步出監(jiān)牢的瞬間肄梨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工挠锥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留众羡,地道東北人。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓蓖租,卻偏偏與公主長得像粱侣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蓖宦,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內(nèi)容