如何简单快速搭建 Android 大仓 1
书接上文,上回提到 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指令时,由自动化工具执行合并操作。
综述
- 通过 Gradle 的
includeBuild
将所有分开的仓库合并到一起,并按一定的目录层级组织各个子项目。 - 通过 gitlab 的 api 实现一个自动化工具来合并代码。
通过上述两个步骤,便打造了一个大仓雏形。然而这只是大仓的第一步,未来还有很多工作呢…
关于大仓,本文只简单描述了一下方案大致思路,行文粗糙,希望对想实践大仓的你有所帮助,如有疑问欢迎评论留言。
欢迎加入Android进阶交流群;701740775。进群可免费领取一份最新技术大纲和Android进阶资料。请备注csdn
如何简单快速搭建 Android 大仓 1相关推荐
- test.php创建,基于phpstudy简单快速搭建一个php程序
原标题:基于phpstudy简单快速搭建一个php程序 人人都是程序员,希望在零碎的阅读时间里,给您一些技术提升. 1 安装phpstudy 通过以下链接download.csdn.net/downl ...
- 快速搭建Android应用后台服务器
一直没单独一个人搭建过后台,之前都是用的云服务后台,跟着帖子一步一步走,最终完美实现后台与移动端的数据沟通,顿时感觉棒棒哒,特此记录一下.很感谢下面帖子的博主得无私分享! 一.后台的搭建 1.自己动手 ...
- 简单快速搭建,全新语聊方案
导读: 年初的时候因为马斯克的一场直播带货,让 ClubHouse 迅速出圈变成现在炙手可热的社交产品.开个玩笑.现在要是没有用过ClubHouse你都不好意思说自己是互联网行业的.(不过目前中国市场 ...
- android找不到符号_快速搭建Android开发环境——Android Studio(附ADB找不到设备)...
由于毕设大概率最终要使用Android来实现,所以现在要开始学习一些Android开发基础了. 学习一门技术,最先要解决的问题就是开发环境的问题. 就如同两年前学java那样,在windows下配置环 ...
- android游戏1024代码,castlegame 可简单快速开发android游戏。我总结的教程
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 安装 fpcupdeluxe-i386-win32.exe 先安装这个. fpc 选择 304版本 即stable 版本 lazarus 选择184版本 ...
- python服务器搭建nginx_Nginx简单快速搭建文件服务器
前言 在之前的一篇博文中介绍了Nginx负载均衡的实现,本篇文章就简单介绍下如何用Nginx搭建一个文件服务器. Nginx安装 Nginx配置 Nginx的配置这块和普通的一样就可以了,只要在ngi ...
- 如何简单快速搭建自己的云对象存储服务(OSS)
简单来说,其实我们只需要有一台服务器,利用服务器的各种资源,搭配其它厂商开发的软件,就能很轻易拥有自己的云对象存储服务.不需要在阿里云上花钱买什么服务,甚至还能自己给别人提供服务,真的是太爽了. 云对 ...
- 三步快速搭建android开发环境 (下载包已集成可用sdk,无需费心到google相应网站下载,快哉!)
http://blog.csdn.net/king_sundi/article/details/24901849 其中,adt buntle在这里下: http://blog.csdn.net/LAN ...
- 安卓开发(一)快速搭建Android开发环境
文章目录 Android 一 Android 开发环境安装 1.1 Android Studio 安装 1.2 雷神模拟器的配置 Android 一 Android 开发环境安装 1.1 Androi ...
- 利用Vue-cli3简单快速搭建前端项目架构
安装 如果在电脑上已经安装了vue-cli2.0如果想要把其替换成vue-cli3.0的话需要先卸载原有vue-cli2.0的版本. npm uninstall vue-cli -g 卸载完成之后就直 ...
最新文章
- cmake 离线安装mysql_(cmake)编译安装mysql
- 机房合作(一):我怎样做组长(敢于承担责任)
- python中面向对象空间时间_python基础学习Day15 面向对象、类名称空间、对象名称空间 (2)...
- 电脑上mysql数据库无法登录_无法远程登入MySQL数据库的几种解决办法MySQL综合 -电脑资料...
- 飞秋爱好者(WZ132)
- DataX离线数据同步工具/平台
- 拼多多董事会变更:董事6人变5人 张震不再出任
- 模拟登陆教务处获取成绩
- Ubuntu18.04编译pulseaudio14.x(八)
- zabbix---agent安装
- Builder模式的误区:将复杂对象的构建进行封装,就是Builder模式了吗?
- 移动硬盘插电脑上驱动感叹号_如何通过移动驱动器向手机或平板电脑添加额外的存储空间...
- Hive教程(08)- JDBC操作Hive
- mysql拼图游戏代码_HTML+Javascript制作拼图小游戏详解(二)
- ChinaSoft 论坛巡礼 | 泛在操作系统理论、技术与开源生态构建
- 蓝桥杯试题 基础练习 Fibonacci数列
- ARM体系结构2:处理器内核和汇编指令集
- 快速解决Android编译报错 : Manifest merger failed with multiple errors, see logs
- Linux(CentOS)下安装NVIDIA GPU驱动
- 计算机函数sun怎么用,手把手演示sumif函数怎么用【处置步骤】
热门文章
- C语言RR调度算法,RR(轮转调度算法)
- 智能安卓手机工控主板能实现哪些智能家居设备呢?
- 如何搜集外贸英文关键词
- 基础数据人员节点相关sql和个人银行账户节点人员编码参照代码
- 运行示例sparkPi计算圆周率(1.1)
- 曙光联手北京计算中心 打造云计算联合实验室
- 根据图片完整路径,获得图片的宽和高,判断是横版还是竖版图片
- 小游戏,对于刚刚学完python基础的非常合适,下一个是自己写的代码
- CentOS 开机出现错误信息:Could not apply the stored configuration for monitors
- IDEA的安装与使用学习笔记(尚硅谷----宋红康老师)