{"id":20064899,"url":"https://github.com/baidu/rubik","last_synced_at":"2025-08-16T15:18:06.871Z","repository":{"id":37360815,"uuid":"504447693","full_name":"baidu/Rubik","owner":"baidu","description":"An Android platform component management tool chain, based on Kotlin language.","archived":false,"fork":false,"pushed_at":"2024-05-22T08:00:13.000Z","size":8506,"stargazers_count":161,"open_issues_count":1,"forks_count":9,"subscribers_count":9,"default_branch":"main","last_synced_at":"2025-07-12T18:00:27.157Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/baidu.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-06-17T08:09:28.000Z","updated_at":"2025-04-07T12:21:32.000Z","dependencies_parsed_at":"2024-05-22T09:25:57.991Z","dependency_job_id":"c770628b-1faa-47e9-859a-00eea8a7f2dd","html_url":"https://github.com/baidu/Rubik","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/baidu/Rubik","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/baidu%2FRubik","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/baidu%2FRubik/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/baidu%2FRubik/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/baidu%2FRubik/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/baidu","download_url":"https://codeload.github.com/baidu/Rubik/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/baidu%2FRubik/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":270729299,"owners_count":24635398,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-16T02:00:11.002Z","response_time":91,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-13T13:48:09.428Z","updated_at":"2025-08-16T15:18:06.840Z","avatar_url":"https://github.com/baidu.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n\u003cdiv align=\"center\"\u003e\n  \u003cp\u003e \u003cimg width=\"600\" src=\"https://user-images.githubusercontent.com/7745189/174275733-ff1ec56e-82ea-4c3b-86de-b2b07d258842.jpeg\"\u003e \u003c/p\u003e\n\n![license](https://img.shields.io/github/license/baidu/rubik.svg)\n![platform](https://img.shields.io/badge/platform-Android-red)\n![language](https://img.shields.io/github/languages/top/baidu/rubik)\n![last](https://img.shields.io/github/last-commit/baidu/rubik.svg)\n![release](https://img.shields.io/github/v/release/baidu/rubik?display_name=release)\n\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n\u003ca href=\"./README_en.md\"\u003eEnglish Readme\u003c/a\u003e\n\u003c/div\u003e\n\n# Rubik\nRubik是一套解决Android平台组件化的综合方案，提供gradle project之间的路由通讯能力，以及对gradle project的组件定义、版本控制、maven发布、aar/jar与源码之间的切换以及组件的自由组合等能力。\n\nRubik由两部分组成：\n* Rubik Router ：提供组件之间的低耦合通讯能力，即Rubik的\"函数路由\"，与一般的页面路由不同，Rubik Router允许把Uri及参数，导航到工程内部，任意的一个公开的JVM语言（Java/Kotlin）函数的执行上，以便于更灵活的进行gradle project之间不基于代码调用的通讯。\n* Rubik 工具链 ：提供组件上下文的定义、版本控制、maven发布、aar/jar与源码之间的切换等能力，包括4个gradle plugin:\n    + rubik：\n        - 提供全局定义组件的能力，并根据全局定义自动启用rubik-context、rubik-shell等插件\n    + rubik-context：\n        - 提供task，自动生成接口中间代码，并把中间代码打包成context.jar ,按版本号发布到maven\n        - 提供task，把业务代码按flavor、版本号编译成aar (包括代码、资源、内置SDK)发布到maven\n        - 通过全局定义的组件，为组件所在子工程自动添加其他组件的context.jar的依赖\n    + rubik-shell：\n        - 给壳工程提供筛选组件能力，根据flavor、版本号筛选要打包进apk的业务组件\n        - 提供组件的源码工程和aar切换的能力\n    + rubik-test:\n        - 给工程提供单元测试环境\n\n## 快速开始\n### 1. 工程创建和组件声明：\n\u0026ensp;\u0026ensp;(1) 创建或使用已有的一个或多个android library module，作为\"组件工程\"（如demo代码中的demo_component_detail、demo_component_home等），用于开发真正的业务逻辑。\n\n\u0026ensp;\u0026ensp;(2) 在最外层工程（gradle root project)的build.gradle或gradle.properties文件中配置Rubik版本号等初始化参数，并在最外层工程中启用rubik插件：\n```groovy\next {\n    rubik_kapt_version = \"com.rubik:kapt:1.9.1.1-K1_5\"   \n    rubik_router_version = \"com.rubik:router:1.9.1.1-K1_5\"   \n    rubik_plugins_version = \"com.rubik:plugins:1.9.1.1-AGBT4-K1_5\"  \n} \n\napply plugin: 'rubik' // 启用rubik插件\n```\n\n\u0026ensp;\u0026ensp;(3) 在最外层工程的build.gradle文件或同级目录下的rubik-*.gradle文件中，配置组件信息：\n```groovy\nrubik {\n    component { // 第一个组件\n        uri \"app://com.myapp.home\"  // 组件的Uri\n        touching {    // 组件需要依赖的其他组件\n            uri (\"app://com.myapp.detail\" ) { \n                version \"0.1.1\"  // 依赖其他组件的版本\n            }\n            uri( … ) \n        }\n        source {    // 定义默认来源，如不需切换源码和aar，可以只声明project或maven\n            project (\":demo_component_home\") \n        }\n    }\n    component { … }  //继续配置第二个组件\n} \n```\n\n### 2. 让组件之间互相通信：\n\u0026ensp;\u0026ensp;(1). 在接口提供者工程内，通过注解定义路由路径，作为组件暴露给其他组件的通信接口：\n\n\u0026ensp;\u0026ensp;\u0026ensp;\u0026ensp;通过RFunction注解声明函数路由:\n```kotlin\n@RFunction(path = \"account/user\") \nfun getUser(id : Int, name : String) : User? { \n    …\n}\n```\n\n\u0026ensp;\u0026ensp;\u0026ensp;\u0026ensp;通过RPage注解声明页面路由:\n```kotlin\n@RPage(path = \"page/main\") \nclass HomeActivity : AppCompatActivity() {\n    … \n}\n```\n\u0026ensp;\u0026ensp;(2). 执行接口提供者工程对应的\"publishRubikXxxRContextLib\"任务，发布组件上下文到云端或本地maven仓库。\n\n\u0026ensp;\u0026ensp;(3). 执行接口提供者工程对应的\"publishRubikXxxRComponent\"任务，发布组件aar到云端或本地maven仓库。\n\n\u0026ensp;\u0026ensp;(4). 在接口调用者工程内，调用上述接口提供者所提供的接口，可以选择两种方式：\n\n\u0026ensp;\u0026ensp;\u0026ensp;\u0026ensp;通过Kotlin DSL：\n```kotlin\nnavigate {\n    uri = \"app://com.myapp.detail/account/user\"  // 请求的uri\n    query { // 请求的参数\n        \"id\" with 400\n        \"name\" with \"CuiVincent\" \n    }\n    result\u003cUser?\u003e { user -\u003e \n    // 通过泛型指定接收数据类型，多次异步返回时，可以用多个result接收\n        …\n    }\n} \n```\n\n\u0026ensp;\u0026ensp;\u0026ensp;\u0026ensp;通过自动生成的镜像函数：\n```kotlin\nDetailContext.Account.user(400, \"CuiVincent\" ) { user -\u003e\n    … // 自动生成的镜像函数的参数类型、返回值类型都是明确的，比DSL方式更具有约束力\n}\n```\n\n### 3. 筛选要打包的组件\n\u0026ensp;\u0026ensp;(1). 创建或使用已有的android application project，作为\"壳工程\"（如demo代码中的demo_root_app），用于把组件组装并编译成Apk。\n\n\u0026ensp;\u0026ensp;(2). 在\"壳工程\"的的build.gradle文件或同级目录下的rubik-*.gradle文件中，指定\"壳工程\"最终要将哪些组件，以哪种方式引入，并打包到最终的编译产物之中：\n```groovy\nrubik {\t\n    packing {\n        projectMode { // projectMode，通过源码工程的方式引入组件\n            uri (\"app://com.myapp.home\")\n            uri (\"app://com.myapp.*\") // 支持通过*匹配任意字符\n        }\n        mavenMode { // mavenMode，通过maven上的aar的方式引入组件\n            uri (\"app://com.myapp.detail\") {\n                version \"0.2.0\" \n            }\n        }\n    }\n} \n```\n## 测试\n* 通过rubik-test插件，给当前工程的androidTest variant添加全部可pick组件的context.jar依赖，便于写测试用例。\n```kotlin\n@RunWith(AndroidJUnit4::class)\nclass RouterTestCase {\n    @Before\n    fun init() {\n        Rubik.init()\n    } // 初始化Rubik\n    @Test\n    fun usePerview() {\n        PerviewContext.preViewVideo(path) { success -\u003e\n            log(\"preViewVideo success:${success}\")\n        } // 测试用例\n    }\n    … // 继续写测试用例\n }\n\n```\n\n## 如何贡献\n请用Kotlin语言编写，所有注明动机的合理改动提交都会被接收。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbaidu%2Frubik","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbaidu%2Frubik","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbaidu%2Frubik/lists"}