Android library模块publish到JitPack完成流程

背景

前段时间想要找一个支持Material You主题的FloatingActionButton,几经辗转总算是找到了,但组件是在另一个开源库的基础上封装继承,一直拖到昨天才把该部分抽离出来,放到了 单独项目 中。

由于View依赖了几个类,每个类都有各自的分工,聚合到一起会导致View类过大,且有应该它承担的职责,故没有将所有方法放到一个类文件中。 这样麻烦就到了引用时,昨天睡前决定以开源库的形式支持,于是有了这篇文章。

前置知识

Android module类型

Android中module分为两类,分别是application和library,application是可以运行起来的app,library则是某一部分独立的功能。library又可以细分为Java library和Android library,两者的区别在于Java library比Android library少了资源文件(项目res文件夹下),构建出来的是jar;Android library构建出来的是aar。

JitPack构建流程

先check out出你的代码,执行Gradle task:publishToMavenLocal,再把生成的aar文件上传以com.github.用户名.仓库名称:tag的格式。这些都由JitPack帮我们完成。

行动

决定了publish到开源仓库,接下来要决定到哪个仓库。常用的几个分别有:

  • Google
  • MavenCenter
  • JetCenter(停止支持)
  • JitPack

JetCenter从去年开始宣布停止维护,首先排除。 Google没有找到url等相关信息,加上平时用到Google仓库的都是官方提供的依赖,猜测不开放给publish。 剩下的两个MavenCenter和JitPack。JitPack依赖git,Github仓库的中打tag就可以创建,最易操作,但以来的group和artifact是不能修改的。MavenCenter搜索到的步骤很复杂,日后再说。

于是最后决定用JitPack。

项目配置

Android中module分为两类,分别是application和library,application是可以运行起来的app,library则是某一部分独立的功能。library又可以细分为Java library和Android library,两者的区别在于Java library比Android library少了资源文件(项目res文件夹下),构建出来的是jar文件;Android library构建出来的是aar文件。

添加Gradle Plugin并配置依赖库

创建一个依赖库需要用到library module。创建一个module,Templates选Android Library,输入名称,创建。 然后就是等待构建,构建完成后在刚刚module的build.gradle(Kotlin版本对应为buil.gradle.kts)增加Gradle Plugin:maven-publish

最好是添加依赖后先同步,等同步完成再添加publishing代码块,否则publishing代码块会报红。

在build.gradle文件的最外层与(与plugins、android、dependencies等通层级)添加:

publishing {
    publications {
        create<MavenPublication>("maven") {
            groupId = "io.github.opoojkk"
            artifactId = "material-speed-dial"
            version = "1.0.0"

            afterEvaluate {
                artifact(tasks.getByName("bundleReleaseAar"))
            }
        }
    }
}

groupIdartifactId都修改成自己的(尝试后发现JitPack中修改了也还是固定的com.github.用户名.仓库名:tag的形式😅)。

另外,JitPack官方文档中用的是 from(components["java"]),这样会提示SoftwareComponentInternal with name 'java' not found.。原因暂时不详,参考链接: SoftwareComponentInternal with name ‘java’ not found

匹配Gradle和Target Java

踩过的坑: 项目Gradle版本8.0,Java设置1.8,疯狂提示: No matching variant of com.android.tools.build:gradle:8.1.1 was found. 改成Java 11后提示要用18,再改成18搞定。

sourceCompatibilitytargetCompatibilityjvmTarget后的值都需要统一修改。

让依赖库可以被依赖

开始时说过是依赖Github仓库,因此这一步需要将仓库推送到Github,步骤略去。 推送后在仓库中点击Release Draft a new release 选择Choose a tag,输入一个tag,这里是tag会对应到依赖库的版本,可以输入1.0.0这样的格式,其他当然也可以。要点击Create new tag: xxx on publish,Release title也填入1.0.0。 这样完成了Github部分的步骤。

接下来打开 JitPack首页 ,把刚刚的Github仓库地址复制下来,粘贴到搜索框点击Look up,就可以看到这样的ui:

想要得到依赖库,需要点击Get it

刚刚的部分会显示这样的状态,标识正在构建:

完成后前面多出一个绿色的icon,表示已经成功: 点击可以见到log,在log的最后能够看到依赖库的地址。

当红色的icon时表示出了问题,可以点击红色的icon查看问题的原因。 再然后就是导入了,可以参考 官网文档

总结:

总结一下步骤:

  1. Android项目中创建module,添加插件并配置;
  2. 上传到Github仓库;
  3. Github仓库打tag;
  4. 到JitPack找到仓库,点击Get it得到依赖库。

参考链接

  1. SoftwareComponentInternal with name ‘java’ not found
  2. JitPack文档