架构:Android 组件化开发

前言

强烈推荐先阅读这篇文章 Android 组件化最佳实践 java

本文是阅读实践后的思考总结,更倾向实践步骤。android

组件化开发架构

组件化开发大致就是这样的架构,最关键的是basebase_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();
    复制代码
  • 至此,单独调试 和 简单的集成调试 完结,接下来更多的就是 集成调试状况下,如何保证组件在高度聚合的状况下互通有无。

组件间数据传递

总体思路就是在基础组件中定义接口,组件间经过接口传递数据,彻底解耦。

感谢

Android 组件化最佳实践

相关文章
相关标签/搜索