前言
作为一个热爱编码的安卓开发,工作这么多年,也喜欢写点自己爱用的库,奈何这样的代码越写越多,我就发现了一个很尴尬的问题。代码越堆越多,每次全局改点啥,就要挪来挪去。
其实很早之前也想过(并试过)上传到Maven仓库,比如本地搭建、阿里云私有的等等。但是都感觉限制性很高,然后也试过上传到mavenCentral,但是这个弄到一半,中途放弃了。
最近突然又想把这个事情办完算了,结果第一步就把我卡住了。

上面是啥意思呢?
简单来说就是以前的玩法不让玩了。然后又给了文档说明。

如果玩的话,要用新的玩法,我们这次,就是手把手教你,最新玩法怎么玩。官方文档地址:
central.sonatype.org/register/le...
注册账号
按照文档的意思,我们需要在这个网站注册登录

点击sign in 会出现如下界面:

这里我为了省事,直接选择用 github 账号授权登录。(在弹窗选择授权登录即可)
登录成功之后,我们选择:

正常情况下,新账号是Namespaces 选项卡下是没有任何内容的(我这里是已经注册好了一个Namespaces)。下一步我们就是去注册Namespaces。
注册Namespaces
找到Register New Namespace按钮,然后点击它。

会弹出如下界面:

这里我们填入我们的主域名即可。比如我买了个域名 fastcv.cc,那在这里填入cc.fastcv即可。
但是cc.fastcv我已经提交并且验证通过了,这里我就用fastcv.com来做演示。填入com.fastcv并提交之后,我们在Namespace选项卡下可以看到这个内容:

在这一步就是需要去验证这个域名是不是你的。
验证Namespace
我们点击Verify Namespace按钮

这里会给我们一段文本,比如这里的 "ssdiral7je"。
那怎么去验证呢?按照弹窗的提示,我们需要去我们域名里面创建一个Txt Record。
这是个啥?
以阿里云的域名来说,我们找到我们购买的域名后

点击进去查找域名解析

然后在域名解析里面找到解析设置。

再找到添加记录。

在添加记录弹窗里面配置如上信息后,再将之前的验证文本字符串填入到记录值的文本输入框里面。最后点击确定。就会在记录里面多出一条

这一步配置好之后,我们返回我们之前的这个页面

点击Confirm即可,然后等待验证结果即可。
怎么上传库?
在Namespace验证通过后,我们就可以准备去上传我们的库文件到Central Portal了。
因为安卓项目现在基本上都是gradle的项目配置。所以感兴趣的可以直接去官方文档看gradle的配置方式。
central.sonatype.org/publish/pub...

在我写文档的这个时候,目前还没有官方出这个gradle插件。但是它推荐了一些用户自己实现的gradle插件:

这里我选择的是

地址如下:
安装它的说明文档结合我的实际情况,我的库文件module下的gradle配置如下:
kotlin
plugins {
alias(libs.plugins.android.library)
alias(libs.plugins.kotlin.android)
id("maven-publish")
id("signing")
id("tech.yanand.maven-central-publish") version ("1.3.0")
}
android {
namespace = "cc.fastcv.line_number_clock"
compileSdk = 34
defaultConfig {
minSdk = 24
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles("consumer-rules.pro")
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
kotlinOptions {
jvmTarget = "11"
}
}
dependencies {
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.appcompat)
implementation(libs.material)
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core)
}
publishing {
publications {
create<MavenPublication>("mavenJava") {
afterEvaluate { artifact(tasks.getByName("bundleReleaseAar")) }
groupId = "你的Namespace"
artifactId = "库名称"
version = "库版本"
pom {
name = "库的名称"
description = "对库的描述"
url = "https://github.com/fastcv-cc/LineNumberClock"
// 许可证名称和地址
licenses {
license {
name = "The Apache License, Version 2.0"
url = "http://www.apache.org/licenses/LICENSE-2.0.txt"
}
}
// 开发者信息
developers {
developer {
name = "pisto"
email = "[email protected]"
}
}
// 版本控制仓库地址
scm {
url = "https://github.com/fastcv-cc/LineNumberClock"
connection = "scm:git:git://github.com/fastcv-cc/LineNumberClock.git"
developerConnection =
"scm:git:ssh://[email protected]:fastcv-cc/LineNumberClock.git"
}
}
}
}
repositories {
}
}
signing {
sign(publishing.publications)
}
mavenCentral {
authToken = rootProject.properties["authTokenValue"] as String
// 上传是否应该自动发布。如果您希望手动执行此操作,请使用 'USER_MANAGED'。
// 该属性是可选的,默认为 'AUTOMATIC'。
publishingType = "AUTOMATIC"
// 当发布类型为 'AUTOMATIC' 时,状态API获取 'PUBLISHING' 或 'PUBLISHED' 状态的最大等待时间
// 或者当发布类型为 'USER_MANAGED' 时,获取 'VALIDATED' 状态。
// 该属性是可选的,默认为60秒。
maxWait = 60
}
最后在我们的项目根目录gradle.properties 文件中添加
kotlin
signing.keyId=xxx
signing.password=xxx
signing.secretKeyRingFile=xxx
authTokenValue=xxx
这步配置完成之后,我们就可以使用以下命令将我们的库文件上传到Central Portal了。
kotlin
./gradlew publishToMavenCentralPortal
你问我这些信息从哪里获取?
不要急,我们接下来讲怎么获取这些配置信息
获取signing的相关配置信息
由于Central Portal会对我们上传的包进行签名验证。这里使用的签名采用的是公私钥(RSA)的模式,即私钥签名,公钥验证。所以我们需要先为项目生成一份公私钥对,并将公钥上传至公钥中心,再把私钥配置到项目中,为生成的包签名。
而GPG就是干这个活的,我的电脑是Mac,所以我以下记录的是Mac上关于GPG的操作过程。其它系统的大家到网上搜一下就行了,教程很多。
安装GPG
kotlin
brew install gpg
使用 GPG,生成公钥和私钥
在终端下执行命令
kotlin
gpg --full-generate-key
输入命令后,一路选择默认到输入名字和邮箱的地方(回车就是选择默认的),输入你的名字和邮箱,中间有一次确认是否保存的选项,选择y即可。
在输入完名字和邮箱后,会有个新的选项出现,询问你是否需要修改信息,我们直接选择Okey(输入O)即可。接下来就是输入你的密码,然后确定就行。
整体大致如下:

千万要记住你的密码和相关信息哦!!!
查看密钥信息
kotlin
gpg -k
可以看到刚才生成的密钥。

其中 183****BD5 为密钥指纹,指纹的后 8 位 「*****BD5」就是我们需要配置的 signing.keyId 的值。
你设置的密码就是 signing.password 的值。
导出私钥
kotlin
gpg --export-secret-keys [密钥指纹] > private-key.gpg
使用以上命令导出我们的私钥。注意看我们这个命令执行的目录,生成的密钥就在这个目录。
然后我们将密钥放置在某个目录下,这个目录的路径就是 signing.secretKeyRingFile 的值。
上传公钥到公钥服务器
我们在前面说过,Central Portal会对我们上传的包进行签名验证,我们本地配置了私钥进行签名,但是我们的公钥Central Portal不知道,所以它会去公钥服务器里面根据我们的配置信息去找对应的公钥,然后做校验。
所以我们需要把我们的公钥上传到公钥服务器里面。
kotlin
gpg --keyserver keyserver.ubuntu.com --send-keys [密钥指纹]
其中,keyserver.ubuntu.com 就是公钥服务器的地址,Central Portal校验签名就是从公钥服务器拉取。
目前支持的公钥服务器地址有三个:
如果一个地址访问失败,替换成换成其中任意一个都是可以的。
获取authTokenValue值
获取这个值我们需要回到我们的这个网站

选择View Account。

在弹窗里面复制它给我们的账号密码,然后找个Base64转码网站以
**username:password **的格式转码,获取到的Base64的编码就是我们需要的authTokenValue的值。
完成这一步之后,我们就可以通过命令去上传我们编码好的库文件了。
查看上传的库文件
在central.sonatype.com/ 里面点击这个

就可以看到你上传的库文件了,正常情况下,你的状态是推送中的状态,等待一段时间后就可以了。
如果使用自己的库文件

通过搜索自己库文件的名字。

点击进入,就可以看到相应的配置信息了。
