如何通過Gradle上傳Android庫到JCenter

hgDendi發表於2017-11-15

介紹如何將自己的專案上傳到JCenter。

前言

我們經常在Android的gradle檔案中看到這些compile指令碼,這些指令碼其實就是因為之前庫的開發者把對應庫的jar或aar檔案放到了遠端伺服器上,所以我們可以通過compile進行拉取。

compile 'com.android.support:recyclerview-v7:27.0.0'
compile 'com.squareup:otto:1.3.7'
compile 'com.squareup.picasso:picasso:2.5.2'
compile 'com.squareup.okhttp:okhttp:2.4.0'
compile 'com.squareup.retrofit:retrofit:1.9.0'複製程式碼

AAR是什麼

因為AndroidLibrary一般需要內建一些Android特定檔案,比如Manifest,Resources,Assets或者JNI等超出jar檔案標準的格式。

jar包是被嵌入在aar檔案包中的一部分。

排布規則

compile後面的字串排布規則是

GROUP_ID:ARTIFACT_ID:VERSION

GROUP_ID

通常用開發者的包名進行命名。

很有可能同一個上下文中有好幾個library,這些可以共享同一個GROUP_ID

ARTIFACT_ID

定義library的真實名字,比如picasso

VERSION

版本號,一般是x.x.x格式

Android專案準備

以一個簡單的demo為例,專案地址在

github.com/hgDendi/And…

是一個HelloWorld專案,其中字串來自於mylib module下的MyLib抽象類的靜態方法。

mylib也是我們這次需要上傳到JCenter的類。

project
project

Module劃分

一般需要把需要上傳的庫作為一個獨立的module,即1 module per 1 library。

一般分為庫的模組和使用demo模組。

如果想要有一個以上的庫,請劃分多個module。

比如如下的專案結構。

1510486146328
1510486146328

bintray

註冊賬號,登入bintray.com。

新建倉庫

在個人管理介面點選“Add New Repository”

1510486324520
1510486324520

然後建立一個Maven倉庫

1510486374030
1510486374030

建立成功之後點選"Create New Package"

WX20171112-193514@2x
WX20171112-193514@2x

輸入對應資訊,其中Website和VersionControl可以填寫github地址,issue填寫github的issue地址

WX20171112-193746@2x
WX20171112-193746@2x

點選CreatePackage,你在Bintray上的Maven伺服器就已經建立成功了。

專案檔案準備

Project#gradle

在Project的gradle檔案中加入依賴

buildscript {
    ...

    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.0'
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.6'
        classpath 'com.github.dcendents:android-maven-gradle-plugin:1.4.1'
    }
}複製程式碼

local.properties

在local.properties中加入使用者資訊。

因為gitignore自動忽略local.properties,所以私人資訊放在這裡是比較安全的。

bintray.user=[...]
bintray.apikey=[...]
bintray.gpg.password=[...]複製程式碼

apikey可以在EditProfile裡看到

APIKEY
APIKEY

module的build.gradle

根據上面步驟中的資訊,在lib module的build.gradle檔案中增加資訊。

apply plugin: 'com.android.library'

ext {
      // 剛剛建立的倉庫名
    bintrayRepo = 'testMaven'
      // package的名字
    bintrayName = 'mylib'

      // owner的groupID
    publishedGroupId = 'com.hgDendi.test'
    libraryName = 'MyLib'
    artifact = 'mylib'

    libraryDescription = 'lib test demo'

    siteUrl = 'https://github.com/hgDendi/AndroidJCenterDemo'
    gitUrl = 'https://github.com/hgDendi/AndroidJCenterDemo.git'

    libraryVersion = '0.0.1'

    developerId = 'dendi'
    developerName = 'Dendi Chan'
    developerEmail = 'hg.dendi@gmail.com'

    licenseName = 'The MIT License'
    licenseUrl = 'https://rem.mit-license.org'
    allLicenses = ["MIT"]
}複製程式碼

如上所示,則最後生成的gradle script會是

compile 'com.hgdendi.test:mylib:0.0.1'複製程式碼

增加指令碼依賴

在lib module的build.gradle檔案下增加一行apply from

apply from: 'https://raw.githubusercontent.com/hgDendi/AndroidJCenterDemo/master/bintray.gradle'
apply from: 'https://raw.githubusercontent.com/hgDendi/AndroidJCenterDemo/master/maveninstall.gradle'複製程式碼

上傳程式碼

執行gradlew命令將lib上傳

./gradlew install
./gradlew bintrayUpload複製程式碼

這時候登入bintray,就可以看到上傳結果了。

uploadSuccess
uploadSuccess

同步到jcenter

此時程式碼還是隻在你的maven倉庫,並未同步到JCenter中。

這時候點進你的package,點選AddToJCenter就可以將程式碼上傳到JCenter。

add2Jcenter
add2Jcenter

上傳成功

同步到JCenter有時候可能需要半天到一天的時間。

同步成功後,便可以使用compile從伺服器拉取lib了。

dependencies {
//    implementation project(':mylib')
    compile 'com.hgDendi:mylib:1.0.0'
}複製程式碼

相關文章