1. 程式人生 > >掃盲Android Studio 倉庫jCenter併發布自己的開源庫

掃盲Android Studio 倉庫jCenter併發布自己的開源庫

AS從哪裡獲取到開源庫

首先我們在使用第三方開源庫時,直接在專案的 gradle 檔案中新增這樣一行程式碼:
compile 'com.jakewharton:butterknife:7.0.1'
新增完之後,你會發現依懶庫中確實出現了這個庫檔案,那麼 AS 具體是去哪裡下載這個庫的呢?

jcenter

細心的話會發現專案根目錄的 gradle 檔案裡面有這樣的配置

allprojects {
    repositories {
        jcenter()
    }
}

這程式碼的作用就是告訴 AS 使用 jcenter 作為程式碼倉庫!
jcenter 就是 Android library 檔案伺服器中的其中一個,另外一個就是 Maven Central,這兩個都是Maven 倉庫。 jcenter 由 bintray.com 維護 , Maven Central 則是由 sonatype.org 維護,它們分別儲存在不同的伺服器,兩者沒有任何關係。在

http://jcenter.bintray.com/ 可以看到 jcenter 整個倉庫的內容。
那麼既然有了兩個選擇,為什麼最終會選擇使用 jcenter ?
起初,Android Studio 選擇 Maven Central 作為預設倉庫。如果你使用老版本的 Android Studio 建立一個新專案, mavenCentral() 會自動的定義在 build.gradle 中。
但是 Maven Central 的最大問題是對開發者不夠友好。上傳 library 異常困難。上傳上去的開發者都是某種程度的極客。同時還因為諸如安全方面的其他原因, Android Studio 團隊決定把預設的倉庫替換成jcenter。正如你看到的,一旦使用最新版本的 Android Studio 建立一個專案,jcenter() 自動被定義,而不是 mavenCentral()。
有許多將 Maven Central 替換成 jcenter 的理由,下面是幾個主要的原因。

  1. jcenter通過CDN傳送library,開發者可以享受到更快的下載體驗;
  2. jcenter是全世界最大的Java倉庫,因此在Maven Central 上有的,在jcenter上也極有可能有。換句話說jcenter是Maven Central的超集;
  3. 上傳library到倉庫很簡單,不需要像在Maven Central上做很多複雜的事情;
  4. 友好的使用者介面;
  5. 如果你想把library上傳到Maven Central,你可以在bintray網站上直接點選一個按鈕就能實現;

如何獲得特定的庫

在文章開頭,我們是這位引入開源庫的:compile 'com.jakewharton:butterknife:7.0.1'


單引號裡面的內容對應的格式是這樣的:GROUP_ID:ARTIFACT_ID:VERSION
GROUP_ID:定義了library的group,通常我們使用包名來命名;
ARTIFACT_ID:library真實名字;
VERSION:版本號;
當我們 Sync project with gradle file 時,AS 就會去請求這個地址 http://jcenter.bintray.com/com/jakewharton/butterknife/7.0.1/ 去下載相關的檔案。然後再編譯使用。

上傳library到jcenter

  1. 新建一個專案
    一個是主專案:app,一個是依懶庫:mylibrary。如圖:
    專案結構
  2. 註冊帳號
    到該網址https://bintray.com/signup/oss 個人免費賬號。注意註冊郵箱最好用Gmail。
    註冊完成之後,儲存API Key。獲取方式如下:
    選擇Edit Profile
    選擇API Key
  3. 引入bintray-release
    在專案的根目錄的build.gradle新增bintray-release的classpath:classpath 'com.novoda:bintray-release:0.3.4' 如圖:
  4. 配置待上傳moudle的build.gralde
    新增以下程式碼:
apply plugin: 'com.novoda.bintray-release'

publish {
    userOrg = 'xxx'//bintray.com使用者名稱
    groupId = 'com.helloandroid'//jcenter上的路徑
    artifactId = 'mylibrary'//專案名稱
    publishVersion = '1.0.0'//版本號
    desc = 'this is for test'//描述,不重要
    website = 'https://github.com/kuyue'//網站,最好有,不重要
}


5. 上傳程式碼到庫
在Android Studio的Terminal面板進行,執行下面的命令即可:
windows系統:
gradlew clean build bintrayUpload -PbintrayUser=xxx -PbintrayKey=xxxxxxxxxxxxxxxxxxxxxx -PdryRun=false
Mac系統:
./gradlew clean build bintrayUpload -PbintrayUser=xxx -PbintrayKey=xxxxxxxxxxxxxxxxxxxxxx -PdryRun=false
注:user就是使用者名稱,key就是我們剛才的Api key,dryRun是一個配置引數,當為true的時候,會執行所有的環節,但是不會上傳。

最後看到這樣的資訊就算上傳成功!

這時候如果需要引用剛才上傳的庫,需要這樣配置:
(1)、專案根目錄gradle檔案中這樣配置(xxx為你的使用者名稱):

(2)、最後還需要在需要引用的地方新增上以下依懶
compile 'com.helloandroid:mylibrary:1.0.0
當然這樣每次要新增依懶時,都要執行步驟一,這樣是很不友好的。不過只要我們完成以下步驟,就可以只需要執行步驟2就可以添加了!
開啟網址:https://bintray.com/你的使用者名稱/maven,進入以下頁面,

點選庫名字,跳轉到

再點選Add to JCenter

最後填寫資訊提交,當稽核通過時,會發站內信通知您。通過時就只需要執行步驟2就可以新增依懶!
6. 更新版本
更新版本很容易,只需要更改下庫版本號就可以!

publish {
    userOrg = 'xxx'//bintray.com使用者名稱
    groupId = 'com.helloandroid'//jcenter上的路徑
    artifactId = 'mylibrary'//專案名稱
    publishVersion = '1.0.1'//版本號
    desc = 'this is for test'//描述,不重要
    website = 'https://github.com/kuyue'//網站,最好有,不重要
}

執行釋出命令後,在網站上執行以下操作即可:

7. 解決bug
執行命令列時,可能會出現以下錯誤資訊
(1)如圖

解決方法:在要上傳的gradle 檔案的android節點裡面新增以下程式碼:

lintOptions {
        abortOnError false
    }

(2)如圖

出現Could not create package是因為外掛建立不了庫。
解決方法:我們手動建立一個


(3)有可能出現亂碼問題
解決問題:在專案根目錄gradle檔案中新增以下程式碼

allprojects {
tasks.withType(Javadoc) {
    options{
        encoding "UTF-8"
        charSet 'UTF-8'
        links "http://docs.oracle.com/javase/7/docs/api"
    }
  }
}

參考

./gradlew clean build bintrayUpload -PbintrayUser=xxx -PbintrayKey=xxxxxxxxxxxxxxxxxxxxxx -PdryRun=false

出現的錯誤:

  1. 在Terminal 執行命令時,提示無許可權 Permission denied
    解:在 Terminal 直接輸入 chmod +x gradlew 回車即可
  2. jdk版本問題,因為在安裝 AS 時官方建議安裝jdk6.0到7.0,不建議安裝8.0,所以就裝了個7.0。執行命令時提示:unsupported major.minor version 52.0。意思是不支援jdk7.0,需要 jdk8.0。在這裡也試過網上找不裝8.0而能解決問題的方法,不過沒有找到有效的方法。因此這裡只能裝8.0,AS 官網只說了對8.0支援不太好,目前用到現在沒有發現什麼問題。發現問題了再裝回去吧。。。。(解除安裝 jdk7.0方法:http://docs.oracle.com/javase/8/docs/technotes/guides/install/mac_jdk.html#A1096903 命令列中的%用 sudo代替,因為執行該命令需要管理員許可權)。
  3. ndk問題,提示資訊:ndk is missing a “platforms” directory。解決方法:直接用 sdk manager去下載 ndk就可以。
  4. 提示資訊如圖:這裡寫圖片描述 解決方法:
    1.新增bintrayUser、bintrayKey、dryRun 配置,如圖:這裡寫圖片描述
    2.不使用命令列執行,而直接點選操作,按順序進行以下操作:a, clean project;b,先執行assembleRelease,再執行 publishMavenPublicationToMavenLocal,然後再執行 bintrayUpload這裡寫圖片描述

以上就是遇到的坑爹問題,只有想不到,沒有遇不到的問題。