android studio islibrary,通过AndroidStudio发布Android Library到Jcenter[超详细]
這篇文章很長
如果已經對jcenter,maven有了一些概念,可以直接看我的另外一篇精簡文章:
快速發布Abdroid Library到JCenter[精簡]
開始之前先明白幾個概念
maven
Maven是基于項目對象模型(POM project object model),可以通過一小段描述信息(配置)來管理項目的構建,報告和文檔的軟件項目管理工具
換句話說,Maven是通過pom.xml文件的配置獲取jar包的,從而省去了手動拷貝jar包到project的麻煩。
gradle
Gradle是一個基于Apache Ant和Apache Maven概念的項目自動化建構工具。它使用一種基于Groovy的特定領域語言來聲明項目設置,而不是傳統的XML
翻譯一下,gradle是通過Groovy語法,獲取library,對Android來說不用自己拷貝jar或者aar了。
從哪里獲取?
上面說的maven和gradle都是通過配置,然后自動獲取,那么問題來了:從哪里獲取?答案:代碼倉庫
就Android開發來說,目前兩個比較著名的倉庫是 mavenCentral和jcenter
mavenCentral和jcenter
mavenCentral被稱為maven的權威中央倉庫,但是上傳library極其復雜繁瑣,這也是被google換掉的原因之一;
其實從名字上看,mavenCentral有點讓人困惑,會讓人感覺這個倉庫只支持maven的配置方式。
其實,無論是mavenCentral還是jcenter都支持maven和gradle的配置方式。
jcenter托管在 https://bintray.com ,也可以說是這個網站在維護管理jcenter倉庫;
mavenCentral()被google默認替換成jcenter()
在Android Studio早期版本中,如果我們創建一個Project,給我們的默認repository是mavenCentral():
buildscript {
repositories {
mavenCentral() //現在已經被替換成了jcenter()
}
}
.
.
.
allprojects {
repositories {
mavenCentral() //現在已經被替換成了jcenter()
}
}
之后我們就可以用簡單的配置,來使用library了:
implementation 'com.google.code.gson:gson:2.8.5'
正式開始
如果你讀完上面的文字,我想你已經明白了,我們為什么選擇上傳到jcener了:Android Studio現在默認的配置的是jcenter,原因是mavenCentral上傳過程太復雜。
注冊bintray.com帳號
由于jcenter是托管在bintray.com上的,因此我們只要有bintray的帳號,就可以管理我們自己上傳的library了。
注冊這一步就不說了,沒什么特別的,按照要求填寫就行了。
1:添加一個新的Repository,當然如果你不想添加,bintray默認會有一個名字是maven的Repository(不想添加可跳過次步驟)
image.png
填寫相關信息:
image.png
2:在Repository中添加一個Package
image.png
image.png
image.png
3:獲取bintray.user和bintray.apikey,下面使用插件上傳要用到
bintray.user 就是你注冊時候填寫的用戶名,這沒什么好說的。
下面主要說一下如何獲取bintray.apikey:
image.png
image.png
image.png
image.png
到此,我們bintray上的配置就完全結束了:
4:編寫要上傳的Library的代碼
使用Android Studio創建一個工程,這個工程其實的作用是為了上傳和測試你自己要上傳的Library。
image.png
圖中的asyncokhttp其實就是一個module(Android Library),這個庫其實就是封裝了一下okhttp3,讓其能在主線程直接調用網絡請求。
看一下asyncokhttp的依賴:
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
// 省略了一些不重要的信息
//這里依賴okhttp3
implementation 'com.squareup.okhttp3:okhttp:3.12.0'
}
5:使用插件開始上傳
在編寫測試完畢你的代碼之后,我們就可以使用插件開始上傳你的庫了
這里用到的插件一共有兩個:
1:maven插件,主要用來幫助生成和打包maven所需要上傳的文件
apply plugin: 'com.github.dcendents.android-maven'
2:bintray插件,主要用來打包和上傳庫到bintray網站
apply plugin: 'com.jfrog.bintray'
在Project的build.gradle(根目錄)中添加:
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.3.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
// 下面兩行是新添加的
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4'
classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1'
}
}
在Project的的local.properties中添加上面獲取到的bintray.user 和bintray.apikey
image.png
在Moudle的目錄下創建3個文件:
image.png
1:android-maven-install.grdle主要是使用apply plugin: 'com.github.dcendents.android-maven'插件,完成maven相關文件的生成與打包。
內容:
apply plugin: 'com.github.dcendents.android-maven'
install {
repositories.mavenInstaller {
// This generates POM.xml with proper parameters
pom {
project {
packaging libraryPackaging
groupId publishedGroupId
artifactId artifact
// Add your description here
name libraryName
description libraryDesc
url websiteUrl
// Set your license
licenses {
license {
name licenseName
url licenseUrl
}
}
developers {
developer {
id developerId
name developerName
email developerEmail
}
}
scm {
connection websiteUrl
developerConnection websiteUrl
url websiteUrl
}
}
}
}
}
2:android-tasks.gradle主要是生成javadoc.jar和sorce.jar:
task javadoc(type: Javadoc) {
options.encoding = "utf-8"
source = android.sourceSets.main.java.srcDirs
classpath += files(android.bootClasspath)
options {
//links "http://docs.oracle.com/javase/7/docs/api/"
linksOffline "https://developer.android.com/reference","${android.sdkDirectory}/docs/reference"
encoding = "UTF-8"
}
exclude '**/BuildConfig.java'
exclude '**/R.java'
android.libraryVariants.all { variant ->
variant.javaCompileProvider.configure{
javadoc.classpath += files(it.classpath.files)
}
}
}
task sourcesJar(type: Jar) {
from android.sourceSets.main.java.srcDirs
classifier = 'sources'
}
task javadocJar(type: Jar, dependsOn: javadoc) {
classifier = 'javadoc'
from javadoc.destinationDir
}
artifacts {
archives javadocJar
archives sourcesJar
}
3:bintray.gradle主要是用apply plugin: 'com.jfrog.bintray'完成文件的打包上傳到bintray.com
內容:
apply plugin: 'com.jfrog.bintray'
configurations {
optional
compile.extendsFrom optional
}
def siteUrl = project.websiteUrl
def gitUrl = project.vcsUrl
def libName = project.name
group = project.publishedGroupId
version = project.versionName
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
bintray {
user = properties.getProperty("bintray.user")
key = properties.getProperty("bintray.apikey")
configurations = ['archives']
pkg {
repo = project.bintrayRepo //發布到Bintray的maven庫
name = libName //發布到Bintray上的項目名字
desc = project.libraryDesc
override = true
publish = true
publicDownloadNumbers = true
websiteUrl = siteUrl
issueTrackerUrl = project.issueTrackerUrl
vcsUrl = gitUrl
licenses = [project.licenseName]
publish = true
//attributes = ['gradle-plugin': 'com.use.less:com.use.less.gradle:gradle-useless-plugin']
version {
desc = project.libraryVersionDesc
released = new Date()
gpg {
sign = true //Determines whether to GPG sign the files. The default is false
passphrase = properties.getProperty("bintray.gpg.password")
//Optional. The passphrase for GPG signing'
}
}
}
}
6:配置Library的相關信息
在module的build.gradle的最后添加:
ext {
libraryPackaging = 'aar' //上傳aar形式的打包文件
// jcenter
bintrayRepo = "network" // 你上傳的位于bintray中的Repository名稱,如果沒有創建會有一個叫maven的
name = 'asyncokhttp' // 必須和library module的名字相同
libraryDesc = 'A OkHttp Library'
publishedGroupId = 'org.zarroboogs.http.asyncokhttp' // 填寫groupId, 一般是包名,比如:com.android.support
versionName = '1.0.1' // 版本號,比如:22.2.1
websiteUrl = 'https://github.com/andforce/AsyncOkHttp' // 可以填寫github上的庫地址.
issueTrackerUrl = 'https://github.com/andforce/AsyncOkHttp/issues' // 可以填寫github庫的issue地址.
vcsUrl = 'https://github.com/andforce/AsyncOkHttp.git' // 可以填寫github上庫的地址.
licenseName = "Apache-2.0"
libraryVersionDesc = 'version descriotion'
// maven
artifact = 'asyncokhttp' // 必須和library module的名字相同
libraryName = 'asyncokhttp'
developerId = 'anforce'
developerName = 'andforce'
developerEmail = '86118@163.com'
licenseName = 'The Apache Software License, Version 2.0'
licenseUrl = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
}
apply from: 'android-maven-install.gradle'
apply from: 'android-tasks.gradle'
apply from: 'bintray.gradle'
7:運行命令上傳發布的你的Library
在Project的根目錄:
#編譯
./gradlew install
#上傳
./gradlw bintrayUpload
8:手動提交到jcenter
在運行上面的命令之后,我們就可以在bintray的Repo中看到剛剛上傳的Library 了。
image.png
但是這個時候,還沒有正式發布到jcenter,我需要用手主動提交一下:
image.png
點擊Add to JCenter之后,會有一個審核時間,大約24小時后,就可以在JCenter上看到了。
簡化
從上面教程我們可以看到,每次都需要創建和引用3個文件,還是挺麻煩的。
apply from: 'android-maven-install.gradle'
apply from: 'android-tasks.gradle'
apply from: 'bintray.gradle'
為了引用方便,可以把上面三個gradle內容放到一個文件中,這樣引用一行,效果和上面引用3個文件是一樣的
//apply from: 'android-maven-install.gradle
//apply from: 'android-tasks.gradle'
///apply from: 'bintray.gradle'
apply from: 'jcenter.gradle'
這樣每次創建一個文件就好了。
apply from: 'https://raw.githubusercontent.com/andforce/release-android-lib-to-jcenter/master/jcenter.gradle'
最后,之前編譯和上傳的命令,也可以合并成一個了:
#編譯
#./gradlew install
#上傳
#./gradlw bintrayUpload
# 上面的合并成一條
./gradlew jcenter
應用實例
總結
以上是生活随笔為你收集整理的android studio islibrary,通过AndroidStudio发布Android Library到Jcenter[超详细]的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: android studio类重复,An
- 下一篇: 摩尔庄园手游美美鱼有什么用?
