「すでに存在するプログラムタイプ」とはどういう意味ですか?


99

Android Studioでアプリを作成しようとしています。Eclipse PahoライブラリをGradle依存関係として追加した後(またはそれはMavenですか?私はAndroidエコシステムに慣れていません)、次のエラーが発生しました。

Program type already present: android.support.v4.accessibilityservice.AccessibilityServiceInfoCompat
Message{kind=ERROR, text=Program type already present: android.support.v4.accessibilityservice.AccessibilityServiceInfoCompat, sources=[Unknown source file], tool name=Optional.of(D8)}

このエラーに関連するStackOverflowのさまざまな質問をチェックしましたが、回答はすべて特定のライブラリに固有のものです。 エラーの解決策だけでなく、エラーの意味の理解も求めています。 そうすれば、人々が特定のケースの解決策を見つけやすくなります。これまでのところ、答えはありません。

他のStackOverflowの回答から、私はそれが私のGradleファイルと関係があると収集しました。それで、ここにapp / build.gradleがあります:

apply plugin: 'com.android.application'
android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "---REDACTED FOR PRIVACY---"
        minSdkVersion 15
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}
dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support:appcompat-v7:27.1.0'
    implementation 'com.android.support:support-media-compat:27.1.0'
    implementation 'com.android.support:support-v13:27.1.0'
    implementation 'com.google.android.gms:play-services-maps:12.0.1'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.0.2'
    implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.0.2'
}

repositories {
    maven { url 'https://repo.eclipse.org/content/repositories/paho-releases/' }
} 

回答:


73

この問題は通常、名前の競合が原因で発生します。この場合、複数のライブラリで使用されているsupport-v4ライブラリです。

モジュールの依存関係リストapp(アプリのデフォルトのモジュール名)を見つけるために、gradlew app:dependenciesすべてのライブラリのリストを取得することができます。

それsupport-v4が使用されていることがわかりました:

//short version of the dependencies list highlighting support-v4
+--- com.android.support:support-v13:27.1.0
|    \--- com.android.support:support-v4:27.1.0

+--- com.google.android.gms:play-services-maps:12.0.1
|    +--- com.google.android.gms:play-services-base:12.0.1
|    |    +--- com.google.android.gms:play-services-basement:12.0.1
|    |    |    +--- com.android.support:support-v4:26.1.0 -> 27.1.0 (*)

+--- org.eclipse.paho:org.eclipse.paho.android.service:1.0.2
|    +--- com.google.android:support-v4:r7  // <- problem here

マップのsupport-v4はsupport-v13から提供されたバージョンを使用することがわかります。

また、Eclipseライブラリが別のバージョン(r7 ??)を使用していることもわかります。

問題を解決するには、次のsupport-v4ようにこのEclipseライブラリからモジュールを除外してみてください。

implementation ('org.eclipse.paho:org.eclipse.paho.android.service:1.0.2') {
    exclude module: 'support-v4'
}

その後、アプリケーションをコンパイルできるはずです。

ところで、コードをテストすることでEclipseモジュールが壊れないように注意する必要があります。


2
まったく別の衝突がありましたが、あなたの答えは実際に何かが衝突するかもしれないという考えを得るのに役立ちました。私はAndroid Exo Playerを使用する2つの異なるプレーヤーを使用しています。いつか誰かを助けるかもしれません。ありがとう!
Vucko 2018

@Vuckoどのようにして衝突を特定しましたか?
Vir Rajpurohit 2018年

全くの運によって。私は調査を開始し、私のBrightcoveビデオプレーヤーライブラリは依存関係としてexoplayerを使用していることに気付きました。それがあなたにとって何であるかを見てみてください。
Vucko 2018年

82

私にとっては掃除だけプロジェクトをする問題は解決しました

ターミナルの使用:

./gradlew clean

Android Studioの使用:

Build (menu) > Clean Project

正解です。多分それはアンドロイドスタジオのバグです。
aolphn

3
Android Studioでは、メニューからも実行できますBuild > Clean Project
サルバドール

1
Android StudioのFile > Invalidate Caches / Restart > Invalidate and restart場合、問題も修正される可能性があります
最大

12

から 公式ドキュメント

クラスが実行時クラスパスに複数回出現する場合、次のようなエラーが発生します。

Program type already present com.example.MyClass

このエラーは通常、次のいずれかの状況が原因で発生します。

  • バイナリ依存関係には、アプリが直接依存関係としても含むライブラリが含まれます。

    たとえば、アプリはライブラリAとライブラリBへの直接の依存関係を宣言していますが、ライブラリAにはすでにバイナリにライブラリBが含まれています。この問題を解決するには、直接の依存関係としてライブラリBを削除します。

  • アプリのローカルバイナリ依存関係とリモートバイナリ依存関係が同じライブラリにあります。

    この問題を解決するには、バイナリの依存関係の1つを削除します。(同じライブラリがjarおよびgradle依存関係として追加されているかどうかを確認してください)


どうもありがとう。1つ目は私にとって問題の原因でした。別のライブラリ内にある繰り返しライブラリにcompileOnlyを使用しましたが、ビルド時にビルド時に除外されます。
モンスターブレイン

4

私にも起こりましたが、私の場合、debugApi&を使用して同じクラスを持つ異なる依存関係を含めようとしています。Apiそのため、Android Studioは重複クラスとしてマークされているため、debugApireleaseApiを使用してビルドバリアントに基づいて異なる依存関係を含めることで問題を解決しました。


3

サポートライブラリをアプリレベルのGradleファイルに追加する

実装 'com.android.support:design:27.1.0'


2

私の場合、2つの* .jarファイルまたは2つのライブラリがソースコードのどこかにあることを意味します。例えば:私は2を持っているyoutube.jarapp/libaryしてmodule/libary たら、冗長を削除し、それが罰金になります


1

私はそれが誰かに役立つことを願っています、ビルド>クリーンプロジェクトが私のために働いた


3
このソリューションは、別の回答のコメントですでに提案されています
ファニック

1

この問題の問題-ライブラリをモジュールとして使用し、別のライブラリの依存関係と同じライブラリを使用した場合。

例:LibraryAがモジュールとしてインポートされ、同じLibraryAが依存関係として他のライブラリモジュールに追加されました。

この問題を修正する方法は?

解決策1->両方を保持する場合-> LibraryAモジュールのパッケージ名をリファクタリングするだけ

解決策2-> LibraryA依存関係を削除し、モジュールを使用する

実装プロジェクト( ':LibraryA')

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.