現(xiàn)在有個(gè)這樣的場(chǎng)景,需要你編寫(xiě)一個(gè)基礎(chǔ)庫(kù)sdk供上層業(yè)務(wù)調(diào)用,同時(shí)考慮引入kotlin,于是你花了3分鐘很快就把所有的代碼寫(xiě)完了,然后assembleRelease輸出aar,再引入aar到主工程中。此時(shí)你想在主工程中結(jié)合業(yè)務(wù)調(diào)試下剛寫(xiě)完的kt代碼,發(fā)現(xiàn)沒(méi)法debug,效果如下所示:

由于項(xiàng)目時(shí)間關(guān)系,在我遇到這個(gè)問(wèn)題時(shí)由于代碼量不大,立馬就將kt編寫(xiě)改成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è)開(kāi)關(guān),在你需要調(diào)試代碼時(shí)引入子模塊中的源代碼,而發(fā)布時(shí)依賴(lài)aar
- 通過(guò)maven庫(kù)的方式,不管是本地還是遠(yuǎn)程maven,在發(fā)布代碼時(shí)附帶源碼
子模塊方式
這種方式在操作上依賴(lài)一個(gè)開(kāi)關(guān)變量,而我根本不想再多維護(hù)一個(gè)開(kāi)關(guān)值,所以不推薦。下面還是簡(jiǎn)單說(shuō)明下怎么操作,原本是aar方式依賴(lài),現(xiàn)在改成子模塊方式,如下圖所示:

include 'basic-net'
project(':basic-net').projectDir = new File(settingsDir, '../TestKtAarLib/basic-net')
這種方式明目張膽把源碼依賴(lài)進(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ù)起好了,然后你就打開(kāi) 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屬性配置你也可以不寫(xiě)到gradle.properties中,而是放到每個(gè)module下分類(lèi)管理更好。
#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依賴(lài)庫(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)依賴(lài)庫(kù)后報(bào)很多奇怪的問(wèn)題,比如重復(fù)引入的問(wèn)題、依賴(lài)傳遞的問(wèn)題等等,而這些就依賴(lài)我們自己解決問(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我有。
參考: