現(xiàn)在有個(gè)這樣的場(chǎng)景,需要你編寫一個(gè)基礎(chǔ)庫(kù)sdk供上層業(yè)務(wù)調(diào)用窿祥,同時(shí)考慮引入kotlin,于是你花了3分鐘很快就把所有的代碼寫完了,然后assembleRelease輸出aar放典,再引入aar到主工程中。此時(shí)你想在主工程中結(jié)合業(yè)務(wù)調(diào)試下剛寫完的kt代碼基茵,發(fā)現(xiàn)沒(méi)法debug奋构,效果如下所示:
由于項(xiàng)目時(shí)間關(guān)系,在我遇到這個(gè)問(wèn)題時(shí)由于代碼量不大拱层,立馬就將kt編寫改成java了弥臼。但java語(yǔ)法在某些場(chǎng)景下實(shí)在太羅嗦,同時(shí)為了引入kt的協(xié)程特性根灯,如果我要繼續(xù)在基礎(chǔ)庫(kù)中使用kt径缅,前提條件是需要解決kt的aar包不能debug的問(wèn)題。
解決問(wèn)題的過(guò)程總是那么曲折不順烙肺,解決問(wèn)題后的感受總是那么神清氣爽纳猪。先說(shuō)結(jié)論,這個(gè)問(wèn)題有兩種解決方式:
- 通過(guò)引入子模塊的方式桃笙,配置一個(gè)開關(guān)氏堤,在你需要調(diào)試代碼時(shí)引入子模塊中的源代碼,而發(fā)布時(shí)依賴aar
- 通過(guò)maven庫(kù)的方式搏明,不管是本地還是遠(yuǎn)程maven鼠锈,在發(fā)布代碼時(shí)附帶源碼
子模塊方式
這種方式在操作上依賴一個(gè)開關(guān)變量,而我根本不想再多維護(hù)一個(gè)開關(guān)值熏瞄,所以不推薦脚祟。下面還是簡(jiǎn)單說(shuō)明下怎么操作,原本是aar方式依賴强饮,現(xiàn)在改成子模塊方式由桌,如下圖所示:
include 'basic-net'
project(':basic-net').projectDir = new File(settingsDir, '../TestKtAarLib/basic-net')
這種方式明目張膽把源碼依賴進(jìn)來(lái)了,實(shí)在找不到借口不能debug了邮丰。說(shuō)了這么多不好行您,其實(shí)還是有優(yōu)點(diǎn)的,你可以及時(shí)修改源碼來(lái)佐證自己的想法剪廉,但僅僅是佐證而已娃循,如果這套基礎(chǔ)庫(kù)代碼不是你維護(hù)的,或者你們有明確分工斗蒋,不建議你修改后commit捌斧。
maven庫(kù)方式
推薦采用這種方式笛质,原因很簡(jiǎn)單,發(fā)布完后不用管事了捞蚂,上層業(yè)務(wù)使用的同學(xué)權(quán)限也僅僅是debug級(jí)別妇押,不會(huì)由于一些莫名其妙的原因修改了你的代碼而不自知。
下面我以線上maven庫(kù)的方式為例姓迅,首先要弄個(gè)maven服務(wù)敲霍,去 這里下載,提取碼:hcxu 丁存,完事之后解壓肩杈,cmd 進(jìn)入到這個(gè)目錄:nexus-3.22.0-02-win64\nexus-3.22.0-02\bin>,windows系統(tǒng)下運(yùn)行命令 nexus.exe /run解寝,別著急等待一下扩然,看到 Started Sonatype Nexus OSS 3.22.0-02 這句話就代表服務(wù)起好了,然后你就打開 http://localhost:8081/
接著登錄進(jìn)去(admin/admin123)编丘,然后拷貝maven-releases和maven-snapshots這兩個(gè)倉(cāng)庫(kù)的地址:
maven服務(wù)這部分算是完事了与学,下面來(lái)看工程中怎么配置,在gradle.properties中配置maven的pom屬性以及maven倉(cāng)庫(kù)地址和賬密嘉抓。maven的pom屬性配置你也可以不寫到gradle.properties中索守,而是放到每個(gè)module下分類管理更好。
#MAVEN需要的配置
PROJ_GROUP_ID = com.leeeyou.testktaar.basic.net
PROJ_ARTIFACTID = basic-net
PROJ_VERSION = 1.1.0
PROJ_DESCRIPTION =test kt aar debug
PROJ_TYPE = aar
#這里是maven地址和賬密
MAVEN_REPO_RELEASE_URL=http://localhost:8081/repository/maven-releases/
MAVEN_REPO_SNAPSHOT_URL=http://localhost:8081/repository/maven-snapshots/
NEXUS_USERNAME=admin
NEXUS_PASSWORD=oooo9999
現(xiàn)在準(zhǔn)備一個(gè)maven_push.gradle用于發(fā)布aar和源碼到maven倉(cāng)庫(kù)中抑片,同時(shí)在build.gradle中引入該文件:apply from: 'maven_push.gradle'
apply plugin: 'maven'
apply plugin: 'signing'
configurations {
deployerJars
}
repositories {
mavenCentral()
}
// 判斷版本是Release or Snapshots
def isReleaseBuild() {
return !PROJ_VERSION.contains("SNAPSHOT");
}
// 獲取倉(cāng)庫(kù)url
def getRepositoryUrl() {
return isReleaseBuild() ? MAVEN_REPO_RELEASE_URL : MAVEN_REPO_SNAPSHOT_URL;
}
uploadArchives {
repositories {
mavenDeployer {
beforeDeployment {
MavenDeployment deployment -> signing.signPom(deployment)
}
pom.version = PROJ_VERSION
pom.artifactId = PROJ_ARTIFACTID
pom.groupId = PROJ_GROUP_ID
repository(url: getRepositoryUrl()) {
authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD) // maven授權(quán)信息
}
}
}
}
// 進(jìn)行數(shù)字簽名
signing {
// 當(dāng) 發(fā)布版本 & 存在"uploadArchives"任務(wù)時(shí)卵佛,才執(zhí)行
required { isReleaseBuild() && gradle.taskGraph.hasTask("uploadArchives") }
sign configurations.archives
}
//上傳源碼
task androidSourcesJar(type: Jar) {
classifier = 'sources'
from android.sourceSets.main.java.srcDirs
}
artifacts {
archives androidSourcesJar
}
最后執(zhí)行uploadArchives任務(wù)后,發(fā)現(xiàn)aar以及源碼成功發(fā)布到了倉(cāng)庫(kù)中
工程配置和發(fā)布到maven倉(cāng)庫(kù)這部分算是完事了敞斋,接下來(lái)就是使用剛發(fā)布的aar截汪。首先在根build.gradle中配置倉(cāng)庫(kù)地址,然后在具體的module中引入basic-net依賴庫(kù)植捎,同步一下衙解,正常情況下能成功拉下代碼。
//根build.gradle
maven {
url 'http://localhost:8081/repository/maven-releases/'
}
//module的build.gradle
implementation 'com.leeeyou.testktaar.basic.net:basic-net:1.1.0'
此時(shí)我已成功拉下了1.1.0版本的代碼焰枢,測(cè)試是包含源碼的蚓峦,所以我可以隨意debug NetRequest的post和get函數(shù)。久違的debug界面济锄,真香
后記
我這套示例程序的環(huán)境如干凈的貝加爾湖水暑椰,而你的工程環(huán)境如同你小區(qū)的垃圾堆臟亂不堪。這里沒(méi)有貶低之意荐绝,只是環(huán)境的簡(jiǎn)單和復(fù)雜會(huì)在你引進(jìn)依賴庫(kù)后報(bào)很多奇怪的問(wèn)題一汽,比如重復(fù)引入的問(wèn)題、依賴傳遞的問(wèn)題等等低滩,而這些就依賴我們自己解決問(wèn)題的能力了召夹。
上面sonatype的使用也是最簡(jiǎn)單的岩喷,它還有很多復(fù)雜的功能,比如權(quán)限监憎、分組等均驶,這些如果你要用到再找資料也不遲。多提一嘴枫虏,在拉倉(cāng)庫(kù)代碼時(shí),可能會(huì)失敗報(bào)錯(cuò):Repository does not allow updating assets爬虱,此時(shí)你就進(jìn)入sonatype的配置頁(yè)允許匿名訪問(wèn)就ok了隶债。
總的來(lái)說(shuō),想要debug某個(gè)aar庫(kù)跑筝,想辦法搞到源碼死讹,源碼在手,debug我有曲梗。
參考: