support v4/design/v7依賴的沖突的解決

屏幕快照 2018-01-25 上午11.27.27.png

關鍵字:關鍵字:關鍵字:Suggestion: add 'tools:replace="android:value"' to <meta-data> element at AndroidManifest.xml:26:9-28:38 to override. 編譯沖突 Merge 錯誤


1.前言

SDK 開發(fā)中通常會引用一些依賴,例如 SDK 中引用了 v4 和 v7 包,那么接入 SDK 的 APP 中也同樣引用了 V4 V7 包彪置,但是和 SDK 中的V4 V7 版本不一樣禁筏,這種情況下會引發(fā)什么問題?

當工程中依賴的不同版本的同一個依賴庫次屠,重復依賴的庫都是通過 gradle 網絡依賴方式,那么 AS 會默認選擇高版本。

但是如果既有本地依賴版本悬秉,又有網絡依賴版本,結果就是引起重復依賴沖突观游。
解決方式:都走網絡依賴

2.檢查依賴報告

Terminal 終端面板里輸入以下命令

// XXX表示想打印的module的name
gradle XXX:dependencies

依賴報告示例如下:

+--- project :libraryContentLink
|    \--- com.android.support:support-v4:25.1.0 -> 25.1.1
|         +--- com.android.support:support-compat:25.1.1
|         |    \--- com.android.support:support-annotations:25.1.1 -> 25.3.1
+--- com.lzy.widget:imagepicker:0.5.5
|    +--- com.android.support:appcompat-v7:25.1.1 (*)
|    +--- com.github.chrisbanes.photoview:library:1.2.4
|    |    \--- com.android.support:support-v4:22.0.0 -> 25.1.1 (*)
|    \--- com.android.support:recyclerview-v7:25.1.1 (*)

V4 和 V7 的頂級依賴是 -> 25.1.1
依賴報告中可以看到有些依賴標注了 *號搂捧,表示這個依賴被忽略了,這是因為其他頂級依賴中也依賴了這個傳遞的依賴懂缕, Gradle 會自動分析下載最合適的依賴允跑。有些依賴形如22.2.1 ->23.1.1是由于默認會優(yōu)先版本高的依賴.這個時候你想使用版本低的依賴的話需要排除掉高的依賴。因此這里需要排除Fresco里面的supportV4依賴搪柑。

3.兩種情況的解決方案

Android Studio 機制:
Android Studio 默認情況下會優(yōu)先高版本的依賴庫聋丝。

實際情況分為兩種
第一種情況:如果 SDK 中的版本高于 APP 中的版本?
解決方式一:
去掉 SDK 中的低版本依賴工碾,使用 SDK 中的新版本(這個過程可以是 Android Studio自動完成弱睦,無需改動)

解決方式二:
如果 App 中不想引用高版本的 V4 V7 包,而 AS 中默認情況下會優(yōu)先高版本的依賴庫渊额,這種情況下怎么辦呢况木?需要手動處理排除依賴

compile('com.facebook.fresco:fresco:0.10.0') {
       exclude module: 'support-v4'
}

第二種情況:如果 SDK 中的版本小于 APP 中的版本垒拢?
很抱歉 APP 中的某些功能可能不正常。


4.驗證方法數(shù)

https://github.com/KeepSafe/dexcount-gradle-plugin

驗證不同的版本添加后對方法數(shù)的影響:

1503140016991.png
1503140424945.png

簡單的一個實現(xiàn)火惊,驗證了對方法數(shù)是沒有影響的求类,在兩個版本中

java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v4/animation/AnimatorCompatHelper;

java.lang.NoSuchMethodError: No static method wrap(Ljava/lang/Object;)Landroid/support/v4/view/WindowInsetsCompat; in class Landroid/support/v4/view/WindowInsetsCompat; or its super classes (declaration of 'android.support.v4.view.WindowInsetsCompat' appears in /data/app/cn.xuexuan.newui-2/base.apk:classes12.dex)

26.0.0-alpha1以上版本中沒有AnimatorCompatHelper類。

經過這兩次錯誤的分析屹耐,總結出一個規(guī)律尸疆,凡是出現(xiàn)Android/support/v4/中找不到類或者方法,可以確定是依賴了多個不同版本的support庫惶岭,都可以使用下面介紹的方法來解決寿弱。

強制設置某個模塊的版本

force強制設置某個模塊的版本。

configurations.all {
    resolutionStrategy {
        force 'com.android.support:support-v4:24.1.0'
    }
}

com.android.support包名的庫版本都是用24.1.0

dependencies {
  compile fileTree(include: ['*.jar'], dir: 'libs')
  ...
  configurations.all {
    resolutionStrategy.eachDependency { 
      DependencyResolveDetails details ->
        def requested = details.requested
          if (requested.group == 'com.android.support') {
            if (!requested.name.startsWith("multidex")) {
              details.useVersion '25.1.0'
            }
          }
    }
  }
}

另外一種方式排除依賴中的指定包

compile ('com.mcxiaoke.viewpagerindicator:library:25.1.0') {
  exclude group: 'com.android.support'
}

描述:APP模塊中添加v427.0.2解決

Error:Execution failed for task ':app:preDebugBuild'.
> Android dependency 'com.android.support:support-v4' has different version for the compile (22.0.0) and runtime (27.0.2) classpath. You should manually set the same version via DependencyResolution
1516675664556.png
Manifest merger failed : uses-sdk:minSdkVersion 14 cannot be smaller than version 16 declared in library[com.android.support:design:27.0.2]

產生原因:
某個依賴包的manifests中的minSdkVersion版本比項目的minSdkVersion要高
解決方法:
1.更改項目的uses-sdk:minSdkVersion
2.更改依賴包的uses-sdk:minSdkVersion
3.在項目的manifests標簽下添加

設置minSdkVersion大于16


5.編譯沖突場景

錯誤如下:


屏幕快照 2018-01-25 上午12.18.15.png
Error:Execution failed for task ':app:processDebugManifest'.
> Manifest merger failed : Attribute meta-data#android.support.VERSION@value value=(26.0.2) from [com.android.support:design:26.0.2] AndroidManifest.xml:28:13-35
    is also present at [com.android.support:support-v4:26.1.0] AndroidManifest.xml:28:13-35 value=(26.1.0).
    Suggestion: add 'tools:replace="android:value"' to <meta-data> element at AndroidManifest.xml:26:9-28:38 to override.

發(fā)生編譯錯誤的引來庫配置如下:
app下下的build.gradle

android {
  compileSdkVersion 26
  defaultConfig {
    targetSdkVersion 26
  }
  ...
}
dependencies {
  ...
  implementation 'com.android.support:design:26.1.0'
}

module下的build.gradle

android {
  compileSdkVersion 26
  buildToolsVersion '26.0.2'
  ...
}
dependencies {
  ...
  implementation 'com.android.support:design:26.0.2'
}

6.編譯沖突發(fā)生的原因

由于導入的SDK用的是design26.0.2的包按灶,而當前項目里用的是design26.1.0症革,Manifest文件合并失敗。即項目內出現(xiàn)了不同的support或者其他庫也引用了多個版本兆衅,合并出現(xiàn)了merge錯誤地沮。


7.編譯沖突如何解決

7.1 方法一:手動修改方式強制使用相同版本

降級App中的support版本
App中引用的design改為26.0.2SDK中的版本保持一致。往舊版本改羡亩,雖然問題可以解決摩疑,但是不推薦。


7.2 方法二:gradle配置方式強制使用相同版本

強制使用相同版本

configurations.all {
  resolutionStrategy.eachDependency { details ->
    def requested = details.requested
    if (requested.group == 'com.android.support') {
      if (!requested.name.startsWith("multidex")) {
        details.useVersion '25.3.1'
      }
    }
  }
}

7.3 方法3:升級App中的版本

module中引用如下

android {
  compileSdkVersion 26
  buildToolsVersion '26.0.2'
  ...
}
dependencies {
  ...
  implementation 'com.android.support:design:26.0.2'
}

app中的如下配置的時候引發(fā)了Merge錯誤畏铆。

android {
  compileSdkVersion 26
  defaultConfig {
    targetSdkVersion 26
  }
  ...
}
dependencies {
  ...
  implementation 'com.android.support:design:26.1.0'
}

當把app中的配置升級后

android {
  compileSdkVersion 27
  defaultConfig {
    targetSdkVersion 27
  }
  ...
}
dependencies {
  ...
  implementation 'com.android.support:design:27.0.2'
}

再次執(zhí)行雷袋,發(fā)現(xiàn)問題解決了。上面提到了:項目內出現(xiàn)了不同的support或者其他庫也引用了多個版本辞居,合并出現(xiàn)merge錯誤楷怒。如果這個不同的support版本是跨大版本號的,例如moduel中用的是26.0.1瓦灶,app中用的是27.0.2鸠删,相差了一個level這時候會自動選擇高版本的support,如果是26.0.226.1.0贼陶,相差的只是小版本刃泡,這時候可能需要手動處理了。


http://www.bubuko.com/infodetail-2027963.html
http://blog.csdn.net/p576518762/article/details/78320477
http://blog.csdn.net/xx326664162/article/details/71488551

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末碉怔,一起剝皮案震驚了整個濱河市烘贴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌撮胧,老刑警劉巖桨踪,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異芹啥,居然都是意外死亡锻离,警方通過查閱死者的電腦和手機铺峭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來纳账,“玉大人逛薇,你說我怎么就攤上這事捺疼∈璩妫” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵啤呼,是天一觀的道長卧秘。 經常有香客問我,道長官扣,這世上最難降的妖魔是什么翅敌? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮惕蹄,結果婚禮上蚯涮,老公的妹妹穿的比我還像新娘。我一直安慰自己卖陵,他們只是感情好遭顶,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著泪蔫,像睡著了一般棒旗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上撩荣,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天铣揉,我揣著相機與錄音,去河邊找鬼餐曹。 笑死逛拱,一個胖子當著我的面吹牛,可吹牛的內容都是我干的台猴。 我是一名探鬼主播朽合,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼卿吐!你這毒婦竟也來了旁舰?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤嗡官,失蹤者是張志新(化名)和其女友劉穎箭窜,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體衍腥,經...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡磺樱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年纳猫,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片竹捉。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡芜辕,死狀恐怖,靈堂內的尸體忽然破棺而出块差,到底是詐尸還是另有隱情侵续,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布憨闰,位于F島的核電站状蜗,受9級特大地震影響,放射性物質發(fā)生泄漏鹉动。R本人自食惡果不足惜轧坎,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望泽示。 院中可真熱鬧缸血,春花似錦、人聲如沸械筛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽变姨。三九已至族扰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間定欧,已是汗流浹背渔呵。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留砍鸠,地道東北人扩氢。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像爷辱,于是被迫代替她去往敵國和親录豺。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內容