深入理解Android 依賴包衝突問題

   首先,Android依賴包衝突其實並不是簡單的不同模塊依賴了相同庫的不同版本,因爲系統會自動選擇高版本,同時給這兩個模塊使用。衝突只存在兩種情況

  •     引用了本地jar文件
    由於引用的jar是會直接編譯到項目裏的,如果項目的兩個module同時引入了相同的本地jar文件, 就會存在相同的類有多個實現,及duplicated defined class。這種情況比較好分析和定位,去掉其中一個即可。
  •    不同模塊引用了相同的遠程庫(比如maven庫)的不同版本,且這兩個版本不兼容
    這類衝突主要是Android Support類, 目前Android已經退出AndroidX包了。
    這種情況就比較難分析,本文將就我曾經遇到過的一個案例來分析此類包衝突的解決方案流程。

 

問題分析

 當時編譯一個項目時遇到這個錯誤

  Learn how to resolve the issue at https://developer.android.com/studio/build/dependencies#duplicate_classes.

  Program type already present: android.support.design.widget.CoordinatorLayout$Behavior

 CoordinatorLayout$Behavior類存在多次定義。這個主要是因爲這個類在support的低版本26.xx上,是在design庫裏的。而到了support的27.xx,這個類卻到了support-core-ui庫。

com.android.support:design:26.1.0

com.android.support:support-core-ui:27.1.0

    

     所以如果你有些模塊引用了design:26.xx, 其他模塊引用了support-core-ui:27.xx, 然後就會出現CoordinatorLayout在兩個庫都存在的問題

    如果design也是27版本,該庫不會有CoordinatorLayout這個類,也就不會報錯了。

    解決方法,就是讓這兩個庫保持一樣的版本。通過修改app/build.gradle, 讓這兩個庫都使用較高的新版本,然後就可以保持一致了(全局使用高版本庫替換)

 

問題原因

 

    上面分析出了原因,但是爲甚會出現這種情況呢?我們具體來分析下:

通過./gradlew dependencies即可查看包的依賴分析,該命令非常有效,大家可以試試

ModuleA通過引用support 27版本引入了support-core-ui:27.1.1庫

ModuleB直接依賴design 26版本,儘管因爲ModuleA引入了support 27導致ModuleB依賴的support-core-ui升級到了27,

但是design庫並沒有升級,從而導致同時存在design:26和support-core-ui:27, 進而引入了兩個相同類CoordinatorLayout

 

/**************************************************
* 本文來自CSDN博主"一點碼客",喜歡請頂部點擊關注
* 轉載請標明出處:http://blog.csdn.net/itchosen
***************************************************/

如需實時查看更多更新文章,請關注公衆號"一點碼客",一起探索技術

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章