android组件化之路

问题:实际业务变化快,而工程内各个功能模块耦合度太高,不能对功能模块进行快速方便地拆分或组装。团队共同开发中,可能一个文件同时被多人修改,导致每次更新提交代码都需要消耗大量时间去merge代码。每次修改,都需要进行功能测试和系统测试。

目的:解决以上问题,使项目可以灵活配置,功能模块完全解耦,实践组件化之路。

实现:在之前的开发中,一个应用程序,我们将全部功能模块都写在工程app包中。实践组件化,我们将各个功能模块独立出来,最终以依赖包的形式整合到app主Module中去。在这里我写了个项目demo,简单分了几个功能模块,应用结构如下图所示:

项目组件化结构图

说明:每一个组件module是一个子工程,子工程可以依赖基础库baselibrary可独立运行;也可以作为主工程的依赖库。

具体实现:1:配置项目的buildscript,如下图所示:

buildscript配置

关于butterknife的配置及用法:http://jakewharton.github.io/butterknife,butterknife8支持在lib库中注解。

2:在主app module gradle中如下配置:

applyplugin:'com.android.application'

applyplugin:'android-apt'

android {

    compileSdkVersion COMPILE_SDK_VERSION as int

    buildToolsVersion BUILD_TOOLS_VERSION

    defaultConfig {

        applicationId APPLICATION_ID

        minSdkVersion MIN_SDK_VERSIONas int

        targetSdkVersion TARGET_SDK_VERSIONas int

        versionCode 1

        versionName "1.0"

    }

    signingConfigs {

        debugConfig {

            storeFile file("***.jks")

            storePassword "******"

            keyAlias "*****"

            keyPassword "******"

        }

    releaseConfig {

        storeFile file("******.jks")

        storePassword "********"

        keyAlias "*****"

        keyPassword"*******"

    }

}

}

 buildTypes {

       release {

         minifyEnabled false

         proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

     }

  }

dependencies {

if(!isDebug.toBoolean()) {//各个模块作为库加载

compile project(':loginmodule')

compile project(':startmodule')

compile project(':homemodule')

compile project(':msgmodule')

}else{//各模块独立运行

compile project(':baselibrary')

}

//router

apt'com.github.mzule.activityrouter:compiler:1.1.7'

}

说明:关于activityrouter的配置及使用,在后面会说到。

3:baselibrary作为各个模块共同依赖的基础库,其gradle配置如下:

applyplugin:'com.android.library'

applyplugin:'com.jakewharton.butterknife'

applyplugin:'android-apt'

android {

compileSdkVersion24

buildToolsVersion"25.0.2"

defaultConfig {

minSdkVersion15

targetSdkVersion24

versionCode1

versionName"1.0"

}

buildTypes {

release {

minifyEnabledfalse

proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'

}

}

}

dependencies {

compile fileTree(include: ['*.jar'],dir:'libs')

androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {

excludegroup:'com.android.support',module:'support-annotations'

})

compile'com.android.support:appcompat-v7:24.2.1'

compile'com.jakewharton:butterknife:8.5.1'

apt'com.jakewharton:butterknife-compiler:8.5.1'

compile'com.github.mzule.activityrouter:activityrouter:1.2.2'

}

4:在子工程模块gradle配置如下(以homemodule为例):

if(isDebug.toBoolean()) {

applyplugin:'com.android.application'

}else{

applyplugin:'com.android.library'

}

applyplugin:'com.jakewharton.butterknife'

applyplugin:'android-apt'

android {

compileSdkVersion24

buildToolsVersion"25.0.2"

defaultConfig {

minSdkVersion15

targetSdkVersion24

versionCode1

versionName"1.0"

testInstrumentationRunner"android.support.test.runner.AndroidJUnitRunner"

}

buildTypes {

release {

minifyEnabledfalse

proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'

}

}

sourceSets {

main{

if(isDebug.toBoolean()) {

manifest.srcFile'src/debug/AndroidManifest.xml'

}else{

manifest.srcFile'src/release/AndroidManifest.xml'

}

}

}

resourcePrefix"home_"

}

dependencies {

compile fileTree(dir:'libs',include: ['*.jar'])

androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {

excludegroup:'com.android.support',module:'support-annotations'

})

compile project(':baselibrary')

apt'com.jakewharton:butterknife-compiler:8.5.1'

//router

apt'com.github.mzule.activityrouter:compiler:1.1.7'

}

说明:当module单独运行和作为module运行时,其activity在manifest中设置也会不同,这里可以根据isDebug设置不同的manifest。当分别开发模块时,容易出资源重复命名的问题,可以在build.gradle中设置resourcePrefix "home_",通过给模块设置不同的资源前缀,可以避免重复命名。

Activity跳转问题

从上面的配置中,可以看到,项目引入了apt'com.github.mzule.activityrouter:compiler:1.1.7',我们为什么使用ActivityRouter呢,当我们把各个功能模块抽成独立的lib的时候,各个模块之间难免要进行Activity的跳转及传参。我们不能再像以前那样直接通过startActivity来实现跳转了。关于ActivityRouter的配置及用法:https://github.com/mzule/ActivityRouter

使用在application中注解:@Modules({"app","homeModule","loginModule","startModule","msgModule"})

public class XxxxApplication extends Application {

}

每个module中创建空java类注解:

@Module("homeModule")

public class HomeModule{

}

组件间通信问题:

不同组件Activity之间传递大量数据时可以通过EventBus来进行传递,EventBus原理及用法:https://github.com/greenrobot/EventBus

编译运行

当在gradle.properties中设置isDebug=true时,可以独立运行每个module,独立运行调试,当设置isDebug=false,可以编译运行整个project,注意isDebug变量设置改变时,要重新对gradle进行sync。

可能遇到的一些问题:

1:如果遇到/com/github/mzule/activityrouter/router/RouterInit.java javaError:(7, 5) 错误: 找不到符号 符号:  变量 RouterMapping等错误,请检查app是否把各个Module都依赖进来了。

2:使用butterknife注解时,每个Module会对应生成R2文件,即使在base库里注解过了,Module也要重新注解,组件中不能直接使用。

3:如果项目中使用到menu注意:

@Override

protected void onMenuItemClick(MenuItem item) {

//        switch (item.getItemId()) {

//            case R2.id.xxx:

//                Routers.open(mContext,"");

//                break;

//        }

if (item.getItemId() == R.id.xxx){

Routers.open(mContext,"");

}

super.onMenuItemClick(item);

}

寻找对应的menu id时,用if else 代替 switch,注:itemid 和 R2值不一样,和R是一样的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容