Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android studio 發布Android Library項目到JCenter

Android studio 發布Android Library項目到JCenter

編輯:關於Android編程

互聯網的發展是非常迅猛的,剛剛覺得自己適應了eclipse的用法,突然發現它已經被淘汰了。

OK,今天不是來說eclipse和Android studio的褒貶。我們是來學習技術的。在做SDK相關的開發時發現一個問題,Android studio 使用第三方包超級簡單方面。一行代碼搞定。

compile ‘com.ruffian.utils.android:utilssdk:0.1.0’

這就可以把第三包(Library)導入到項目編譯使用。我的天啊,這麼神奇嗎?回想起使用eclipse導入項目,當做依賴包使用的艱辛,是不是頓時覺得這種方式碉堡了。

這行代碼神奇的背後影藏著什麼呢?先問問自己

1.首先這個第三方的包如何能為我?它在哪裡?雲服務器?本地?
2.這個第三方包是怎樣的項目結構呢?jar?apk?
3.我們如何能做到一行代碼使用第三方包?

1.首先這個第三方的包如何能為我?它在哪裡?雲服務器?本地?

通過測試發現,這個第三方包,存在雲服務器上,compile 之後Android studio 會將代碼下載到本地。通過以下方式查看文件位置

這裡寫圖片描述

項目右鍵->Library Properties 就可以查看文件位置<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPjxpbWcgYWx0PQ=="這裡寫圖片描述" src="/uploadfile/Collfiles/20160531/20160531091153453.png" title="\" />

這個第三方包是怎樣的項目結構呢?jar?apk?

在Library文件目錄項看到三個文件夾

.pom jar aar

打開 .pom 文件,可以看到是關於library項目的一些基本信息。網上解釋:

pom,Project Object Model,在maven1中叫做project.xml,到maven2後改為pom.xml。該文件用於管理:源代碼、配置文件、開發者的信息和角色、問題追蹤系統、組織信息、項目授權、項目的url、項目的依賴關系等等。一個maven項目可以沒有任何源代碼,但必須包含pom文件。

jar:不解釋了,就是java/Android代碼
aar:诶,這個是啥,貌似在哪裡見過,但是又不是很熟。修改後綴看看裡面什麼狀況

這裡寫圖片描述

aar文件夾結構如上圖。略微了解了一下,aar是 SDK的一種項目結構。使用studio打包。而我們使用eclipse處理SDK Library一般是一個完整的Android項目(包括資源文件)和jar文件

我們如何能做到一行代碼使用第三方包?

前面簡單交代一下1,2兩個問題。接下來說說我們一個普普通通的開發者如何做到看似高大上的行為。

其實Android Studio是從build.gradle裡面定義的Maven 倉庫服務器上下載library的。Apache Maven是Apache開發的一個工具,提供了用於貢獻library的文件服務器。總的來說,只有兩個標准的Android library文件服務器:jcenter 和 Maven Central。

關於以及將Android Library發布到JCenter的操作可以查看下面這篇文章

https://inthecheesefactory.com/blog/how-to-upload-library-to-jcenter-maven-central-as-dependency/en

臥槽,這麼坑爹,丟給你們一個英文網站就算完了?那好咯,給多一個中文的翻譯

http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0623/3097.html

這是一篇好文章,能看懂的話基本都知道怎麼回事了,列舉的條條是道,但是好像有點坑爹,怎麼弄都跑不起來,或者各種報錯。程序員嘛,誰跟你講道理,跑起來才是硬道理。好吧,下面我嘗試了之後做了一下總結個改進。反正我是成功實現了。我跑起來了,怎麼樣。

第1部分:在bintray上創建package 第2部分:准備一個Android Studio項目 第3部分:把library上傳到你的bintray空間 第4部分:測試使用

第1部分:可以參考上面鏈接文章操作,注冊賬號,創建包名。圖文並茂真的可以參考,就不在重復
第2部分:創建一個Android studio項目,然後添加一個module,做為library項目

2.1創建項目
這裡寫圖片描述

2.2配置項目[ 這個是最關鍵的啦 ](跳過功能代碼部分,可以寫一個最簡單的log類)
為了快速上手,這裡直接給出幾個配置文件的代碼
1.在library項目中添加以下3個文件
1.1 project.properties

#project
project.name=UtilsSdk
project.groupId=com.ruffian.utils.android
project.artifactId=utilssdk
project.versionName=0.1.0
project.packaging=aar
#這兩個值可以隨便找一個項目
project.siteUrl=https://github.com/adamrocker/volley
project.gitUrl=https://github.com/adamrocker/volley.git

#javadoc
javadoc.name=UtilsSdk

解釋一下文件(記得實際項目中一定要替換成開發者自己的項目名稱,包名等等)

project.name:項目名稱
project.groupId:項目組ID,通常情況下如果你的包名為com.example.test,那麼項目組ID就是com.example
project.artifactId:項目ID,通常情況下如果你的包名為com.example.test,那麼項目ID就是test
project.packaging:包類型,Android庫是aar
project.siteUrl:項目官方網站的地址,沒有的話就用Github上的地址,例如:https://github.com/xiaopansky/Sketch
project.gitUrl:項目的Git地址,例如:https://github.com/xiaopansky/Sketch.git
javadoc.name:生成的javadoc打開後主頁顯示的名稱,通常跟項目名稱一樣即可

1.2 local.properties

#bintray
bintray.user=ruffian
bintray.apikey=******************

#developer
developer.id=Ruffian
developer.name=RuffianZhong
[email protected]

解釋一下文件(記得實際項目中一定要替換成開發者自己的項目名稱,包名等等)

bintray.user:你的Bintray的用戶名
bintray.apikey:你的的Bintray的API Key
developer.id:通常是你在開源社區的昵稱
developer.name:你的姓名
developer.email:你的郵箱

1.3 bintrayUpload.gradle

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

// load properties
Properties properties = new Properties()
File localPropertiesFile = project.file("local.properties");
if (localPropertiesFile.exists()) {
    properties.load(localPropertiesFile.newDataInputStream())
}
File projectPropertiesFile = project.file("project.properties");
if (projectPropertiesFile.exists()) {
    properties.load(projectPropertiesFile.newDataInputStream())
}

// read properties
def projectName = properties.getProperty("project.name")
def projectGroupId = properties.getProperty("project.groupId")
def projectArtifactId = properties.getProperty("project.artifactId")
def projectVersionName = properties.getProperty("project.versionName")
def projectPackaging = properties.getProperty("project.packaging")
def projectSiteUrl = properties.getProperty("project.siteUrl")
def projectGitUrl = properties.getProperty("project.gitUrl")

def developerId = properties.getProperty("developer.id")
def developerName = properties.getProperty("developer.name")
def developerEmail = properties.getProperty("developer.email")

def bintrayUser = properties.getProperty("bintray.user")
def bintrayApikey = properties.getProperty("bintray.apikey")

def javadocName = properties.getProperty("javadoc.name")

group = projectGroupId

// This generates POM.xml with proper parameters
install {
    repositories.mavenInstaller {
        pom {
            project {
                name projectName
                groupId projectGroupId
                artifactId projectArtifactId
                version projectVersionName
                packaging projectPackaging
                url projectSiteUrl
                licenses {
                    license {
                        name 'The Apache Software License, Version 2.0'
                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                    }
                }
                developers {
                    developer {
                        id developerId
                        name developerName
                        email developerEmail
                    }
                }
                scm {
                    connection projectGitUrl
                    developerConnection projectGitUrl
                    url projectSiteUrl
                }
            }
        }
    }
}

// This generates sources.jar
task sourcesJar(type: Jar) {
    from android.sourceSets.main.java.srcDirs
    classifier = 'sources'
}

task javadoc(type: Javadoc) {
    source = android.sourceSets.main.java.srcDirs
    classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}

// This generates javadoc.jar
task javadocJar(type: Jar, dependsOn: javadoc) {
    classifier = 'javadoc'
    from javadoc.destinationDir
}

artifacts {
    archives javadocJar
    archives sourcesJar
}

// javadoc configuration
javadoc {
    options {
        encoding "UTF-8"
        charSet 'UTF-8'
        author true
        version projectVersionName
        links "http://docs.oracle.com/javase/7/docs/api"
        title javadocName
    }
}

// bintray configuration
bintray {
    user = bintrayUser
    key = bintrayApikey
    configurations = ['archives']
    pkg {
        repo = "maven"
        name = projectName
        websiteUrl = projectSiteUrl
        vcsUrl = projectGitUrl
        licenses = ["Apache-2.0"]
        publish = true
    }
}

bintrayUpload.gradle這個文件不用解釋,不用修改,直接復制

2.在library項目的build.gradle文件最後添加代碼

apply from: "bintrayUpload.gradle"

引用本地的 “bintrayUpload.gradle” 文件。這個文件的代碼直接復制到項目中即可,不需要修改。

3.在項目目錄下的build.gradle文件中添加代碼

 dependencies {       
        classpath 'com.android.tools.build:gradle:1.2.3'
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.4'
        classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'
    }

好了,精華都在那幾個配置文件裡面了,前提是在bintray上面已經建好了賬號。填好包名
接下來就要上傳代碼到bintray中了。

第3部分:把library上傳到你的bintray空間

3.1請到Android Studio的終端(Terminal)選項卡

這裡寫圖片描述

第一步是檢查代碼的正確性,以及編譯library文件(aar,pom等等),輸入下面的命令:

gradlew install

如果沒有什麼問題,會顯示:

BUILD SUCCESSFUL

現在我們已經成功一半了。下一步是上傳編譯的文件到bintray,使用如下的命令:

gradlew bintrayUpload

如果顯示如下你就大神問問周圍的人:“你看我吊不”!然後去在bintray的網頁上檢查一下你的package

SUCCESSFUL

但是你怎麼可能有我那麼吊,你肯定一直在報錯,哈哈。報錯就對了。
常見問題

Error:Cause: org/gradle/api/publication/maven/internal/DefaultMavenFactory:當你使用的Gradle版本是2.4以上,Android插件版本是1.3.0以上的時候就會出現這個問題,這時候你只需將android-maven-gradle-plugin插件版本改為classpath ‘com.github.dcendents:android-maven-gradle-plugin:1.3’即可

—我是分隔符—

You are using JDK version ‘java version “1.7.0_71”’. Some versions of JDK 1.7 (e.g. 1.7.0_10) may cause class loading errors in Gradle.Please update to a newer version (e.g. 1.7.0_67):當你使用的Gradle版本是2.4以上,Andriod插件版本是1.2.3的時候就會出現這個問題,同樣的你只需要將android-maven-gradle-plugin插件版本改為classpath ‘com.github.dcendents:android-maven-gradle-plugin:1.3’即可

—我是分隔符—

No value has been specified for property ‘packageName’.出這個問題肯定是看文檔不仔細,把project.properties文件放在了項目根目錄下,一定要放在mudule目錄下才可以

—我是分隔符—

Could not upload to ‘https://.pom’: HTTP/1.1 400 Bad Request [message:Unable to upload files: Maven group, artifact or version defined in the pom file do not match the file path ‘***.pom’]這個問題一般都是你的module的名字和你在project.properties 配置的artifactId不一致導致的,改成一樣的即可

估計這幾個問題之後就應該可以看見SUCCESS了。現在看看bintray網站上面的變化

1.
這裡寫圖片描述
2.
這裡寫圖片描述
3.
這裡寫圖片描述

終於把代碼放到了網上,現在需要將代碼從bintray同步到jcenter。這一步很簡單,查看鏈接中的文章有說明。

那現在是不是就可以實現1行代碼實現吊炸天的操作?哪有那麼容易,隨便弄一下就想一行代碼搞定?
得2行代碼!!

因為代碼從bintray同步到jcenter需要幾個小時的時間,但是我已經等不及想看看自己成果,那麼就多寫一行代碼配置一下library路徑就可以了

新建一個Android studio 測試項目。

在項目根目錄下的build.gradle中添加

allprojects {
    repositories {
        jcenter(){
            url 'https://dl.bintray.com/ruffian/maven/'
        }
    }
}

引入Library項目,在APP目錄下的build.gradle中添加

dependencies {
    //utils
    compile 'com.ruffian.utils.android:utilssdk:0.1.0'
}

sync now

ok,搞定,在activity中調用Library中的方法測試一下,能正確調用。沒問題!你做到了

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved