当前位置: 首页 > 软件库 > 手机/移动开发 > >

Rubik

Android 组件化开发框架
授权协议 Apache-2.0
开发语言 Kotlin
所属分类 手机/移动开发
软件类型 开源软件
地区 国产
投 递 者 莫典
操作系统 跨平台
开源组织 百度
适用人群 未知
 软件概览

Rubik是一套解决Android平台组件化的综合方案,提供gradle project之间的路由通讯能力,以及对gradle project的组件定义、版本控制、maven发布、aar/jar与源码之间的切换以及组件的自由组合等能力。

English Readme

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:
      • 给工程提供单元测试环境

快速开始

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}")
        } // 测试用例
    }
    … // 继续写测试用例
 }

 相关资料
  • 日期: 2020-12-25 创盛视联数码科技(北京)有限公司 概述 提供云课堂基础SDK功能,包括推流,拉流,排麦组件,聊天以及白板组件。为用户提供快速,简便的方法开展自己的实时互动课堂。 功能特性 安卓端SDK目前支持了音视频sdk、白板插件、聊天插件以及排麦插件 音视频SDK功能 功能特性 描述 备注 推流 支持推流到服务器 拉流 支持从服务器订阅流 获取流状态 支持获取流的状态(发报数、收

  • 日期: 2020-12-25 创盛视联数码科技(北京)有限公司 概述 提供云课堂基础SDK功能,包括推流,拉流,排麦组件,聊天以及白板组件。为用户提供快速,简便的方法开展自己的实时互动课堂。 功能特性 iOS端SDK目前支持了音视频SDK、白板插件、聊天插件以及排麦插件; 音视频SDK功能 功能特性 描述 备注 推流 支持推流到服务器 拉流 支持从服务器订阅流 获取流状态 支持获取流的状态(发报数

  • 本文向大家介绍Vue组件化开发之通用型弹出框的实现,包括了Vue组件化开发之通用型弹出框的实现的使用技巧和注意事项,需要的朋友参考一下 本文主要分享关于组件化开发的理解,让刚入门的小伙伴少走一些弯路,提高开发效率,作者本人也是新手,如有不当之处,请大佬指出,感谢。 相信很多刚入门的小伙伴,经常会写很多重复的代码,而这些代码一般情况下也都是大同小异,在这种情况下,如何让开发和学习变得更加高效,组件化

  • 本文向大家介绍基于Vue开发数字输入框组件,包括了基于Vue开发数字输入框组件的使用技巧和注意事项,需要的朋友参考一下 随着 Vue 越来越火热, 相关组件库也非常多啦, 只用轮子怎么够, 还是要造起来!!! 1、概述 Vue组件开发的API:props、events和slots 2、组件代码 github地址:https://github.com/MengFangui/VueInputNumbe

  • 由于小程序开发模式的特殊性,下文将主要介绍小程序组件的开发。 初始化工程 npm init rax my-component 选择 - Component (Build component for application include web),然后选择需要构建到的目标端代码。 项目目录 . ├── README.md ├── build.json ├── demo │   ├── index.

  • 这篇文档的目的是帮助开发人员开发空白组件 获取 compStore 项目 在 compStore 编写空白组件 将空白组件移植到 ChartBuilder 获取 compStore 项目 compStore 项目可以在 git@git.uinnova.com:udatav/chartbuilder-compstore.git 获取 在 compStore 编写空白组件 在 chartbuilder

  • A-Frame的 实体-组件框架 中的组件是在可以被混合、匹配和组合到实体上的JavaScript模块(module),来构建外观、行为和功能。我们可以使用JS注册组件并使用声明式语法在DOM中使用它。组件是可配置,可重用和可分享的。A-Frame应用程序的代码应该尽可能放在组件里面。 Image by Ruben Mueller from vrjump.de 注意组件必须被定义在 <a-scen

  • "One does not live by bread alone,but by every word that comes from the mouth of God" --(MATTHEW4:4) python开发框架 不管是python,还是php,亦或别的做web项目的语言,乃至于做其它非web项目的开发,一般都要用到一个称之为什么什么框架的东西。 框架的基本概念 开发这对框架的认识,由于