Le paquet empêche un paquet existant du même nom

J'ai un problème où la mise à niveau de mon apk ne sera pas installée en raison du message ci-dessus.

J'ai lu des messages sur SO qui disent que ce message se produit lorsque l'application est signée avec une autre clé de diffusion.

  • Alignement du texte fin de boutons Android
  • Android: comment envoyer périodiquement un emplacement à un serveur
  • Erreur: Impossible d'ouvrir le fichier de classe R.java
  • Aucun JNI_OnLoad n'a trouvé l'ignorance> Arrêt de l'application
  • NullPointerException sur getReseources () Bitmap Array
  • Effet de transition bouton ActionBar up
  • Exemple de publication sur différentes clés

    . Dans mes journaux alors que j'essaie de mettre à niveau l'option, je reçois ce qui suit:

    04-07 13:28:03.796 2072-2072/? W/InstallAppProgress: Replacing package:com.xxx.rr3 04-07 13:28:04.326 3675-3845/? W/PackageManager: verifying app can be installed or not 04-07 13:28:04.378 3675-3845/? W/PackageManager: Package com.xxx.rr3 signatures do not match the previously installed version; ignoring! 

    . L'application originale était en production depuis plus de 4 ans et a été écrite à l'aide d'Eclipse, qui est installé sur mon ancien disque dur.

    Il y a 6 mois, mon patron m'a acheté un lecteur SSD et j'ai installé Android Studio. J'ai migré l'ancien projet et il se construit bien et il va s'installer sur un périphérique qui n'a pas installé la version précédente.

    J'ai copié le magasin de clés de mon ancien disque dur vers mon nouveau SSD et je l'utilise pour signer la nouvelle version de l'application dans Android Studio. Je n'ai donc jamais utilisé la même batterie de clés, avec les mêmes mots de passe et alias.

    Quelqu'un peut-il me dire pourquoi Android dit que ma mise à niveau est signée avec une autre clé?

    [UPDATE1]

    J'ai extrait CERT.RSA pour les anciens et les nouveaux apk. Ils utilisent tous deux le même magasin de clés et les clés, mais j'ai remarqué que j'utilise le mauvais alias de sortie. Ci-dessous les empreintes digitales pour les deux pubs, la première est l'ancienne en bas, la nouvelle.

     C:\OpenSSL-Win64\bin>keytool -printcert -file CERT.RSA Owner: CN=matthew womersley, OU=dev, O=carefreegroup, L=wakefield, ST=west yorkshire Issuer: CN=matthew womersley, OU=dev, O=carefreegroup, L=wakefield, ST=west yorkshire Serial number: 6144ad2c Valid from: Fri Jan 11 08:55:29 GMT 2013 until: Thu May 14 09:55:29 BST 3012 Certificate fingerprints: MD5: 50:63:5E:54:9D:D3:C4:71:A9:4E:3C:F4:27:9E:50:CA SHA1: 7C:2C:DB:7E:92:D2:01:46:43:8D:D2:B9:A4:D2:B0:F4:85:E7:16:D9 SHA256: 38:64:89:4D:A2:37:72:AA:CE:90:5E:34:46:B9:D0:A4:CA:18:B7:07:7A:E2:DB:1D:7C:60:CD:70:F6:77:C5:FF Signature algorithm name: SHA256withRSA Version: 3 Extensions: #1: ObjectId: 2.5.29.14 Criticality=false SubjectKeyIdentifier [ KeyIdentifier [ 0000: 3F 95 E8 FA 36 5B 26 07 33 72 8B 09 37 0C 18 C5 ?...6[&.3r..7... 0010: 3B 5A 19 42 ;ZB ] ] C:\OpenSSL-Win64\bin>keytool -list -keystore .keystore keytool error: java.lang.Exception: Keystore file does not exist: .keystore C:\OpenSSL-Win64\bin>keytool -printcert -file CERT.RSA Owner: CN=matthew womersley, OU=dev, O=carefreegroup, L=wakefield, ST=west yorkshire Issuer: CN=matthew womersley, OU=dev, O=carefreegroup, L=wakefield, ST=west yorkshire Serial number: 6144ad2c Valid from: Fri Jan 11 08:55:29 GMT 2013 until: Thu May 14 09:55:29 BST 3012 Certificate fingerprints: MD5: 50:63:5E:54:9D:D3:C4:71:A9:4E:3C:F4:27:9E:50:CA SHA1: 7C:2C:DB:7E:92:D2:01:46:43:8D:D2:B9:A4:D2:B0:F4:85:E7:16:D9 SHA256: 38:64:89:4D:A2:37:72:AA:CE:90:5E:34:46:B9:D0:A4:CA:18:B7:07:7A:E2:DB:1D:7C:60:CD:70:F6:77:C5:FF Signature algorithm name: SHA256withRSA Version: 3 

    J'ai spécifié les versions de sortie correctes en cliquant sur 'Générer Signature Apk' mais il y a toujours une erreur, bien que différente.

    Le paquet est en conflit avec un paquet existant avec le même nom

    . J'ai essayé de créer le nouvel app manuellement, en utilisant le lien suivant:

    lien

     C:\Users\mattheww\StudioProjects\nfcscanner3>gradlew assembleRelease Downloading https://services.gradle.org/distributions/gradle-2.14.1-all.zip Unzipping C:\Users\mattheww\.gradle\wrapper\dists\gradle-2.14.1-all\8bnwg5hd3w55iofp58khbp6yv\gradle-2.14.1-all.zip to C:\Users\mattheww\.gradle\wrapper\dists\gradle-2.14.1-all\8bnwg5hd3w55iofp58khbp6yv FAILURE: Build failed with an exception. * Where: Build file 'C:\Users\mattheww\StudioProjects\nfcscanner3\app\build.gradle' line: 1 * What went wrong: A problem occurred evaluating project ':app'. > java.lang.UnsupportedClassVersionError: com/android/build/gradle/AppPlugin : Unsupported major.minor version 52.0 * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. BUILD FAILED Total time: 29.982 secs 

    .

    Si le magasin de clés et les empreintes digitales correspondent aux deux applications, quelqu'un peut-il expliquer pourquoi la nouvelle application ne sera toujours pas mise à niveau?

    [MISE À JOUR 2]

    Je viens juste de me rappeler que lorsque j'avais importé le projet Eclipse dans Android Studio, cela ne fonctionnerait pas correctement. Il y a eu un problème avec l'objet d'application. My Appication Object s'appelle NfcScannerApplication et j'ai une classe mise en œuvre avec le même nom (qui est également décrit dans le manifeste).

    Une fois importé dans Android Studio, construit et lancé sur un périphérique, Android a déclaré qu'il ne pouvait pas trouver la classe Application. Alors j'ai utilisé le code suivant qui semblait résoudre le problème.

     public static NfcScannerApplication getRealApplication (Context applicationContext) { Log.e(TAG, "inside NfcScannerApplication getRealApplication"); NfcScannerApplication application = null; if (applicationContext instanceof NfcScannerApplication) { application = (NfcScannerApplication) applicationContext; } else { Application realApplication = null; Field magicField = null; try { magicField = applicationContext.getClass().getDeclaredField("realApplication"); magicField.setAccessible(true); realApplication = (Application) magicField.get(applicationContext); } catch (NoSuchFieldException e) { Log.e(TAG, e.getMessage()); } catch (IllegalAccessException e) { Log.e(TAG, e.getMessage()); } application = (NfcScannerApplication) realApplication; } return application; } // the above method is commented out and this is used //because the migration process from Eclipse to Android //needed it. see below //https://stackoverflow.com/questions/36495954/bootstrapapplication-cannot-be-cast-to-applicationclass 

    Il utilise la réflexion pour obtenir la classe Application. Pourrait-il être la raison pour laquelle, même si j'utilise le même magasin de clés, etc., Android pense qu'il y a une application différente sur l'appareil portant le même nom?

    [MISE À JOUR 3] Je semble avoir trouvé le problème. 🙂 J'ai un ContentProvider qui obtient le contexte d'application lorsque l'application est chargée pour la première fois. J'appelle getContext et je l'ai jeté dans ma classe Application.

    Ce que je fais maintenant, c'est appeler getContext.getApplicationContext () et ça fonctionne bien maintenant. Voici le code que j'utilise maintenant et l'ancien code est décrit ci-dessus.

     //old code //Context context = getContext(); //nfcAppObj = (NfcScannerApplication) getContext(); //new code Context applicationContext = getContext().getApplicationContext(); nfcAppObj = getRealApplication(applicationContext); 

  • Android LocalServerSocket
  • Avantage d'utiliser Parcelable au lieu d'un objet de sérialisation
  • Comment gérer: java.util.concurrent.TimeoutException: android.os.BinderProxy.finalize () a expiré après 10 secondes d'erreurs?
  • Mise en route de WiFi sur Android
  • Planifier un emploi récurrent en utilisant un répartiteur de travaux de Firebase
  • Android Studio - Gradle
  • 3 Solutions collect form web for “Le paquet empêche un paquet existant du même nom”

    Si vous avez l'ancien apk, vous pouvez l'utiliser pour obtenir les détails du cert utilisés pour le signer. (Extraire le fichier CERT.RSA de l'apk -unziping it-, puis exécuter l'application openssl sur ce fichier.)

     unzip -p App.apk META-INF/CERT.RSA |openssl pkcs7 -inform DER -noout -print_certs -text 

    Ensuite, utilisez keytool (qui vient avec java) pour répertorier les certificats de votre magasin de clés, et voir si vous trouvez une correspondance, ou si le certificat que vous pensez être le bon correspond vraiment.

    Pour votre référence:

    Obtenir des détails de certificat à partir d'un apk

    Comment savoir quel magasin de clés a été utilisé pour signer une application?

    Publiez votre apk signé dans la Play Store en version bêta ou alpha si le Play Store refuse votre apk, cela signifie que votre magasin de clés n'est pas la clé d'origine.

    Si play store a accepté votre apk, essayez de mettre à jour votre apk installé depuis Play Store.

    Si votre application n'est pas répertoriée sur Play Store, vous pouvez extraire votre apk précédent de l'appareil et comparer les deux APK signature signature SHA1

    Pour obtenir SHA1 de l'apk Comment puis-je savoir quel magasin de clés a été utilisé pour signer une application?

    À moins que vous ne fassiez quelque chose de spécial, lorsque vous cliquez sur le bouton "Jouer" dans Android Studio, il utilisera une clé de débogage spécifique temporaire AS pour signer l'application puis elle l'installera sur votre appareil.

    Eclipse a fait quelque chose de très similaire.

    Si vous parlez d'utiliser Android Studios "Générer Signed APK", essayez les étapes de débogage suivantes:

    • Installez l'apk par l'intermédiaire d'Adb manuellement, voir si l'erreur persiste.
    • Signez l'apk vous-même à travers gradle, voir si l'erreur persiste.

    Si ces deux étapes ne fonctionnent pas, je pense qu'il est raisonnablement sûr de supposer que vous n'utilisez pas la même clé que vous étiez auparavant.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.