书接上文,上回提到 B 站Android团队为了解决组件化后协作上的问题,已经采用了大仓(monorepo)的方案来组织代码。

国内实践大仓的团队少之又少,更别提 Android 的大仓了,几乎没有来自其它团队的可借鉴经验。在这条路上,我们可以算作先行者。本文粗陋,文中所列思路不可能适用所有团队,仅给同样想实践Android 大仓的人些许启发。

一个标准的 Gradle 项目

首先回顾一下 Android 项目的组织方式。自从13年开始官方逐渐迁移到 Android Studio 做为 IDE 后,Android 项目的开发和编译就绑在 Gradle 上了。

一个标准的 Gradle 项目结构如下所示:

MyApp/
├── build.gradle
├── settings.gradle
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradle.properties
└── app├── build.gradle└── src└── main├── java├── res└── AndroidManifest.xml

通常,会有多个Gradle Module存在:

MyApp/
├── build.gradle
├── settings.gradle
├── app
│     ├── build.gradle
│     └── src
├── lib1
│     ├── build.gradle
│     └── src
└── lib2├── build.gradle└── src

其中 settings.gradle 会注册所有的 Module

include ':app', ':lib1', ':lib2'

多仓库

随业务的扩张,Module 数量会越来越多。遵循多数人实践过的组件化的思路,按业务分仓库存放便理所当然:

android group/├── MyApp/ │     ├── build.gradle│     └── settings.gradle├── app1/│     ├── build.gradle│     └── settings.gradle├── app2/│     ├── build.gradle│     └── settings.gradle└── libs/├── build.gradle└── settings.gradle

每个仓库都是一个标准 Gradle 项目,通过 publishing 插件将module 都上传 aar(或者jar)到 maven私服(如nexus)上,再在 MyApp/build.gradle 中以 maven 组件的形式依赖它们,最终打包成apk:

repositories {maven {name = "myRepo"url = "http://myrepo.example.com/android"}
}
dependencies {implementation 'com.example.android:app-a:1.0.0'implementation 'com.example.android:app-b:1.0.0'implementation 'com.example.android:lib-a:1.1.0'
}

[图片上传失败...(image-7a44b2-1546505515555)]

此时的代码组织方式便是上文中所述的多仓库形态(可能许多团队正处于当前阶段)。

多仓到大仓

那么,如何既能快速搭建出适用于 Android 的大仓,又能不影响当前的团队协作流程,还要尽量避免迁移带来的开发效率降低?

经过一段时间的深入研究 Gradle API,终于找到一个简单快速的可行方案——composite builds。

上面说过,其实每个仓库都是按业务分离的标准的 Gradle 项目,那么就可以通过Gradle 官方提供的一个直接引入其它项目的API——includeBuild——快速将所有仓库组织起来。

在 MyApp/settings.gradle 中直接引入其它 Gradle 项目:

includeBuild '../app1'
includeBuild '../app2'
includeBuild '../libs'

另外比较令人惊喜的是,如Gradle 官方所说,includeBuild会自动替换依赖com.example.android:app-a为有对应声明的module,如 project(:app1:app-a)。这样仍然可以用原有的依赖写法,什么都不用改,基本没有迁移工作量。

具体示例可以见官方示例项目:https://github.com/gradle/gradle/tree/master/subprojects/docs/src/samples/compositeBuilds/hierarchical-multirepo

而且,使用 includeBuild 能保留当前的开发流程不变,每个模块仍发布到 maven 上,不破坏既有协作流程。各个业务的开发,通过Android Studio 打开自己项目的目录即可,可以说几乎没有开发效率的影响。

解决了各个项目合并问题,另外一个就是要保证大仓的可维护性。

上文讲过,依然沿用之前分层的方式,按约定的文件夹组织:

<root dir>├── build.gradle├── settings.gradle ├── app/│    ├── app-a│    │    ├── src │    │    └── build.gradle│    ├── app-b│    │    ├── src│    │    └── build.gradle   │    ├── build.gradle│    └── settings.gradle│├── common/│    ├── common-a│    │    ├── src│    │    └── build.gradle│    ├── build.gradle│    └── settings.gradle│├── framework/│    ├── lib-a│    │    ├── src│    │    └── build.gradle│    ├── build.gradle│    └── settings.gradle│└── MyApp├── src└── build.gradle

各个业务方的代码只需要按层级对号入座即可。

对号入座的方式有很多种,最简单的便是直接拷贝项目到对应目录,而如果要保留原仓库的提交记录,则可以使用 git filter-branch 和 git update-index 等命令(略过不表╮( ̄▽ ̄)╭)。

收敛合并权限

人总是会犯错的,为了不让近百名开发成员在一个仓库里打架,我们需要在 gitlab 权限分配的基础上,通过API实现自动化的方式来合并代码。

每个文件夹(或者模块)可以添加一个配置文件,如OWNERS,业务团队自己分配 owner和reviewer。

<root dir>├── app│    ├── OWNERS│    └── app-a│          └── OWNERS├── common│    ├── OWNERS│    └── common-a│          └── OWNERS├── framework│    ├── OWNERS│    └── lib-a│          └── OWNERS└── MyApp└── OWNERS

通过gitlab webhook及note api来实现一个自动化工具:

当开发人员提交一个新的 Merge Reqeust 时,工具找到有变更文件夹的对应 owner 及 reviewer,提醒他来review 和操作合并;当他在MR中提交merge指令时,由自动化工具执行合并操作。

综述

  1. 通过 Gradle 的includeBuild将所有分开的仓库合并到一起,并按一定的目录层级组织各个子项目。
  2. 通过 gitlab 的 api 实现一个自动化工具来合并代码。

通过上述两个步骤,便打造了一个大仓雏形。然而这只是大仓的第一步,未来还有很多工作呢…

关于大仓,本文只简单描述了一下方案大致思路,行文粗糙,希望对想实践大仓的你有所帮助,如有疑问欢迎评论留言。

欢迎加入Android进阶交流群;701740775。进群可免费领取一份最新技术大纲和Android进阶资料。请备注csdn

如何简单快速搭建 Android 大仓 1相关推荐

  1. test.php创建,基于phpstudy简单快速搭建一个php程序

    原标题:基于phpstudy简单快速搭建一个php程序 人人都是程序员,希望在零碎的阅读时间里,给您一些技术提升. 1 安装phpstudy 通过以下链接download.csdn.net/downl ...

  2. 快速搭建Android应用后台服务器

    一直没单独一个人搭建过后台,之前都是用的云服务后台,跟着帖子一步一步走,最终完美实现后台与移动端的数据沟通,顿时感觉棒棒哒,特此记录一下.很感谢下面帖子的博主得无私分享! 一.后台的搭建 1.自己动手 ...

  3. 简单快速搭建,全新语聊方案

    导读: 年初的时候因为马斯克的一场直播带货,让 ClubHouse 迅速出圈变成现在炙手可热的社交产品.开个玩笑.现在要是没有用过ClubHouse你都不好意思说自己是互联网行业的.(不过目前中国市场 ...

  4. android找不到符号_快速搭建Android开发环境——Android Studio(附ADB找不到设备)...

    由于毕设大概率最终要使用Android来实现,所以现在要开始学习一些Android开发基础了. 学习一门技术,最先要解决的问题就是开发环境的问题. 就如同两年前学java那样,在windows下配置环 ...

  5. android游戏1024代码,castlegame 可简单快速开发android游戏。我总结的教程

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 安装 fpcupdeluxe-i386-win32.exe 先安装这个. fpc 选择 304版本 即stable 版本 lazarus 选择184版本 ...

  6. python服务器搭建nginx_Nginx简单快速搭建文件服务器

    前言 在之前的一篇博文中介绍了Nginx负载均衡的实现,本篇文章就简单介绍下如何用Nginx搭建一个文件服务器. Nginx安装 Nginx配置 Nginx的配置这块和普通的一样就可以了,只要在ngi ...

  7. 如何简单快速搭建自己的云对象存储服务(OSS)

    简单来说,其实我们只需要有一台服务器,利用服务器的各种资源,搭配其它厂商开发的软件,就能很轻易拥有自己的云对象存储服务.不需要在阿里云上花钱买什么服务,甚至还能自己给别人提供服务,真的是太爽了. 云对 ...

  8. 三步快速搭建android开发环境 (下载包已集成可用sdk,无需费心到google相应网站下载,快哉!)

    http://blog.csdn.net/king_sundi/article/details/24901849 其中,adt buntle在这里下: http://blog.csdn.net/LAN ...

  9. 安卓开发(一)快速搭建Android开发环境

    文章目录 Android 一 Android 开发环境安装 1.1 Android Studio 安装 1.2 雷神模拟器的配置 Android 一 Android 开发环境安装 1.1 Androi ...

  10. 利用Vue-cli3简单快速搭建前端项目架构

    安装 如果在电脑上已经安装了vue-cli2.0如果想要把其替换成vue-cli3.0的话需要先卸载原有vue-cli2.0的版本. npm uninstall vue-cli -g 卸载完成之后就直 ...

最新文章

  1. cmake 离线安装mysql_(cmake)编译安装mysql
  2. 机房合作(一):我怎样做组长(敢于承担责任)
  3. python中面向对象空间时间_python基础学习Day15 面向对象、类名称空间、对象名称空间 (2)...
  4. 电脑上mysql数据库无法登录_无法远程登入MySQL数据库的几种解决办法MySQL综合 -电脑资料...
  5. 飞秋爱好者(WZ132)
  6. DataX离线数据同步工具/平台
  7. 拼多多董事会变更:董事6人变5人 张震不再出任
  8. 模拟登陆教务处获取成绩
  9. Ubuntu18.04编译pulseaudio14.x(八)
  10. zabbix---agent安装
  11. Builder模式的误区:将复杂对象的构建进行封装,就是Builder模式了吗?
  12. 移动硬盘插电脑上驱动感叹号_如何通过移动驱动器向手机或平板电脑添加额外的存储空间...
  13. Hive教程(08)- JDBC操作Hive
  14. mysql拼图游戏代码_HTML+Javascript制作拼图小游戏详解(二)
  15. ChinaSoft 论坛巡礼 | 泛在操作系统理论、技术与开源生态构建
  16. 蓝桥杯试题 基础练习 Fibonacci数列
  17. ARM体系结构2:处理器内核和汇编指令集
  18. 快速解决Android编译报错 : Manifest merger failed with multiple errors, see logs
  19. Linux(CentOS)下安装NVIDIA GPU驱动
  20. 计算机函数sun怎么用,手把手演示sumif函数怎么用【处置步骤】

热门文章

  1. C语言RR调度算法,RR(轮转调度算法)
  2. 智能安卓手机工控主板能实现哪些智能家居设备呢?
  3. 如何搜集外贸英文关键词
  4. 基础数据人员节点相关sql和个人银行账户节点人员编码参照代码
  5. 运行示例sparkPi计算圆周率(1.1)
  6. 曙光联手北京计算中心 打造云计算联合实验室
  7. 根据图片完整路径,获得图片的宽和高,判断是横版还是竖版图片
  8. 小游戏,对于刚刚学完python基础的非常合适,下一个是自己写的代码
  9. CentOS 开机出现错误信息:Could not apply the stored configuration for monitors
  10. IDEA的安装与使用学习笔记(尚硅谷----宋红康老师)