SDK開發(fā),經(jīng)常需要在使用者(host)環(huán)境下調(diào)試,測試。我們通常的做法是,將SDK發(fā)布到本地,然后拿到host代碼,host依賴本地SDK版本,編譯host,然后安裝調(diào)試
-
這個做法的缺點:
- 你需要去申請host代碼權(quán)限
- host代碼構(gòu)建復(fù)雜,因為不熟悉,你并不一定能構(gòu)建成功
- host代碼臃腫,構(gòu)建特別慢,很多時候,我們的時間浪費在host的構(gòu)建上
-
改進思路:
- 能否直接將SDK的代碼更新到host apk里,而不去編譯整個app
-
新方法的要求:
- android studio IDE
- android gradle tool 插件版本:3.0.0 - 3.4.0
-
新方法的限制:
- 只能更新SDK工程里java和native代碼,不包括再依賴的第三方庫,不支持資源
- SDK工程里的java和引用到的庫,沒有被host混淆
-
新方法的優(yōu)點:
- 可以將release apk變成debuggable apk
- 支持?jǐn)帱c調(diào)試SDK的native代碼。(請在SDK Manager 中安裝LLDB)
-
新方法的使用:
- 將下面代碼復(fù)制到SDK工程根目錄的setting.gradle,注意classpath 'com.android.tools.build:gradle:3.0.1' 必須與根目錄中的build.gradle相同,確保根目錄build.gradle中的repositories也加上了jcenter()
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath "com.ydq.android.gradle.build.tool:debughelper:1.0.1"
classpath 'com.android.tools.build:gradle:3.0.1'
}
configurations.all {
// check for updates every build
resolutionStrategy.cacheDynamicVersionsFor 0, 'seconds'
resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
}
}
ext {
hostApk = "${rootDir}/test.apk"
//hostFlavor = "audio"
//updateJavaClass = false
//modifyApkDebuggable = false
//hostLaunchActivity = "com.ydq.test.demo.MainActivity"
//excludeSo = "libxx.so;libyy.so"
}
apply plugin: 'com.ydq.android.gradle.debug.helper'
- 指定要調(diào)試的apk路徑給hostApk
- 如果SDK使用了flavor,指定host所依賴的flavor名字
- 如果只想更新native,設(shè)置updateJavaClass為false,默認(rèn)是true
- 如果不想將apk變成可調(diào)試的,設(shè)置modifyApkDebuggable為false,默認(rèn)是true。有些release版APP會檢查這個標(biāo)志,當(dāng)發(fā)現(xiàn)變成可調(diào)試時,就會退出。
- 如果apk中有多個可啟動activity,請指定默認(rèn)啟動的activity
- 設(shè)置excludeSo,如果不想將一些so更新到host apk中,以分號劃分多個so
- 當(dāng)配置好后,上面腳本會自動生成一個dummyHost的app項目到你的工程,選擇這個項目,然后運行/調(diào)試。
- 當(dāng)host信息有所改變時,也就是ext里的信息有所改變,或是host apk更新了,請clean整個工程
- 如果在sync項目時出現(xiàn)了奇怪的錯誤,請關(guān)掉項目,手動將dummyHost和.idea目錄刪掉,重新打開項目