我的GitHub | 我的博客 | 我的微信 | 我的郵箱 |
---|---|---|---|
baiqiantao | baiqiantao | bqt20094 | baiqiantao@sina.com |
目錄
通過 AS 創建 aar 的步驟
aar
文件是 Google 為 Android 開發所設計的一種library
格式,全名為Android Archive Library
,與Java Jar Library
不同的是,aar 除了 java code 之外還包含資源文件。
1、創建一個新的普通 Android 工程(New Project 而不是 New Module),修改module
層的build.gradle
文件,刪除 applicationId
,將apply plugin: 'com.android.application'
改成 apply plugin: 'com.android.library'
,然后同步
如果嫌上述操作太麻煩,可以這么做:創建一個普通的 Android 工程,刪除 app module,然后 new 一個 library module
2、執行 gradle 命令gradle assembleRelease
,或者點擊菜單 Build > Make Project
,執行完以后可以看到 project-name/module-name/build/outputs/aar/
文件夾下生成了.aar
文件
3、此.aar
文件除了包含 class 文件外,還包含各種資源文件,例如我們解壓后發現其包含如下內容:
使用 mavenDeployer 發布到 GitHub 倉庫【推薦】
Maven作為目前Java界最好的Dependency管理系統,把jar包托管到Maven中央庫,然后通過Maven Dependency使用是目前業界各種第三方庫的普遍做法。如果你想把自己開發的一些庫分享給別人使用,也可以遵循這樣的套路。Gradle可以看做是升級版的Maven,其使用了Maven最優秀的Dependency管理系統,但是,又規避了Maven的 build pipeline 的刻板和xml格式配置文件等缺點,可以說是目前Java界最好的構建工具。下面就來說說,如何使用Gradle把自己開發的jar包部署到Maven中央庫中。
創建項目
創建一個普通的 Android 項目,然后創建一個 library。
因為這個項目中的 app 模塊實際上是用不到的,所以,我們可以直接刪除 app 模塊,此時 settings.gradle
中只有我們的 library :
include 'log'
接下來,在 library 中編寫你的代碼即可。
配置項目
代碼編寫完成后,在 library 模塊的build.gradle
末尾添加以下代碼:
//********************************************************************** 打包發布
apply plugin: 'maven'
uploadArchives {
def GITHUB_REPO_PATH = "../" //生成的aar文件的保存目錄,建議放在project根目錄,也可以放在任意目錄
repositories.mavenDeployer {
repository(url: "file://${file(GITHUB_REPO_PATH).absolutePath}")
pom.project { //引用時的格式為【implementation 'com.bqt:aop-log:1.0.0'】
groupId 'com.bqt'
artifactId 'aop-log'
version '1.0.0' //當你的庫需要修改時,只需更改此版本號即可
}
}
}
// 和源代碼一起打包
task androidSourcesJar(type: Jar) {
classifier = 'sources'
from android.sourceSets.main.java.sourceFiles
}
artifacts {
archives androidSourcesJar
}
構建並上傳
在 Gradle > app > Tasks > upload > 雙擊 uploadArchives
或者使用命令行進入到項目的根目錄后,執行以下命令:
gradlew uploadArchives
然后等待編譯完成:
Executing tasks: [uploadArchives]
...
BUILD SUCCESSFUL in 6s
26 actionable tasks: 23 executed, 3 up-to-date
16:18:38: Task execution finished 'uploadArchives'.
編譯完成后會在你指定的目錄下生成以下四個文件:
上傳到 GitHub
在 Github 上創建一個倉庫用於存放生成的 aar 等文件,例如 [aop_log]
把倉庫clone
到本地,將生成的 aar 文件拷到這個倉庫中,當然也可以將整個工程拷貝到這個倉庫中(這樣的話項目源碼就可以和 aar 一起提交到一個項目中了),然后 add、commit、push。
當升級版本時,只需將新版本的內容添加到倉庫即可,不要刪除舊版本的內容:
使用此庫
在需要使用此庫的 project
的 build.gradle
中添加以下代碼:
allprojects {
repositories {
//... 【baiqiantao】為用戶名,【aop_log】為項目名,其他為固定值
maven { url "https://raw.githubusercontent.com/baiqiantao/aop_log/master" }
}
}
在需要使用此庫的module的 build.gradle
中添加如下依賴:
implementation 'com.bqt:aop-log:1.0.2'
然后就可以愉快的使用庫了。
使用 JitPack 發布到自定義 maven 倉庫【推薦】
Easy to use package repository for Git
Publish your JVM and Android libraries
Modification修改 to the standard標准 Maven plugin to be compatible兼容 with android-library projects (aar).
支持 GitHub 和 碼雲 上的項目
在 jcenter
、maven center
平台上發布代碼需要注冊、登錄、提交代碼、審核.....等復雜冗長的流程,而 JitPack
實際上是一個自定義的 Maven 倉庫,不過它的流程極度簡化,在其平台上發布項目無需注冊申請,只需要輸入 Github 項目地址然后點擊get it
即可。
創建及配置項目
1、在 GitHub 上創建倉庫代碼,clone 項目到本地
2、在此倉庫中創建一個 Android 的項目,然后創建一個 library module,並刪除 app 模塊
3、在項目的根目錄的build.gradle
里面添加:
classpath 'com.android.tools.build:gradle:3.3.0'
classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1'
可用的版本及使用條件詳見 官方文檔
注意,使用最新版的 gradle 時,很可能會因 JitPack 還沒有適配導致失敗!
4、在 library 模塊的build.gradle
里面添加:
apply plugin: 'com.github.dcendents.android-maven'
5、在 library 中編寫代碼,最后提交到 GitHub 倉庫中即可
創建 GitHub release 版本
提交代碼后返回到 GitHub 倉庫后,點擊releases
創建一個發布版本
填寫版本號、標題、描述、是否是預發布等信息,最后點擊確定即可。
這時候我們就可以去 JitPack官網 操作了
提交 release 版本到 JitPack
拷貝GitHub上倉庫地址,例如 aop_log,將拷貝的地址粘貼到搜索框,點擊Lookup
就會找到我們的項目:
上圖中有四個 TAB,分別為:
Releases
:代表一個發布版本,JitPack 不會自動幫我們構建,只有第一次被用戶引用並構建完成才能使用Builds
:代表一次構建,JitPack 會自動幫我們構建,產生的版本不帶v
,例如0.1
而非v0.1
Branches
:代表某一分支,JitPack 不會自動幫我們構建Commits
:代表某一此提交,JitPack 不會自動幫我們構建
其中有3個重要的字段:
version
:指你在Github
上發布項目時候填寫的release tag
,后面帶着你提交是添加的日志log
:JitPack編譯你的項目生成的日志文件,綠色表示 ok,紅色表示編譯錯誤;點擊圖標可以查看詳細編譯信息status
:表示當前項目的狀態,如果編譯通過顯示的是綠色的Get it
,表示可以使用,如果編譯有問題,那么則顯示Report
,你可以點擊Report
去提交你的 log 並描述一下你的問題,Jitpack 會給你答復
當你的 status 為綠色他的Get it
的時候,那么說明是可以使用的。點擊一下該按鈕,根據提示使用就可以了。
Jitpack 會為我們的項目生成一個帶版本信息的小圖片,點擊此圖片將顯示的代碼拷貝到你 GitHub 倉庫的Readme.md
里面去就可以顯示徽章了
當我們的庫升級時,這個徽章會自動顯示最新的版本。
使用我們創建好的倉庫
1、根目錄build.gradle
添加:
allprojects {
repositories {
google()
jcenter()
maven { url 'https://www.jitpack.io' }
}
}
2、在需要引用此庫的 module 的build.gradle
里面添加:
implementation 'com.github.baiqiantao:aartest:0.4'
然后即可使用庫中的內容了
提示我版本過低解決方案
我一切都是使用的最新版,但一直報錯,報錯信息如下:
FAILURE: Build failed with an exception.
* Where:
Build file '/home/jitpack/build/bqtutils/build.gradle' line: 1
* What went wrong:
A problem occurred evaluating project ':bqtutils'.
> Failed to apply plugin [id 'com.android.library']
> Minimum supported Gradle version is 4.10.1. Current version is 4.8.1. If using the gradle wrapper, try editing the distributionUrl in /home/jitpack/build/gradle/wrapper/gradle-wrapper.properties to gradle-4.10.1-all.zip
解決方案:
- 先降低
gradle:3.3.0
為gradle:3.1.2
- 同時降低
gradle-4.10.1
為gradle-4.4
- 同時降低
android-maven-gradle-plugin:2.1
為android-maven-gradle-plugin:2.0
- 同步之后發現OK了,然后再一個個都更新到最新版就可以了!
使用 bintray-release 發布到 Jcenter 倉庫【問題多】
實際體驗:從注冊到配置各種垃圾異常,新版本 AndroidStudio + gradle 根本不成功!純屬垃圾東西!浪費時間!
Super duper(極其出色的) easy way to release your Android and other artifacts to bintray.
This is a helper for releasing libraries to bintray. It is intended to help configuring stuff(材料) related to maven and bintray. At the moment(目前) it works with Android Library projects, plain(普通的) Java and plain Groovy projects, but our focus is to mainly support(主要支持) Android projects.
注冊 bintray 賬號
賬號信息
baiqiantao@gmail.com
baiqt
注意事項:
- 注意,千萬不要直接使用官網中的地址去注冊,因為官網注冊默認是組織,有30天試用期,之后要付費,而且發布時候各種問題,我們應該使用 正確的注冊地址 去注冊。如果不小心注冊了企業賬號,也可以注銷再重新注冊個人賬號
- 注意,這爛貨支持的郵箱不全,不支持帶數字的郵箱,用163和qq的都不行,實測gmail、sina、foxmail可以用
- 注意,注冊的時候可能非常非常慢,如果耗時過長,可以重新再試一次
注冊完成后,需要郵箱激活,然后就可以登錄了。
創建 maven 倉庫
登錄完成后會進入個人主頁面,看下自己的倉庫下面有沒有一個名為maven
的倉庫(一般都沒有),如果沒有,我們需要創建一個名為maven
的倉庫。
設置倉庫為Public
(個人版只能設為Public
),Name填寫為maven
,類型Type設置Maven
,其他的隨意。一般 Default Licenses 協議,選擇Apache-2.0
,Description 描述,自由填寫。
然后點擊Create,稍等幾秒鍾,就完成創建,然后回到主頁,在 Add New Repository 位置就可以看到創建的maven倉庫。
然后點擊右上角頭像 -> Edit Profile -> API Key -> 輸入密碼,然后就能看到你一段 key 字符串,把這個 copy 下放一邊,一會上傳要用。
f863932f739376a6b5199793c9110ece9566b7a3
項目配置
project 的配置
在項目的build.gradle
中添加如下配置
1、添加bintray-release
的classpath
:
buildscript {
//...
dependencies {
classpath 'com.novoda:bintray-release:0.9'
}
}
2、為了能將統一的配置用在多個module中,我們可以添加一個 ext:
ext {
userOrg = 'baiqt'//用戶名,確定你這里用的是用戶名
groupId = 'com.bqt'//Jcenter上的路徑
publishVersion = '1.0.0'//版本號,如果需要更新,只需修改下版本號就可以了,其他什么都不用動
repoName='maven' //倉庫名
desc = '日志埋點' //描述
website = 'http://www.cnblogs.com/baiqiantao' //網站
licences = ['Apache-2.0'] //協議
}
library 的配置
1、在要上傳的 module 的build.gradle
中添加如下配置:
apply plugin: 'com.novoda.bintray-release'
publish {
artifactId = 'aop-log' //項目名稱
userOrg = rootProject.userOrg
groupId = rootProject.groupId
publishVersion = rootProject.publishVersion
repoName = rootProject.repoName
desc = rootProject.desc
website = rootProject.website
licences = rootProject.licences
}
如果同時需要上傳多個moudle,例如編譯時注解的項目一般至少會包括注解處理器module、注解定義module,我們在上傳時,這2個module都要進行上傳。那么這幾個moudle的配置是一樣的,唯一不同的就是publish中的artifactId
,不同的module應該有它不同的名字。
最終引入的方式為:
implementation 'com.bqt:aop-log:1.0.0
2、解決常見問題的配置
android {
//...
lintOptions {//錯誤的時候不停止
abortOnError false
}
allprojects {
tasks.withType(JavaCompile) { //注釋中如果有中文,可能會出現異常,設置全局編碼
options.encoding = "UTF-8"
}
tasks.withType(Javadoc) {
options.addStringOption('Xdoclint:none', '-quiet')
options.addStringOption('encoding', 'UTF-8')
}
}
}
有的建議這么配置:
allprojects {
//...
tasks.withType(Javadoc) {
options {
encoding "UTF-8"
charSet 'UTF-8'
links "http://docs.oracle.com/javase/7/docs/api"
}
}
}
publish 閉包的屬性
publish
閉包包含所有這些屬性。默認值為空,除非另有規定:
userOrg
: 包含用於上傳的組織名稱。[也就是bintray用戶名]repoName
: 代碼倉庫名稱。 默認設置為“maven”。[即:支持非maven名稱命名的maven類型倉庫]groupId
: 用於上傳的group id。artifactId
: 使用的artifactId。publishVersion
: 含有版本號的字符串。 不能以“-SNAPSHOT”結尾,因為bintray不支持snapshots。licences
: 項目的許可證標識符列表。 標識符可以在這里找到:http://spdx.org/licenses/,默認值為['Apache-2.0']
。uploadName
: bintray中包的顯示名稱。 如果沒有設置,artifactId
將用於作為包名稱。desc
: 在bintray中項目的簡短描述。website
: 一個與該項目網址相關的URL字符串。可以在這里使用Github 倉庫。issueTracker
: 配置該項目用於問題跟蹤的URL。 如果website
包含'github.com'
那么這個屬性默認被設置為"${website}/issues"
。repository
: 配置項目VCS的URL。 如果website
包含'github.com'
,則此項默認設置為"${website}.git"
。autoPublish
: 此布爾值定義上傳時是否自動發布包。 如果配置為“假”,該包仍將被上傳到bintray,但您必須手動發布。 默認值為“true”。bintrayUser
: 用於上傳的用戶名。bintrayKey
: 用戶帳戶的bintray API密鑰。 在這里可以找到這個值的說明https://bintray.com/docs/usermanual/interacting/interacting_apikeys.htmldryRun
: 如果設置為“true”,則將運行所有內容,但不會將包上傳到bintray。 如果“false”,那么它將正常上傳。publications
: 用於上傳的publication名稱列表。 默認值為['maven']
,這是這個插件為你創建的一個publication。 您可以定義自己的出版物,更多信息在wiki頁面中。
執行 gradlew 命令進行上傳
執行下面的代碼即可上傳:
gradlew clean build bintrayUpload -PbintrayUser=baiqt -PbintrayKey=f863932f739376a6b5199793c9110ece9566b7a3 -PdryRun=false
其中:
user
用戶名,確定你這里用的是用戶名key
就是我們剛才的讓你保存的keydryRun
為false代表要上傳
當運行完成,看到BUILD SUCCESSFUL
就沒問題了,到此就上傳完成了。
注意:
- 上傳時可能需要KXSW
- 在上傳的過程中提示失敗為
org.apache.http.conn.HttpHostConnectException: Connection to https://api.bintray.com refused
,這個是網絡的問題,多重新上傳幾次,可能是要上傳10多次 - 上傳時可能會遇到各種各樣、各種各樣、各種各樣、各種各樣、各種各樣的異常,草泥馬!
上傳后訪問https://bintray.com/用戶名/maven
,例如 baiqt 即可看到我們上傳的項目了,你可以點擊進去看該庫的一些信息。
關聯到 Jcenter 並等待審核
注意此時我們的庫還不能夠直接被引用,點擊進去該庫,按照下圖,點擊Add To jcenter
然后隨便寫一下對你該庫的描述,然后點擊發送就可以了。接下來就是等 bintray 的工作人員審核了,審核通過會給你發送站內Message,並且Add to Jcenter
那個按鈕就消失了。
你還可以根據你上傳的groupId,訪問https://jcenter.bintray.com/你的groupId
例如 baiqiantao
如果同時上傳了多個module,審核成功后你會發現這幾個module都會被同步到jcenter上。
如果在bintray中找不到 add to Jcenter,可能是因為你注冊的是企業賬號,可以取消重新注冊為個人賬號
使用 gradle-bintray-plugin 發布到 Jcenter 倉庫【麻煩】
gradle-bintray-plugin 倉庫地址
android-maven-gradle-plugin 倉庫地址
android-maven-plugin 倉庫地址
使用體驗:上傳個庫麻煩到喪心病狂、令人發指的地步,為什么這樣垃圾的東西都能存在?
注冊賬號
注冊賬號等步驟和上面的一樣。
project 的配置
在 project 的build.gradle
中添加如下配置
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4'
classpath 'com.github.dcendents:android-maven-plugin:1.2'
//classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
library 的配置
在要上傳的 module 的build.gradle
中添加如下配置:
apply plugin: 'com.github.dcendents.android-maven'
apply plugin: 'com.jfrog.bintray'
一些共用參數:
def siteUrl = 'https://github.com/openproject/LessCode' // project homepage
def gitUrl = 'https://github.com/openproject/LessCode.git' // project git
group = "com.jayfeng" // Maven Group ID
完整的build.gradle
,請參考 build.gradle
定義 pom 並打包 aar
上傳到 jcenter 至少需要四個文件,除了打包的 aar 之外,還需要 pom 和 javadoc、source,否則是通不過jcenter審核的,不過這些我們都可以用腳本生成:
install {
repositories.mavenInstaller {
pom {
project {
packaging 'aar'
name 'Less Code For Android' // project title
url siteUrl
licenses {
license {
name 'The Apache Software License, Version 2.0'
url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
}
}
developers {
developer {
id 'jayfeng' // your user id (you can write your nickname)
name 'jian.feng' // your user name
email '673592063@qq.com' // your email
}
}
scm {
connection gitUrl
developerConnection gitUrl
url siteUrl
}
}
}
}
}
打包 javadocjar 和 sourcejar
這兩個也是上傳到jcenter必須要的:
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))
}
task javadocJar(type: Jar, dependsOn: javadoc) {
classifier = 'javadoc'
from javadoc.destinationDir
}
artifacts {
// archives javadocJar
archives sourcesJar
}
上傳到 Jcenter 倉庫
上傳到jcenter
的網站 BinTray,需要用戶驗證,需要2個值:
bintray.user=openproject
bintray.apikey=c5434272d522d35d1a0123459981225564155753
因為這個屬於個人隱私,一般不能傳到網上去,所以需要在記錄到 LessCode 下的local.properties
中(利用gitignore
忽略這個文件到git),然后腳本再從local.properties
中讀取這兩個值:
Properties properties = new Properties()
boolean isHasFile = false
if (project.rootProject.file('local.properties') != null){
isHasFile = true
properties.load(project.rootProject.file('local.properties').newDataInputStream())
}
bintray {
user = isHasFile ? properties.getProperty("bintray.user") : System.getenv("bintray.user")
key = isHasFile ? properties.getProperty("bintray.apikey") : System.getenv("bintray.apikey")
configurations = ['archives']
pkg {
repo = "maven"
name = "lesscode" // #CONFIG# project name in jcenter
websiteUrl = siteUrl
vcsUrl = gitUrl
licenses = ["Apache-2.0"]
publish = true
}
}
執行 gradle 任務
根據上面的build.gradle
,會產生幾個特別的gradle
任務,通過gradew
執行這些任務即可:
gradew javadocJar
gradew sourcesJar
gradew install
gradew bintrayUpload
或者通過 AS 的最右邊欄的 Gradle 窗口分別可視化操作,點擊執行。
請求審核
當 bintrayUpload 成功之后,在 我的主頁 右下部分 Latest Activity 塊,會看到你提交了一個項目,從這 Latest Activity 列表中點擊你的項目,進入 詳情頁,找到 Maven Central 標簽,鼠標放上去它會提示你去提交審核,點擊進入后,隨便寫什么都可以了。
只要上面沒問題,一般審核很快,幾個小時就差不多了。
我的情況稍微波折一點,第一個版本0.0.1沒有傳javadocjar和sourcejar,等了半天,管理員站內信通知審核失敗,再傳的話需要升級到0.0.2,否則0.0.1已經存在不能重復上傳。
0.0.2版本上傳后,等了半天,管理員告訴我0.0.2版本OK了,但是0.0.1版本還是沒上傳,於是我找了找能不能刪了0.0.1版本,是可以刪除的,這樣的話其實前面沒必要升級到0.0.2了,刪了重新上傳0.0.1也是可以的。
刪了之后,還是要按上面的步驟重新發請求審核,等了幾個小時就通過了。
這次審核通過了,后面升級就不用再審核了。
第三方引用
implementation 'com.jayfeng.lesscode:lesscode-core:0.1.2'
2020-04-15