Android Support庫和AndroidX衝突問題

項目運行從新編譯,編譯到一半就報錯了,真是一臉懵逼。好好的怎麼就忽然報錯了?錯誤信息以下:java

• Errorandroid

Manifest merger failed : Attribute application@appComponentFactory value=(android.support.v4.app.CoreComponentFactory) from [com.android.support:support-compat:28.0.0] AndroidManifest.xml:22:18-91
is also present at [androidx.core:core:1.0.0] AndroidManifest.xml:22:18-86 value=(androidx.core.app.CoreComponentFactory).
Suggestion: add 'tools:replace="android:appComponentFactory"' to <application> element at AndroidManifest.xml:6:5-21:19 to override.
複製代碼

按照日誌提示添加在<application>標籤裏面加 上:tools:replace="android:appComponentFactory"git

<application
        android:name=".application.MyApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        tools:replace="android:appComponentFactory">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
複製代碼

添加完後,從新編譯依舊錯誤:github

Caused by: java.lang.RuntimeException: Manifest merger failed with multiple errors, see logs
    at com.android.builder.core.AndroidBuilder.mergeManifestsForApplication(AndroidBuilder.java:556)
    at com.android.build.gradle.tasks.ProcessApplicationManifest.doFullTaskAction(ProcessApplicationManifest.java:198)
    at com.android.build.gradle.internal.tasks.IncrementalTask.taskAction(IncrementalTask.java:106)
    at sun.reflect.GeneratedMethodAccessor378.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
    at org.gradle.api.internal.project.taskfactory.IncrementalTaskAction.doExecute(IncrementalTaskAction.java:50)
    at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:39)
    at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:26)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.run(ExecuteActionsTaskExecuter.java:131)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
    at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:120)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:99)
    ... 115 more
複製代碼

幾番折騰後,發現是 Androidx庫和 Android Support庫不能共存的問題,一山不容二虎。但是項目並沒遷移Androidx庫,怎麼會出現 Androidx庫呢? api

在這裏插入圖片描述
•Solution

No1. 轉換成Androidx 在 AS 3.2 及以上版本提供了更加方便快捷的方法一鍵遷移到 AndroidX。bash

No2. 轉換成Android Support 1)在 Terminal 中輸入gradlew :app:dependencies 命令,查看第三方庫的依賴樹並找出引用了 androidx的庫; app

在這裏插入圖片描述
2)經查找發現是 implementation 'com.github.chrisbanes:PhotoView:latest.release' 引用了 Androidx庫;
在這裏插入圖片描述
3)進入PhotoView 項目地址,查看更新內容;
在這裏插入圖片描述
4)根據更新內容發現,從 2.2.0版本開始引用 androidx庫,那咱們嘗試回退到 2.1.4版本; implementation 'com.github.chrisbanes:PhotoView:2.1.4'
在這裏插入圖片描述
5)點擊 Sync now 從新編譯,發現 Gradle編譯成功,依賴 androidx庫也消失了。看來問題解決了,和咱們以前分析預想的同樣。
在這裏插入圖片描述
• Notes

1)許多第三方庫並無遷移 androidx庫,因此項目在使用 androidx庫時應當注意兼容問題;ide

2)在引用依賴庫的時候,儘可能避免使用latest.release或+方式,而是使用具體的版本。以避免出現新舊庫兼容,編譯時間久等問題。gradle

相關文章
相關標籤/搜索