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

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

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

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

  1. 通過(guò)引入子模塊的方式桃笙,配置一個(gè)開關(guān)氏堤,在你需要調(diào)試代碼時(shí)引入子模塊中的源代碼,而發(fā)布時(shí)依賴aar
  2. 通過(guò)maven庫(kù)的方式搏明,不管是本地還是遠(yuǎn)程maven鼠锈,在發(fā)布代碼時(shí)附帶源碼

子模塊方式

這種方式在操作上依賴一個(gè)開關(guān)變量,而我根本不想再多維護(hù)一個(gè)開關(guān)值熏瞄,所以不推薦脚祟。下面還是簡(jiǎn)單說(shuō)明下怎么操作,原本是aar方式依賴强饮,現(xiàn)在改成子模塊方式由桌,如下圖所示:

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

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

testktaar-啟動(dòng)maven服務(wù)成功.png
testktaar-啟動(dòng)maven服務(wù)成功-打開瀏覽器.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屬性配置你也可以不寫到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ù)中

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依賴庫(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)依賴庫(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我有曲梗。


參考:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市虏两,隨后出現(xiàn)的幾起案子愧旦,更是在濱河造成了極大的恐慌,老刑警劉巖定罢,帶你破解...
    沈念sama閱讀 218,640評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件笤虫,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡祖凫,警方通過(guò)查閱死者的電腦和手機(jī)琼蚯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)惠况,“玉大人遭庶,你說(shuō)我怎么就攤上這事〕硗溃” “怎么了峦睡?”我有些...
    開封第一講書人閱讀 165,011評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)完箩。 經(jīng)常有香客問(wèn)我赐俗,道長(zhǎng),這世上最難降的妖魔是什么弊知? 我笑而不...
    開封第一講書人閱讀 58,755評(píng)論 1 294
  • 正文 為了忘掉前任阻逮,我火速辦了婚禮,結(jié)果婚禮上秩彤,老公的妹妹穿的比我還像新娘叔扼。我一直安慰自己事哭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評(píng)論 6 392
  • 文/花漫 我一把揭開白布瓜富。 她就那樣靜靜地躺著鳍咱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪与柑。 梳的紋絲不亂的頭發(fā)上谤辜,一...
    開封第一講書人閱讀 51,610評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音价捧,去河邊找鬼丑念。 笑死,一個(gè)胖子當(dāng)著我的面吹牛结蟋,可吹牛的內(nèi)容都是我干的脯倚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,352評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼嵌屎,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼推正!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起宝惰,我...
    開封第一講書人閱讀 39,257評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤植榕,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后尼夺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體内贮,經(jīng)...
    沈念sama閱讀 45,717評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評(píng)論 3 336
  • 正文 我和宋清朗相戀三年汞斧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了夜郁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,021評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡粘勒,死狀恐怖竞端,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情庙睡,我是刑警寧澤事富,帶...
    沈念sama閱讀 35,735評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站乘陪,受9級(jí)特大地震影響统台,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜啡邑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評(píng)論 3 330
  • 文/蒙蒙 一贱勃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦贵扰、人聲如沸仇穗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)纹坐。三九已至,卻和暖如春舞丛,著一層夾襖步出監(jiān)牢的瞬間耘子,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工球切, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拴还,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,224評(píng)論 3 371
  • 正文 我出身青樓欧聘,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親端盆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子怀骤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評(píng)論 2 355