天天看點

建立建構方法android,如何快速建立并釋出一個 Android 庫

一、 前言

最近經常看到各種大神的庫,發現用起來非常友善,自己研究了一下,來寫個庫釋出一下,讓自己寫代碼更加友善一點,自己封裝了基本的開發工具類。也是搜集了各位大神的優秀代碼總結的。

二、必要的準備工作

AndroidStudio、Gradle和自己的開源項目這個必須有。

Jcenter是Bintray下的一個倉庫,是以Bintray帳号必須的,沒有的如何申請。

網絡必須是暢通的,要能通路https://bintray.com

三、申請Bintray帳号

建立建構方法android,如何快速建立并釋出一個 Android 庫

申請

我之前已經申請過了,下圖是登入進去首頁

建立建構方法android,如何快速建立并釋出一個 Android 庫

首頁

四、 建立并釋出一個 Android 庫

1. 建立一個 Android 庫

如果你的庫隻包含 Java 類,那麼,打包為 JAR 檔案并使用 file host 來釋出,也許是分享它的最快、最簡單的方式。 如果你是用控制台來建立,那麼下面的指令就已經足夠了:

jar cvf mylibrary.jar Class1.class Class2.class ... ClassN.class

然而本教程要展示給你的是,如何處理更複雜的庫。這些庫不僅包含 Java 類,還有各種類型的 XML 檔案和資源。 這些庫被建立為 Android 庫子產品,并且通常被打包為 AAR 檔案。

讓我們建立一個簡單的 Android 庫,這個庫為使用它的開發人員提供一個自定義 View。

第 1 步: 添加一個新子產品

首先,選擇 **File **菜單裡的 New > New Module ,添加新的 Android 子產品到你的項目中。 您将看到下面的螢幕,裡面提供了很多選擇:

建立建構方法android,如何快速建立并釋出一個 Android 庫

New module dialog

選擇 Android Library ,點選 Next。 在後面的表格裡,輸入庫的名稱,點選 Next。 我把這個庫命名為 mylittlelibrary。

在最後一個頁面中,選擇 Add no Activity,點選 Finish。

你的項目現在有了兩個子產品,一個是應用子產品,一個是庫子產品。 項目的結構是這樣的:

建立建構方法android,如何快速建立并釋出一個 Android 庫

Structure of project

後面所有的庫代碼隻要寫在庫的項目裡面就可以了。

2.在本地使用庫

現在,庫已經準備好了,為了確定沒有問題,我們來在同一項目的 app 子產品中使用它。 要使用它,請在應用子產品裡的 build.gradle 檔案添加 compile 依賴。

compile project(":mylittlelibrary")

在應用子產品裡建立新的 Java 類,MainActivity。 讓他繼承 Activity 類,重寫其 onCreate 方法。

public class MainActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

}

}

在 onCreate 方法裡,使用自定義 View 的構造方法來建立它的執行個體。 為了讓它能填滿 Activity 所有的螢幕空間,把它傳遞給 setContentView 方法。

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

View v = new MyView(this);

setContentView(v);

}

你的 Activity 已經準備完畢。 把它添加到應用的 manifest 檔案後,建構你的項目并将你的應用部署到一台 Android 裝置上。 當應用啟動時,你應該能夠看到這個自定義 view。

3.在 Bintray 釋出你的庫

Bintray是一個流行的可以用來釋出 Android 庫的平台。 它是免費的,并且易于使用。

首先,在 Bintray 上建立一個帳戶。(上述已建立)

下面隻要登入進去,建立maven 的一個倉庫即可,填寫相關資訊即可,類型maven

建立建構方法android,如何快速建立并釋出一個 Android 庫

第一步

建立建構方法android,如何快速建立并釋出一個 Android 庫

通路您的個人資料頁,單擊 Edit 按鈕。 在下一頁上,單擊 API Key 連結以檢視您的 API 密鑰。

建立建構方法android,如何快速建立并釋出一個 Android 庫

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

五、 配置gradle

建立建構方法android,如何快速建立并釋出一個 Android 庫

第 1 步:添加必要的插件

為了在 Android Studio 裡與 Bintray 互動,你應該把 Bintray 插件引入到項目的 build.gradle 檔案的 dependencies

裡。

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

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

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

這時候如果上面的android-maven-gradle-plugin是1.3時會發生這個錯誤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 步:應用插件

打開您的庫子產品的 build.gradle 檔案并添加以下代碼,以應用我們在上一步中添加的插件。

apply plugin: 'com.jfrog.bintray'

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

第 3 步: 指定 POM 詳細資訊

在上傳庫時,Bintray 插件會尋找 POM 檔案。 即使 Maven 插件為你生成了它,你也應該自己指定 groupId 标簽和 version 标簽的值。 要這樣做,請使用 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 标簽的值。這是因為預設情況下, Maven 插件将你的庫的名稱作為了 artifactId。

第 4 步: 生成源 JAR

為了遵守 Maven 标準,你的庫也應該有一個包含了庫的源檔案的 JAR 檔案。 為了生成 JAR 檔案,需要建立一個新的 Jar任務,generateSourcesJar,并且使用 from 功能指定的源檔案的位置。

task generateSourcesJar(type: Jar) {

from android.sourceSets.main.java.srcDirs

classifier 'sources'

}

第 5 步: 生成 Javadoc JAR

我們同樣推薦,在你的庫裡有一個包含 Javadocs 的 JAR 檔案。 因為目前你還沒有任何 Javadocs,需要建立一個新的 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,需要建立 Jar 任務,generateJavadocsJar,并把 generateJavadocs 的 destinationDir 屬性傳遞給它的 from 功能。 您的新任務應如下所示:

task generateJavadocsJar(type: Jar) {

from generateJavadocs.destinationDir

classifier 'javadoc'

}

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

generateJavadocsJar.dependsOn generateJavadocs

第 6 步: 引入生成的 JAR 檔案

為了把源和 Javadoc JAR 檔案導入到 artifacts 的清單裡,你應該把他們的任務的名字添加到 configuration 裡,稱為 archives,artifacts 清單将被上傳到 Maven 倉庫。 使用下面的代碼片段來完成:

artifacts {

archives generateJavaDocsJar

archives generateSourcesJar

}

第 7 步: 配置 Bintray 插件

要配置插件,你應該使用 Gradle 檔案中的 bintray 閉包。 首先,使用與你的 Bintray 使用者名和 API 密鑰對應的 user 和 key 變量進行身份驗證。在 Bintray,你的庫會被放置在 Bintray package 裡。 你應該使用 pkg 閉包裡命名直覺的 repo、 name、licenses 和 vcsUrl 參數,提供詳細的相關資訊, 如果這個包不存在,會為你自動建立。當你将檔案上傳到 Bintray 時,他們會與 Bintray 包裡的一個版本相關聯。 是以,pkg 必須包含一個 version閉包,閉包的 name 屬性要設為獨一無二的名稱。 另外,你還可以使用 desc,released 和 vcsTag 參數來提供描述、 釋出日期和 Git 标簽。

最後,為了指定應該上傳的檔案,要把 configuration 參數的值設為 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步可以總結如下,參照以下操作,一次性完成

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

dependencies {

···

//釋出庫需要的檔案

classpath 'com.github.dcendents:android-maven-gradle-plugin:1.4.1'

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

···

}

(二)配置要上傳的library/module的gradle檔案

将所有要釋出的内容都寫在maven.gradle裡面,在庫的gradle下添加以下代碼

apply from: "maven.gradle"

(三)配置maven.gradle檔案

// 釋出需要的插件

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後面會根據項目名稱得到

group = "com.hsy.utils"

install {

repositories.mavenInstaller {

// 生成pom.xml和參數

pom {

project {

packaging 'aar'

// 項目描述,複制我的話,這裡需要修改。

name 'utilslibrary'// 可選,項目名稱。

description 'Android Utils'// 可選,項目描述

url siteUrl// 項目首頁,這裡是引用上面定義好。

// 軟體開源協定,現在一般都是Apache License2.0吧,複制我的,這裡不需要修改。

licenses {

license {

name 'The Apache Software License, Version 2.0'

url 'http://www.apache.org/licenses/LICENSE-2.0.txt'

}

}

//填寫開發者基本資訊,複制我的,這裡需要修改。

developers {

developer {

id 'huangshuyuan' // 開發者的id。

name 'huangshuyuan' // 開發者名字。

email '[email protected]'// 開發者郵箱。

}

}

// SCM,複制我的,這裡不需要修改。

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你的注釋寫的不規範就編譯不過。

}

// 生成javaDoc的jar,不需要修改。

task javadocJar(type: Jar, dependsOn: javadoc) {

classifier = 'javadoc'

from javadoc.destinationDir

}

artifacts {

archives javadocJar

archives sourcesJar

}

// 這裡是讀取Bintray相關的資訊,我們上傳項目到github上的時候會把gradle檔案傳上去,

// 是以不要把帳号密碼的資訊直接寫在這裡,寫在local.properties中,這裡動态讀取。

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"// 上傳到maven庫。(這裡要特别注意,如果寫了maven報404錯誤,請在bintray建立一個倉庫,這裡填改成你建立的倉庫的名字,如何建立請看上方。)

name = "com.hsy.utils"// 釋出到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步指令上傳

準備工作都做完啦,最後一步就是上傳操作了,點選AndroidStudio底部的Terminal,觀察下Terminal顯示的路徑是否是你目前項目的root。

1、這裡如果你系統配置了gradle的使用者環境,輸入gradle install,如果沒有配置gradle使用者環境,輸入gradlew install,如果沒有問題,最終你會看到BUILD SUCCESSFUL。

如果你看到了生成javadoc時編譯不過,那麼要看下在gradle中task javadoc下有沒有failOnError false

這句話,在剛才編寫gradle時提示過了。如果加了這句而你的javadoc寫的不規範會有警告,你不用鳥它。

2、最後一步,運作gradle install後看到BUILD SUCCESSFUL後,再輸入上傳指令gradle bintrayUpload,等一分鐘左右就執行完了,會提示SUCCESSFUL。

方式二:gradle上傳

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

此步驟是為了生成釋出必要的檔案,比如aar

建立建構方法android,如何快速建立并釋出一個 Android 庫
建立建構方法android,如何快速建立并釋出一個 Android 庫

一旦完成運作,你就有了一切釋出你的庫需要的東西,有效的 POM 檔案,AAR 檔案,源 JAR,和 Javadocs JAR。

建立建構方法android,如何快速建立并釋出一個 Android 庫

2.上述完成之後,再次打開 Gradle Projects 視窗,搜尋 bintrayUpload 任務。 輕按兩下它,啟動上傳檔案。

建立建構方法android,如何快速建立并釋出一個 Android 庫

上傳完成咯,但是别着急喔,你會發現在項目gradle中依賴如下代碼後依賴失敗:

'compile '包名:子產品名:1.0.0'

原因是我們項目上傳完成後還需要Bintray的管理者稽核,是以在剛才項目頁面點選進去檢視詳情,點選Add to Jcetner

七、 将庫添加到 JCenter

建立建構方法android,如何快速建立并釋出一個 Android 庫

接着你進入一個頁面,讓你填寫一些資訊。 你可以用 Comments 區域來提及任何關于這個庫的細節。

建立建構方法android,如何快速建立并釋出一個 Android 庫

單擊 Send 按鈕,啟動 Bintray 的審查過程。 在一兩天以内,Bintray 的從業人員會把你的庫連結到 JCenter 倉庫,這樣你就将能在你的包的詳細資訊頁面上,看到指向 JCenter 的連結了。

參考: