如何快速創(chuàng)建并發(fā)布一個 Android 庫

我的博客:http://blog.csdn.net/Imshuyuan/article/details/72876515

一、 前言

最近經(jīng)常看到各種大神的庫,發(fā)現(xiàn)用起來非常方便,自己研究了一下,來寫個庫發(fā)布一下,讓自己寫代碼更加方便一點,自己封裝了基本的開發(fā)工具類。也是搜集了各位大神的優(yōu)秀代碼總結(jié)的。

二、必要的準(zhǔn)備工作

AndroidStudio、Gradle和自己的開源項目這個必須有。
Jcenter是Bintray下的一個倉庫,所以Bintray帳號必須的,沒有的如何申請。
網(wǎng)絡(luò)必須是暢通的,要能訪問https://bintray.com

三、申請Bintray帳號

Bintray官網(wǎng)申請

申請

我之前已經(jīng)申請過了,下圖是登錄進去主頁


主頁

四、 創(chuàng)建并發(fā)布一個 Android 庫

1. 創(chuàng)建一個 Android 庫

如果你的庫只包含 Java 類,那么,打包為 JAR 文件并使用 file host 來發(fā)布,也許是分享它的最快、最簡單的方式。 如果你是用控制臺來創(chuàng)建,那么下面的命令就已經(jīng)足夠了:

jar cvf mylibrary.jar Class1.class Class2.class ... ClassN.class
然而本教程要展示給你的是,如何處理更復(fù)雜的庫。這些庫不僅包含 Java 類,還有各種類型的 XML 文件和資源。 這些庫被創(chuàng)建為 Android 庫模塊,并且通常被打包為 AAR 文件。

讓我們創(chuàng)建一個簡單的 Android 庫,這個庫為使用它的開發(fā)人員提供一個自定義 View。

第 1 步: 添加一個新模塊

首先,選擇 **File **菜單里的 New > New Module ,添加新的 Android 模塊到你的項目中。 您將看到下面的屏幕,里面提供了很多選擇:

New module dialog

選擇 Android Library ,點擊 Next。 在后面的表格里,輸入庫的名稱,點擊 Next。 我把這個庫命名為 mylittlelibrary。
在最后一個頁面中,選擇 Add no Activity,點擊 Finish。
你的項目現(xiàn)在有了兩個模塊,一個是應(yīng)用模塊,一個是庫模塊。 項目的結(jié)構(gòu)是這樣的:
Structure of project

后面所有的庫代碼只要寫在庫的項目里面就可以了。

2.在本地使用庫

現(xiàn)在,庫已經(jīng)準(zhǔn)備好了,為了確保沒有問題,我們來在同一項目的 app 模塊中使用它。 要使用它,請在應(yīng)用模塊里的 build.gradle 文件添加 compile 依賴。

compile project(":mylittlelibrary")

在應(yīng)用模塊里創(chuàng)建新的 Java 類,MainActivity。 讓他繼承 Activity 類,重寫其 onCreate 方法。

public class MainActivity extends Activity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
}

在 onCreate 方法里,使用自定義 View 的構(gòu)造方法來創(chuàng)建它的實例。 為了讓它能填滿 Activity 所有的屏幕空間,把它傳遞給 setContentView 方法。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
 
    View v = new MyView(this);
    setContentView(v);
 
}

你的 Activity 已經(jīng)準(zhǔn)備完畢。 把它添加到應(yīng)用的 manifest 文件后,構(gòu)建你的項目并將你的應(yīng)用部署到一臺 Android 設(shè)備上。 當(dāng)應(yīng)用啟動時,你應(yīng)該能夠看到這個自定義 view。

3.在 Bintray 發(fā)布你的庫

Bintray 是一個流行的可以用來發(fā)布 Android 庫的平臺。 它是免費的,并且易于使用。
首先,在 Bintray 上創(chuàng)建一個帳戶。(上述已創(chuàng)建)
下面只要登錄進去,創(chuàng)建maven 的一個倉庫即可,填寫相關(guān)信息即可,類型maven

第一步

訪問您的個人資料頁,單擊 Edit 按鈕。 在下一頁上,單擊 API Key 鏈接以查看您的 API 密鑰。


記住這個密鑰,因為使用 Bintray 插件時,你要用它來進行身份驗證。


五、 配置gradle

第 1 步:添加必要的插件

為了在 Android Studio 里與 Bintray 交互,你應(yīng)該把 Bintray 插件引入到項目的 build.gradle 文件的 dependencies
里。


classpath'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.3'

因為你要把庫上傳到 Maven 倉庫,你還應(yīng)該像下面這樣添加 Maven 插件。

classpath"com.github.dcendents:android-maven-gradle-plugin:1.3"

這時候如果上面的android-maven-gradle-plugin是1.3時會發(fā)生這個錯誤No service of type Factory available in ProjectScopeServices.,解決方法是把android-maven-gradle-plugin版本改為1.4.1:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.2'
        // 添加下面兩行代碼即可。
        classpath 'com.github.dcendents:android-maven-gradle-plugin:1.4.1'
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.4'
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

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

第 2 步:應(yīng)用插件

打開您的庫模塊的 build.gradle 文件并添加以下代碼,以應(yīng)用我們在上一步中添加的插件。

apply plugin: 'com.jfrog.bintray'
apply plugin: 'com.github.dcendents.android-maven'

第 3 步: 指定 POM 詳細(xì)信息

在上傳庫時,Bintray 插件會尋找 POM 文件。 即使 Maven 插件為你生成了它,你也應(yīng)該自己指定 groupId 標(biāo)簽和 version 標(biāo)簽的值。 要這樣做,請使用 gradle 文件中的group 和version 的變量。

group = 'com.github.hathibelagal.librarytutorial' // Change this to match your package name
version = '1.0.1' // Change this to match your version number

如果你對 Maven 很熟悉,想知道為什么我們沒有指定 artifactId 標(biāo)簽的值。這是因為默認(rèn)情況下, Maven 插件將你的庫的名稱作為了 artifactId。

第 4 步: 生成源 JAR

為了遵守 Maven 標(biāo)準(zhǔn),你的庫也應(yīng)該有一個包含了庫的源文件的 JAR 文件。 為了生成 JAR 文件,需要創(chuàng)建一個新的 Jar任務(wù),generateSourcesJar,并且使用 from 功能指定的源文件的位置。

task generateSourcesJar(type: Jar) {
    from android.sourceSets.main.java.srcDirs
    classifier 'sources'
}

第 5 步: 生成 Javadoc JAR

我們同樣推薦,在你的庫里有一個包含 Javadocs 的 JAR 文件。 因為目前你還沒有任何 Javadocs,需要創(chuàng)建一個新的 Javadoc 任務(wù),generateJavadocs,來生成它們。 使用 source 變量來指定源文件的位置。 你還應(yīng)該更新 classpath 變量,以便該任務(wù)可以找到屬于 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 任務(wù),generateJavadocsJar,并把 generateJavadocs 的 destinationDir 屬性傳遞給它的 from 功能。 您的新任務(wù)應(yīng)如下所示:

task generateJavadocsJar(type: Jar) {
    from generateJavadocs.destinationDir
    classifier 'javadoc'
}

為了確保在 generateJavadocsJar 任務(wù)只在 generateJavadocs 任務(wù)完成后才開始,需要添加下面的代碼片段,它使用了 dependsOn 方法來決定任務(wù)的順序:

generateJavadocsJar.dependsOn generateJavadocs

第 6 步: 引入生成的 JAR 文件

為了把源和 Javadoc JAR 文件導(dǎo)入到 artifacts 的列表里,你應(yīng)該把他們的任務(wù)的名字添加到 configuration 里,稱為 archives,artifacts 列表將被上傳到 Maven 倉庫。 使用下面的代碼片段來完成:

artifacts {
    archives generateJavaDocsJar
    archives generateSourcesJar
}

第 7 步: 配置 Bintray 插件

要配置插件,你應(yīng)該使用 Gradle 文件中的 bintray 閉包。 首先,使用與你的 Bintray 用戶名和 API 密鑰對應(yīng)的 user 和 key 變量進行身份驗證。在 Bintray,你的庫會被放置在 Bintray package 里。 你應(yīng)該使用 pkg 閉包里命名直觀的 repo、 name、licenses 和 vcsUrl 參數(shù),提供詳細(xì)的相關(guān)信息, 如果這個包不存在,會為你自動創(chuàng)建。當(dāng)你將文件上傳到 Bintray 時,他們會與 Bintray 包里的一個版本相關(guān)聯(lián)。 因此,pkg 必須包含一個 version閉包,閉包的 name 屬性要設(shè)為獨一無二的名稱。 另外,你還可以使用 desc,released 和 vcsTag 參數(shù)來提供描述、 發(fā)布日期和 Git 標(biāo)簽。

最后,為了指定應(yīng)該上傳的文件,要把 configuration 參數(shù)的值設(shè)為 archives
這是一個配置示例:(建議賬號,key放在其他文件中,下面會介紹)

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  =newDate()
            vcsTag ='1.0.1'
    }
         licenses = ['Apache-2.0']
        vcsUrl ='https://github.com/hathibelagal/LibraryTutorial.git'
        websiteUrl ='https://github.com/hathibelagal/LibraryTutorial'
  
}
    configurations = ['archives']
}

以上7步可以總結(jié)如下,參照以下操作,一次性完成

(一)配置項目gradle,在dependencies 下添加兩行代碼


    dependencies {
     ···
        //發(fā)布庫需要的文件
        classpath 'com.github.dcendents:android-maven-gradle-plugin:1.4.1'
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.4'
     ···
    }


(二)配置要上傳的library/module的gradle文件

將所有要發(fā)布的內(nèi)容都寫在maven.gradle里面,在庫的gradle下添加以下代碼

apply from: "maven.gradle"

(三)配置maven.gradle文件

// 發(fā)布需要的插件

apply plugin: 'com.github.dcendents.android-maven'
apply plugin: 'com.jfrog.bintray'
// 項目引用的版本號,比如compile 'com.hsy.utils:utilslibrary:1.0.1'中的1.0.1就是這里配置的。
version = "1.0.1"
// 定義兩個鏈接,下面會用到。
def siteUrl = 'https://github.com/huangshuyuan/UtilsDemo' // 項目主頁。
def gitUrl = 'https://github.com/huangshuyuan/UtilsDemo.git' // Git倉庫的url。https://github.com/huangshuyuan/UtilsDemo.git
// 唯一包名,比如compile 'com.hsy.utils:utilslibrary:1.0.1'中的com.hsy.utils就是這里配置的。
// :utilslibrary后面會根據(jù)項目名稱得到
group = "com.hsy.utils"
install {
    repositories.mavenInstaller {
        // 生成pom.xml和參數(shù)
        pom {
            project {
                packaging 'aar'
                // 項目描述,復(fù)制我的話,這里需要修改。
                name 'utilslibrary'// 可選,項目名稱。
                description 'Android Utils'// 可選,項目描述
                url siteUrl// 項目主頁,這里是引用上面定義好。

                // 軟件開源協(xié)議,現(xiàn)在一般都是Apache License2.0吧,復(fù)制我的,這里不需要修改。
                licenses {
                    license {
                        name 'The Apache Software License, Version 2.0'
                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                    }
                }
                //填寫開發(fā)者基本信息,復(fù)制我的,這里需要修改。
                developers {
                    developer {
                        id 'huangshuyuan' // 開發(fā)者的id。
                        name 'huangshuyuan' // 開發(fā)者名字。
                        email 'hshuyuan@foxmail.com'// 開發(fā)者郵箱。
                    }
                }
                // SCM,復(fù)制我的,這里不需要修改。
                scm {
                    connection gitUrl// Git倉庫地址。
                    developerConnection gitUrl// Git倉庫地址。
                    url siteUrl // 項目主頁。
                }
            }
        }
    }
}
// 生成jar包的task,不需要修改。
task sourcesJar(type: Jar) {
    from android.sourceSets.main.java.srcDirs
    classifier = 'sources'
}
// 生成jarDoc的task,不需要修改。
task javadoc(type: Javadoc) {
    source = android.sourceSets.main.java.srcDirs
    classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
    failOnError false// 忽略注釋語法錯誤,如果用jdk1.8你的注釋寫的不規(guī)范就編譯不過。
}
// 生成javaDoc的jar,不需要修改。
task javadocJar(type: Jar, dependsOn: javadoc) {
    classifier = 'javadoc'
    from javadoc.destinationDir
}
artifacts {
    archives javadocJar
    archives sourcesJar
}

// 這里是讀取Bintray相關(guān)的信息,我們上傳項目到github上的時候會把gradle文件傳上去,
// 所以不要把帳號密碼的信息直接寫在這里,寫在local.properties中,這里動態(tài)讀取。
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
bintray {
    user = properties.getProperty("bintray.user")// Bintray的用戶名。
    key = properties.getProperty("bintray.apikey")// Bintray剛才保存的ApiKey。

    configurations = ['archives']
    pkg {
        repo = "utilslibrary"http:// 上傳到maven庫。(這里要特別注意,如果寫了maven報404錯誤,請在bintray創(chuàng)建一個倉庫,這里填改成你創(chuàng)建的倉庫的名字,如何創(chuàng)建請看上方。)
        name = "com.hsy.utils"http:// 發(fā)布到Bintray上的項目名字,這里的名字不是compile 'com.hsy.utils:utilslibrary:1.0.1'中的utilslibrary。
        userOrg = 'huangshuyuan'//// Bintray的用戶名。
        websiteUrl = siteUrl
        vcsUrl = gitUrl
        licenses = ["Apache-2.0"]
        publish = true//是否公開項目
        version {
            gpg {
                sign = true
                passphrase = properties.getProperty("bintray.gpg.password")
            }
        }
    }
}


(四)、在local.properties中為module/libraray配置用戶隱私信息

bintray.user=huangshuyuan
bintray.apikey=a8**********************************************2


六、上傳項目到Jcenter

方式一:2步命令上傳

準(zhǔn)備工作都做完啦,最后一步就是上傳操作了,點擊AndroidStudio底部的Terminal,觀察下Terminal顯示的路徑是否是你當(dāng)前項目的root。
1、這里如果你系統(tǒng)配置了gradle的用戶環(huán)境,輸入gradle install,如果沒有配置gradle用戶環(huán)境,輸入gradlew install,如果沒有問題,最終你會看到BUILD SUCCESSFUL。
如果你看到了生成javadoc時編譯不過,那么要看下在gradle中task javadoc下有沒有failOnError false
這句話,在剛才編寫gradle時提示過了。如果加了這句而你的javadoc寫的不規(guī)范會有警告,你不用鳥它。
2、最后一步,運行g(shù)radle install后看到BUILD SUCCESSFUL后,再輸入上傳命令gradle bintrayUpload,等一分鐘左右就執(zhí)行完了,會提示SUCCESSFUL。

瀏覽器https://bintray.com/后會看到你的項目。

方式二:gradle上傳

1.打開 Gradle Projects 窗口,找到install點擊即可會看到BUILD SUCCESSFUL

此步驟是為了生成發(fā)布必要的文件,比如aar

一旦完成運行,你就有了一切發(fā)布你的庫需要的東西,有效的 POM 文件,AAR 文件,源 JAR,和 Javadocs JAR。

2.上述完成之后,再次打開 Gradle Projects 窗口,搜索 bintrayUpload 任務(wù)。 雙擊它,啟動上傳文件。

上傳完成咯,但是別著急喔,你會發(fā)現(xiàn)在項目gradle中依賴如下代碼后依賴失?。?/p>

'compile '包名:模塊名:1.0.0'

原因是我們項目上傳完成后還需要Bintray的管理員審核,所以在剛才項目頁面點擊進去查看詳情,點擊Add to Jcetner

七、 將庫添加到 JCenter


接著你進入一個頁面,讓你填寫一些信息。 你可以用 Comments 區(qū)域來提及任何關(guān)于這個庫的細(xì)節(jié)。

單擊 Send 按鈕,啟動 Bintray 的審查過程。 在一兩天以內(nèi),Bintray 的工作人員會把你的庫鏈接到 JCenter 倉庫,這樣你就將能在你的包的詳細(xì)信息頁面上,看到指向 JCenter 的鏈接了。

上述項目源碼:https://github.com/huangshuyuan/Utils-master

參考:

創(chuàng)建并發(fā)布一個 Android 庫
AndroidStuio快速發(fā)布開源項目到Jcenter/Bintray
Bintray 的用戶手冊

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容