摘要:由于使用了的遠程依賴形式,故直接刪除沖突的內(nèi)容無效,須轉(zhuǎn)為使用本地依賴的形式。根據(jù)官方文檔的指示,刪除的倉庫依賴,使用本地包形式的依賴,去除對的包的引用,即可順利解決問題。
「博客搬家」 原地址: CSDN 原發(fā)表時間: 2016-11-18
OkHttp 是一個流行的開源網(wǎng)絡(luò)請求庫。許多第三方庫的底層都是使用 OkHttp 實現(xiàn)網(wǎng)絡(luò)請求,所以 OkHttp 相關(guān)的依賴沖突問題就變得很難避免,下文是我所遇到的一次關(guān)于 OkHttp 的依賴沖突問題,通過對 Gradle 工具及 Android Studio 的靈活使用,解決了此問題。
1. 關(guān)于 OkHttp 的依賴沖突我的項目中, build.gradle 文件中設(shè)置的主要依賴:
dependencies { compile "com.android.support:appcompat-v7:24.0.0" compile "cn.bmob.android:bmob-sdk:3.5.2" compile "com.squareup.okhttp3:okhttp:3.4.2" compile "com.facebook.fresco:imagepipeline-okhttp3:0.12.0" compile "com.facebook.fresco:fresco:0.12.0" }
在寫該 App 的過程中,出現(xiàn)了較為詭異的情況:
使用 Run "app" 命令可以在 Android 6.0「API 23」環(huán)境中成功運行 App
使用 Run "app" 命令針對 Android 4.4「API 19」環(huán)境的虛擬機,進行 Gradle 構(gòu)建時報錯
使用「Generate Signed APK」,在進行 Gradle 構(gòu)建時報錯
在 cmd 或 Windows PowerShell 中執(zhí)行如下 Gradle 指令:
gradle clean gradle build
報錯,所報錯誤分別如下 :
Error:Error converting bytecode to dex: Cause: com.android.dex.DexException: Multiple dex files define Lokhttp3/Address; Error:Execution failed for task ":app:transformClassesWithDexForDebug". > com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: java.lang.UnsupportedOperationException
:app:transformClassesWithDexForDebug FAILED FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ":app:transformClassesWithDexForDebug". > com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: java.lang.Unsu pportedOperationException * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. BUILD FAILED
通過打印的異常信息,可以確定問題是在于 OkHttp 的依賴沖突。
2. 依賴沖突問題的探究 2.1 使用 Gradle 工具對依賴沖突進行探究Gradle 相關(guān)簡介:
「一」Gradle位置:
C:Users< 用戶名 >.gradlewrapperdistsgradle- < 版本號 > -all<一串識別碼>gradle- < 版本號 >
< Android Studio 目錄 > gradlegradle- < 版本號 >
「二」Gradle 環(huán)境變量配置:
在環(huán)境變量里添加用戶變量: GRADLE_HOME
在環(huán)境變量 path 中增加: %GRADLE_HOME%bin;
此時,我直接使用 Gradle 工具檢查此項目的依賴,進入項目目錄,執(zhí)行如下指令進行依賴檢查:
cd app gradle dependencies
打印出如下圖所示的依賴樹,依賴樹顯示了你 build 腳本聲明的頂級依賴和它們的傳遞依賴:
箭頭所指的地方為與 OkHttp 相關(guān)的庫,從依賴樹可知,我自行引入的 OkHttp 庫替換掉了 Fresco 中的低版本庫,但仍舊提示依賴沖突。
經(jīng)過多次嘗試,發(fā)現(xiàn)只有同時去掉這兩個對 OkHttp 的依賴時,問題得到解決,build.gradle 文件修改如下:
dependencies { compile "com.android.support:appcompat-v7:24.0.0" compile "cn.bmob.android:bmob-sdk:3.5.2" //compile "com.squareup.okhttp3:okhttp:3.4.2" compile("com.facebook.fresco:imagepipeline-okhttp3:0.12.0", { exclude module: "okhttp" }) compile "com.facebook.fresco:fresco:0.12.0" }2.2 對解決依賴沖突問題的嘗試
這個問題很奇葩,去掉對 OkHttp 的依賴怎么可以呢?對著錯誤代碼查遍了 Google 和 Stack Overflow,提到的解決方法有如下兩條:
2.2.1 使用 Multidex support library 開啟 Multidex 功能步驟 1:更改 build.grade
defaultConfig { ... // Enabling multidex support. multiDexEnabled true } dependencies { ... compile "com.android.support:multidex:1.0.1" }
步驟 2:設(shè)置 Application 類
public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); MultiDex.install(this); } }
步驟 3:更改 grade.properties
org.gradle.jvmargs=-XX:MaxHeapSize=2048m -Xmx2048m2.2.2 通過增大可用內(nèi)存解決「:app:transformClassesForDexForDebug」異常
在 gradle.build 中指定 javaMaxHeapSize:
android { . . . dexOptions { javaMaxHeapSize "4g" //specify the heap size for the dex process } }
不過,這兩種辦法都無益于解決問題。
3. 追根溯源解決依賴沖突 3.1 問題的精確定位通過中文搜索引擎搜索之后,在一篇文章中獲得了靈感:
對于如下異常:
2.Execution failed for task ":app:transformClassesWithJarMergingForDebug". com.android.build.api.transform.TransformException: java.util.zip.ZipException: duplicate entry: android/support/v4/app/BackStackState$1.class原因:在所添加的 jar 包或 aar 包中也引用了 support-V4 , 與工程中引用的相沖突
Ctrl+N –> 在搜索框中輸入 BackStackState –> 查找到所有引用該類的類,這些類即為引起沖突的類
去掉本工程中 gradle 中用于引用有沖突的包的代碼或者將沖突的代碼從 jar 包或 aar 包中移除,確保一個 module 中只引用了一份相同的第三方包
根據(jù)這份解決思路,進行問題的最終解決。
首先獲取如下異常的關(guān)鍵信息:
Error:Error converting bytecode to dex: Cause: com.android.dex.DexException: Multiple dex files define Lokhttp3/Address;
由異常信息可知,OkHttp 下的 Address 類有沖突,執(zhí)行如下步驟:
Ctrl + N
在搜索框中輸入 Address
查找到所有引用該類的類
搜索到的內(nèi)容,如下圖所示??芍?,Bmob 和 OkHttp 中均有該類。
3.2 刪掉沖突的 Jar 包將項目的顯示樹由 Android 切換到 Project,查看 Bmob 的 Jar 包的結(jié)構(gòu),發(fā)現(xiàn)其中依賴了一個 OkHttp 的 Jar 包。
由于使用了 Gradle 的遠程依賴形式,故直接刪除沖突的內(nèi)容無效,須轉(zhuǎn)為使用本地依賴的形式。
根據(jù) Bmob 官方文檔的指示,刪除 Bmob 的 Maven 倉庫依賴,使用本地 Jar 包形式的依賴,去除對 OkHttp 的 Jar 包的引用,即可順利解決問題。當(dāng)然也可以只使用 Bmob 的遠程依賴而在 build.gradle 中去掉其他相關(guān)「如 OkHttp,Gson,RxJava 等」的依賴。
4. 參考資料問題預(yù)備
Android OkHttp 完全解析 是時候來了解 OkHttp 了
Gradle 實戰(zhàn)「1」 - 配置環(huán)境變量
Gradle 系列教程之依賴管理
MultiDex
Android分包 MultiDex 原理詳解
How to enable multidexing with the new Android Multidex support library
問題解決
Android Studio 編譯中的一些問題解決辦法
Android Studio 中如何解決重復(fù)依賴導(dǎo)致的 app:transformClassesWithJarMergingForDebug
Bmob的開發(fā)文檔
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/68255.html
摘要:說好的分類集合來啦,采用標(biāo)簽云的方式來展示掘金閱讀提示點擊下文中返回到頂部有分類不合理的地方請?zhí)帷7淳幾g這個后發(fā)現(xiàn)其使用個優(yōu)質(zhì)的開源項目掘金是由的開源的一個庫,用于構(gòu)建可預(yù)期的和聲明式的用戶界面。 想不想通過一線互聯(lián)網(wǎng)公司面試? - Android - 掘金國內(nèi)一線互聯(lián)網(wǎng)公司內(nèi)部面試題庫 以下面試題來自于百度、小米、樂視、美團、58、獵豹、360、新浪、搜狐內(nèi)部題庫 熟悉本文中列出的知...
閱讀 3888·2021-09-06 15:00
閱讀 2205·2019-08-30 15:53
閱讀 3312·2019-08-23 16:44
閱讀 973·2019-08-23 15:19
閱讀 1434·2019-08-23 12:27
閱讀 4231·2019-08-23 11:30
閱讀 625·2019-08-23 10:33
閱讀 397·2019-08-22 16:05