最新版本Bugly Tinker集成爬坑出坑磨歷

前言

由于2019年時有一個項目接入過?Bugly的熱更新框架,時隔兩年之久,新項目亦即需要接入熱更新方案,我以為有以前的成功接入經(jīng)驗,這次接入會是一個小Case,沒想到還是太小看Bugly官方給布下的坑了,不得不說Bugly官方還是沒說明白需要注意的事項。

Bugly官方的?熱更新接入引導(dǎo)

Bugly官方的引導(dǎo)如下:

Bugly官方引導(dǎo)第一步:添加插件依賴

工程根目錄下“build.gradle”文件中添加:

buildscript{

repositories{

jcenter()

?? }

dependencies{

// tinkersupport插件, 其中l(wèi)astest.release指拉取最新版本,也可以指定明確版本號,例如1.0.4

? ? ? ?classpath "com.tencent.bugly:tinker-support:1.1.5" //看一個坑就在這里了,該版本已經(jīng)是較老的版本了

?? }

}

Bugly發(fā)布的TinkerSupport倉庫地址

從Jcenter的倉庫上可知,TinkerSupport的版本截圖如下:

TinkerSupport插件版本

Bugly官方引導(dǎo)第二步:添加插件依賴,在項目的app?模塊的 build.gradle文件內(nèi)添加:

android {

? ? ? ? defaultConfig {

? ? ? ? ? ndk {

? ? ? ? ? ? //設(shè)置支持的SO庫架構(gòu)

? ? ? ? ? ? abiFilters 'armeabi-v7a' //, 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a'

? ? ? ? ? }

? ? ? ? }

? ? ? }

? ? ? dependencies {

? ? ? ? ? compile "com.android.support:multidex:1.0.1" // 多dex配置

? ? ? ? ? //注釋掉原有bugly的倉庫

? ? ? ? ? //compile 'com.tencent.bugly:crashreport:latest.release'//其中l(wèi)atest.release指代最新版本號,也可以指定明確的版本號,例如1.3.4

? ? ? ? ? compile 'com.tencent.bugly:crashreport_upgrade:1.3.6'

? ? ? ? ? // 指定tinker依賴版本(注:應(yīng)用升級1.3.5版本起,不再內(nèi)置tinker)

? ? ? ? ? compile 'com.tencent.tinker:tinker-android-lib:1.9.9' //你會發(fā)現(xiàn)這個版本又是老的

? ? ? ? ? compile 'com.tencent.bugly:nativecrashreport:latest.release' //其中l(wèi)atest.release指代最新版本號,也可以指定明確的版本號,例如2.2.0

? ? ? }

上面的依賴居然還是 "compile"關(guān)鍵字,都廢棄好多年了。

現(xiàn)在?Tinker官方的版本記錄如圖:

Tinker-android-lib倉庫

tinker-android-lib倉庫

綜上,Bugly官方的接入引導(dǎo)所需要的依賴庫就接入完成了,但是問題產(chǎn)生的其實就是坑一:

classpath "com.tencent.bugly:tinker-support:1.1.5"http://這個版本引起的

? ? ?原因如下:

問題的起因:AndroidStudio?版本引起

由于目前大多數(shù)開發(fā)者,都已經(jīng)將AndroidStudio升級到 4.x版本,當(dāng)我們新建項目時,它給項目的根目前下的build.gradle 自動配置的:

classpath "com.android.tools.build:gradle:4.x.x"

并且當(dāng)我們按Bugly官方的引導(dǎo)接入后,此時?一同步整個工程,直接報錯:

A problem occurred configuring project ':app'.

> Failed to notify project evaluation listener.

? > No such property: variantConfiguration for class: com.android.build.gradle.internal.variant.ApplicationVariantData

? > can't find tinkerProcessDebugManifest, you must init tinker plugin first!????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????


于是乎百度、谷歌,BuglyTinkerDemo大都是說?因為 Tinker還不支持?高版本的 AGP(即classpath? ? ? ? ? "com.android.tools.build:gradle:4.x.x"),

哀嚎聲一片:

有好多開發(fā)者都遇到同樣問題


難受

再找找Tinker,同樣有開發(fā)者遇到同樣的問題:

我也差點要放棄該庫

Tinker官方 issues

Bugly?官方的開發(fā)者也不會回應(yīng);

我也很苦惱,百搜不得其解,加 BuglyQQ群加不進去,急了直接向 Bugly公眾號發(fā)私信也沒用:

實在沒辦法連公眾號都不放過

我也按照其他作者的簡書如下進行修改配置:

Tinker目前還不支持Gradle 5.x,需要降低Gradle版本

1.修改gradle文件夾下的gradle-wrapper.properties版本

distributionUrl=https://services.gradle.org/distributions/gradle-5.6.4-all.zip

2.修改項目根目錄下的build.gradle中g(shù)radle依賴版本為

????????????classpath "com.android.tools.build:gradle:3.5.3"

作者:我吃大西瓜QAQ

鏈接:http://www.itdecent.cn/p/eaae6afaaae3

來源:簡書

著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。


那么就算把?classpath "com.android.tools.build:gradle:3.5.3",也還是同步時報錯:

No such property: variantConfiguration for class: com.android.build.gradle.internal.variant.ApplicationVariantData

再說?"com.android.tools.build:gradle:3.5.3"?這版本實在是有點舊,現(xiàn)在最新的都

"com.android.tools.build:gradle:4.1.3"?了,

真相

其實問題確實是出在 classpath “com.android.tools.build:gradle”的插件版本和 classpath"com.tencent.bugly:tinker-support"?兩個版本不兼容的問題,但是不知道為何Bugly官方不會去提醒注意這個,看騰訊的一些出品的開源項目,里面有些 gradle的腳本和依賴,感覺真是有點老舊,不知道他們是怎么能運行成功的。

最終解決方案

1、不需要?把我們較新的?classpath'com.android.tools.build:gradle:4.x'?降至 3.x

? ? 項目的根目錄的 build.gradle配置如下:

dependencies{

? ? ? ? classpath"org.jetbrains.kotlin:kotlin-gradle-plugin:${KOTLIN_VERSION}"

? ? ? ? classpath'com.android.tools.build:gradle:4.1.3'

? ? ? ? classpath"com.tencent.bugly:tinker-support:1.1.9.3" // bugly對 tinker的支持

? ? }

2、不需要把我們的 gradle wrapper的版本從較新的 :gradle-6.5-all降到 5.x

可以使用最新的gradle版本

3、在?Bugly發(fā)布的TinkerSupport倉庫地址?我使用笨方法,從最高的版本降序該個來試(實在是逼得沒辦法了),結(jié)果在?試驗到:

classpath "com.tencent.bugly:tinker-support:1.1.9.3"

在?項目的 app模塊下都使用最新的版本,如:

dependencies{

? ? implementation"org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"

? ? implementation'androidx.core:core-ktx:1.3.2'

? ? implementation'androidx.appcompat:appcompat:1.2.0'

? ? implementation'com.google.android.material:material:1.2.1'

? ? implementation'androidx.constraintlayout:constraintlayout:2.0.4'

? ? testImplementation'junit:junit:4.13.2'

? ? androidTestImplementation'androidx.test.ext:junit:1.1.2'

? ? androidTestImplementation'androidx.test.espresso:espresso-core:3.3.0'

? ? implementation'com.tencent.bugly:crashreport_upgrade:1.5.1'

? ? // 指定tinker依賴版本(注:應(yīng)用升級1.3.5版本起,不再內(nèi)置tinker)

? ? implementation'com.tencent.tinker:tinker-android-lib:1.9.14.14' //大膽使用最新的版本

? ? implementation'com.tencent.bugly:nativecrashreport:3.9.1' //其中l(wèi)atest.release指代最新版本號,也可以指定明確的版本

}

結(jié)果一同步,居然沒有馬上失敗,同步發(fā)了好久的時間,我就知道,呵呵,看來是沒問題了。

最后,跑一個 debug項目包,Tinker生成的 bakapp也出來了

終于OK了

總結(jié)/感慨

1、class "com.android.tools.build:gradle:"?的插件源碼對開發(fā)者來說像是一個黑盒,大量的API可能知其然,而不知其所以然;

2、其實?項目如果直接集成 Tinker(最新版本的話)是能成功了,也不需要各種降版本,但是輸出的 patch包卻需要自己管理、下載、維護,不方便,還是Bugly的 patch包分發(fā)方便;

3、gradle?的API不熟練啊,還是得多加油學(xué)學(xué);

番外

如果能幫到你,有空來 我的GitHub?轉(zhuǎn)轉(zhuǎn)吧,寫的一些東西可能對你有點幫助

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

相關(guān)閱讀更多精彩內(nèi)容

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