如何發(fā)布一個Android庫

經(jīng)常在github上看到通過類似的語句引進別人的庫:

repositories { 
    jcenter()
}
dependencies {
    compile 'com.flipboard:bottomsheet-core:1.5.0' 
    compile 'com.flipboard:bottomsheet-commons:1.5.0' // optional
}

不得不說,使用起來真方便。那如果自己有好的庫,如何分享給其他人,或者放在Bintray,方便自己使用呢?

發(fā)布第一個Android庫(想想還是有點小激動)

先到https://bintray.com注冊,注冊之后獲取API-Key:

api-key.png

必須要特別感謝這位作者:Ashraff Hathibelagal

http://code.tutsplus.com/zh-hans/tutorials/creating-and-publishing-an-android-library--cms-24582
基本上都是按照他的教程做的。
也參考了XRecyclerView的gradle,也表示感謝.

文章雖好,但也有坑....
于是自己又整理了一下

主要分兩步:

1,像往常一樣寫一個library

2,發(fā)布到Bintray

這里需要修改兩個gradle。

Project build.gradle

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.0.0'

        /*
        第 1 步:添加必要的插件
        為了在 Android Studio 里與 Bintray 交互,你應該把 Bintray 插件引入到項目的 build.gradle 文件的 dependencies 里。
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.2'
        因為你要把庫上傳到 Maven 倉庫,你還應該像下面這樣添加 Maven 插件。
        classpath "com.github.dcendents:android-maven-gradle-plugin:1.3"
         */
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.2'
        classpath "com.github.dcendents:android-maven-gradle-plugin:1.3"
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

Module build.gradle

apply plugin: 'com.android.library'
/*
第 2 步:應用插件
打開您的庫模塊的 build.gradle 文件并添加以下代碼,以應用我們在上一步中添加的插件。
 */
apply plugin: 'com.jfrog.bintray'
apply plugin: 'com.github.dcendents.android-maven'
/*
第 3 步: 指定 POM 詳細信息
在上傳庫時,Bintray 插件會尋找 POM 文件。 即使 Maven 插件為你生成了它,你也應該自己指定
 groupId 標簽和 version 標簽的值。 要這樣做,請使用 gradle文件中的group 和version 的變量。
 */
version = "1.0.0"
group = "com.example"


def siteUrl = 'https://github.com/heinika/MyHelloWorldLibrary'
def gitUrl = 'https://github.com/heinika/MyHelloWorldLibrary.git'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.3.0'
}

/*第 4 步: 生成源 JAR
為了遵守 Maven 標準,你的庫也應該有一個包含了庫的源文件的 JAR 文件。
 為了生成 JAR 文件,需要創(chuàng)建一個新的 Jar任務,
 generateSourcesJar,并且使用 from 功能指定的源文件的位置。*/
task generateSourcesJar(type: Jar) {
    from android.sourceSets.main.java.srcDirs
    classifier 'sources'
}

/*
第 5 步: 生成 Javadoc JAR
我們同樣推薦,在你的庫里有一個包含 Javadocs 的 JAR 文件。
 因為目前你還沒有任何 Javadocs,需要創(chuàng)建一個新的 Javadoc 任務,generateJavadocs,來生成它們。
  使用 source 變量來指定源文件的位置。 你還應該更新 classpath 變量,以便該任務可以找到屬于 Android SDK 的類。
 你可以通過把 android.getBootClasspath 方法的返回值添加給他,來這么做。
 */
task generateJavadocs(type: Javadoc) {
    source = android.sourceSets.main.java.srcDirs
    classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}

/*下一步,要從 Javadocs 生成 JAR,需要創(chuàng)建 Jar 任務,generateJavadocsJar
,并把 generateJavadocs 的 destinationDir 屬性傳遞給它的 from 功能。
為了確保在 generateJavadocsJar 任務只在 generateJavadocs 任務完成后才開始,
需要添加下面的代碼片段,它使用了 dependsOn 方法來決定任務的順序:
您的新任務應如下所示:*/
task generateJavadocsJar(type: Jar, dependsOn: generateJavadocs) {
    from generateJavadocs.destinationDir
    classifier 'javadoc'
}

/*
 *第 6 步: 引入生成的 JAR 文件
 *為了把源和 Javadoc JAR 文件導入到 artifacts 的列表里,你應該把他們的任務的名字添加到 configuration 里,
 * 稱為 archives,artifacts 列表將被上傳到 Maven 倉庫。 使用下面的代碼片段來完成:
 */
artifacts {
    archives generateJavadocsJar
    archives generateSourcesJar
}

/*第 7 步: 運行任務
現(xiàn)在是運行我們在前幾步里創(chuàng)建的任務的時候了。 打開 Gradle Projects 窗口,搜索名為 install 的任務。*/

/*
第 8 步: 配置 Bintray 插件
要配置插件,你應該使用 Gradle 文件中的 bintray 閉包。 首先,使用與你的 Bintray 用戶名和 API 密鑰對應的 user 和 key 變量進
行身份驗證。在 Bintray,你的庫會被放置在 Bintray package 里。 你應該使用 pkg 閉包里命名直觀的 repo、 name、licenses 和
vcsUrl 參數(shù),提供詳細的相關(guān)信息, 如果這個包不存在,會為你自動創(chuàng)建。當你將文件上傳到 Bintray 時,他們會與 Bintray 包里的一
個版本相關(guān)聯(lián)。 因此,pkg 必須包含一個 version 閉包,閉包的 name 屬性要設為獨一無二的名稱。 另外,你還可以使用 desc,
released 和 vcsTag參數(shù)來提供描述、 發(fā)布日期和 Git 標簽。
最后,為了指定應該上傳的文件,要把 configuration 參數(shù)的值設為 archives。
bintray {
    user = 'test-user'
    key = '01234567890abcdef01234567890abcdef'
    pkg {
        repo = 'maven'
        name = 'com.github.hathibelagal.mylittlelibrary'

        version {
            name = '1.0.1-tuts'
            desc = 'My test upload'
            released  = new Date()
            vcsTag = '1.0.1'
        }

        licenses = ['Apache-2.0']
        vcsUrl = 'https://github.com/hathibelagal/LibraryTutorial.git'
        websiteUrl = 'https://github.com/hathibelagal/LibraryTutorial'
    }
    configurations = ['archives']
}
 */
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
bintray {
    user = properties.getProperty("BINTRAY_USER")
    key = properties.getProperty("BINTRAY_KEY")
    configurations = ['archives']
    pkg {
        repo = "maven"
        name = "MyHelloWorldLibrary"    //發(fā)布到JCenter上的項目名字

        version {
            name = '1.0.1-tuts'
            desc = 'My test upload'
            vcsTag = '1.0.0'
        }

        websiteUrl = siteUrl
        vcsUrl = gitUrl
        licenses = ["Apache-2.0"]
        publish = true
    }
}
/*
第 9 步: 使用 Bintray 插件上傳文件
再次打開 Gradle Projects 窗口,搜索 bintrayUpload 任務。 雙擊它,啟動上傳文件。*/
/*
一旦任務完成,你就能打開瀏覽器來訪問你的 Bintray 包的詳細信息頁面。 你會看到一個通知,
說你有四個未發(fā)布的文件。 如果要發(fā)布這些文件,單擊 Publish 鏈接。 */
/*
* 使用 Bintray 里的庫
你的庫現(xiàn)在已經(jīng)可以作為 Bintray 包使用了。 只要你分享了你的 Maven 倉庫的 URL,加上 group ID、artifact ID 和 version number,
任何開發(fā)人員都可以訪問你的庫。 例如,為了使用我們剛才創(chuàng)建的庫,開發(fā)人員必須引入下面這個代碼片段:
repositories {
    maven {
        url 'https://dl.bintray.com/eruzza/maven'
    }
}
dependencies {
    compile 'com.github.hathibelagal.librarytutorial:mylittlelibrary:1.0.1@aar'
}
注意,在把庫添加為 compile 依賴之前,
開發(fā)人員必須顯式地在 repositories 列表里,引入你的倉庫。*/

/*
 * Bintray的用戶手冊:https://bintray.com/docs/usermanual/
 */
上傳成功

將庫添加到 JCenter

默認情況下,Android Studio 會搜索一個名為 JCenter 的倉庫里面的庫。 如果你把自己的庫引入到了 JCenter 存儲庫,開發(fā)人員就不必向他的 repositories 里添加任何東西了。

要將你的庫添加到 JCenter,需要打開瀏覽器并訪問你的 Bintray 的包的詳細信息頁面。 單擊 Add to JCenter 按鈕

接著你進入一個頁面,讓你填寫一些信息。 你可以用 Comments 區(qū)域來提及任何關(guān)于這個庫的細節(jié)。
單擊 Send 按鈕,啟動 Bintray 的審查過程。 在一兩天以內(nèi),Bintray 的工作人員會把你的庫鏈接到 JCenter 倉庫,這樣你就將能在你的包的詳細信息頁面上,看到指向 JCenter 的鏈接了。
任何開發(fā)人員現(xiàn)在都可以使用你的庫,而無需更改 repositories 列表。

通過后點擊JCenter如圖

使用

以后用到這個庫的時候,只需要下面一句就可以了。是不是很爽,哈哈哈哈。

compile 'com.example:myfristlibrary:1.0.0'

項目地址:https://github.com/heinika/MyHelloWorldLibrary

補坑: gradle 的配置文件不要設置代理.
另外找不到問題的時候看命令行的日志.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容

  • @synthesize和@dynamic分別有什么作用?@property有兩個對應的詞,一個是 @synthes...
    筆筆請求閱讀 532評論 0 1
  • 猜想runloop內(nèi)部是如何實現(xiàn)的?一般來講,一個線程一次只能執(zhí)行一個任務,執(zhí)行完成后線程就會退出。如果我們需要一...
    筆筆請求閱讀 443評論 0 0
  • 今天文章的標題,第一個想到的是“平凡的一天”,當我想到自己有多少個平凡的一天啊!于是再仔細地想了想,改了這個標題。...
    大洪閱讀 252評論 0 0
  • “你怎么總搬家?” 這是我將搬家的消息告訴朋友后,從不同的人嘴里聽到的相同的回答。聽到這個回應的時候,我的驚愕程度...
    我是小宇宙啊閱讀 417評論 5 5
  • 集中思維和發(fā)散思維可以解決不同類型問題,但目前來看,同時只能有一種思維存在。 通過睡眠會促進神經(jīng)元的生長。 對于拖...
    雪波閱讀 1,722評論 0 3