第1章 組件單獨(dú)調(diào)試與集成發(fā)布

1邻薯、組件化思路

“聚合和解耦是項(xiàng)目架構(gòu)的基礎(chǔ)”裙戏,站在組件化項(xiàng)目角度,第一步期望子組件可以作為APP單獨(dú)調(diào)試和殼APP集成發(fā)布厕诡。好處在于開發(fā)者在一個(gè)子項(xiàng)目中把子組件作為一個(gè)子app開發(fā)累榜,而不影響別人。APP上線灵嫌,發(fā)布者只需關(guān)心是否合并子組件功能信柿。

2、單獨(dú)調(diào)試與集成發(fā)布需求拆解

  • 1醒第、單獨(dú)調(diào)試:指通過(guò)一個(gè)標(biāo)志isRunAlone, 若isRunAlone==true,當(dāng)前l(fā)ib項(xiàng)目轉(zhuǎn)化為app項(xiàng)目渔嚷,反之為lib項(xiàng)目,移除調(diào)試代碼
  • 2稠曼、集成發(fā)布:指殼工程形病,IDE編寫代碼時(shí),不能引用子組件代碼霞幅,做到編寫隔離漠吻,而編譯時(shí),又要將子組件代碼編譯到主項(xiàng)目中司恳,最好配置是在殼工程中g(shù)radle.propetties途乃,建議也要支持?jǐn)U展方法addComponent,以函數(shù)方式支持

3扔傅、核心邏輯

  • 1耍共、初始化當(dāng)前項(xiàng)目
  • 2、獲取當(dāng)前任務(wù)類型
  • 3猎塞、若當(dāng)前是殼工程试读,支持編譯隔離
  • 4、若當(dāng)前是子組件荠耽,支持單獨(dú)調(diào)試和發(fā)布
3.1 示例代碼
    void apply(Project project) {
        this.mProject = project

        //1钩骇、初始化當(dāng)前項(xiàng)目
        initAlone(project)

        //2、判斷當(dāng)前任務(wù) 只有assemble任務(wù)才添加依賴
        assembleTask = getTaskInfo(project)

        //3铝量、當(dāng)前是殼工程 不許被引用
        if (isMainApp(project)) {
            //運(yùn)行殼工程配置
            runMainApp(project)
            //添加配置依賴
            compileComponents(assembleTask, project)
            //添加擴(kuò)展方法 (選項(xiàng)) 參數(shù)
            project.ext.addComponent = { dependencyName -> addComponent(dependencyName) }
            return
        }

        //4倘屹、支持單獨(dú)調(diào)試和發(fā)布
        runAlone(project)

    }
3.2單獨(dú)調(diào)試
    private static final String DEBUG_DIR = "src/main/debug/"

    /**
     * 支持單獨(dú)調(diào)試和發(fā)布
     */
    private void runAlone(Project project) {
        //1.找當(dāng)前module的狀態(tài)
        boolean isRunAlone = fetchAloneStatus(project)
        if (isRunAlone) {
            project.apply plugin: 'com.android.application'
            log("apply plugin is " + 'com.android.application')
            project.android.sourceSets {
                main {
                    //debug模式下,如果存在src/main/debug/AndroidManifest.xml慢叨,則自動(dòng)使用其作為manifest文件
                    def debugManifest = "${DEBUG_DIR}AndroidManifest.xml"
                    if (project.file(debugManifest).exists()) {
                        manifest.srcFile debugManifest
                    }
                    java.srcDirs = ['src/main/java', "${DEBUG_DIR}java"]
                    res.srcDirs = ['src/main/res', "${DEBUG_DIR}res"]
                    assets.srcDirs = ['src/main/assets', "${DEBUG_DIR}assets"]
                    jniLibs.srcDirs = ['src/main/jniLibs', "${DEBUG_DIR}jniLibs"]
                }
            }
        } else {
            project.apply plugin: 'com.android.library'
            log("apply plugin is " + 'com.android.library')
            //main下刪除所有debug目錄下的文件
            project.android.sourceSets.main {
                //默認(rèn)這個(gè)位置纽匙,為代碼清晰
                manifest.srcFile 'src/main/AndroidManifest.xml'
                //刪除所有debug目錄下內(nèi)容
                java {
                    exclude 'debug/**'
                }
                res {
                    exclude 'debug/**'
                }
                assets {
                    exclude 'debug/**'
                }
                jniLibs {
                    exclude 'debug/**'
                }
            }
        }
    }

4、插件編寫原則

1插爹、單一職責(zé):一個(gè)插件只做好一件事哄辣,不要與其他組件化插件功能耦合请梢。
2赠尾、配置化:用戶最小情況修改代碼力穗,可以帶來(lái)穩(wěn)定
3、易用性:以用戶為中心气嫁,編寫代碼提供插件支持当窗,減少生僻概念,支持用戶慣性寫法

  • 1寸宵、單一職責(zé)
    單獨(dú)調(diào)試和集成發(fā)布功能屬于通用功能崖面,即使不做插件化,在開發(fā)中也有好處梯影。過(guò)于強(qiáng)大插件功能巫员,易用性反而降低,進(jìn)而限制了

  • 2甲棍、配置化
    在根目錄下gradle.propetties配置isRunAlone简识,就可以設(shè)置設(shè)置項(xiàng)目中組件lib與app形式切換
    在空殼app下gradle.propetties配置,就可以動(dòng)態(tài)引入子組件

###是否為主APP
isMainApp=true

###配置方式接入組件
debugComponent=':module_main',\
  ':module_girls',\
  ':module_news'
releaseComponent=':module_main',\
  ':module_girls',\
  ':module_news'
  • 易用性 支持殼工程 addComponent(':module_main')函數(shù),在gradle中引入子組件,配置還支持容錯(cuò)性trimAll不可見字符

5感猛、使用示例

根目錄配置gradle.propetties

##集成與獨(dú)立模式
isRunAlone=false

1七扰、殼工程
gradle配置

apply plugin: 'thorAlone'
并且刪除原來(lái)的app引用
//apply plugin: 'com.android.application'

//或采用這種方式
dependencies{
    //組件解耦采用這種方式  assemble 才會(huì)引入依賴 build并不引入達(dá)到組件間代碼隔離
    addComponent(':module_main')
    addComponent(deps.support.multidex)
}

gradle.propetties

###是否為主APP
isMainApp=true

###配置方式接入組件
debugComponent=':module_main',\
  ':module_girls',\
  ':module_news'
releaseComponent=':module_main',\
  ':module_girls',\
  ':module_news'

2、子組件配置
gradle配置,刪除sourceSets

apply plugin: 'thorAlone'
并且刪除原來(lái)的lib引用
//apply plugin: 'com.android.library'

//刪除 sourceSets
//sourceSets{
//main{}
//}

子組件代碼配置


6陪白、項(xiàng)目代碼

https://github.com/yinlingchaoliu/AndroidComponent

插件位置
AndroidComponent/thor_alone_gradle_plugin

//諸神黃昏
include ':component:thor_alone_gradle_plugin',
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末颈走,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子咱士,更是在濱河造成了極大的恐慌立由,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件序厉,死亡現(xiàn)場(chǎng)離奇詭異拆吆,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)脂矫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門枣耀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人庭再,你說(shuō)我怎么就攤上這事捞奕。” “怎么了拄轻?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵颅围,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我恨搓,道長(zhǎng)院促,這世上最難降的妖魔是什么筏养? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮常拓,結(jié)果婚禮上渐溶,老公的妹妹穿的比我還像新娘。我一直安慰自己弄抬,他們只是感情好茎辐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著掂恕,像睡著了一般拖陆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上懊亡,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天依啰,我揣著相機(jī)與錄音,去河邊找鬼店枣。 笑死速警,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的艰争。 我是一名探鬼主播坏瞄,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼甩卓!你這毒婦竟也來(lái)了鸠匀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤逾柿,失蹤者是張志新(化名)和其女友劉穎缀棍,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體机错,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡爬范,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了弱匪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片青瀑。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖萧诫,靈堂內(nèi)的尸體忽然破棺而出斥难,到底是詐尸還是另有隱情,我是刑警寧澤帘饶,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布哑诊,位于F島的核電站,受9級(jí)特大地震影響及刻,放射性物質(zhì)發(fā)生泄漏镀裤。R本人自食惡果不足惜竞阐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望暑劝。 院中可真熱鬧骆莹,春花似錦、人聲如沸铃岔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)毁习。三九已至,卻和暖如春卖丸,著一層夾襖步出監(jiān)牢的瞬間纺且,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工稍浆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留载碌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓衅枫,卻偏偏與公主長(zhǎng)得像嫁艇,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子弦撩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354