发布Android Library到Maven/JCenter

背景介绍

为熟悉Kotlin以提高生产力,特用Kotlin重写了一个内部Java库中的WiFi管理部分,并独立成WifiConnectivityManager库发布出来。本文主要记录使用Novoda发布该库的过程,以及中间遇到的一些坑。若对读者有一定的参考和借鉴价值,也将倍感欣慰。

为使整个过程详实可鉴,会辅以较多的截图,且每张图的内容也经过仔细筛选,读者可视个人情况选择精读或泛读。另外,注意到Bintray网站正处于beta测试期间,所以相应截图可能与最新网页界面有所不同,望知悉。

环境配置

  1. Android Studio (AS) v4.1
  2. Gradle Wrapper (v6.1.1 -> v5.6.4)
  3. Android Gradle Plugin (AGP)(v4.1.1 -> v3.6.2)
  4. Nodova Bintray Release v0.9.2

注:截至本文写作时(11/12/2020)Nodova官方尚不支持Gradle v6+和AGP v4.0+以上版本。例如,使用Gradle v6.1.1和AGP v4.1.1,在执行发布命令gradlew clean build bintrayUpload时遇到了LazyConfigurationUsageContext错误,作为临时解决方案,将Gradle和Android Gradle Plugin版本分别降低到了v5.6.4和v3.6.2。

申请账号

JFrog Bintray作为领先的软件发布服务平台,提供了通用、安全和开放的软件自动发布服务,而Novoda的Bintray-release则是专为Android项目构建(artifacts)发布而服务。所以,如果没有JFrog Bintray账号的话首先需要申请并激活账号,当然也可以使用如Github,Google等第三方账号授权登陆。

填写账号信息并创建试用账号(30天)。
Company Name:aila
Organization ID: aila (默认同company name)
First Name: Neil
Last Name: Ling
User Name: niling
Password: *********
Email Address: ggnodes2018@gmail
Select Country: China

Screen Shot 2020-11-12 at 12.39.22 PM.png

检查并激活账号,重新登陆后可以看到组织(org:aila)管理界面,如下所示:


注:生成的账号地址格式为:https://bintray.com/{orgName},如刚新建的组织对应的地址为https://bintray.com/aila。若创建账号时无有效的组织id,则默认为用户名,即https://bintray.com/nilling。因build.gradle文件中Nodova相关的publish配置中需要指明userOrg,特此说明,否则容易引起误解。

创建库名和包名

(Repository)和(Package)是Bintray中用于管理构建(Artifact)的两个逻辑组织单元,类似于Java中的Package name和Class name, 使得通过maven URL即可查找到对应的构建。例如,我们的构建(WifiConnectivityManager)最终对应的maven URL为maven { url 'https://dl.bintray.com/aila/tools' },其中aila为组织名(userOrg), tools为库名(repoName)。如果配合依赖声明

implementation 'com.nling.tools:wificonnectivitymanager:0.0.1'

Gradle则可以从maven库中查找到我们发布的构建,查找顺序依次为:

  1. 名:dl.bintray.com
  2. 组织名(userOrg):aila
  3. 名(repoName):tools
  4. 名(groupId):com.nling.tools
  5. 构建名(artifactId):wificonnectivitymanager
  6. 版本号(publishVersion):0.0.1

本小结主要介绍如何创建库和包。
在管理界面点击【Add New Repository】,进入新建界面,库名为tools, 类别为Maven。

Screen Shot 2020-11-12 at 1.21.27 PM.png

进入新建的名为tools的Repository的详情页面,点击【Add New Package】创建新的包。
Name: wificonnectivitymanager
License: Apache-2.0


Screen Shot 2020-11-12 at 1.31.12 PM.png

创建成功的package界面显示如下(beta版)


Screen Shot 2020-11-12 at 1.33.22 PM.png

至此,发布所需的所有准备工作就完成了。

GroupId和Artifact version在哪里指定?在build.gradle配置文件中!

集成Novoda并发布

依照Novoda的README,修改库所在build.gradle文件,完成nodova集成。

apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'com.novoda.bintray-release'  // 2

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.novoda:bintray-release:0.9.2' // 1
    }
}

publish {  // 3
    userOrg = 'aila' // 4
    repoName = 'tools' //5
    groupId = 'com.nling.tools' // 6
    artifactId = 'wificonnectivitymanager' // 7
    publishVersion = '0.0.1' // 8
    desc = 'This repository aims to provide an uniform interface for apps to connect to a specific Wi-Fi network, without having to care about what the OS version the app is running on or is targeting to. Internally, it handles the details when it comes to connecting to or disconnecting from a Wi-Fi network, and of course, it behaves differently on different OS platform.'
    website = 'https://github.com/lingxuxiong/WifiConnectivityManager'
    // bintrayUser = 'nling' // 9
    // bintrayKey = 'xxxxx'  // 10
}
  1. 添加nodova依赖。
  2. 应用novoda插件,该声明需要在apply plugin: 'com.android.library'之后。
  3. 添加publish相关的配置信息。
  4. userOrg为新建账户时的组织名,如果没指定的话默认为用户名。
  5. repoName为新建的库名
  6. groupId为构建所属组,可自由指定,无冲突即可。
  7. artifactId为新建的包名。
  8. publishVersion为构建版本号,升级新版本时需相应增加次字段的值。
  9. bintrayUser为新建账户时的userName。
  10. bintrayKey为apiKey,可在organization的详情界面查看。


    Screen Shot 2020-11-12 at 1.50.13 PM.png

编译和发布

./gradlew clean build bintrayUpload -PbintrayUser=niling -PbintrayKey=**************************************************** -PdryRun=false

若编译或上传失败,则会给出相应错误信息。

若编译并发布成功,则会打印类似日志:
Screen Shot 2020-11-12 at 1.52.27 PM.png

同时在库名为tools的下可以看到发布成功的记录
Screen Shot 2020-11-12 at 1.57.00 PM.png

点击发布成功的构建(wificonnectivitymanager)可进入详情界面查看相关信息,下面截图展示了gradle脚本如何引用新构建,注意右上角为构建的maven URL地址。
Screen Shot 2020-11-12 at 1.59.52 PM.png

引用发布库

刚才构建只是发布到了Maven,可点击【Link to JCenter】进一步链接到JCenter。该过程需要等待审批,若审批通过则可以直接引用:

implementation 'com.nling.tools:wificonnectivitymanager:0.0.1'

否则需要指定其所在的maven库地址:

allprojects {
    repositories {
        google()
        jcenter()
        maven { url 'https://dl.bintray.com/aila/tools' }
    }
}

其中aila和tools分别对应组织名和库名。

⚠️ 已链接到JCenter的库,以后每次新版本发布均无需申请,新版本可直接更新到JCenter。

总结

总的来说,使用Nodova发布library的过程非常简单,只需简单的几步配置即可。对初学者来说,难点是如何在JFrog Bintray中配置相关的库名和包名,并将相关信息与nodova配置关联起来。笔者就因为一个简单的配置错误而抓疯(pull my hairs out)了快一天。

参考文档

  1. Anitaa Murthy. 6-easy-steps-to-upload-your-android-library-to-bintray-jcente, 05/26/2018, 11/11/2020.
  2. 编码前线. 使用bintray-release快速发布库到JCenter.08/25/2018, 11/11/2020
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。