INSTALL_FAILED_DUPLICATE_PERMISSION…C2D_MESSAGE


179

私はアプリでGoogle通知を使用しており、今までマニフェストで以下を実行しました:

<!-- GCM -->
<uses-permission android:name="android.permission.GET_ACCOUNTS" /> <!-- GCM requires a Google account. -->
<uses-permission android:name="android.permission.WAKE_LOCK" /> <!-- Keeps the processor from sleeping when a message is received. --> 
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> <!-- This app has permission to register and receive data message. --> 

<!-- Creates a custom permission so only this app can receive its messages. NOTE: APP_PACKAGE.permission.C2D_MESSAGE -->   
<permission android:name="com.myapp.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="com.myapp.permission.C2D_MESSAGE" />    
<!-- END GCM -->

Nexus 7をAndroid 5.0にアップデートするまで、問題なく動作しました。
Eclipseを使用してこのデバイスにアプリをインストールしようとすると、次のエラーが発生します。

INSTALL_FAILED_DUPLICATE_PERMISSION perm = com.myapp.permission.C2D_MESSAGE pkg = com.myapp

何が悪いのか分かりませんか?Android 5.0までは完全に機能していました。
C2D_MESSAGEは2行で使用していることを知っています、permissionそしてuses-permissionそれは大丈夫でなければならないので、私は、元のGoogle GCMガイドからそのコードをコピーしてきました。


20
あいまいなバグのために最初にあなたが取ったのは(まあ、私はしました…)実際には、2つのアプリが異なる署名で署名された同じカスタム権限を宣言してデバイスにインストールすることを防ぐ新しいセキュリティ機能です
AZ_

回答:


231

私に役立つ解決策を見つけました。

My Device(Nexus 7)Android 5.0。ロリポップ私はこれらのステップに従います。

アプリをアンインストールした後App NameDownloadedタブのアプリリストの下にあります。

  • 設定に移動
  • アプリ
  • リストの一番下には、 YourApp、「NOT INSTALLED」タグ付いてい
  • 開いた
  • [ すべてのユーザーからアンインストール]をクリックしOptionMenuて選択します

これらの手順を実行した後、新しいアプリを正常にインストールし、問題なく動作しています。


6
Android 5.0.1でネクサス9を
ナビゲート

これはうまくいきました、ありがとう!私の問題は少し異なりました。モバイルアプリで自動テスト(Xamarin.UITest)を行っています。手動テスト用に別のバージョンをアップロードしました。アプリを(VS / Xamarin UITest経由で)デバイスに読み込もうとすると、この問題が発生し始めました。再度、感謝します。
LuFaMa

これは正解でなければなりません:stackoverflow.com/a/27767179/343679
Sharj

@Pratik Butaniソリューションは私のために働いた。エラーが発生する理由を知りたいのですが、説明していただけますか?
Karthikeyan Ve 2015年

1
NOT INSTALLEDタグが付いたリストの一番下にアプリが見つかりません。どういう意味ですか?
IgorGanapolsky

139

削除する

<uses-permission android:name="${applicationId}.permission.C2D_MESSAGE"/>
<permission
    android:name="${applicationId}.permission.C2D_MESSAGE"
    android:protectionLevel="signature"/>

アプリを実行...次に、権限を再度追加して、アプリを実行します。

よし!


31
この問題は多くの場合、同じデバイスにアプリのデバッグバージョンとリリースバージョンをインストールしようとすると発生するため、この回答を上にしてください。このソリューションを使用すると、簡単にそれを行うことができます。マニフェストで変数を使用できることを知りませんでした。賛成投票!
フロリアン2015年

4
アプリがすでに本稼働中である場合、この回答は機能しません。アプリのユーザーが権限なしで新しいバージョンをダウンロードしてから、権限のある新しいバージョンを再度インストールすることを期待できません。
nilsmagnus 2015年

5
異なる名前のアプリのデバッグバージョンとリリースバージョンがあるためにこれが発生した場合は、機能させるためにアンインストールする必要はありません。${applicationId}ハードコーディングする代わりに使用するだけです
yuval

1
静的アプリケーションIDの代わりに$ {applicationId}を使用すると、問題が解決しました!! フレーバーを使用する場合を含みます!!!!
JannGabriel 2016

1
@yuvalのコメントは適切で、解決されました。多くの答えのうち、これが問題を最もよくカバーしています:stackoverflow.com/a/36992939/56285
Jonik

49

私はAndroid-21のカスタム署名権限で同じ問題を抱えていて、完全にアンインストールしていることを確認することで解決しました。

これは、次の場合に発生するエッジケースです。

  1. アプリケーションは、署名レベルのセキュリティを使用してカスタム権限を定義します
  2. 別のキーで署名されたバージョンでインストール済みアプリを更新しようとしています
  3. テストデバイスは、複数のユーザーをサポートするAndroid 21以降を実行しています

コマンドラインの例

これは、問題とその解決方法を示すコマンドラインのトランスクリプトです。この時点でデバッグバージョンがインストールされ、リリースキーで署名された製品バージョンをインストールしようとしています。

# This fails because the debug version defines the custom permission signed with a different key:

[root@localhost svn-android-apps]# . androidbuildscripts/my-adb-install Example release
920 KB/s (2211982 bytes in 2.347s)
        pkg: /data/local/tmp/Example-release.apk
Failure [INSTALL_FAILED_DUPLICATE_PERMISSION perm=com.example.android.example.PERMISSION_EXAMPLE_PLUGIN pkg=com.example.android.example]

# I use uninstall -k because apparently that is similar to uninstalling as a user
# by dragging the app out of the app tray:

[root@localhost svn-android-apps]# /android-sdk-linux/platform-tools/adb uninstall -k com.example.android.example
The -k option uninstalls the application while retaining the data/cache.
At the moment, there is no way to remove the remaining data.
You will have to reinstall the application with the same signature, and fully uninstall it.
If you truly wish to continue, execute 'adb shell pm uninstall -k com.example.android.example'

# Let's go ahead and do that:

[root@localhost svn-android-apps]# /android-sdk-linux/platform-tools/adb shell pm uninstall -k com.example.android.example
Success

# This fails again because the custom permission apparently is part of the data/cache
# that was not uninstalled:

[root@localhost svn-android-apps]# . androidbuildscripts/my-adb-install Example release
912 KB/s (2211982 bytes in 2.367s)
        pkg: /data/local/tmp/Example-release.apk
Failure [INSTALL_FAILED_DUPLICATE_PERMISSION perm=com.example.android.example.PERMISSION_EXAMPLE_PLUGIN pkg=com.example.android.example]

# In spite of the warning above, simply doing a full uninstall at this point turned out to 
# work (for me):

[root@localhost svn-android-apps]# /android-sdk-linux/platform-tools/adb uninstall com.example.android.example
Success

# Release version now successfully installs:

[root@localhost svn-android-apps]# . androidbuildscripts/my-adb-install Example release
898 KB/s (2211982 bytes in 2.405s)
        pkg: /data/local/tmp/Example-release.apk
Success

[root@localhost svn-android-apps]# 

Eclipseの例

反対の方向に進んで(リリースビルドが既にインストールされているときにEclipseからデバッグビルドをインストールしようとすると)、次のダイアログが表示されます。

Eclipse再インストールダイアログ

この時点で単にyesと答えると、インストールは成功します。

デバイスの例

別の回答で指摘されているように、デバイスの設定でアプリ情報ページに移動し、オーバーフローメニューをクリックし、[すべてのユーザーからアンインストール]を選択してこのエラーを防ぐこともできます。


ありがとうございます。ただし、「デバイス設定でアプリ情報ページに移動し、オーバーフローメニューをクリックして、「すべてのユーザーのアンインストール」を選択してこのエラーを防ぐこともできます。
yajnesh

私と結婚してください。編集後、[設定]> [アプリ]に移動し、古いバージョンのアプリをタップして、オプションメニューで[すべてのユーザーからアンインストール]を選択します。
Fabricio PH 2014

前提条件リストの#2が真である必要はありません。私の場合、私はアプリを更新していませんが、この手順に従って説明されているように、パッケージ名が異なる同じアプリのデバッグビルドをインストールしています。stackoverflow.com/a/21006552/507339。これは私が解決策を
見つけ

33

最初に代替apkをアンインストールする必要がないので、これを解決しました(苦痛ですね)。apkのデバッグバージョンとリリースバージョンの両方を正常にインストールするには、AndroidManifest.xml内のgradleの組み込み$ {applicationId}プレースホルダーを使用して、コンパイル時に権限のandroid:name値を変更します。

build.gradleファイルのスニペット:

buildTypes {
    debug {
        applicationIdSuffix ".debug"
        ...
    }
}

AndroidStudio.xmlファイルのスニペット:

<uses-permission android:name="${applicationId}.permission.C2D_MESSAGE"/>
<permission
    android:name="${applicationId}.permission.C2D_MESSAGE"
    android:protectionLevel="signature"/>

を使用aapt l -a app-debug.apkして、APK内の変更されたAndroidManifest.xmlファイルを検査し、プレースホルダーが適切に適用されたことを確認できます。さまざまな製品フレーバーを使用している場合は、このメソッドのバリエーションをニーズに合わせて適用できると確信しています。


私が異なって定義した場合と思われるapplicationId二つの異なる中productFlavors、および使用${applicationId}効果は同じになります。
ロバート

1つ以上のフレーバーが必要な場合、これはより堅牢なソリューションだと思います。
ロバート

これは正しいとマークされているはずです。すべての同僚がプロジェクトを構築してapkをインストールするためにいくつかのハックアラウンドを行うとは期待できないことを考慮して
goemic

ありがとう、@ jackpileアプリは完全に問題なく動作します。リリースビルドとデバッグビルドの両方がインストールされている場合、問題は1つだけです。デバッグビルドをインストールすると、代わりにリリースビルドが開きます
Prateek Surana

これは正解としてマークする必要があります.. @Jackpileに感謝
アーメドewess

28

マニフェストファイルから、パッケージ名の「ハードコード」参照を削除します。

(これはを使用しない場合でもベストプラクティスですproductFlavors

たとえば、マニフェストに次のものが含まれている場合:

<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>
<uses-permission android:name="com.yourpackage.name.permission.C2D_MESSAGE"/>

<permission
    android:name="com.yourpackage.name.permission.C2D_MESSAGE"
    android:protectionLevel="signature"/>
<permission
    android:name="com.yourpackage.name.permission.MAPS_RECEIVE"
    android:protectionLevel="signature"/>

それを次のように変更しました:

<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>
<uses-permission android:name="${applicationId}.permission.C2D_MESSAGE"/>

<permission
    android:name="${applicationId}.permission.C2D_MESSAGE"
    android:protectionLevel="signature"/>
<permission
    android:name="${applicationId}.permission.MAPS_RECEIVE"
    android:protectionLevel="signature"/>

次に、モジュールのgradleファイルで、関連するものを設定しますapplicationId

signingConfigs {
    stage {
        storeFile file('keystore/stage.keystore')
        storePassword 'android'
        keyAlias 'androiddebugkey'
        keyPassword 'android'
    }
    production {
        storeFile file('keystore/playstore.keystore')
        storePassword store_password
        keyAlias key_alias
        keyPassword key_password
    }
}

productFlavors {
    staging {
        signingConfig signingConfigs.staging
        applicationId defaultConfig.applicationId + ".staging"
        versionName defaultConfig.versionName + "-staging"
    }

    production {
        signingConfig signingConfigs.production
    }
}

詳細については、このチュートリアルに従ってください


2
使用し${applicationId}て問題を修正しました!
アンディ

これは、言及された問題にどのように対処しますか?
Vincent

18

adbでアプリをアンインストールしてみてください:

adb uninstall com.yourpackage

奇妙なことに、システムUIからAPKをアンインストールし、インストール済みのアプリの下に表示されなかったとしても、Nexus 6でこれを実行する必要がありました。
ジョンウィリス

それは私を与えましたFailure [DELETE_FAILED_INTERNAL_ERROR]。その理由は何でしょうか?
Reaz Murshed

17

このエラーが発生している間は、許可が拒否されたアプリのパッケージ名が明確に示されます。また、アプリケーションをアンインストールするだけでは問題は解決しません。問題を解決するには、次の手順を実行する必要があります。

  1. 設定に移動
  2. アプリに行きます
  3. ダウンロードしたアプリのリストに移動します
  4. あなたはリストにアンインストールされたアプリケーションを見ることができます
  5. アプリケーションをクリックして、詳細オプションに移動します
  6. すべてのユーザーオプションのアンインストールをクリックします

問題は解決しました:D


8

OS 5.0にアプリケーションをインストールすると、次のメッセージが表示されます。

INSTALL_FAILED_DUPLICATE_PERMISSION perm=com.myapp.permission.C2D_MESSAGE pkg=com.myapp

重複するパッケージはなく、古いアプリケーションを手動でアンインストールするか、adbを使用してこの問題を解決できます。

adb uninstall com.yourpackage


5

上記のどれもうまくいきませんでした。私のアプリは以前はLollipopよりもうまく機能していました。しかし、Lollipopでテストしたところ、上記のエラーが発生しました。インストールを拒否しました。私は以前のバージョンをインストールしていなかったため、上記のソリューションはすべて私の場合無効です。しかし、このSOソリューションのおかげで、問題なく動作しています。ほとんどの開発者と同じように、Googleの誤解を招くチュートリアルに従って、次のようにコピーアンドペーストして権限を追加しました。

<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<permission android:name="com.google.android.permission.C2D_MESSAGE" 
            android:protectionLevel="signature" />

これは、古いバージョン<Lollipopで動作します。だから今私は次のように変更しました:

<uses-permission android:name="com.mycompany.myappname.c2dm.permission.RECEIVE" />
<permission android:name="com.mycompany.myappname.permission.C2D_MESSAGE" 
            android:protectionLevel="signature" />

4

CommonsWareは正しいですが、私の意見では、これは(バグ)不十分な言い方です:「デバイスにインストールされたapkは、インストールしようとしている新しい証明書とは異なる証明書で署名されています」

これは、以前は間違った証明書が原因でデバイスからアプリをアンインストールするかどうかを尋ねていたため、おそらく新しいバグです。

手動でアプリをアンインストールすることは、それがそうであるかもしれないのと同じくらい痛い解決策です。

また、チーム開発のために行った作業として、デバッグキーストアをリポジトリに追加し、gradleにポイントして次のように使用します。

android {
    ...
    signingConfigs {
        debug {
            storeFile file("../certificates/debug.keystore")
        }
    }

    ...

    buildTypes {
        debug {
            signingConfig signingConfigs.debug
        }
    }

    ...
}

また、チームメンバー間でデバイスを渡す場合、すべて同じデバッグ証明書を使用するため、問題は発生しません。:)


4

Android 5では、設定->アプリを確認します。アクティブユーザーのみを削除するのではなく(android 5には複数のユーザーがいて、私の電話にはゲストユーザーがいたため)、アクション/ツールバーの右上隅にあるアクセサリボタンをタップし、[すべてのユーザーからアンインストール]を選択します。Android 5では、ランチャーからアンインストールするだけで、アクティブユーザーのアプリのみをアンインストールするようです。

アプリはまだデバイス上にあります。リリースバージョンをインストールしようとしていたのでこれに夢中になり、機能しなかったので、デバッグバージョンがまだインストールされているため、アプリをアンインストールしたのが正しいと考えました。しかし、それでもインストールできませんでした。最初の手掛かりは、アンインストールされたアプリのアプリリストのレコードで、その横に、アンインストールされたというメッセージ(画像)がありました。

アンインストールしたアプリが引き続きアプリに表示される すべてのユーザーからアンインストール


申し訳ありませんが、あなたのコメントを見ました。これを画像付きの追加情報投稿と見なします。
ジョーディ14

2

このリンクを参照してください彼らが同じ鍵で署名されている場合に機能すると言った。リリースキーとデバッグキーは同じではありません。

だからそれを行う:

buildTypes {
        release {
            minifyEnabled true
            signingConfig signingConfigs.release//signing by the same key
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-android.txt'

        }
        debug {
            applicationIdSuffix ".debug"
            debuggable true
            signingConfig signingConfigs.release//signing by the same key
        }

    }

 signingConfigs {
        release {
            storeFile file("***\\key_.jks")
            storePassword "key_***"
            keyAlias "key_***"
            keyPassword "key_"***"
        }


}

1

以下の行を置き換えます:

<permission android:name="com.myapp.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="com.myapp.permission.C2D_MESSAGE" 
android:protectionLevel="signature" /> 

1

私の場合、次のように、パッケージ名に同じドメイン名を持ついくつかのアプリケーションをインストールしました。

com.mypackage.app1
com.mypackage.app2
com.mypackage.app3 
...

問題を解決するために、同様のパッケージ名を持つすべてのアプリをアンインストールして、再インストールする必要がありました。

デバイスからすべてのパッケージ名を見つけるために、私は以下を使用しました。

adb shell pm list packages

次に、探しているパッケージ名と一致するパッケージを取得しました。

dumpsys | grep -A18 "Package \[com.mypackage\]"

次に、そのドメインを持つすべてのアプリをアンインストールしました。

uninstall com.mypackage.app1
uninstall com.mypackage.app2
uninstall com.mypackage.app3
...

アプリケーションをアンインストールすることもできます Settings。に行くSettings -> Apps -> Find the app -> Uninstall

それが私と同じ問題を抱えている誰かを助けることを願っています。


0

以前は、署名が異なるアプリがデバイス上で見つかったと言っていました。IDEからインストールする場合、アンインストールするかどうかも尋ねられますか?

しかし、私はAndroid 5.0からアンインストールの理由を変えたと思います。同じ署名のアプリをインストールしている場合は発生しません


0

Nexus 5 Android Lollipop 5.0.1でも同じ問題が発生しました。

Installation error: INSTALL_FAILED_DUPLICATE_PERMISSION perm=com.android.** pkg=com.android.**

そして私の場合、私はuninstallingそれがであったため、この問題をアプリで修正できませんでしたandroid appが、アプリcustom permissions名をmanifest、Androidアプリと同じで、アンインストールも変更もできないためする必要がありました。

これが誰かに役立つことを願っています!


0

私の場合、次のエラーを受け取りました

インストールエラー:INSTALL_FAILED_DUPLICATE_PERMISSION perm = com.map.permission.MAPS_RECEIVE pkg = com.abc.Firstapp

パッケージ名のアプリをインストールしようとしたところcom.abc.Secondapp。ここでのポイントは、パッケージ名com.abc.Firstappを持つアプリがすでに私のアプリケーションにインストールされているということです。

パッケージ名でアプリケーションをアンインストールすることでこのエラーを解決しました com.abc.Firstappして、パッケージ名を使用してアプリケーションをインストールしますcom.abc.Secondapp

これがテスト中に誰かに役立つことを願っています。


0

AndroidManifest.xmlファイルで、特別に宣言された権限の名前を変更します。次に例を示します。

<!-- Creates a custom permission so only this app can receive its messages. NOTE: APP_PACKAGE.permission.C2D_MESSAGE -->   
<permission android:name="com.myapp.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="com.myapp.permission.C2D_MESSAGE" />    
<!-- END GCM -->

これに、

<!-- Creates a custom permission so only this app can receive its messages. NOTE: APP_PACKAGE.permission.C2D_MESSAGE -->   
<permission android:name="com.myapprocks.permission.C2D_MESSAGE"  android:protectionLevel="signature" />
<uses-permission android:name="com.myapprocks.permission.C2D_MESSAGE" />    
<!-- END GCM -->

com.myapprocksこの部分は、他のアプリとの競合を解決します。


0

私の場合、サードパーティのライブラリ(ベンダー)を使用しており、ライブラリにはデバイスにインストール済みのサンプルアプリが付属しています。そのため、ライブラリを実装する自分のアプリをインストールしようとするたびに、そのサンプルアプリが競合するようになりました。だから私はベンダーのサンプルアプリをアンインストールしただけで、それはその後動作します。




0

アプリのフレーバーが異なる場合は、まずアンインストールしてみてください。これは、同じ問題が発生したときに役立ちました。

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