從零到一發布 Android 開源庫
最近在Flipboard實習期間寫了一個輪播工具,技術上沒什么難點,不過動畫效果還是不錯的,決定改改代碼寫個庫開源出去。 項目地址:http://github.com/chengdazhi/DecentBanner ,歡迎大家提Issue報Bug。由于國內有關發布開源庫的文章與教程很少見,我就先挖個坑。
本文力求簡明,希望大家可以很快學會如何把自己寫的代碼開源出去,并讓全世界的開發者可以通過一句compile語句來使用。畢竟重點在于庫本身,而發布只是必須的過程。
整個過程涉及以下幾個工具:
-
Android Studio + Gradle : 用于將庫獨立成模塊。
-
Bintray : Bintray是用于托管庫代碼的地方,也是將庫發布到JCenter的工具。只有庫發布到JCenter,在Gradle中才可以通過一句compile命令來集成。
-
Telecine : 用于給Android應用錄屏。
過程分為以下幾步:
- 將代碼封裝在一個module中。
- 通過gradle將代碼上傳到Bintray。
- 將代碼托管到GitHub,并編寫README,以及后續推廣與維護。
下面以這三步為主線一步步將庫開源出去。
封裝代碼
在這一部分中我們要把庫的代碼封裝并生成aar文件。aar文件類似于jar,只不過由于Android還包含XML、Assets、JNI等等其他格式的文件,所以打包后的結果就是aar。
首先在Android Studio中點擊File菜單,選擇New->New Module,然后在彈出視圖中選擇Android Library,點擊Next后填寫庫的名稱。
我在這里填寫decentbanner,然后在目錄視圖中就可以看到兩個module了,一個是App的,一個是庫的。(默認可運行的module名稱為app,我在這里改成了demo)
創建完新的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,具體在哪里后面再說。大家不妨先在網站里到處逛逛。
Maven
首先我們因為要使用到Bintray和Maven的服務,我們需要在項目根目錄下的build.gradle中添加兩行classpath。具體的文檔可以參考 Bintray plugin 和 Maven 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選項即可。
我們在這里先將這兩個值寫在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文件。
以上除了兩行classpath寫在根目錄build.gradle,以及username和apikey寫在local.properties下,其余修改的全部是庫module下的build.gradle文件,完整文件可以參考 我的源碼 。到這里我們完成了所有gradle的編寫,現在我們需要進入Gradle Window視圖,默認在Android Studio的右側,處在最小化狀態,找不到可以從菜單點擊View->Tool Windows->Gradle調出。點擊圖標欄的Gradle圖標。
輸入install,點擊OK。注意這里的Gradle project是你的庫module。這時會執行Maven相關的task。
而后你的庫module的build目錄下會出現POM文件,AAR文件,源代碼Jar文件和Javadocs Jar文件。
成功后再次點擊Gradle圖標,輸入bintrayUpload并點擊OK。執行成功后你的庫就成功上傳到Bintray了。注意以后每次更新庫時需要更新版本號,不然會沖突,同時每次都需要順序執行install和bintrayUpload。上傳成功后你可以在Bintray主頁左下角的My Recent Packages欄目中看到新的package。
點進去后會有這樣一個提示,讓你在七天之內公開,點擊Publish。
JCenter
然后為了讓所有開發者都可以使用,你需要將類庫添加到JCenter。操作很簡單,只需要點擊如下所示的按鈕,而后你需要填寫有關類庫的信息。
我提交之后過幾個小時就有郵件通知添加成功,大家耐心等待。添加成功后會變成如下景象。
在每次發新版時,點擊Publish后不會立即生效,也就是說如果在Gradle中想要立即引用新版,會無法解析,因為有幾分鐘的延遲,等到左下角的Maven build Settings中的依賴代碼改變,或是右上側Version欄目下新版信息有了tweeter標識后就可以正常引用了。
托管到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。
來自:http://blog.chengdazhi.com/index.php/217