CC
Introduction: simple and powerful android componentized architecture framework 使用简单但功能强大的安卓组件化框架
Tags:
组件化-架构-组件-路由-解耦-CC 是一套 Android 的组件化框架,由 CC 核心 API 类库和 cc-register 插件组成
模块 | CC | cc-register |
---|---|---|
当前最新版本 |
CC 的特色
- 一静一动,开发时运行 2 个 app:
- 静:主 App (通过跨 App 的方式单组件 App 内的组件)
- 动:单组件 App (通过跨 App 的方式调用主 App 内的组件)
- 支持渐进式组件化改造
- 解耦只是过程,而不是前提
一句话介绍 CC:
CC 是一套基于组件总线的、支持渐进式改造的、支持跨进程调用的、完整的 Android 组件化框架
- 基于组件总线:
- 不同于市面上种类繁多的路由框架,CC 采用了基于组件总线的架构,不依赖于路由(路由 VS 总线)
- 支持渐进式改造:
- 接入 CC 后可立即用以组件的方式开发新业务,可单独运行调试开发,通过跨 app 的方式调用项目中原有功能
- 不需要修改项目中现有的代码,只需要新增一个 IComponent 接口的实现类(组件类)即可支持新组件的调用
- 模块解耦不再是前提,将陡峭的组件化改造实施曲线拉平
- 支持跨进程调用:
- 支持应用内跨进程调用组件,支持跨 app 调用组件
- 调用方式与同一个进程内的调用方式完全一致
- 无需 bindService、无需自定义 AIDL,无需接口下沉
- 完整:
- CC 框架下组件提供的服务可以是几乎所有功能,包括但不限于页面跳转、提供服务、获取数据、数据存储等
- CC 提供了配套插件 cc-register,完成了自定义的组件类、全局拦截器类及 json 转换工具类的自动注册,
- cc-register 同时还提供了代码隔离、debug 代码分离、组件单独调试等各种组件化开发过程中需要的功能
CC 的设计灵感来源于服务端的服务化架构,将组件之间的关系拍平,不互相依赖但可以互相调用,不需要再管理复杂的依赖树。
了解业界开源的一些组件化方案:多个维度对比一些有代表性的开源 android 组件化开发方案
demo 演示
demo 下载(主工程,包含 ComponentB 之外的所有组件)
demo_component_b 组件单独运行的 App(Demo_B)下载
以上2 个 app用来演示组件打包在主 app 内和单独以 app 运行时的组件调用,都安装在手机上之后的运行效果如下图所示
目录结构
- cc 组件化框架基础库(主要)
- cc-register CC 框架配套的 gradle 插件(主要)
- cc-settings-2.gradle 组件化开发构建脚本(主要)
- demo demo 主程序(调用其它组件,并演示了动态组件的使用)
- demo_base demo 公共库(base 类、util 类、公共 Bean 等)
- demo_component_a demo 组件 A
- demo_component_b demo 组件 B(上方提供下载的 apk 在打包时 local.properties 中添加了 demo_component_b=true)
- demo_component_jsbridge demo 组件(面向组件封装的 jsBridge,并演示了如何进行跨进程组件调用)
- demo_component_kt demo 组件(kotlin)
- demo_interceptors demo 全局拦截器(如果有多个 app 并且拦截器不同,可以创建多个 module 给不同 app 使用)
- cc-settings-demo.gradle 演示如何自定义配置文件,如:添加 actionProcessor 自动注册的配置
- demo-debug.apk demo 安装包(包含 demo/demo_component_a/demo_component_kt)
- demo_component_b-debug.apk demo 组件 B 单独运行安装包
创建组件
创建一个组件很简单:只要创建一个IComponent
接口的实现类,在 onCall 方法中实现组件暴露的服务即可
public class ComponentA implements IComponent {
@Override
public String getName() {
//指定组件的名称
return "ComponentA";
}
@Override
public boolean onCall(CC cc) {
//在此处将组件内部的服务暴露给外部调用
//组件内部的逻辑与外部完全解耦
String actionName = cc.getActionName();
switch (actionName) {
case "showActivity": //响应 actionName 为"showActivity"的组件调用
//跳转到页面:ActivityA
CCUtil.navigateTo(cc, ActivityA.class);
//返回处理结果给调用方
CC.sendCCResult(cc.getCallId(), CCResult.success());
break;
default:
//其它 actionName 当前组件暂时不能响应,可以通过如下方式返回状态码为 -12 的 CCResult 给调用方
CC.sendCCResult(cc.getCallId(), CCResult.errorUnsupportedActionName());
break;
}
return false;
}
}
调用组件
CC 使用简明的流式语法 API,因此它允许你在一行代码搞定组件调用:
"CC"也是本框架主入口 API 类的类名,是由 ComponentCaller 缩写而来,其核心职能是:组件的调用者。
CC.obtainBuilder("ComponentA")
.setActionName("showActivity")
.build()
.call();
也可以这样
CC.obtainBuilder("ComponentA")
.setActionName("showActivity")
.build()
.callAsync();
或者这样
CC.obtainBuilder("ComponentA")
.setActionName("showActivity")
.build()
.callAsyncCallbackOnMainThread(new IComponentCallback() {
@Override
public void onResult(CC cc, CCResult result) {
String toast = result.isSuccess() ? "success" : "failed";
Toast.makeText(MainActivity.this, toast, Toast.LENGTH_SHORT).show();
}
});
开始使用
混淆配置
不需要额外的混淆配置
自动注册插件
CC 专用版:cc-register,fork 自AutoRegister,在自动注册的基础上添加了一些 CC 专用的业务
通用版:
源码:AutoRegister 原理:android 扫描接口实现类并通过修改字节码自动生成注册表
版本更新日志
请点击:更新日志
遇到问题怎么办?
- 先打开 CC 的日志开关,看完整的调用过程日志,这往往能帮助我们找到问题
CC.enableDebug(true); //普通调试日志,会提示一些错误信息 CC.enableVerboseLog(true); //组件调用的详细过程日志,用于跟踪整个调用过程
- 看文档
- 看 issue了解开源社区上其它小伙伴提出的问题及解答过程,很可能就有你现在遇到的问题
- 提 issue,如果以上还没有解决你的问题,请提一个 issue,这很可能是个新的问题,提 issue 能帮助到后面遇到相同问题的朋友
- 加下方的 QQ 群提问
QQ 群
QQ 群号:686844583
或者扫描下方二维码加群聊