为什么android.arch.navigation导致程序类型已经存在:android.support.v4.os.ResultReceiver $ 1?

Hec*_*tor 5 android android-architecture-navigation

我正在使用Android Studio版本

Android Studio 3.2 Canary 14
Build #AI-181.4668.68.32.4763614, built on May 4, 2018
JRE: 1.8.0_152-release-1136-b02 x86_64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Mac OS X 10.11.6
Run Code Online (Sandbox Code Playgroud)

在调查新的Architectural导航组件android.arch.navigation时,我遇到了这个构建失败.

AGPBI: {"kind":"error","text":"Program type already present: android.support.v4.os.ResultReceiver$1","sources":[{}],"tool":"D8"}
:app:transformDexArchiveWithExternalLibsDexMergerForDebug FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:transformDexArchiveWithExternalLibsDexMergerForDebug'.
> com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives: ...
...
  Program type already present: android.support.v4.os.ResultReceiver$1
Run Code Online (Sandbox Code Playgroud)

我的应用程序gradle build类似于: -

apply plugin: 'com.android.application'
apply plugin: "androidx.navigation.safeargs"

android {
    compileSdkVersion 'android-P'
    defaultConfig {
        applicationId "com.research.frager"
        minSdkVersion 19
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    def nav_version = "1.0.0-alpha01"

    implementation "android.arch.navigation:navigation-fragment:$nav_version"
    implementation "android.arch.navigation:navigation-ui:$nav_version"

    // optional - Test helpers
    androidTestImplementation "android.arch.navigation:navigation-testing:$nav_version"

    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.0.0-alpha1'

    implementation 'androidx.constraintlayout:constraintlayout:1.1.0'
    implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0-alpha1'
    testImplementation 'junit:junit:4.12'

    androidTestImplementation 'androidx.test:runner:1.1.0-alpha2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0-alpha2'
}
Run Code Online (Sandbox Code Playgroud)

和项目级gradle构建: -

buildscript {

    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.2.0-alpha14'
        classpath "android.arch.navigation:navigation-safe-args-gradle-plugin:1.0.0-alpha01"
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试过重构到AndroidX,但是我收到一条消息,说明在项目中找不到用法,为什么这个"v4"类仍然被提到?

小智 11

我一直在看这个问题,我在这里通过在向库中添加依赖项时排除支持包来排序主要问题,这样做:

implementation("android.arch.navigation:navigation-fragment:$nav_version") {
  exclude group: 'com.android.support'
}
Run Code Online (Sandbox Code Playgroud)

这将允许您运行该应用程序.但是,此工件使用支持工件而不是androidx工件.查看文档,我们可以看到NavHostFragment正在扩展support.v4.Fragment https://developer.android.com/reference/androidx/navigation/fragment/NavHostFragment

因此,简而言之,就我所见,您可以看到三个选项.第一个是删除androidx工件并使用支持工件,这最终取决于你的应用程序有多大.

第二个选项是删除导航库并返回到处理导航的经典方式,我想这可能对您不利.

第三种选择是实现你自己的导航主机,我不知道它会有多少工作.

这个响应将保持准确,直到谷歌发布该库的androidx版本,我很惊讶他们还没有.

希望这很有帮助.