android模塊化簡(jiǎn)單教程

當(dāng)項(xiàng)目大到一定程度后,公司各個(gè)模塊的業(yè)務(wù)相互耦合,維護(hù)的時(shí)候非常困難,另外項(xiàng)目大到一定程度后,編譯速度也是個(gè)坑爹的東西,所以這個(gè)時(shí)候模塊化就顯得很有必要了。最近公司一直在推進(jìn)這方面的工作,于是我也從gayhub上fork了一個(gè)項(xiàng)目動(dòng)手實(shí)踐起來(lái),下面做個(gè)簡(jiǎn)單的記錄。

先貼代碼,對(duì)著代碼看更直觀:示例代碼

1.模塊劃分

模塊化的第一步就是模塊劃分要明確,否則所謂的模塊化無(wú)從談起。由于本項(xiàng)目直接fork自 https://github.com/BaronZ88/ModularizationProject ,所以直接偷了他的模塊劃分圖來(lái):

模塊圖

可以很明顯的看到整個(gè)模塊分為三層,基礎(chǔ)組件層,基礎(chǔ)業(yè)務(wù)層,業(yè)務(wù)層。最底下一層包含一些第三方開(kāi)源庫(kù)和公司自己開(kāi)發(fā)的各種底層庫(kù),在這一層中基本上通過(guò)gradle引入的第三方框架都在這里配置;第二層是基礎(chǔ)業(yè)務(wù)庫(kù),所謂的基礎(chǔ)業(yè)務(wù)庫(kù)就是有很多業(yè)務(wù)都可能涉及到這些的,比如一些公用的vo,比如登錄業(yè)務(wù),比如支付系統(tǒng);最高一層就是我們真正的模塊化的各種業(yè)務(wù),這一層的任何一個(gè)不同模塊都應(yīng)該可以單獨(dú)作為一個(gè)app跑起來(lái),每次開(kāi)發(fā)時(shí)應(yīng)該只需要運(yùn)行某一個(gè)模塊,從而避免影響其它業(yè)務(wù)。在我們的示例代碼中,結(jié)構(gòu)就是這樣的:

其中App模塊就是我們的主模塊,運(yùn)行這個(gè)模塊保證所有模塊都會(huì)被當(dāng)做module引入,然后其它以Module結(jié)尾的都可以單獨(dú)運(yùn)行起來(lái)。另外CommonBusiness和CoreModel是基礎(chǔ)業(yè)務(wù)層的模塊,OpenSourceLibrary是最底下一層基礎(chǔ)組件層的module。
有了這些基礎(chǔ),模塊化才能繼續(xù)進(jìn)行下去

2.配置運(yùn)行不同的模塊

(1)區(qū)分兩種狀態(tài)

首先要明確一點(diǎn),對(duì)任意一個(gè)業(yè)務(wù)module來(lái)說(shuō),它都有兩種狀態(tài),一種是運(yùn)行App模塊時(shí)的module狀態(tài),單純提供依賴,一種是模塊單獨(dú)運(yùn)行時(shí)的可運(yùn)行狀態(tài)。
為了區(qū)分這兩種狀態(tài),我們?cè)趃radle.properties文件中添加了一個(gè)變量isBuildModule,當(dāng)為true的時(shí)候,各個(gè)業(yè)務(wù)模塊能夠單獨(dú)運(yùn)行,當(dāng)為false時(shí),每個(gè)業(yè)務(wù)module無(wú)法單獨(dú)跑起來(lái)只能作為module引入,將整個(gè)應(yīng)用跑起來(lái),此時(shí)只有App模塊能運(yùn)行。

(2)配置兩種狀態(tài)下的gradle文件

一個(gè)module是否可以單獨(dú)運(yùn)行,是由它的gradle文件中的配置決定的,該module如果只是一個(gè)library,通常我們這樣寫:
apply plugin: 'com.android.library'
但如果要讓該module能單獨(dú)跑起來(lái)我們要這么寫:
apply plugin: 'com.android.application'
綜合一下,結(jié)合isBuildModule變量,最終我們這么處理:

if (isBuildModule.toBoolean()) {
    apply plugin: 'com.android.application'
} else {
    apply plugin: 'com.android.library'
}

這樣,我們就能夠通過(guò)修改isBuildModule來(lái)配置是否單獨(dú)運(yùn)行模塊。

(3)提供兩套AndroidManifest.xml文件

由于一個(gè)module要想單獨(dú)跑起來(lái),那么我們必須要指定啟動(dòng)的Activity,但是當(dāng)isBuildModule為false時(shí)又不需要,所以我們要準(zhǔn)備兩套Manifest文件。以NewHouseModule為例:



Manifest文件分為debug模式和release模式,debug模式就是該模塊可以單獨(dú)運(yùn)行的模式。然后在該module的gradle文件中配置下:

  sourceSets {
        main {
            if (isBuildModule.toBoolean()) {
                manifest.srcFile 'src/main/debug/AndroidManifest.xml'
            } else {
                manifest.srcFile 'src/main/release/AndroidManifest.xml'
            }
        }
    }

這里分別看下兩種文件的區(qū)別:
debug:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.baronzhang.android.newhouse">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/new_house_ic_launcher"
        android:label="@string/new_house_app_name"
        android:supportsRtl="true"
        android:theme="@style/NewHouseAppTheme">
        <activity
            android:name="com.baronzhang.android.newhouse.NewHouseMainActivity"
            android:label="@string/new_house_label_home_page">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>

</manifest>

release:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.baronzhang.android.newhouse">

    <application
        android:allowBackup="true"
        android:supportsRtl="true">
        <activity
            android:name="com.baronzhang.android.newhouse.NewHouseMainActivity"
            tools:replace="label"
            android:label="@string/new_house_label_home_page">
        </activity>

    </application>

</manif

這里差距主要是是否配置了啟動(dòng)Activity。

(4)配置依賴關(guān)系

經(jīng)過(guò)上面三部的配置,按道理可以通過(guò)修改isBuildModule變量來(lái)配置是否讓某個(gè)模塊單獨(dú)運(yùn)行了,然后事實(shí)不是這樣,當(dāng)isBuildModule為true時(shí),這個(gè)時(shí)候運(yùn)行App模塊會(huì)報(bào)錯(cuò),我們需要修改下App模塊下的gradle文件:

  if (isBuildModule.toBoolean()) {
        compile project(':CoreModel')
        compile project(':CommonBusiness')
    } else {
        compile project(':InstantMessagingModule')
        compile project(':NewHouseModule')
        compile project(':SecondHouseModule')
    }

當(dāng)運(yùn)行的是某個(gè)模塊是,每一個(gè)業(yè)務(wù)module都是一種application,而不是library,是不能以compile project的方式引入的,所以要排除掉,但也同時(shí)排除了這些module依賴的一些基礎(chǔ)業(yè)務(wù)庫(kù),所以我們要引入進(jìn)來(lái)。這樣,配置每個(gè)模塊單獨(dú)運(yùn)行就完成了。

3.配置路由跳轉(zhuǎn)

由于不同的業(yè)務(wù)相互解耦的非常徹底,然后有些時(shí)候必然會(huì)出現(xiàn)一個(gè)模塊要跳往另一個(gè)模塊,這種時(shí)候,系統(tǒng)自帶的跳轉(zhuǎn)已經(jīng)不行了,因?yàn)樵撃K中沒(méi)有另一個(gè)模塊的Activity,這里可以考慮通過(guò)Scheme跳轉(zhuǎn),但一來(lái)配置麻煩,二來(lái)還有安全風(fēng)險(xiǎn),所以不推薦。這個(gè)時(shí)候,Android頁(yè)面路由就該上場(chǎng)了。
原作者自己擼了一個(gè)頁(yè)面路由框架,我等渣渣只能膜拜,然后自己去github上找了下,最終選定了阿里巴巴開(kāi)源的ARouter,配置簡(jiǎn)單,上手簡(jiǎn)單,使用簡(jiǎn)單。該框架的詳細(xì)使用教程看這里:https://github.com/alibaba/ARouter 。這一步?jīng)]有難度,照著文檔來(lái)就行了,注意一點(diǎn),凡是使用ARouter的模塊,都要在build.gradle文件中加入

dependencies {
    // 替換成最新版本, 需要注意的是api
    // 要與compiler匹配使用,均使用最新版可以保證兼容
    compile 'com.alibaba:arouter-api:x.x.x'
    annotationProcessor 'com.alibaba:arouter-compiler:x.x.x'
    ...
}

這里更推薦的是將 compile 'com.alibaba:arouter-api:x.x.x' 放到OpenSourceLibrary模塊中去,每個(gè)模塊只需要配置annotationProcessor即可。

總結(jié)

經(jīng)過(guò)以上操作,最簡(jiǎn)單的模塊化就完成了,后面會(huì)繼續(xù)介紹一些稍微麻煩一些的內(nèi)容:
Android模塊化之登錄業(yè)務(wù)處理
Android模塊化之ButterKnife和Dagger2的使用
參考文檔:
Android 模塊化探索與實(shí)踐

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,936評(píng)論 6 535
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,744評(píng)論 3 421
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 176,879評(píng)論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 63,181評(píng)論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,935評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 55,325評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,384評(píng)論 3 443
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 42,534評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,084評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,892評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,067評(píng)論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,623評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,322評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 34,735評(píng)論 0 27
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 35,990評(píng)論 1 289
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,800評(píng)論 3 395
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,084評(píng)論 2 375

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,677評(píng)論 25 708
  • 今天來(lái)回味下組件化和模塊化,這2種說(shuō)法時(shí)一回事,當(dāng)然還是有區(qū)別的,下面再詳細(xì)說(shuō),其實(shí)很簡(jiǎn)單,只是設(shè)計(jì)范圍的不同,也...
    前行的烏龜閱讀 48,802評(píng)論 6 94
  • 不怕跌倒,所以飛翔 組件化開(kāi)發(fā) 參考資源 Android組件化方案 為什么要組件化開(kāi)發(fā) 解決問(wèn)題 實(shí)際業(yè)務(wù)變化非常...
    筆墨Android閱讀 3,001評(píng)論 0 0
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,900評(píng)論 6 342
  • “同一任務(wù),用戶花2個(gè)步驟完成當(dāng)然比花5個(gè)步驟完成更省力了呀,體驗(yàn)也更好”。未多加思考者聽(tīng)之即為真理。記得剛?cè)腴T,...
    一尺厚閱讀 491評(píng)論 0 4