Rubik —— Android 组件化开发框架
Rubik是一套解决Android平台组件化的综合方案,提供gradle project之间的路由通讯能力,以及对gradle project的组件定义、版本控制、maven发布、aar/jar与源码之间的切换以及组件的自由组合等能力。
Rubik由两部分组成:
- Rubik Router :即Rubik的函数级路由能力,与一般的页面路由不同,Rubik Router允许把Uri及参数,导航到工程内部,任意的一个公开的JVM语言(Java/Kotlin)函数的执行上,以便于更灵活的进行gradle project之间不基于代码调用的通讯。
- Rubik 工具链 :提供组件上下文的定义、版本控制、maven发布、aar/jar与源码之间的切换等能力,包括4个gradle plugin:
- rubik:
- 提供全局定义组件的能力,并根据全局定义自动启用rubik-context、rubik-root等插件
- rubik-context:
- 提供task,自动生成镜像函数等中间代码,并把中间代码打包成context.jar ,按版本号发布到maven
- 提供task,把业务代码按flavor、版本号编译成aar (包括代码、资源、内置SDK)发布到maven
- 通过全局定义的组件,为组件所在子工程自动添加其他context.jar的依赖
- rubik-root:
- 给壳工程提供筛选组件等能力,根据flavor、版本号筛选要打包进apk的业务组件
- 提供组件的源码工程和aar切换的能力
- rubik-test:
- 给工程提供单元测试环境
- rubik:
快速开始
1. 工程创建和组件声明:
(1) 创建或使用已有的一个或多个android library module,作为"组件工程"(如demo代码中的demo_component_detail、demo_component_home等),用于开发真正的业务逻辑。
(2) 在最外层工程(gradle root project)的build.gradle或gradle.properties文件中配置Rubik版本号等初始化参数,并在最外层工程中启用rubik插件:
ext { rubik_kapt_version = "com.rubik:kapt:1.9.1.1-K1_5" rubik_router_version = "com.rubik:router:1.9.1.1-K1_5" rubik_plugins_version = "com.rubik:plugins:1.9.1.1-AGBT4-K1_5" } apply plugin: 'rubik' // 启用rubik插件
(3) 在最外层工程的build.gradle文件或同级目录下的rubik-*.gradle文件中,配置组件信息:
rubik { component { // 第一个组件 uri "app://com.myapp.home" // 组件的Uri dependencies { // 组件需要依赖的其他组件 uri ("app://com.myapp.detail" ) { version "0.1.1" // 依赖其他组件的版本 } uri( … ) } source { // 定义默认来源,如不需切换源码和aar,可以只声明project或maven project (":demo_component_home") } } component { … } //继续配置第二个组件 }
2. 让组件之间互相通信:
(1). 在接口提供者工程内,通过注解定义路由路径,作为组件暴露给其他组件的通信接口:
通过RFunction注解声明函数路由:
@RFunction(path = "account/user") fun getUser(id : Int, name : String) : User? { … }
通过RPage注解声明页面路由:
@RPage(path = "page/main") class HomeActivity : AppCompatActivity() { … }
(2). 执行接口提供者工程对应的"publishRubikXxxRContextLib"任务,发布组件上下文到云端或本地maven仓库。
(3). 执行接口提供者工程对应的"publishRubikXxxRComponent"任务,发布组件aar到云端或本地maven仓库。
(4). 在接口调用者工程内,调用上述接口提供者所提供的接口,可以选择两种方式:
通过Kotlin DSL:
navigate { uri = "app://com.myapp.detail/account/user" // 请求的uri query { // 请求的参数 "id" with 400 "name" with "CuiVincent" } result<User?> { user -> // 通过泛型指定接收数据类型,多次异步返回时,可以用多个result接收 … } }
通过自动生成的镜像函数:
DetailContext.Account.user(400, "CuiVincent" ) { user -> … // 自动生成的镜像函数的参数类型、返回值类型都是明确的,比DSL方式更具有约束力 }
3. 筛选要打包的组件
(1). 创建或使用已有的android application project,作为"壳工程"(如demo代码中的demo_root_app),用于把组件组装并编译成Apk。
(2). 在"壳工程"的的build.gradle文件或同级目录下的rubik-*.gradle文件中,指定"壳工程"最终要将哪些组件,以哪种方式引入,并打包到最终的编译产物之中:
rubik { packing { projectMode { // projectMode,通过源码工程的方式引入组件 uri ("app://com.myapp.home") uri ("app://com.myapp.*") // 支持通过*匹配任意字符 } mavenMode { // mavenMode,通过maven上的aar的方式引入组件 uri ("app://com.myapp.detail") { version "0.2.0" } } } }
测试
- 通过rubik-test插件,给当前工程的androidTest variant添加全部可pick组件的context.jar依赖,便于写测试用例。
@RunWith(AndroidJUnit4::class) class RouterTestCase { @Before fun init() { Rubik.init() } // 初始化Rubik @Test fun usePerview() { PerviewContext.preViewVideo(path) { success -> log("preViewVideo success:${success}") } // 测试用例 } … // 继续写测试用例 }

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
每日一博 | 跨机房 ES 同步实战
作者:谢泽华 背景 众所周知单个机房在出现不可抗拒的问题(如断电、断网等因素)时,会导致无法正常提供服务,会对业务造成潜在的损失。所以在协同办公领域,一种可以基于同城或异地多活机制的高可用设计,在保障数据一致性的同时,能够最大程度降低由于机房的仅单点可用所导致的潜在高可用问题,最大程度上保障业务的用户体验,降低单点问题对业务造成的潜在损失显得尤为重要。 同城双活,对于生产的高可用保障,重大的意义和价值是不可言喻的。表面上同城双活只是简单的部署了一套生产环境而已,但是在架构上,这个改变的影响是巨大的,无状态应用的高可用管理、请求流量的管理、版本发布的管理、网络架构的管理等,其提升的架构复杂度巨大。 结合真实的协同办公产品:京办(为北京市政府提供协同办公服务的综合性平台)生产环境面对的复杂的政务网络以及京办同城双活架构演进的案例,给大家介绍下京办持续改进、分阶段演进过程中的一些思考和实践经验的总结。本文仅针对ES集群在跨机房同步过程中的方案和经验进行介绍和总结。 架构 1. 部署Logstash在金山云机房上,Logstash启动多个实例(按不同的类型分类,提高同步效率),并且和金山云机房...
- 下一篇
谷歌 Chrome/Chromium 移除了 JPEG-XL 支持
谷歌方面已经按照原定的计划,实现了在Chrome/Chromium 110 中取消对 JPEG-XL 支持的决定。目前相关代码已经完成合并,从 Chromium/Chrome 网络浏览器代码库中删除了 JPEG-XL 支持。 在相关消息于今年 10 月份刚被曝出时,就有一些用户和开发者表达了对 JPEG-XL 的支持;并试图促使谷歌改变他们对取消 JPEG-XL 支持的立场,但事实证明他们并没有成功。谷歌方面曾解释称,他们作出这一决定的原因在于: 处于实验性阶段的 flag 和代码不应无限期地保留 整体生态对JPEG-XL 格式缺乏兴趣,难以继续推动试验 与现有的格式相比,新的图像格式并没有带来足够的增量收益,因此没有理由默认启用它 通过移除相关代码可以减轻维护负担,帮助开发者专注于改进 Chrome 中的现有格式 且谷歌也对 WebP 和 AVIF 等替代格式更感兴趣。谷歌/AVIF 团队近日还分享一份基准测试结果,将AVIF图像格式与WebP、JPEG和JPEG XL图像格式进行了比较。 JPEG XL 基于 Google 的 PIK 格式和 Cloudinary 的 FUIF ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Red5直播服务器,属于Java语言的直播服务器
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作