發佈Android開源庫,看這個文章就夠了!

最近在Flipboard實習期間寫了一個輪播工具,技術上沒什麼難點,不過動畫效果仍是不錯的,決定改改代碼寫個庫開源出去。項目地址:http://github.com/chengdazhi/DecentBanner,歡迎你們提Issue報Bug。因爲國內有關發佈開源庫的文章與教程不多見,我就先挖個坑。html

本文力求簡明,但願你們能夠很快學會如何把本身寫的代碼開源出去,並讓全世界的開發者能夠經過一句compile語句來使用。畢竟重點在於庫自己,而發佈只是必須的過程。java

整個過程涉及如下幾個工具:android

  • Android Studio + Gradle : 用於將庫獨立成模塊。git

  • Bintray : Bintray是用於託管庫代碼的地方,也是將庫發佈到JCenter的工具。只有庫發佈到JCenter,在Gradle中才能夠經過一句compile命令來集成。github

  • Telecine : 用於給Android應用錄屏。api

過程分爲如下幾步:瀏覽器

  1. 將代碼封裝在一個module中。
  2. 經過gradle將代碼上傳到Bintray。
  3. 將代碼託管到GitHub,並編寫README,以及後續推廣與維護。

下面以這三步爲主線一步步將庫開源出去。服務器

封裝代碼

在這一部分中咱們要把庫的代碼封裝並生成aar文件。aar文件相似於jar,只不過因爲Android還包含XML、Assets、JNI等等其餘格式的文件,因此打包後的結果就是aar。微信

首先在Android Studio中點擊File菜單,選擇New->New Module,而後在彈出視圖中選擇Android Library,點擊Next後填寫庫的名稱。併發

new_module

我在這裏填寫decentbanner,而後在目錄視圖中就能夠看到兩個module了,一個是App的,一個是庫的。(默承認運行的module名稱爲app,我在這裏改爲了demo)

project_structure

建立完新的module後就能夠填充代碼了,至於寫什麼組件倒沒有關係。寫好後,若是想在app module中使用新的module中的類,須要在app module下的build.gradle中添加依賴:

compile project(':yourmodulename') //冒號後是你的新module的名稱

當你在app module下測試沒有問題後,這一步就完成了。固然這裏的重點在於庫的代碼,封裝自己是沒有難度的。

將庫上傳到Bintray

Bintray是一個能夠託管Android庫的平臺,平時咱們在gradle中經過一句compile命令就能夠引用的庫,都託管在JCenter上,而JCenter則由Bintray維護。咱們在這個部分中要進行的操做分兩步,一是將咱們的代碼上傳到Bintray的Maven倉庫中,二是將Maven倉庫發佈到JCenter。在這一部分中Gradle是核心,因此若是你哪一個地方出了問題,我在這個部分末尾給出了幾個gradle文件的GitHub地址能夠供你們參考。

當你完成註冊並登陸到Bintray後,你會發現有九個倉庫可供你使用,點View All後你會看到Maven選項。這裏不須要進行任何操做,只須要知道咱們要使用Maven進行上傳便可。咱們這裏真正須要的是API Key,後面當咱們在上傳庫時須要提供username和API key,具體在哪裏後面再說。你們不妨先在網站裏處處逛逛。

bintray_repos

Maven

首先咱們由於要使用到Bintray和Maven的服務,咱們須要在項目根目錄下的build.gradle中添加兩行classpath。具體的文檔能夠參考Bintray pluginMaven plugin

classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.2'
classpath "com.github.dcendents:android-maven-gradle-plugin:1.3"

這裏依賴的插件版本低於GitHub文檔中的最新版本,由於我依賴最新版時發現Android Studio會報錯,信息是庫不兼容,若是你沒有這個問題,固然仍是最新版最好。在添加完classpath後,要在你的庫module中依賴新的插件,只需將下面兩行添加到庫module目錄中的build.gradle文件便可。

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

Bintray在上傳庫時須要一個POM文件,而這個文件可讓Maven插件自動生成,但你仍是須要給出groupId和version的值,只須要將下面這兩行代碼添加到庫module的build.gradle中便可。

group = '你的庫的包名' // 這裏須要和真實包名對應,不能隨便填寫
version = '1.0.1' // 指定版本號

爲了與Maven標準對應,你須要在庫module的build.gradle中添加幾個task,分別生成Jar,Javadoc和JavadocsJar,只須要將下面三個task代碼添加到gradle文件便可。

task generateSourcesJar(type: Jar) {
    from android.sourceSets.main.java.srcDirs //經過from函數指定代碼源,這裏是默認代碼源
    classifier 'sources'
}

task generateJavadocs(type: Javadoc) {
    source = android.sourceSets.main.java.srcDirs //source指定了代碼源
    classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}

//這裏dependsOn意爲僅當generateJavadocs完成後纔開始本task
task generateJavadocsJar(type: Jar, dependsOn: generateJavadocs) {         
    from generateJavadocs.destinationDir
    classifier 'javadoc'
}

爲了將你生成的源代碼和Javadoc Jar文件添加到Maven中,你須要將task添加到一個archive中,只須要向庫module下的build.gradle中添加以下代碼:

artifacts {
    archives generateJavaDocsJar
    archives generateSourcesJar
}

Bintray

到這裏咱們已經配置好了Maven插件,如今須要配置Bintray插件。在編寫代碼前,咱們須要提供username和API key,username就是你註冊時填寫的,若是你直接用GitHub登陸,那麼username就是GitHub的username。要找到API key,首先進入我的主頁,即點擊Bintray主頁右上角的頭像並點擊Your Profile,而後點擊頭像右側大大的Edit按鈕,然後在左側找到API Key選項便可。

bintray_apikey

咱們在這裏先將這兩個值寫在local.properties下,由於這種數據是不該該傳到GitHub的。

bintray.user=your_username
bintray.apikey=your_apikey

然後咱們繼續在庫module下的build.gradle中添加以下代碼塊,這裏我直接貼了個人代碼,方便你們參閱,請你們對具體的值進行修改。在這裏有一個license屬性,立刻就要說到如何選擇一個license。license只是聲明別人在使用你的代碼時的權限,不須要申請,選擇以後直接在項目中添加一個相應的LICENSE文件便可。除此以外,

//須要在local.properties文件中取值
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())

bintray {
    user = properties.getProperty("bintray.user")
    key = properties.getProperty("bintray.apikey")

    pkg {
        repo = 'maven'
        name = 'it.chengdazhi.decentbanner'

        version {
            name = '1.0.5-tuts'
            desc = "decent banner"
            released = new Date()
            vcsTag = '1.0.5'
        }
    }

    configurations = ['archives']
}

在選擇License時,能夠參考這張圖,來自阮一峯老師的博文。剛纔說過,選擇License只是選擇一種權利,選好以後能夠直接添加就好。GitHub在建立Repo時能夠快速添加License文件。

license

以上除了兩行classpath寫在根目錄build.gradle,以及username和apikey寫在local.properties下,其他修改的所有是庫module下的build.gradle文件,完整文件能夠參考個人源碼。到這裏咱們完成了全部gradle的編寫,如今咱們須要進入Gradle Window視圖,默認在Android Studio的右側,處在最小化狀態,找不到能夠從菜單點擊View->Tool Windows->Gradle調出。點擊圖標欄的Gradle圖標。

gradle_window

輸入install,點擊OK。注意這裏的Gradle project是你的庫module。這時會執行Maven相關的task。

gradle_command

然後你的庫module的build目錄下會出現POM文件,AAR文件,源代碼Jar文件和Javadocs Jar文件。

library_build

成功後再次點擊Gradle圖標,輸入bintrayUpload並點擊OK。執行成功後你的庫就成功上傳到Bintray了。注意之後每次更新庫時須要更新版本號,否則會衝突,同時每次都須要順序執行install和bintrayUpload。上傳成功後你能夠在Bintray主頁左下角的My Recent Packages欄目中看到新的package。

my_recent_packages

點進去後會有這樣一個提示,讓你在七天以內公開,點擊Publish。

publish_repo

JCenter

而後爲了讓全部開發者均可以使用,你須要將類庫添加到JCenter。操做很簡單,只須要點擊以下所示的按鈕,然後你須要填寫有關類庫的信息。

add_to_jcenter

我提交以後過幾個小時就有郵件通知添加成功,你們耐心等待。添加成功後會變成以下景象。

link_to_jcenter

在每次發新版時,點擊Publish後不會當即生效,也就是說若是在Gradle中想要當即引用新版,會沒法解析,由於有幾分鐘的延遲,等到左下角的Maven build Settings中的依賴代碼改變,或是右上側Version欄目下新版信息有了tweeter標識後就能夠正常引用了。

maven_build_settings

version_info

託管到GitHub,寫readme,推廣與維護

恭喜你,你已經完成了全部有坑的環節,如今離完成只剩一個GitHub了!GitHub對於你的開源庫而言有以下幾個做用,一是能夠維護一份文檔,也就是README,告知你們相關信息;二是能夠將代碼以很方便的形式讓你們參考並作二次開發;第三點在於GitHub是世界上最大的同性交友平臺,是全部開源庫的集散地;第四點在於你們能夠很方便的提交Issue給你報Bug。

README

有不少文章講了如何將項目託管到GitHub,這裏再也不重述。首先咱們說說README這個文件。在GitHub的每一個項目中,根目錄中的README.md會被用於展現,你們能夠在這個文檔中展現庫的相關信息,至少要包含依賴語句。除此之外,我建議你們在README中添加如下幾項信息:

  • 效果展現:若是你作的是View,那麼給出一個截圖或是Gif,若是是其餘組件,最好也給出可視化很強的圖片,由於圖片對人的衝擊力遠大於文字。若是你要作動圖,並進行圖片錄製的話,首先推薦一個錄屏工具Telecine,Jake Wharton出品,無需root,方便傳輸,這是我對比多個市場上下載量最大的錄屏工具後做出的推薦。而後,在你將視頻轉成gif後,可使用Photoshop對Gif進行裁剪與剪輯,只需打開時間軸窗口便可,很方便。建議你將gif圖片放在項目目錄中,而不是在README中之外鍊形式添加,否則可能顯示異常。

  • 樣例下載:開發者若是被你的展現圖所吸引,會但願能下載一個樣例。建議你們能同時給出apk的下載連接和二維碼。因爲國內不少人經過微信掃二維碼,而微信瀏覽器又不支持下載,你們須要給服務器上的apk文件設置請求頭,將Content-Type設置爲application/octet-stream,強制微信跳轉到外部瀏覽器。

  • 功能與使用範例:給出支持的功能與相對應的最基本的使用方式,最好作出相關說明,好比參數等等。

  • License:把剛纔選擇的License添加到README中。

你們不妨多參考Star數很高的開源項目的README。

推廣

你已經成功地發佈了開源庫,爲了讓更多的人看到你的開源庫,這裏給出幾個推廣方式:

  • 微博:微博能夠說是推廣庫的最佳方式,正確的使用姿式是:一句話說清楚庫的功能,給個地址,放個圖,艾特幾個大V,剩下的就看你的庫的質量了。

  • 週報:能夠將你的庫投稿給各類週報,每期週報裏都會推送各類庫,在這裏推薦兩個週報:Android開發技術週報國外Android週報。各類各樣的週報是不少的,你們多多發掘。

  • 推廣這種事是須要發揮想象力的。好比我在這裏寫個博客順便就打個廣告。

維護

當有人在使用你的開源庫並發現問題時,會向你提Issue。還有可能會有人想參與進來,和你一同開發。

可是,全部開源庫都會經歷從積極維護到中止維護(Deprecated)的過程,這也推動着開源事業不斷地向前發展。全部代碼與開源庫都有過期的一天,只剩下幾顆星星留在你的主頁上,像一枚勳章,映射着你昔日的張狂。

推薦:

 Android開發基本常識

相關文章
相關標籤/搜索