INSTALL_FAILED_DUPLICATE_PERMISSION ... C2D_MESSAGE

179

Saya menggunakan pemberitahuan Google di aplikasi saya, dan sampai sekarang saya telah melakukannya di manifes:

<!-- 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 -->

Ini bekerja dengan baik sampai saya memperbarui Nexus 7 ke Android 5.0 saya.
Sekarang ketika saya mencoba menginstal aplikasi di perangkat ini dengan Eclipse, saya mendapatkan kesalahan ini:

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

Saya tidak mengerti apa yang salah? Itu bekerja dengan sempurna hingga Android 5.0.
Saya tahu bahwa saya menggunakan C2D_MESSAGEdua baris, permissiondan uses-permissiontetapi saya telah menyalin kode itu dari panduan Google GCM yang asli, jadi pasti baik-baik saja.

NullPointerException
sumber
20
Apa yang awalnya Anda ambil untuk bug yang tidak jelas (well, saya lakukan ...) sebenarnya adalah fitur keamanan baru yang mencegah dua aplikasi dari menyatakan izin khusus yang sama yang ditandatangani dengan tanda tangan yang berbeda, untuk diinstal pada perangkat
AZ_

Jawaban:

231

Saya telah menemukan solusi yang berfungsi untuk saya.

Di Perangkat Saya (Nexus 7) Android 5.0. Lollipop saya ikuti langkah-langkah ini.

Setelah Menghapus Aplikasi, Anda akan menemukan di App Namebawah Daftar Aplikasi Downloadedtab.

  • Pergi ke pengaturan
  • Aplikasi
  • Di bagian bawah daftar, Anda akan menemukan YourApptag "NOT INSTALLED"
  • Buka
  • Klik OptionMenudan Pilih "Copot pemasangan untuk semua Pengguna"

Setelah langkah-langkah ini, saya berhasil menginstal aplikasi baru dan itu berjalan dengan baik.

Pratik Butani
sumber
6
Saya nave nexus 9 dengan android 5.0.1 dan saya tidak bisa melihat aplikasi saya dengan tag "
notoinstall
Ini berhasil untuk saya, terima kasih! Masalah saya sedikit berbeda. Saya melakukan pengujian otomatis (Xamarin.UITest) di aplikasi seluler kami, dan saya mengunggah versi yang berbeda untuk beberapa pengujian manual. Ketika saya mencoba memuat aplikasi (via VS / Xamarin UITest) ke perangkat, saya mulai melihat masalah ini. Terima kasih lagi.
LuFaMa
Yang ini harus menjadi jawaban yang benar: stackoverflow.com/a/27767179/343679
Sharj
@Pratik Butani Solusinya bekerja untuk saya. Saya ingin tahu alasan untuk mendapatkan kesalahan? Bisakah Anda jelaskan?
Karthikeyan Ve
1
Saya tidak menemukan aplikasi saya di bagian bawah daftar dengan tag BUKAN DIINSTAL . Maksud kamu apa?
IgorGanapolsky
139

Menghapus

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

Jalankan Aplikasi ... Kemudian Tambahkan permisson lagi dan Jalankan Aplikasi.

Siap!.

Delmirio Segura
sumber
31
Jawaban ini harus di atas karena masalah ini sering terjadi ketika Anda mencoba menginstal debug dan merilis versi aplikasi Anda pada perangkat yang sama. Dengan solusi ini Anda dapat dengan mudah melakukannya. Saya tidak tahu Anda bisa menggunakan variabel dalam manifes. Suara positif!
florian
4
Jawaban ini tidak berfungsi jika aplikasi sudah dalam produksi. Saya tidak dapat mengharapkan pengguna aplikasi saya untuk mengunduh versi baru tanpa izin dan kemudian menginstal versi yang lebih baru dengan izin lagi.
nilsmagnus
5
Jika ini terjadi pada Anda karena Anda memiliki versi debug dan lepaskan aplikasi Anda dengan nama yang berbeda, maka penghapusan instalan tidak diperlukan agar bisa berfungsi: Anda hanya perlu menggunakan ${applicationId}alih - alih
meng
1
Menggunakan $ {applicationId} alih-alih id aplikasi statis menyelesaikan masalah saya !! Termasuk saat menggunakan Flavours !!!!
JannGabriel
1
Komentar @ yuval tepat dan menyelesaikan ini untuk saya. Dari banyak jawaban, yang terbaik ini mencakup masalah: stackoverflow.com/a/36992939/56285
Jonik
49

Saya memiliki masalah yang sama dengan izin tanda tangan khusus pada Android-21 dan menyelesaikannya dengan memastikan saya melakukan uninstall lengkap.

Ini adalah kasus tepi yang terjadi ketika:

  1. Aplikasi mendefinisikan izin khusus menggunakan keamanan tingkat tanda tangan
  2. Anda berupaya memperbarui aplikasi yang diinstal dengan versi yang ditandatangani dengan kunci yang berbeda
  3. Perangkat uji menjalankan Android 21 atau lebih baru dengan dukungan untuk banyak pengguna

Contoh baris perintah

Berikut ini adalah transkrip baris perintah yang menunjukkan masalah dan cara mengatasinya. Pada titik ini versi debug diinstal dan saya mencoba untuk menginstal versi produksi yang ditandatangani dengan kunci rilis:

# 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]# 

Contoh gerhana

Pergi ke arah yang berlawanan (mencoba menginstal debug build dari Eclipse ketika rilis build sudah diinstal), saya mendapatkan dialog berikut:

Eclipse instal ulang dialog

Jika Anda hanya menjawab ya pada titik ini instalasi akan berhasil.

Contoh perangkat

Seperti yang ditunjukkan dalam jawaban lain, Anda juga dapat membuka halaman info aplikasi di pengaturan perangkat, klik menu overflow, dan pilih "Copot pemasangan untuk semua pengguna" untuk mencegah kesalahan ini.

kode-x
sumber
Terima kasih, Tetapi Anda harus memulai jawaban Anda dengan "Anda juga dapat pergi ke halaman info aplikasi di pengaturan perangkat, klik menu overflow, dan pilih" Copot pemasangan untuk semua pengguna "untuk mencegah kesalahan ini."
yajnesh
Silakan menikahi saya. Setelah redaksi Anda, saya pergi ke Pengaturan> Aplikasi, sentuh di versi lama aplikasi dan di menu opsi pilih "Copot pemasangan untuk semua pengguna".
Fabricio PH
# 2 dari daftar prasyarat Anda tidak harus benar. Dalam kasus saya, saya tidak memperbarui aplikasi, tetapi menginstal debug-membangun aplikasi yang sama dengan nama paket yang berbeda seperti yang dijelaskan per proceudre ini. stackoverflow.com/a/21006552/507339 . Ini adalah masalah yang saya tidak melihat solusi untuk
Nilzor
33

Saya telah memecahkan ini tanpa harus menggunakan uninstall apk alternatif terlebih dahulu (apa yang menyakitkan, kan?). Untuk berhasil menginstal versi debug dan rilis apk, cukup gunakan placeholder $ {applicationId} bawaan Gradle di AndroidManifest.xml untuk memodifikasi android izin: nilai nama pada waktu kompilasi.

Cuplikan file build.gradle:

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

Cuplikan file AndroidStudio.xml:

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

Anda dapat memeriksa file AndroidManifest.xml yang dimodifikasi dalam apk menggunakan aapt l -a app-debug.apkuntuk memastikan placeholder diterapkan dengan benar. Jika Anda menggunakan berbagai rasa produk, saya yakin Anda dapat menerapkan variasi metode ini sesuai dengan kebutuhan Anda.

Jackpile
sumber
tampaknya jika saya mendefinisikan berbeda applicationIddalam dua berbeda productFlavors, dan menggunakan ${applicationId}efeknya akan sama.
Robert
Saya pikir ini adalah solusi yang lebih kuat jika Anda membutuhkan lebih dari 1 rasa.
Robert
ini harus ditandai dengan benar. mengingat bahwa Anda tidak dapat mengharapkan dari setiap rekan kerja untuk melakukan beberapa hacks di sekitar untuk hanya membangun sebuah proyek dan menginstal apk
goemic
Terima kasih, @jackpile aplikasi berjalan dengan baik bagi saya hanya ada satu masalah jika ada kedua rilis dan debug build yang diinstal kemudian setelah menginstal debug build rilis build terbuka sebagai gantinya
Prateek Surana
ini harus ditandai sebagai jawaban yang benar .. terima kasih @Jackpile
ahmed ewess
28

Hapus referensi "Hard Coded" apa pun dari nama paket Anda, dari file manifes Anda.

(Ini adalah praktik terbaik bahkan jika Anda tidak menggunakan productFlavors)

Misalnya, jika manifes Anda mengandung:

<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"/>

Mengubahnya menjadi:

<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"/>

Kemudian, dalam file gradle modul Anda, atur relevan Anda 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
    }
}

Anda dapat mengikuti tutorial ini untuk informasi lebih lanjut

David
sumber
2
menggunakan ${applicationId}memperbaiki masalah untuk saya!
Andy
Bagaimana ini mengatasi masalah yang disebutkan?
Vincent
18

coba hapus instalan aplikasi dengan adb:

adb uninstall com.yourpackage
Giuseppe
sumber
Aneh, saya hanya harus melakukan ini pada Nexus 6 saya, meskipun saya telah menghapus instalan APK saya melalui UI Sistem DAN tidak muncul di bawah aplikasi yang diinstal.
Jon Willis
Itu memberi saya Failure [DELETE_FAILED_INTERNAL_ERROR]. Apa yang mungkin menjadi alasannya?
Reaz Murshed
17

Saat memberikan kesalahan ini, ia akan dengan jelas menyebutkan nama paket aplikasi karena izinnya ditolak. Dan hanya menghapus instalan aplikasi tidak akan menyelesaikan masalah. Untuk mengatasi masalah, kita perlu melakukan langkah berikut:

  1. Pergi ke pengaturan
  2. Menuju aplikasi
  3. Buka daftar aplikasi yang diunduh
  4. Anda dapat melihat aplikasi yang dihapus dalam daftar
  5. Klik pada aplikasi, buka opsi lainnya
  6. Klik uninstall untuk semua opsi pengguna

Masalah terpecahkan: D

Preethi Rao
sumber
8

Menginstal aplikasi di OS 5.0 saya mendapatkan pesan ini:

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

Tidak ada paket duplikat, dan kami dapat mengatasi masalah ini dengan menghapus instalasi aplikasi lama secara manual atau menggunakan adb:

adb uninstall com.yourpackage

Jorgesys
sumber
5

Tidak satu pun di atas bekerja untuk saya. Aplikasi saya berfungsi dengan baik sebelum Lollipop. Tetapi ketika saya mengujinya di Lollipop kesalahan di atas muncul. Itu menolak untuk menginstal. Saya tidak memiliki versi sebelumnya yang diinstal sehingga semua solusi di atas tidak valid dalam kasus saya. Tetapi berkat solusi SO ini sekarang berfungsi dengan baik. Sama seperti kebanyakan pengembang saya mengikuti tutorial menyesatkan Google dan saya menambahkan izin dengan salin dan tempel seperti ini:

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

Ini akan bekerja dengan versi yang lebih lama <Lollipop. Jadi sekarang saya berubah menjadi:

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

CommonsWare benar, tetapi menurut saya ini adalah cara (bug) yang buruk untuk mengatakan: "Apk yang diinstal pada perangkat ditandatangani dengan sertifikat yang berbeda dengan yang baru yang Anda coba pasang" .

Ini mungkin adalah bug baru karena di masa lalu ia digunakan untuk menanyakan apakah akan menghapus aplikasi dari perangkat karena salah sertifikat.

Solusinya sama menyakitkannya dengan menghapus aplikasi itu secara manual.

Juga apa yang telah kami lakukan demi pengembangan tim, kami menambahkan keystore debug ke repositori kami, dan arahkan gradle untuk menggunakannya seperti:

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

    ...

    buildTypes {
        debug {
            signingConfig signingConfigs.debug
        }
    }

    ...
}

Dan sekarang ketika melewati perangkat antara anggota tim, kita semua menggunakan sertifikat debug yang sama, jadi tidak ada masalah. :)

TacB0sS
sumber
4

Di Android 5, periksa pengaturan Anda -> aplikasi. Alih-alih menghapus hanya untuk pengguna aktif (karena android 5 dapat memiliki beberapa pengguna dan ponsel saya memiliki pengguna tamu) ketuk tombol aksesori di sudut kanan atas tindakan / bilah alat dan pilih "copot untuk semua pengguna". Tampaknya di Android 5 saat Anda baru mencopot pemasangan dari peluncur, Anda hanya mencopot aplikasi untuk pengguna aktif.

Aplikasi ini masih ada di perangkat .. Ini membuat saya terpesona karena saya mencoba untuk menginstal versi rilis, tidak berfungsi jadi saya pikir ya benar karena saya masih menginstal versi debug, menghapus aplikasi. Tapi daripada masih tidak bisa menginstal .. Petunjuk pertama adalah catatan dalam daftar aplikasi aplikasi yang dihapus dengan pesan di sebelahnya bahwa itu dihapus (gambar).

Aplikasi yang belum diinstal masih muncul di aplikasi Copot pemasangan untuk semua pengguna

Jordy
sumber
Sry, perhatikan komentar Anda. Kami hanya akan mempertimbangkan ini sebagai posting info tambahan dengan gambar.
Jordy
2

Lihat tautan ini ini yang katanya akan berfungsi saat mereka ditandatangani oleh kunci yang sama. Kunci rilis dan kunci debug tidak sama.

Jadi lakukanlah:

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_"***"
        }


}
NickUnuchek
sumber
1

ganti baris di bawah ini:

<permission android:name="com.myapp.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="com.myapp.permission.C2D_MESSAGE" 
android:protectionLevel="signature" /> 
Sỹ Phạm
sumber
1

Dalam kasus saya, saya memiliki beberapa aplikasi yang diinstal memiliki nama domain yang sama dalam nama paket sebagai berikut.

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

Saya harus menghapus semua aplikasi yang memiliki nama paket yang sama dan menginstalnya kembali untuk menghilangkan masalah.

Untuk menemukan semua nama paket dari perangkat saya menggunakan yang berikut ini.

adb shell pm list packages

Kemudian saya mengambil paket yang sesuai dengan nama paket saya yang saya cari.

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

Kemudian copot semua aplikasi yang memiliki domain itu.

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

Anda juga dapat menghapus instalasi aplikasi menggunakan Settings aplikasi. Pergi keSettings -> Apps -> Find the app -> Uninstall

Harapan itu membantu seseorang yang memiliki masalah yang sama dengan saya.

Reaz Murshed
sumber
0

Sebelumnya digunakan untuk mengatakan bahwa aplikasi dengan tanda tangan berbeda ditemukan di perangkat. Saat menginstal dari IDE, ia juga akan menanyakan apakah Anda ingin menghapus instalannya?

Tapi saya pikir dari Android 5.0 mereka telah mengubah alasan untuk menghapus instalasi. Itu tidak terjadi jika Anda menginstal aplikasi dengan tanda tangan yang sama

Yasir
sumber
0

Saya mengalami masalah yang sama dengan nexus 5 Android Lollipop 5.0.1:

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

Dan dalam kasus saya, saya tidak dapat memperbaiki masalah uninstallingaplikasi ini karena itu adalah android app, tetapi saya harus mengubah custom permissionsnama aplikasi sayamanifest karena mereka sama dengan aplikasi android, yang saya tidak dapat menghapus atau melakukan perubahan apa pun.

Semoga ini bisa membantu seseorang!

Ultimo_m
sumber
0

Dalam kasus saya, saya menerima kesalahan berikut

Kesalahan pemasangan: INSTALL_FAILED_DUPLICATE_PERMISSION perm = com.map.permission.MAPS_RECEIVE pkg = com.abc.Firstapp

Ketika saya mencoba untuk menginstal aplikasi yang memiliki nama paket com.abc.Secondapp. Intinya adalah aplikasi dengan nama paket com.abc.Firstappsudah diinstal di aplikasi saya.

Saya mengatasi kesalahan ini dengan menghapus instalasi aplikasi dengan nama paket com.abc.Firstapp dan kemudian menginstal aplikasi dengan nama paketcom.abc.Secondapp

Saya harap ini akan membantu seseorang saat pengujian.

Abhinav Singh Maurya
sumber
0

Di file AndroidManifest.xml Anda, ubah nama izin yang Anda nyatakan khusus, misalnya:

<!-- 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 -->

untuk ini,

<!-- 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 bagian ini menyelesaikan konflik dengan aplikasi Anda yang lain.

resw67
sumber
0

Dalam kasus saya, saya menggunakan perpustakaan pihak ketiga (yaitu vendor) dan perpustakaan dilengkapi dengan aplikasi sampel yang sudah saya instal pada perangkat saya. Sehingga aplikasi sampel sekarang saling bertentangan setiap kali saya mencoba menginstal aplikasi sendiri yang mengimplementasikan perpustakaan. Jadi saya hanya mencopot aplikasi sampel vendor dan berfungsi setelahnya.

Nouvel Travay
sumber
0

Saya mencopot versi sebelumnya. Ini berhasil untuk saya.

Sushil Dhayal
sumber
0

Saya me-restart telepon saya setelah menghapus aplikasi dan itu berhasil

Pedro Martins
sumber
0

Jika Anda memiliki rasa aplikasi yang berbeda, coba uninstall dulu. Ini membantu saya ketika saya memiliki masalah yang sama.

olleh
sumber