Android 开发之组件化环境搭建

组件化开发 是适应团队开发的一种模式 

如果你一个项目有三人以上联合开发 你就会发现开发协作以及效率会大不如从前 代码臃肿 各种调用 各种重复 都是有可能会发生的 甚至会出现今天写明天错 这时候单一的module 的开发模式 明显已经不适合再继续使用了 所以组件化 应运而生(当然还有插件化 以后会开篇插件化以及插件化相关的框架介绍 今天只谈组件化 以及组件化和插件化的区别)

下面给他两个示例图 区别组件化 和 插件化


组件化图例
插件化图例

 例图已经很明显了 两者从原理上来说是有着本质区别的 但最终目的都是为了提高开发效率和团队协作能力

下面开始环境搭建 本文以as 为例

新建一个项目 KidsDemo 

新建一个module library libmodel 放公共方法 或者 资源 

新建一个phone module businessmodel 功能模块

案例使用了中间件路由 Arouter 具体使用我就不说了 本文略长 关于第三方 我会提供相关联系 

阿里巴巴中间件 点击了解Arouter路由

我的项目架构 


项目架构

我们只写两个module 的 交互 和 通信 即 app 和 businessmodel 之间进行

首先对preject 进行配置 

打开project 的 build.gradle 文件 

添加中间件


apply plugin: ‘com.alibaba.arouter’ dependencies { 

…. 

classpath “com.alibaba:arouter-register:1.0.0” 

// NOTE: Do not place your application dependencies here; they belong 

// in the individual module build.gradle files 

}


提取远程依赖 设置开关 在project 的 gradle.properties 中添加 

isDebug = true;// false debug 模式 true 发布模式 ;false 开发模式不存在依赖关系


提取sdk管理供各model 调用 统一设置sdk版本

ext{ 

android_compileSdkVersion = 25 

android_buildToolsVersion = ‘25.0.3’ 

android_minSdkVersion = 16 

android_targetSdkVersion = 25 

app_versionCode = 1; 

app_versionName = “1.0”;

lib_fastjson = 'com.alibaba:fastjson:1.2.32'

lib_gson = 'com.google.code.gson:gson:2.6.1'

lib_xutils = 'org.xutils:xutils:3.5.0'

lib_router = 'com.alibaba:arouter-api:1.3.0'

lib_routercom = 'com.alibaba:arouter-compiler:1.1.4'

}


接着配置 libmodel 的 build.gradle 文件

compileSdkVersion rootProject.android_compileSdkVersion 

buildToolsVersion rootProject.android_buildToolsVersion

defaultConfig {

    minSdkVersion rootProject.android_minSdkVersion

    targetSdkVersion rootProject.android_targetSdkVersion

    versionCode rootProject.app_versionCode

    versionName rootProject.app_versionName

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

}

compile lib_gson 

compile lib_xutils 

这里配置了sdk 的一些属性 和 gson xutils 等工具

配置 app 的 build.gradle 文件


compileSdkVersion rootProject.android_compileSdkVersion 

buildToolsVersion rootProject.android_buildToolsVersion 

defaultConfig { 

applicationId “com.example.mysmall.kidsdemo” 

minSdkVersion rootProject.android_minSdkVersion 

targetSdkVersion rootProject.android_targetSdkVersion 

versionCode rootProject.app_versionCode 

versionName rootProject.app_versionName 

javaCompileOptions { 

annotationProcessorOptions { 

arguments = [ moduleName : project.getName() ] 

testInstrumentationRunner “android.support.test.runner.AndroidJUnitRunner” 

buildTypes { 

release { 

minifyEnabled false 

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

resourcePrefix “app_” // 区别资源文件命名 防止重名问题

compile lib_router 

annotationProcessor lib_routercom 

testCompile ‘junit:junit:4.12’ 

compile project(‘:businessmodel’) 

compile project(‘:libmodel’)

添加中间件 以及 添加 libmodel businessmodel 依赖

配置 businessmodel 的 build.gradle 文件 

if (isDebug.toBoolean()) {

applyplugin:'com.android.library'

}else {

applyplugin:'com.android.application'

}

android { 

compileSdkVersion rootProject.android_compileSdkVersion 

buildToolsVersion rootProject.android_buildToolsVersion

defaultConfig {

    minSdkVersion rootProject.android_minSdkVersion

    targetSdkVersion rootProject.android_targetSdkVersion

    versionCode rootProject.app_versionCode

    versionName rootProject.app_versionName

    javaCompileOptions {

        annotationProcessorOptions {

            arguments = [ moduleName : project.getName() ]

        }

    }

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

}

buildTypes {

    release {

        minifyEnabled false

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

    }

}

resourcePrefix "business_" // 同上 区别命名

}

compile lib_router 

annotationProcessor lib_routercom 

compile project(‘:libmodel’) 

添加中间件 和 libmodel 依赖

然后我们要配置清单文件 manifast.xml 

main/ 包下创建 debug/包 然后复制你的manifast.xml 到 debug 下 修改 application 和 mainactivity 的属性即可

然后在android 闭包下配置 

sourceSets {

main {

if (isDebug.toBoolean()) {

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

        }else {

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

        }

}

}

好了 这样就可以了 分别提供在library 和 application 情况下对manifast的访问


到这里基本配置 已经完成了 

解释一下 几个点

第一 app 和 businessmodel 仅仅只配置了 

compile lib_router 

annotationProcessor lib_routercom // 阿里巴巴的中间件 

compile project(‘:libmodel’) // 共有基础包 

这里并没有配置 网络请求 和 解析 工具 是因为我在libmodel 中已经配置 app 和 buisnessmodel 中配置了 libmodel 直接调用即可 初始化 和 相关封装 工作 都在 libmodel 中 并提供接口 共app 和 buisinessmodel 调用

第二 businessmodel 的相关配置 

if (isDebug.toBoolean()) {

applyplugin:'com.android.library'

}else {

applyplugin:'com.android.application'

}

不知道大家注意没有 在project 的 gradle.properties 文件下 的 我给了一个属性 isDebug = true;// false debug 模式 true 发布模式 这是个开关 为了加载不同的busnessmodel 类型 当为true 是 businessmodel 是个library module 反之 是app module

当然 还有的人将manifastxml 文件进行了配置 配置了两个 这个也是可以的 而我这里没有配置 是因为我一直是当作module 开发的 这种方式的配置方式是 在businessmodel 的main包下 创建一个debug包 将mainfastxml 文件复制一下 paste到 debug 包下 并去掉MainActivity的相关属性即可

我们开始编写libmodle 看一下 这个包的架构 


libmodel结构

base 基础包 存储baseactivity application 和 activity管理者 

router 路由包 管理路由 初始化 和 uri 地址管理 

utils 工具包 一些sp工具 gson 解析工具等



首先看一下 base 包 

AppContext 是上下问管理类 获取application 的 上下文对象 具体代码就不写了 稍后我会push 到 github 上 

AppManager app的堆栈管理 所有的activity 

BaseActivity activity 的父类 和 activity 生命周期管理 

BaseChildApplication 各个modile 的application 的 父类 管理同意初始化 以及内存管理 

ApplicationAsLibrary 内存管理的抽象方法

router 包下 ConstantRouterUri 所有的uri 的 常量类 

utils 这个包就不说了 无关紧要 只是展示作用而已 

稍后会有代码上传 如有需要 自己去pull 就i好了

现在我们开始编码 我想要app 和 businessmodule 进行互相跳转 互相传值并展示 

app module 下只有两个类 一个是mainactivity 一个是appApplication

/**

* 作者: Nade_S on 2018/6/21.

*/public classMyAppextendsApplication{    

@Override    

public void onCreate() {

        super.onCreate();

        ARouter.openLog();    // 打印日志        

ARouter.openDebug();  // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)       

 ARouter.init( this ); // 尽可能早,推荐在Application中初始化    }

}


App的MainActivity

//@Route(path = "/app/activity/main")

@Route(path = ConstantRouterUri.AppMainUri)

public class MainActivityextends AppCompatActivity {

@Override

    protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        findViewById(R.id.app_jump_bt).setOnClickListener(new View.OnClickListener() {

@Override

            public void onClick(View v) {

ARouter.getInstance().build("/business/activity/main").withInt("age",33).withString("name","c罗").navigation();

            }

});

        int age = getIntent().getIntExtra("age",0);

        String name = getIntent().getStringExtra("name");

        Toast.makeText(this, "appMain---"+name+age, Toast.LENGTH_SHORT).show();

    }

}


为了直观显示 我把MainActivity 直接写在了这里

@Route(path = ConstantRouterUri.AppMainUri) 这样也是可以的

我现在要做的操作的是 点击跳转到 businessmodel 下 MainActivity 页面 并传值过去

现在开始编写 businessmodel包下的MainActivity

//@Route(path = "/business/activity/main")

@Route(path = ConstantRouterUri.BusinessMainUri)

public class MainActivity extends AppCompatActivity {

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.b_activity_main);

        findViewById(R.id.business_jump_bt).setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                ARouter.getInstance().build("/app/activity/main").withInt("age",34).withString("name","梅西").navigation();

            }

        });

        int age = getIntent().getIntExtra("age",0);

        String name = getIntent().getStringExtra("name");

        Toast.makeText(this, "businessMain---"+name+age, Toast.LENGTH_SHORT).show();

    }

}


business取值并展示 点击返回到app包下的并传值

效果如下:展示App/MainActivity 与 Business/MainActivty 相互传值并显示 


效果展示

当然这是发布版 如果是开发阶段 直接在project的 build.gradle 设置开关debug--ture/false即可

好了 本文结束 如有疑问 留言或私信 demo 已上传 需要源码可以下载后查看

点击下载demo

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

推荐阅读更多精彩内容