Android项目中独立Git库源码依赖技术方案

206 阅读3分钟

一、背景 文章 Android项目中独立Git项目分库后的编译调试时Gradle的配置中介绍了Android项目中独立Git库源码依赖时的本地处理方案。但在实际的项目开发中,由于团队多人协作以及可能存在的多独立Git库等情况,实际上使用还是有所不便。如采用Google Repo或者submodule方式,实际上也只是基于Git命令基础上的脚本封装,只是解决多库的Git使用问题,而不能解决实际项目场景中的多独立Git库的统一AAR发布、源码依赖与AAR依赖的一键切换、甚至构建过程中的定制与扩展等。 另一方面,在源码依赖领域,Gradle在几年前就开始进行了尝试,并在官网博文中发布了文章: Introducing source dependencies,只是到目前为止,在关键的authentication问题上还没有给出实质性的方案,还不能被正式使用。同时,对于独立Git库存在经常修改的情况,这种方案也必须依赖于经常往远程push commit方式。现实中,对于独立Git库的修改,可以等主工程可以直接有效果,基本稳定后,确认没问题了再发布AAR,然后再一键切换到二进制AAR依赖。如此才能满足复杂项目场景中的现实需要。 当然,本文重点主要还是围绕源码依赖进行,相当于现实项目场景整体方案其中的关键一个组成部分。

二、技术方案 文章 Android项目中独立Git项目分库后的编译调试时Gradle的配置,其实已经提供了基本的源码依赖思路,只是在具体实现上,没有考虑到团队多人协作以及可能存在的多独立Git库等情况,手动逐个配置往往不便。如此,可以在其基础上进行一次升级,针对多独立Git库,通过Gralde Task和开关配置的方式,尽可能的自动化其中的手动操作过程。 主要过程简单示例如下,项目实际使用中可以抽取成Gradle插件: 1,gradle.properties中配置源码依赖开关: sourceDependence = false 复制代码 2, settings.gradle中include独立Git库本地源码项目 if(sourceDependence) { include ':components:uicomponent' project(':components:uicomponent').projectDir = new File(getRootDir().getParent() + '/components/uicomponent') } 复制代码 3,项目根目录build.gradle定义与独立Git库交互脚本,封装成task: buildscript { apply from: './buildConfig.gradle'

repositories {
    google()
    jcenter()
    ....
}
dependencies {
    ....

    classpath 'org.ajoberstar.grgit:grgit-core:3.0.0'
    classpath 'org.ajoberstar.grgit:grgit-gradle:3.0.0'
}

}

task sourceDependenceLib { doLast { doClone('components', 'git@git.xxx.com:xxx/android/xxx/components.git', 'dev') } }

import org.ajoberstar.grgit.Grgit

void doClone(String dirName, String remote, String branch) { File dir = new File(getRootDir().getParent() + "/" + dirName) def git if(!dir.exists()) { git = Grgit.clone(dir: dir, uri: remote, refToCheckout: branch) } git = Grgit.open(dir: dir) git.checkout(branch: branch) git.pull(rebase: false) } 复制代码 4,主工程依赖中添加上源码依赖切换逻辑: ext { dependencies = [ .... uicomponent: "com.shopee.ui:uicomponent:$uicomponent_version" ] }

if(sourceDependence) { dependencies.uicomponent = project(':components:uicomponent') }

复制代码 执行sourceDependenceLib task,可以直接git load下最新的指定分支源码,打开sourceDependence开关,即可直接切换从二进制依赖切换到源码依赖。 最终效果如下:

源码依赖情况下,可以直接修改独立Git库代码,直接源码编译。阶段性稳定后发布AAR。 end~

作者:HappyCorn 链接:juejin.cn/post/690984… 来源:掘金 来源:转发 HappyCorn