作為一個熱愛編碼的安卓開發(fā),工作這么多年,也喜歡寫點自己愛用的庫,奈何這樣的代碼越寫越多,我就發(fā)現(xiàn)了一個很尷尬的問題。代碼越堆越多,每次全局改點啥,就要挪來挪去。
其實很早之前也想過(并試過)上傳到Maven倉庫,比如本地搭建、阿里云私有的等等。但是都感覺限制性很高,然后也試過上傳到mavenCentral,但是這個弄到一半,中途放棄了。
最近突然又想把這個事情辦完算了,結(jié)果第一步就把我卡住了。

上面是啥意思呢?
簡單來說就是以前的玩法不讓玩了。然后又給了文檔說明。

如果玩的話,要用新的玩法,我們這次,就是手把手教你,最新玩法怎么玩。官方文檔地址:
https://central.sonatype.org/register/legacy/
注冊賬號
按照文檔的意思,我們需要在這個網(wǎng)站注冊登錄

點擊sign in 會出現(xiàn)如下界面:

這里我為了省事,直接選擇用 github 賬號授權(quán)登錄。(在彈窗選擇授權(quán)登錄即可)
登錄成功之后,我們選擇:

正常情況下,新賬號是Namespaces 選項卡下是沒有任何內(nèi)容的(我這里是已經(jīng)注冊好了一個Namespaces)。下一步我們就是去注冊Namespaces。
注冊Namespaces
找到Register New Namespace按鈕,然后點擊它。

會彈出如下界面:

這里我們填入我們的主域名即可。比如我買了個域名 fastcv.cc,那在這里填入cc.fastcv即可。
但是cc.fastcv我已經(jīng)提交并且驗證通過了,這里我就用fastcv.com來做演示。填入com.fastcv并提交之后,我們在Namespace選項卡下可以看到這個內(nèi)容:

在這一步就是需要去驗證這個域名是不是你的。
驗證Namespace
我們點擊Verify Namespace按鈕

這里會給我們一段文本,比如這里的 "ssdiral7je"。
那怎么去驗證呢?按照彈窗的提示,我們需要去我們域名里面創(chuàng)建一個Txt Record。
這是個啥?
以阿里云的域名來說,我們找到我們購買的域名后

點擊進去查找域名解析

然后在域名解析里面找到解析設(shè)置。

再找到添加記錄。

在添加記錄彈窗里面配置如上信息后,再將之前的驗證文本字符串填入到記錄值的文本輸入框里面。最后點擊確定。就會在記錄里面多出一條

這一步配置好之后,我們返回我們之前的這個頁面

點擊Confirm即可,然后等待驗證結(jié)果即可。
怎么上傳庫?
在Namespace驗證通過后,我們就可以準(zhǔn)備去上傳我們的庫文件到Central Portal了。
因為安卓項目現(xiàn)在基本上都是gradle的項目配置。所以感興趣的可以直接去官方文檔看gradle的配置方式。
https://central.sonatype.org/publish/publish-portal-gradle/

在我寫文檔的這個時候,目前還沒有官方出這個gradle插件。但是它推薦了一些用戶自己實現(xiàn)的gradle插件:

這里我選擇的是

地址如下:
https://github.com/yananhub/flying-gradle-plugin
安裝它的說明文檔結(jié)合我的實際情況,我的庫文件module下的gradle配置如下:
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"
}
}
// 開發(fā)者信息
developers {
developer {
name = "pisto"
email = "sayhigerry@gmail.com"
}
}
// 版本控制倉庫地址
scm {
url = "https://github.com/fastcv-cc/LineNumberClock"
connection = "scm:git:git://github.com/fastcv-cc/LineNumberClock.git"
developerConnection =
"scm:git:ssh://git@github.com:fastcv-cc/LineNumberClock.git"
}
}
}
}
repositories {
}
}
signing {
sign(publishing.publications)
}
mavenCentral {
authToken = rootProject.properties["authTokenValue"] as String
// 上傳是否應(yīng)該自動發(fā)布。如果您希望手動執(zhí)行此操作,請使用 'USER_MANAGED'。
// 該屬性是可選的,默認為 'AUTOMATIC'。
publishingType = "AUTOMATIC"
// 當(dāng)發(fā)布類型為 'AUTOMATIC' 時,狀態(tài)API獲取 'PUBLISHING' 或 'PUBLISHED' 狀態(tài)的最大等待時間
// 或者當(dāng)發(fā)布類型為 'USER_MANAGED' 時,獲取 'VALIDATED' 狀態(tài)。
// 該屬性是可選的,默認為60秒。
maxWait = 60
}
最后在我們的項目根目錄gradle.properties 文件中添加
signing.keyId=xxx
signing.password=xxx
signing.secretKeyRingFile=xxx
authTokenValue=xxx
這步配置完成之后,我們就可以使用以下命令將我們的庫文件上傳到Central Portal了。
./gradlew publishToMavenCentralPortal
你問我這些信息從哪里獲???
不要急,我們接下來講怎么獲取這些配置信息
獲取signing的相關(guān)配置信息
由于Central Portal會對我們上傳的包進行簽名驗證。這里使用的簽名采用的是公私鑰(RSA)的模式,即私鑰簽名,公鑰驗證。所以我們需要先為項目生成一份公私鑰對,并將公鑰上傳至公鑰中心,再把私鑰配置到項目中,為生成的包簽名。
而GPG就是干這個活的,我的電腦是Mac,所以我以下記錄的是Mac上關(guān)于GPG的操作過程。其它系統(tǒng)的大家到網(wǎng)上搜一下就行了,教程很多。
安裝GPG
brew install gpg
使用 GPG,生成公鑰和私鑰
在終端下執(zhí)行命令
gpg --full-generate-key
輸入命令后,一路選擇默認到輸入名字和郵箱的地方(回車就是選擇默認的),輸入你的名字和郵箱,中間有一次確認是否保存的選項,選擇y即可。
在輸入完名字和郵箱后,會有個新的選項出現(xiàn),詢問你是否需要修改信息,我們直接選擇Okey(輸入O)即可。接下來就是輸入你的密碼,然后確定就行。
整體大致如下:

千萬要記住你的密碼和相關(guān)信息哦?。?!
查看密鑰信息
gpg -k
可以看到剛才生成的密鑰。

其中 183****BD5 為密鑰指紋,指紋的后 8 位 「*****BD5」就是我們需要配置的 signing.keyId 的值。
你設(shè)置的密碼就是 signing.password 的值。
導(dǎo)出私鑰
gpg --export-secret-keys [密鑰指紋] > private-key.gpg
使用以上命令導(dǎo)出我們的私鑰。注意看我們這個命令執(zhí)行的目錄,生成的密鑰就在這個目錄。
然后我們將密鑰放置在某個目錄下,這個目錄的路徑就是 signing.secretKeyRingFile 的值。
上傳公鑰到公鑰服務(wù)器
我們在前面說過,Central Portal會對我們上傳的包進行簽名驗證,我們本地配置了私鑰進行簽名,但是我們的公鑰Central Portal不知道,所以它會去公鑰服務(wù)器里面根據(jù)我們的配置信息去找對應(yīng)的公鑰,然后做校驗。
所以我們需要把我們的公鑰上傳到公鑰服務(wù)器里面。
gpg --keyserver keyserver.ubuntu.com --send-keys [密鑰指紋]
其中,keyserver.ubuntu.com 就是公鑰服務(wù)器的地址,Central Portal校驗簽名就是從公鑰服務(wù)器拉取。
目前支持的公鑰服務(wù)器地址有三個:
- pool.sks-keyservers.net
- keyserver.ubuntu.com
- keys.gnupg.net
如果一個地址訪問失敗,替換成換成其中任意一個都是可以的。
獲取authTokenValue值
獲取這個值我們需要回到我們的這個網(wǎng)站

選擇View Account。

在彈窗里面復(fù)制它給我們的賬號密碼,然后找個Base64轉(zhuǎn)碼網(wǎng)站以
**username:password **的格式轉(zhuǎn)碼,獲取到的Base64的編碼就是我們需要的authTokenValue的值。
完成這一步之后,我們就可以通過命令去上傳我們編碼好的庫文件了。
查看上傳的庫文件
在https://central.sonatype.com/ 里面點擊這個

就可以看到你上傳的庫文件了,正常情況下,你的狀態(tài)是推送中的狀態(tài),等待一段時間后就可以了。
如果使用自己的庫文件

通過搜索自己庫文件的名字。

點擊進入,就可以看到相應(yīng)的配置信息了。
