INSTALL_FAILED_DUPLICATE_PERMISSION… C2D_MESSAGE


179

Uygulamamda Google bildirimlerini kullanıyorum ve şimdiye kadar manifest'te şunları yaptım:

<!-- 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 cihazımı Android 5.0 sürümüne güncelleyene kadar mükemmel çalıştı.
Şimdi Eclipse ile bu cihaza uygulamayı yüklemeye çalıştığınızda, bu hatayı alıyorum:

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

Neyin yanlış olduğunu anlamıyorum? Android 5.0'a kadar mükemmel çalışıyordu.
Ben kullanıyorum bilmek C2D_MESSAGEiki hatlarında, permissionve uses-permissionama sorun olmalı bu yüzden, orijinal Google GCM kılavuzundan bu kodu kopyaladıktan.


20
Başlangıçta belirsiz bir hata için aldığınız şey (iyi, yaptım…) aslında iki uygulamanın farklı bir imzayla imzalanan aynı özel izni bildirmesini, bir cihaza yüklenmesini engelleyen yeni bir güvenlik özelliğidir
AZ_

Yanıtlar:


231

Benim için işe yarayan bir çözüm buldum.

Cihazımda (Nexus 7) Android 5.0. Lolipop Bu adımları takip ediyorum.

Uygulamayı Kaldırdıktan Sonra Sekmenin App NameUygulama Listesi altında bulabilirsiniz Downloaded.

  • Ayarlara git
  • Uygulamalar
  • Listenin altında, YourApp"MONTAJ DEĞİL" Etiketi ile karşılaşacaksınız
  • Açık
  • Tıklayın OptionMenuve "Tüm Kullanıcılar için Kaldır" ı seçin

Bu adımlardan sonra, yeni uygulamayı başarıyla yükledim ve iyi çalışıyor.


6
Android 5.0.1 ile nexus 9 nave ve "noto yüklü" etiketi ile benim app göremiyorum
xXJohnRamboXx 14:15

Bu benim için çalıştı, teşekkürler! Sorunum biraz farklıydı. Mobil uygulamamızda otomatik test (Xamarin.UITest) yapıyorum ve bazı manuel testler için farklı bir sürüm yükledim. Uygulamayı cihaza (VS / Xamarin UITest üzerinden) yüklemeye çalıştığımda, bu sorunu görmeye başladım. Tekrar teşekkürler.
LuFaMa

Bu doğru cevap olmalı: stackoverflow.com/a/27767179/343679
Sharj

@Pratik Butani Çözüm benim için çalıştı. Hatayı almanın nedenini bilmek ister misiniz? Lütfen açıklayabilir misiniz?
Karthikeyan Ve

1
Uygulamamı listenin alt kısmında MONTAJ DEĞİL etiketiyle bulamıyorum . Ne demek istiyorsun?
IgorGanapolsky

139

Kaldırmak

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

Uygulamayı Çalıştır ... Sonra tekrar izin ekleyin ve Uygulamayı çalıştırın.

Hazır!.


31
Uygulamanızın hata ayıklamasını yüklemeye ve aynı cihaza sürüm yayınlamaya çalıştığınızda bu sorun sıklıkla ortaya çıktığı için bu yanıt en üstte olmalıdır. Bu çözüm ile kolayca yapabilirsiniz. Manifest'te değişken kullanabileceğinizi bilmiyordum. Oyla!
florian

4
Uygulama zaten üretimde ise bu cevap çalışmaz. Uygulamamdaki kullanıcıların izinler olmadan yeni bir sürüm indirmesini ve ardından tekrar izinlerle daha yeni bir sürüm yüklemesini bekleyemiyorum.
nilsmagnus

5
Uygulamanızın farklı adlara sahip hata ayıklama ve sürüm sürümlerine sahip olduğunuz için bu gerçekleşiyorsa, çalışması için bir kaldırma işlemi gerekli değildir: sadece ${applicationId}kodlamak yerine kullanmanız gerekir
yuval

1
Statik uygulama kimliği yerine $ {applicationId} kullanmak sorunumu çözdü! Tatlandırıcılar kullanırken dahil !!!!
JannGabriel

1
@ yuval'ın yorumu yerinde ve bunu benim için çözdü. Birçok cevaptan, bu en iyi sorunu ele alıyor: stackoverflow.com/a/36992939/56285
Jonik

49

Android-21'deki özel imza izniyle aynı sorunu yaşadım ve tam bir kaldırma işlemi yaptığımdan emin olarak çözdüm.

Bu, şu durumlarda ortaya çıkan bir uç durumdur:

  1. Uygulama, imza düzeyinde güvenlik kullanarak özel bir izin tanımlar
  2. Yüklü uygulamayı farklı bir anahtarla imzalanmış bir sürümle güncellemeye çalışıyorsunuz
  3. Test cihazı, birden fazla kullanıcı desteğiyle Android 21 veya daha yenisini çalıştırıyor

Komut satırı örneği

İşte sorunu ve sorunun nasıl çözüleceğini gösteren bir komut satırı metni. Bu noktada bir hata ayıklama sürümü yüklü ve ben bırakma anahtarıyla imzalanmış bir üretim sürümünü yüklemeye çalışıyorum:

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

Tutulma örneği

Ters yönde (Eclipse bir yayın derlemesi zaten yüklüyken bir hata ayıklama derlemesi yüklemeye çalışırken), aşağıdaki iletişim kutusunu alıyorum:

Eclipse yeniden yükleme iletişim kutusu

Bu noktada evet cevabını verirseniz kurulum başarılı olacaktır.

Cihaz örneği

Başka bir yanıtta belirtildiği gibi, cihaz ayarlarındaki bir uygulama bilgi sayfasına gidebilir, taşma menüsünü tıklayabilir ve bu hatayı önlemek için "Tüm kullanıcılar için kaldır" ı seçebilirsiniz.


Teşekkürler, Ancak yanıtınızı "cihaz ayarlarındaki bir uygulama bilgi sayfasına da gidebilir, taşma menüsünü tıklayabilir ve" Bu hatayı önlemek için "Tüm kullanıcılar için kaldır" ı seçmeniz gerekir.
yajnesh

Benimle evlen lütfen. Redaksiyonunuzu takiben Ayarlar> Uygulamalar'a gittim, uygulamanın eski sürümüne dokunun ve seçenek menüsünde "Tüm kullanıcılar için kaldır" ı seçin.
Fabricio PH

Önkoşul listenizin # 2'sinin doğru olması gerekmez. Benim durumumda , uygulamayı güncellemiyorum , ancak bu işlem başına açıklanan farklı paket adıyla aynı uygulamanın bir hata ayıklama derlemesini yüklüyorum. stackoverflow.com/a/21006552/507339 . Bu bir çözüm göremediğim bir konu
Nilzor

33

Bunu önce alternatif apk'yi kaldırmaya başvurmadan çözdüm (ne acı, değil mi?). Bir apk'nin hem hata ayıklama hem de yayın sürümünü başarıyla yüklemek için, izinlerin android: ad değerlerini derleme zamanında değiştirmek için AndroidManifest.xml içindeki gradle'ın yerleşik $ {applicationId} yer tutucusunu kullanmanız yeterlidir.

Build.gradle dosya snippet'i:

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

AndroidStudio.xml dosya snippet'i:

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

Yer aapt l -a app-debug.apktutucunun düzgün bir şekilde uygulandığından emin olmak için apk içindeki değiştirilmiş AndroidManifest.xml dosyasını inceleyebilirsiniz . Çeşitli ürün aromaları kullanıyorsanız, eminim ihtiyaçlarınıza göre bu yöntemin bir varyasyonunu uygulayabilirsiniz.


applicationIdiki farklı olarak farklı tanımlarsam productFlavorsve ${applicationId}etkiyi kullanırsam aynı olur.
Robert

1 lezzetten fazlasına ihtiyacınız varsa, bunun daha sağlam bir çözüm olduğunu düşünüyorum.
Robert

bu doğru olarak işaretlenmelidir. Her iş arkadaşınızdan bir proje oluşturmak ve apk'yi yüklemek için
etrafta

Teşekkürler, @jackpile uygulaması benim için gayet iyi çalışıyor, hem sürüm hem de hata ayıklama yapıları yüklüyse sadece bir sorun var, sonra hata ayıklama kurulumunu yükledikten sonra bunun yerine sürüm oluşturma açılır
Prateek Surana

bu doğru cevap olarak işaretlenmelidir .. teşekkürler @Jackpile
ahmed ewess

28

Manifest dosyanızdan paket adınızın "Sabit Kodlu" referanslarını kaldırın.

(Kullanmasanız bile bu en iyi uygulamadır productFlavors)

Örneğin, bildiriminizde aşağıdakiler varsa:

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

Bunu şu şekilde değiştirdi:

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

Ardından, modül not dosyanızda ilgili öğenizi ayarlayın 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
    }
}

Daha fazla bilgi için bu öğreticiyi takip edebilirsiniz


2
kullanarak ${applicationId}sorunu benim için düzeltti!
Andy

Bu söz konusu konuyu nasıl ele alıyor?
Vincent

18

uygulamayı adb ile kaldırmayı deneyin:

adb uninstall com.yourpackage

Tuhaf, APK'mı Sistem UI'sından kaldırmış olsam da yüklü uygulamalar altında görünmese de Nexus 6'mda bunu yapmak zorunda kaldım.
Jon Willis

Bana verdi Failure [DELETE_FAILED_INTERNAL_ERROR]. Nedeni ne olabilir?
Reaz Murshed

17

Bu hatayı verirken, izin reddedildiği için uygulamanın paket adından açıkça bahsedilecektir. Ve sadece uygulamayı kaldırmak sorunu çözmez. Sorunu çözmek için aşağıdaki adımı yapmalıyız:

  1. Ayarlara git
  2. Uygulamaya Git
  3. İndirilen uygulama listesine git
  4. Kaldırılan uygulamayı listede görebilirsiniz
  5. Uygulamayı tıklayın, daha fazla seçeneğe gidin
  6. Tüm kullanıcı seçenekleri için kaldır'a tıklayın

Çözülen problem: D


8

OS 5.0'da bir uygulama yüklerken şu mesajı alıyorum:

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

Çoğaltılmış paket yok ve bu sorunu eski uygulamayı manuel olarak kaldırmayı veya adb'yi kullanarak çözebiliriz:

adb uninstall com.yourpackage


5

Yukarıdakilerin hiçbiri benim için çalışmadı. Uygulamam daha önce Lollipop'tan iyi çalışıyordu. Ama bunu Lollipop'ta test ettiğimde yukarıdaki hata ortaya çıktı. Yüklemeyi reddetti. Yüklü önceki sürümlerim yoktu, bu yüzden yukarıdaki tüm çözümler benim durumumda geçersiz. Ancak bu SO çözümü sayesinde şimdi iyi çalışıyor. Çoğu geliştirici gibi Google'ın yanıltıcı eğitimini izledim ve izinleri kopyalayıp yapıştırarak aşağıdaki gibi ekledim:

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

Bu, <Lollipop'un eski sürümleriyle çalışır. Şimdi değiştim:

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

4

CommonsWare doğru, ama bence bu (hata) kötü bir yol: "Cihaza yüklenen apk farklı bir sertifika ile imzalamaya çalışıyor, sonra yüklemeye çalıştığınız yeni sertifika" .

Bu muhtemelen yeni bir hatadır, çünkü geçmişte uygulamayı yanlış sertifika nedeniyle cihazdan kaldırıp kaldırmamayı soruyordu.

Olabilecek kadar acı veren bir çözüm, uygulamayı manuel olarak kaldırmak olacaktır.

Ayrıca ekip geliştirme uğruna yaptıklarımız, hata ayıklama anahtar deposunu depomuza ekledik ve kullanmak için puanlama ölçütü ekledik:

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

    ...

    buildTypes {
        debug {
            signingConfig signingConfigs.debug
        }
    }

    ...
}

Ve şimdi ekip üyeleri arasında cihazları geçirirken, hepimiz aynı hata ayıklama sertifikasını kullanıyoruz, bu yüzden sorun yok. :)


4

Android 5'te ayarlarınızı kontrol edin -> uygulamalar. Sadece aktif kullanıcıyı silmek yerine (android 5'in birden fazla kullanıcısı olabileceğinden ve telefonumun bir misafir kullanıcısı olduğundan) eylem / araç çubuğunun sağ üst köşesindeki aksesuar düğmesine hafifçe vurun ve "tüm kullanıcılar için kaldır" ı seçin. Android 5'te yalnızca başlatıcıdan kaldırdığınızda uygulamayı yalnızca etkin kullanıcı için kaldırdığınız anlaşılıyor.

Uygulama hala cihazda .. Bu bir sürüm yayınlamaya çalışıyorum beri göz kamaştırdı, işe yaramadı, bu yüzden hala hata ayıklama sürümü yüklü, app kaldırıldı çünkü olması gerektiğini düşündüm. Ama yine de yükleyemedi .. İlk ipucu, kaldırılan uygulamanın uygulama listesinde kaldırıldığı mesajının bulunduğu bir kayıttı (resim).

Yüklü uygulama hala uygulamalarda görünüyor Tüm kullanıcılar için kaldırıldı


Sry, yorumuna baktı. Bunu sadece resimli ekstra bir bilgi gönderisi olarak değerlendireceğiz.
Jordy

2

Bu bağlantıya bakınAynı anahtarla imzalandıklarında çalışacağı söylenen . Serbest bırakma anahtarı ve hata ayıklama anahtarı aynı değildir.

Öyleyse yap:

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

aşağıdaki satırları değiştirin:

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

1

Benim durumumda, paket adında aşağıdaki gibi aynı etki alanı adına sahip birkaç uygulama yükledim.

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

Benzer paket adlarına sahip tüm uygulamaları kaldırmak ve sorundan kurtulmak için tekrar yüklemek zorunda kaldım.

Aygıttaki tüm paket adlarını bulmak için aşağıdakileri kullandım.

adb shell pm list packages

Sonra aradığım paket adımla eşleşen paketleri aldım.

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

Ardından, bu etki alanına sahip tüm uygulamaları kaldırın.

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

Ayrıca, uygulamaları Settings . Şuraya git:Settings -> Apps -> Find the app -> Uninstall

Umarım benimle aynı sorunu yaşayan birine yardımcı olur.


0

Daha önce, farklı imzalı bir uygulamanın cihazda bulunduğunu söylerdi. IDE'den yükleme yaparken de kaldırmak istiyor musunuz?

Ancak Android 5.0'dan kaldırma nedenini değiştirdiklerini düşünüyorum. Aynı imzayla uygulama yüklüyorsanız gerçekleşmez


0

Bir nexus 5 Android Lollipop 5.0.1 ile aynı sorunla karşılaştım:

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

Ve benim durumumda bir sorun olduğu uninstallingiçin bu sorunu çözemedim android app, ancak uygulama custom permissionsadımı değiştirmek zorunda kaldımmanifest çünkü bir android uygulamasıyla aynı oldukları için kaldıramadım veya herhangi bir değişiklik yapamadım.

Umarım bu birine yardımcı olur!


0

Benim durumumda aşağıdaki hatayı aldım

Yükleme hatası: INSTALL_FAILED_DUPLICATE_PERMISSION perm = com.map.permission.MAPS_RECEIVE pkg = com.abc.Firstapp

Paket adı olan uygulamayı yüklemeye çalışırken com.abc.Secondapp. İşte nokta, paket adı olan uygulamacom.abc.Firstapp ile uygulama benim uygulamasında zaten yüklü oldu.

Bu hatayı uygulamayı paket adıyla kaldırıp com.abc.Firstappardından paket adıyla yükleyerek çözdümcom.abc.Secondapp

Umarım bu test sırasında birine yardımcı olur.


0

AndroidManifest.xml dosyanızda, özel olarak bildirilmiş izinlerinizin adlarını değiştirin, örneğin:

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

buna,

<!-- 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 bu bölümü diğer uygulamanızla çakışmayı çözer.


0

Benim durumumda bir üçüncü taraf kitaplığı (satıcı gibi) kullanıyordum ve kitaplık, cihazımda zaten yüklediğim örnek bir uygulama ile geliyor. Bu yüzden, örnek uygulamayı şimdi kütüphaneyi uygulayan kendi uygulamamı yüklemeye çalıştığımda çakışıyordu. Bu yüzden sadece satıcının örnek uygulamasını kaldırdım ve daha sonra çalışır.



0

Uygulamayı kaldırdıktan sonra telefonumu yeniden başlattım ve işe yaradı


0

Uygulamanın farklı bir lezzetine sahipseniz, önce uygulamayı kaldırmayı deneyin. Aynı sorunu yaşadığımda bu bana yardımcı oldu.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.