從一搭建-Android組件化框架

首先逸尖,談?wù)劄槭裁匆獙戇@個系列的文章,嚴(yán)格來說是一段學(xué)習(xí)組件化的筆記瘸右。

很多小伙伴都了解組件化冷溶,也學(xué)習(xí)過,但是像我這樣沒有大型項目經(jīng)驗的尊浓,很難深入理解它的意義。直到去年公司開啟了新項目纯衍,我?guī)е?個小伙伴一起從0開發(fā)到1(當(dāng)然還有產(chǎn)品栋齿,測試及后端每個人的功勞),突破百萬日活襟诸。

隨著功能模塊越來越多瓦堵,開發(fā)人員交替,開發(fā)風(fēng)格不統(tǒng)一(有的mvp歌亲,有mvc菇用,甚至有站擼activity的),工程不僅代碼臃腫陷揪,目錄下多達(dá)38個包惋鸥。功能模塊嚴(yán)重耦合,開發(fā)中經(jīng)常引起老功能bug悍缠,或者一個bug反復(fù)出現(xiàn)(讓你不寫單元測試)卦绣。在被折磨的內(nèi)心崩潰以后,終于在組件化單元測試中找到了救贖飞蚓。(單元測試:請看http://www.reibang.com/nb/26784460

吐槽完畢滤港,開擼代碼,想看基礎(chǔ)的推薦這幾篇文章(是不是拿完鏈接趴拧,就可以撤了):

目標(biāo)

首先山叮,我們的目標(biāo)是告別臃腫,建立一個業(yè)務(wù)組件之間獨立添履,即可集成開發(fā)屁倔,也可組件化開發(fā)的基礎(chǔ)項目框架。

如果是簡單的建立幾個module缝龄,那誰都會汰现,我們的項目里也有很多module。這里要解決的主要問題是:

  1. 組件既能獨立編譯開發(fā)叔壤,也可以集成開發(fā)僵蛛,組件間可以靈活組合打包暇榴。
  2. 組件之間是沒有關(guān)聯(lián)的,如何通信,頁面如何調(diào)用寄悯。(這里引入了“路由”的概念,組件間通過路由中轉(zhuǎn)建立聯(lián)系沥邻,Android用的是URL Scheme作為路由)

創(chuàng)建基礎(chǔ)工程

app:為殼工程罩润,只負(fù)責(zé)集成各個module。
lib_common:為公共基礎(chǔ)庫脚曾,引入大部分第三方庫和工具類东且。
module_setting:項目各種開關(guān),功能設(shè)置(具體什么module自己選擇)
module_main:主module本讥,暫時只有一個MainActivity珊泳。

新建工程.png

1. 創(chuàng)建config.gradle,對所以組件的gradle配置拷沸、第三方依賴色查,統(tǒng)一管理。(關(guān)于本地化配置gradle的教程撞芍,參考開頭推薦的文章)
ext {//提取依賴秧了,版本號,方便管理
    appVersion = [
            versionCode: 1,
            versionName: "1.0.0"
    ]
    android = [
            compileSdkVersion: 26,
            minSdkVersion    : 18,
            targetSdkVersion : 26,
    ]
    dependencies = [
            appcompat_v7       : 'com.android.support:appcompat-v7:26.1.0',
            constraintLayout   : 'com.android.support.constraint:constraint-layout:1.1.1',
            support_design             : 'com.android.support:design:26.1.0',
            support_annotations: 'com.android.support:support-annotations:26.1.0',

            testJunit          : 'junit:junit:4.12',
            textRunner         : 'com.android.support.test:runner:1.0.0',
            androidTestEspresso: 'com.android.support.test.espresso:espresso-core:3.0.0',
    ]
}

這里api序无、implementation验毡、compile的區(qū)別需要注意,以免重復(fù)引入依賴:
implementation:編譯的依賴只作用于當(dāng)前的module
compile 與 api:二者等同帝嗡,無區(qū)別

dependencies {//module引用config.gradle的配置
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    api rootProject.ext.dependencies.appcompat_v7
    api rootProject.ext.dependencies.support_design
    api rootProject.ext.dependencies.constraintLayout
2. 集成模式 和 組件化模式切換

我們需要一個開關(guān)米罚,在gradle.properties中創(chuàng)建"isModule"變量,在每個module的build.gradle中丈探,通過它來切換開發(fā)模式录择。

# false表示是集成化開發(fā)模式,true表示是組件化開發(fā)模式
isModule = true
if (isModule.toBoolean()) {
    apply plugin: 'com.android.application'
} else {
    apply plugin: 'com.android.library'
}

那么問題來了,組件獨立編譯時隘竭,需要臨時的manifest塘秦,Application來初始化一些配置。并在集成模式下移除這些配置动看。以module_main為例:

創(chuàng)建debug文件夾 和 DebugApplication尊剔,創(chuàng)建module文件夾 和 臨時Manifest

怎么靈活的切換以上文件呢,還是要用到"isModule"菱皆,在build.gradle的android{}下须误,通過判斷isModule,加載不同的AndroidManifest.xml仇轻,并在集成模式中移除debug文件夾

android {
    ...
    sourceSets {
        main {
            if (isModule.toBoolean()) {
                manifest.srcFile 'src/main/module/AndroidManifest.xml'
            } else {
                manifest.srcFile 'src/main/AndroidManifest.xml'
                java {
                    exclude 'debug/**'
                }
            }
        }
    }
3. 公共基礎(chǔ)庫(lib_common)

作為公共的基礎(chǔ)庫京痢,除了引入依賴,還具有一下功能:

  • 引入了常用的工具類篷店、公共/自定義widget祭椰,公共常量
  • 第三方框架(數(shù)據(jù)庫,網(wǎng)絡(luò)疲陕,圖片方淤,RxJava等)
  • permission聲明
  • 一些公用的資源文件,styles蹄殃、dimens携茂、colors、drawable等等
4. app殼工程诅岩,主要功能

app殼工程邑蒋,沒有任何的業(yè)務(wù)代碼,主要用于集成模式下:

  • build.gradle依賴各個組件
  • 配置AndroidManifest.xml
  • 聲明Android應(yīng)用的Application(繼承l(wèi)ib_common的BaseApplication)按厘。
  • 配置工程混淆文件

小結(jié):

本章介紹了:為什么要用組件化,需要解決的問題钱慢,組件化工程的配置

項目也才搭建到這里逮京,下一章我們會引入阿里的ARouter組件化框架,完善基礎(chǔ)工程束莫。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末懒棉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子览绿,更是在濱河造成了極大的恐慌策严,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件饿敲,死亡現(xiàn)場離奇詭異妻导,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門倔韭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來术浪,“玉大人,你說我怎么就攤上這事寿酌∫人眨” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵醇疼,是天一觀的道長硕并。 經(jīng)常有香客問我,道長秧荆,這世上最難降的妖魔是什么倔毙? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮辰如,結(jié)果婚禮上普监,老公的妹妹穿的比我還像新娘。我一直安慰自己琉兜,他們只是感情好凯正,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著豌蟋,像睡著了一般廊散。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上梧疲,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天允睹,我揣著相機與錄音,去河邊找鬼幌氮。 笑死缭受,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的该互。 我是一名探鬼主播米者,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼宇智!你這毒婦竟也來了蔓搞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤随橘,失蹤者是張志新(化名)和其女友劉穎喂分,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體机蔗,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡蒲祈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年甘萧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片讳嘱。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡幔嗦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出沥潭,到底是詐尸還是另有隱情邀泉,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布钝鸽,位于F島的核電站汇恤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏拔恰。R本人自食惡果不足惜因谎,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望颜懊。 院中可真熱鬧财岔,春花似錦、人聲如沸河爹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽咸这。三九已至夷恍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間媳维,已是汗流浹背酿雪。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留侄刽,地道東北人指黎。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像州丹,于是被迫代替她去往敵國和親醋安。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355