Android 开发之组件化环境搭建

xiaoxiao2021-02-28  43

组件化开发 是适应团队开发的一种模式 如果你一个项目有三人以上联合开发 你就会发现开发协作以及效率会大不如从前 代码臃肿 各种调用 各种重复 都是有可能会发生的 甚至会出现今天写明天错 这时候单一的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_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 看一下 这个包的架构

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 class MyApp extends Application{ @Override public void onCreate() { super.onCreate(); ARouter.openLog(); // 打印日志 ARouter.openDebug(); // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险) ARouter.init( this ); // 尽可能早,推荐在Application中初始化 } }

MainActivity

> @Route(path = "/app/activity/main") public class MainActivity extends > 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包下的并传值

效果如下:

好了 本文结束 如有疑问 留言或私信 稍后会有链接 点击下载demo

转载请注明原文地址: https://www.6miu.com/read-2632531.html

最新回复(0)