opoojkk

发布android库到Maven Central

xx
目次

平时写一些小东西时有一部分代码是很常用到的,总不能每次都写一遍,每次都复制也太麻烦了,最简单的方式就发布到maven仓库,用拉取远程仓库的方式解决。因此,废了一顿劲发布到maven central中。也刚好记录下来,帮助有需要的人。

准备 #

在发布之前,需要先考虑发不到哪里,Android工程中常用的maven仓库有四个:

随着Jcenter宣布设为只读代码库,可以选择的只剩了三家,加上Google是官方自己用的,实际上也只有两家。

Jitpack发布相对简单,之间也尝试过,有需要可以参考: Android library模块publish到JitPack完整流程。今天的是发布到maven central的。主要原因是可以用自己的域名- -

发布的流程很清晰:构建-签名-上传

Maven Central注册 #

发布到Maven Central首先要做的当然是注册账号了,中maven central repository右上角点击Sign In,后选择注册或者用Google、Github登录即可。

注册好之后是添加namespace,这样别人才能用com.example.lib:1.0.0这样的形式拉下来你的仓库。

生成token #

进到Setup Token-Based Authentication,点击"Generate User Token",按照提示生成一个新的token,保存下来等下需要用到。

添加namespace #

这里有两种选择,github提供的和自己的域名。如果用github提供的,你的github用户名是yourname,那namespace就是io.github.yourname。io.github这部分是固定的,你只需要修改yourname这部分,按照流程继续往下走就可以了。

如果用自己的域名,只需要在域名的DNS中添加一条Txt类型的记录,内容和maven central提示的相同即可。

构建和发布 #

代码的部分就略过了,还没有那么大能耐能教别人怎么写代码。写好之后就是构建和发布了。

在一个android项目中,一个模块有两种类型,要么是可以运行的应用,要么是提供某些逻辑功能的库。两者的差别只在使用的Gradle插件是com.android.application(应用)还是com.android.library(库)上。想要发布用到的当然是库这一类型的。

除了指明是哪种类型的模块的插件,还需要一些其他的。发布用到maven-publish,它是Gradle提供的发布插件。

在发布到maven central时,是要要求有签名的,Gradle签名的插件一般是signing,不同于应用的签名,这里的是用GPG,简单来说是一种非对称加密工具,详细的推荐阅读GPG入门教程。别担心,不会引入太多新的内容,只用到创建和输出密钥、分发到服务器中这三个操作。

或者,你也可以用com.vanniktech.maven.publish这个Gradle插件,包含了发布、签名这两个部分,你只需要导入这一个就可以了。我在使用时,最新的版本是0.34.0

配置 #

你需要做的只是在想要发布的模块build.gradle.kts文件加上发布和签名两部分配置。因为有相关的插件依赖,所以还要加上依赖。

插件:

1
2
3
4
5
6
plugins {
    alias(libs.plugins.android.library)
    alias(libs.plugins.kotlin.android)
    // 添加这一行
    id("com.vanniktech.maven.publish") version "0.34.0"
}

发布:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
mavenPublishing {
    configure(
        AndroidSingleVariantLibrary(
            // the published variant
            variant = "release",
            // whether to publish a sources jar
            sourcesJar = true,
            // whether to publish a javadoc jar
            publishJavadocJar = true,
        )
    )

    coordinates("com.opoojkk", "androidkt", android.defaultConfig.versionName)

    pom {
        name.set(project.name)
        description.set("common android kotlin extensions")
        inceptionYear.set("2025")
        url.set("https://github.com/opoojkk/androidkt/")
        licenses {
            license {
                name.set("The Apache License, Version 2.0")
                url.set("http://www.apache.org/licenses/LICENSE-2.0.txt")
                distribution.set("http://www.apache.org/licenses/LICENSE-2.0.txt")
            }
        }
        developers {
            developer {
                id.set("lxx")
                name.set("lxx")
                url.set("https://github.com/opoojkk/")
            }
        }
        scm {
            url.set("https://github.com/opoojkk/androidkt/")
            connection.set("scm:git:git://github.com/opoojkk/androidkt.git")
            developerConnection.set("scm:git:ssh://[email protected]/opoojkk/androidkt.git")
        }
    }
}

上面的这些都是我的配置,需要吧涉及到的地址改成你的。尤其是coordinates中的,这会影响到你发布到的namespace。

签名:

1
2
3
4
5
6
7
8
signing {
    useInMemoryPgpKeys(
        findProperty("signingKeyId")?.toString() ?: "",
        findProperty("signingKey")?.toString() ?: "",
        findProperty("signingPassword")?.toString() ?: ""  // 确保密码不为 null
    )
    sign(publishing.publications)
}

除了这些还有些,你还需要在gradle.properties中添加下配置.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
// 发布到maven central
mavenCentralPublishing=true
// 对所有publication签名
signAllPublications=true
// 自动发布,否则要在maven central手动发布
mavenCentralAutomaticPublishing=true

// 从maven central哪来的tname
mavenCentralUsername=xxxxxx
// 从maven central哪来的token
mavenCentralPassword=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// 用来签名的GPG keyid
signingKeyId=xxxxxxxx
// GPG私钥,注意包含包含开始和结尾"==="和空行的部分全部都是,写成一行,讲换行改成"/n"
signingKey=...
// 设置的密码
signingPassword=xxxxxx

执行 #

最后一步,执行gralde命令:

1
./gradlew publishToMavenCentral

打完收工。

GPG命令 #

涉及到的GPG命令:

创建: gpg --gen-key

创建之后需要拿到keyid才能继续执行后面的操作,获取keyid的命令:gpg --list-keys --keyid-format short

你会得到和下面类似的:

1
2
3
pub   rsa4096/34567890 2025-07-26 [SCE]
      1231231231231231231231231231231234567890
uid           [ 绝对 ] lxx (androidkt) <[email protected]>

1231231231231231231231231231231234567890就是你的keyid。一般都用短id,也就是后八位34567890。

输出密钥: gpg --armor --output public-key.txt --export {keyid}

执行后,你会得到很长的一串字符,这就是你的私钥。

发布keyid到服务器: gpg --keyserver keyserver.ubuntu.com {keyid}

有三个服务器可选,差不多…

这些在GPG入门教程中都是有的。

总结 #

踩坑 #

  1. 签名
    1. 签名用了很久才配置好,开始用导出的pgp私钥文件路径,结果不行。试过读出文字,也不行。中间还改了好多种配置,最后把全部内容放上去才好。
  2. keyid一定要发布到server!
  3. 不用在build.gradle中自己加maven仓库,替你试过了,不好使….

步骤 #

最后总结一下步骤,以防看着迷糊。

  1. 注册maven central账号,添加namespace,生成token
  2. 生成pgp密钥,发布keyid到服务器
  3. gradle添加插件、发布配置
  4. 执行gradle脚本发布

参考 #

标签:
Categories: