疑難雜癥記錄1:關(guān)于Kotlin aar文件不能debug的問(wèn)題

現(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,效果如下所示:

testktaar-kt源碼被編譯成class文件.png

由于項(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)題有兩種解決方式:

  1. 通過(guò)引入子模塊的方式,配置一個(gè)開(kāi)關(guān),在你需要調(diào)試代碼時(shí)引入子模塊中的源代碼,而發(fā)布時(shí)依賴(lài)aar
  2. 通過(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)在改成子模塊方式,如下圖所示:

testktaar-basic-net-aar轉(zhuǎn)子模塊依賴(lài)方式.png
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/

testktaar-啟動(dòng)maven服務(wù).png

testktaar-啟動(dòng)maven服務(wù)成功.png
testktaar-啟動(dòng)maven服務(wù)成功-打開(kāi)瀏覽器.png

接著登錄進(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ù)中

testktaar-發(fā)布aar到maven倉(cāng)庫(kù).png
testktaar-sonatype-發(fā)布成功.png

工程配置和發(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界面,真香

testktaar-debug-maven庫(kù).png

后記

我這套示例程序的環(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我有。


參考:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容