手把手教你上传安卓库到Central Portal

前言

作为一个热爱编码的安卓开发,工作这么多年,也喜欢写点自己爱用的库,奈何这样的代码越写越多,我就发现了一个很尴尬的问题。代码越堆越多,每次全局改点啥,就要挪来挪去。

其实很早之前也想过(并试过)上传到Maven仓库,比如本地搭建、阿里云私有的等等。但是都感觉限制性很高,然后也试过上传到mavenCentral,但是这个弄到一半,中途放弃了。

最近突然又想把这个事情办完算了,结果第一步就把我卡住了。

上面是啥意思呢?

简单来说就是以前的玩法不让玩了。然后又给了文档说明。

如果玩的话,要用新的玩法,我们这次,就是手把手教你,最新玩法怎么玩。官方文档地址:

central.sonatype.org/register/le...

注册账号

按照文档的意思,我们需要在这个网站注册登录

central.sonatype.com/

点击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插件:

这里我选择的是

地址如下:

github.com/yananhub/fl...

安装它的说明文档结合我的实际情况,我的库文件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值

获取这个值我们需要回到我们的这个网站

central.sonatype.com/

选择View Account。

在弹窗里面复制它给我们的账号密码,然后找个Base64转码网站以

**username:password **的格式转码,获取到的Base64的编码就是我们需要的authTokenValue的值。

完成这一步之后,我们就可以通过命令去上传我们编码好的库文件了。

查看上传的库文件

central.sonatype.com/ 里面点击这个

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

如果使用自己的库文件

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

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

相关推荐
eternal__day29 分钟前
微服务架构下的服务注册与发现:Eureka 深度解析
java·spring cloud·微服务·eureka·架构·maven
hopetomorrow37 分钟前
学习路之PHP--webman安装及使用
android·学习·php
aningxiaoxixi44 分钟前
android 之 Tombstone
android
移动开发者1号1 小时前
应用启动性能优化与黑白屏处理方案
android·kotlin
移动开发者1号1 小时前
Android处理大图防OOM
android·kotlin
张风捷特烈1 小时前
每日一题 Flutter#4 | 说说组件 build 函数的作用
android·flutter·面试
Harrison_zhu4 小时前
在Android13上添加系统服务的好用例子
android
CV资深专家9 小时前
在 Android 框架中,接口的可见性规则
android
daifgFuture13 小时前
Android 3D球形水平圆形旋转,旋转动态更换图片
android·3d
青衫红叶14 小时前
Idea使用springAI搭建MCP项目
java·spring cloud·maven·intellij-idea·spring-ai