手把手教你上传安卓库到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 = "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
    // 上传是否应该自动发布。如果您希望手动执行此操作,请使用 '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/ 里面点击这个

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

如果使用自己的库文件

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

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

相关推荐
程序员张31 小时前
Maven编译和打包插件
java·spring boot·maven
哲科软件6 小时前
跨平台开发的抉择:Flutter vs 原生安卓(Kotlin)的优劣对比与选型建议
android·flutter·kotlin
jyan_敬言12 小时前
【C++】string类(二)相关接口介绍及其使用
android·开发语言·c++·青少年编程·visual studio
代码的余温12 小时前
5种高效解决Maven依赖冲突的方法
java·maven
paishishaba12 小时前
Maven
java·maven
程序员老刘12 小时前
Android 16开发者全解读
android·flutter·客户端
福柯柯13 小时前
Android ContentProvider的使用
android·contenprovider
不想迷路的小男孩13 小时前
Android Studio 中Palette跟Component Tree面板消失怎么恢复正常
android·ide·android studio
餐桌上的王子13 小时前
Android 构建可管理生命周期的应用(一)
android
菠萝加点糖13 小时前
Android Camera2 + OpenGL离屏渲染示例
android·opengl·camera