一、 前言
最近經常看到各種大神的庫,發現用起來非常友善,自己研究了一下,來寫個庫釋出一下,讓自己寫代碼更加友善一點,自己封裝了基本的開發工具類。也是搜集了各位大神的優秀代碼總結的。
二、必要的準備工作
AndroidStudio、Gradle和自己的開源項目這個必須有。
Jcenter是Bintray下的一個倉庫,是以Bintray帳号必須的,沒有的如何申請。
網絡必須是暢通的,要能通路https://bintray.com
三、申請Bintray帳号
申請
我之前已經申請過了,下圖是登入進去首頁
首頁
四、 建立并釋出一個 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 子產品到你的項目中。 您将看到下面的螢幕,裡面提供了很多選擇:
New module dialog
選擇 Android Library ,點選 Next。 在後面的表格裡,輸入庫的名稱,點選 Next。 我把這個庫命名為 mylittlelibrary。
在最後一個頁面中,選擇 Add no Activity,點選 Finish。
你的項目現在有了兩個子產品,一個是應用子產品,一個是庫子產品。 項目的結構是這樣的:
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
第一步
通路您的個人資料頁,單擊 Edit 按鈕。 在下一頁上,單擊 API Key 連結以檢視您的 API 密鑰。
記住這個密鑰,因為使用 Bintray 插件時,你要用它來進行身份驗證。
五、 配置gradle
第 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
一旦完成運作,你就有了一切釋出你的庫需要的東西,有效的 POM 檔案,AAR 檔案,源 JAR,和 Javadocs JAR。
2.上述完成之後,再次打開 Gradle Projects 視窗,搜尋 bintrayUpload 任務。 輕按兩下它,啟動上傳檔案。
上傳完成咯,但是别着急喔,你會發現在項目gradle中依賴如下代碼後依賴失敗:
'compile '包名:子產品名:1.0.0'
原因是我們項目上傳完成後還需要Bintray的管理者稽核,是以在剛才項目頁面點選進去檢視詳情,點選Add to Jcetner
七、 将庫添加到 JCenter
接着你進入一個頁面,讓你填寫一些資訊。 你可以用 Comments 區域來提及任何關于這個庫的細節。
單擊 Send 按鈕,啟動 Bintray 的審查過程。 在一兩天以内,Bintray 的從業人員會把你的庫連結到 JCenter 倉庫,這樣你就将能在你的包的詳細資訊頁面上,看到指向 JCenter 的連結了。
參考: