前言
由于2019年時有一個項目接入過?Bugly的熱更新框架精肃,時隔兩年之久司抱,新項目亦即需要接入熱更新方案黎烈,我以為有以前的成功接入經(jīng)驗,這次接入會是一個小Case武翎,沒想到還是太小看Bugly官方給布下的坑了,不得不說Bugly官方還是沒說明白需要注意的事項溶锭。
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)是較老的版本了
?? }
}
從Jcenter的倉庫上可知毫痕,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官方的版本記錄如圖:
綜上族奢,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")拾因,
哀嚎聲一片:
再找找Tinker绢记,同樣有開發(fā)者遇到同樣的問題:
Bugly?官方的開發(fā)者也不會回應(yīng);
我也很苦惱正卧,百搜不得其解,加 BuglyQQ群加不進(jìn)去蠢熄,急了直接向 Bugly公眾號發(fā)私信也沒用:
我也按照其他作者的簡書如下進(jìn)行修改配置:
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.reibang.com/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
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也出來了
總結(jié)/感慨
1应役、class "com.android.tools.build:gradle:"?的插件源碼對開發(fā)者來說像是一個黑盒,大量的API可能知其然,而不知其所以然捐凭;
2官套、其實?項目如果直接集成 Tinker(最新版本的話)是能成功了,也不需要各種降版本,但是輸出的 patch包卻需要自己管理、下載因悲、維護(hù)人灼,不方便投放,還是Bugly的 patch包分發(fā)方便耗绿;
3、gradle?的API不熟練啊,還是得多加油學(xué)學(xué);
番外
如果能幫到你向胡,有空來 我的GitHub?轉(zhuǎn)轉(zhuǎn)吧拇派,寫的一些東西可能對你有點幫助