强烈推荐先阅读这篇文章 Android 组件化最佳实践 java
本文是阅读实践后的思考总结,更倾向实践步骤。android
组件化开发大致就是这样的架构,最关键的是base
和 base_custom
组件内容的区别化。git
这里涉及两个概念 模块化 和 组件化,这两个本质上是同样的,都是为了下降代码耦合性,区别就在于内容,组件化都是单一功能的集合,模块化就是独立业务线的集合,其实咱们均可以称之为组件化。github
File——>New——>New Moudle——>Phone & Tablet Moudleapi
建立后是一个工程,相似app,会默认建立好相关资源文件。「业务模块首选」安全
File——>New——>New Moudle——>Android Librarybash
建立后是一个moudle「组件首选」markdown
编码过程当中须要注意的就是 资源和代码的聚合,仍是遵循 本身的事情本身作 的原则,下降耦合性。网络
资源架构
图片资源 drawable
,须要用到的放在本身目录下,相似共用的返回键这种,放在基础组件中;
颜色值 color
,不要共用,没多少,写在本身组件中;
尺寸 dp
,这个基本没啥变化,能够放到基础组件中;
样式 style,涉及到Activity主题的,这个能够在基础组件中定义,组件中继承,这样既保证了整个app风格,也能够特殊化。
为了保证 组件内资源 的 充分隔离,咱们能够 规范命名,以模块化命名,这样的外部调用时,不容易出错。
例如 登陆模块 ic_login_phone
login_phone_hint_text
...
严格一点,能够在 build.gradle
文件中配置 命名前缀,这样编码时 不按照这种格式,就会飘红。只针对xml文件,图片还需本身规范命名。
android { resourcePrefix "login_" // 其余配置 ... } 复制代码
代码
runtimeOnly
dependencies { ... runtimeOnly project(':moudle_shop') } 复制代码
代码写好后,须要 单独调试 或 集成到app中调试,那就须要配置两种模式。
gradle.properties
文件,定义属性用来区分两种模式//例如 false表示集成调试,true表示单独调试 isSingleRun = false 复制代码
在 build.gradle
文件中配置
if (isSingleRun.toBoolean()) { //单独调试 应该是工程类型 apply plugin: 'com.android.application' } else { //集成调试 则做为library集成到app中 apply plugin: 'com.android.library' } android{ ... } ... 复制代码
applicationId
android{ defaultConfig { //单独测试 须要配置applicationId if (isSingleRun.toBoolean()) { applicationId "com.xx.moudle_xx" } } } 复制代码
AndroidManifest.xml
单独测试是须要一个启动页入口的,因此清单文件也须要配置
android{ sourceSets { main { if (isSingleRun.toBoolean()) { //单独测试 新建一个文件夹manifest,存放清单文件,设置启动页入口 manifest.srcFile 'src/main/manifest/AndroidManifest.xml' } else { manifest.srcFile 'src/main/AndroidManifest.xml' } } } } 复制代码
Applcation
每一个组件,都会有须要初始化的东西,共用的(好比:网络框架,图片框架)能够在基础组件中初始化,那么一些本身模块须要初始化的东西,该怎么作?由于集成测试不会初始化 组件的Application
。
这里咱们能够在基础组件中定义 BaseApp
4. 组件 Application 的动态配置
至此,调试配置完成,配置的目的就是为了方便 组件 独立开发时测试 以及 集成到app时测试。将 gradle.properties
文件中的 isSingleRun
属性设置为true
,测试一下配置是否成功。
将isSingleRun
设置为true
,就能够 单独调试 了,像 app 工程那样。
将isSingleRun
设置为false
,而后集成到app
中就能够 集成测试 了。
集成测试这里有个问题,如何跳转到组件中的 Activity呢?须要用到 Alibaba 开源的 ARouter
推荐阅读 Android 组件化最佳实践 中的 4、组件间界面跳转。
ARouter配置步骤:
base组件中配置build.gradle
android { defaultConfig { ... javaCompileOptions { annotationProcessorOptions { arguments = [ moduleName : project.getName() ] } } } } dependencies { api 'com.alibaba:arouter-api:1.3.1' // arouter-compiler 的注解依赖须要全部使用 ARouter 的 module 都添加依赖 annotationProcessor 'com.alibaba:arouter-compiler:1.1.4' } 复制代码
组件中配置
android { defaultConfig { ... javaCompileOptions { annotationProcessorOptions { arguments = [ moduleName : project.getName() ] } } } } dependencies { ... annotationProcessor 'com.alibaba:arouter-compiler:1.1.4' } 复制代码
在app主程序 Application
中初始化
//这断必须写,不然不生效,本觉得我不须要打印日志,没写这段,结果花费好长时间找bug if (BuildConfig.DEBUG) { // 这两行必须写在init以前,不然这些配置在init过程当中将无效 ARouter.openLog(); // 打印日志 ARouter.openDebug(); // 开启调试模式(若是在InstantRun模式下运行,必须开启调试模式!线上版本须要关闭,不然有安全风险) } ARouter.init(this); 复制代码
组件中被启动Activity 配置 path,path 必须是 ”/“ 开头,最少两级
@Route(path = "/test/test") public class TestActivity extends BaseActivity {} 复制代码
主程序启动 组件中 Activity
ARouter.getInstance().build("/test/test").navigation(); 复制代码
至此,单独调试 和 简单的集成调试 完结,接下来更多的就是 集成调试状况下,如何保证组件在高度聚合的状况下互通有无。
总体思路就是在基础组件中定义接口,组件间经过接口传递数据,彻底解耦。