web-dev-qa-db-fra.com

le paquet est en conflit avec 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 articles sur SO qui indiquent que ce message se produit lorsque l'application est signée avec une clé de version différente.

exemple d'article sur différentes clés

. Dans mes journaux lorsque j'essaie de mettre à niveau l'apk, j'obtiens les éléments suivants:

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 est en production depuis plus de 4 ans et a été écrite à l’aide de 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. Il fonctionne bien et sera installé sur un périphérique sur lequel la version précédente n'est pas installée.

J'ai copié le magasin de clés de mon ancien disque dur sur mon nouveau SSD et je l'utilise pour signer la nouvelle version de l'application dans Android Studio. Je n'ai donc utilisé que le même magasin 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 clé différente?

[UPDATE1]

J'ai extrait le CERT.RSA pour les anciens et nouveaux apk. Ils utilisent tous les deux le même magasin de clés et les mêmes clés, mais j’ai remarqué que j’utilisais le mauvais alias de publication. Ci-dessous sont les empreintes digitales pour les deux apks le haut est l'ancien, le bas.

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                                        ;Z.B
]
]


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 bonnes versions en cliquant sur 'Générer Signé Apk' mais il y a toujours une erreur, bien que différente.

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

. J'ai essayé de construire le nouvel apk 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 sur les deux applications, quelqu'un peut-il expliquer pourquoi la nouvelle application ne sera toujours pas mise à niveau?

[MISE À JOUR 2]

Je viens de me rappeler que, lorsque j'importais le projet Eclipse dans Android Studio, il ne se construisait pas correctement. Il y avait un problème avec l'objet Appication. Mon objet d'application s'appelle NfcScannerApplication et une classe est implémentée sous le même nom (décrit également dans le manifeste).

Une fois importé dans Android Studio, construit et installé sur un appareil, Android a déclaré ne pas trouver la classe Application. J'ai donc 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. Cela pourrait-il être la raison pour laquelle, même si j'utilise le même magasin de clés, etc., Android pense qu'il existe 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 fournisseur de contenu qui obtient le contexte d'application lorsque l'application est chargée pour la première fois. J'appelle getContext et le diffuse dans ma classe d'application.

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

//old code
//Context context = getContext();
      //nfcAppObj = (NfcScannerApplication) getContext();


//new code
       Context applicationContext = getContext().getApplicationContext();
       nfcAppObj = getRealApplication(applicationContext);
7
turtleboy

Si vous avez l'ancien apk, vous pouvez l'utiliser pour obtenir les détails du certificat utilisé pour le signer. (Extrayez le fichier CERT.RSA du fichier apk (qui le décompresse), puis exécutez 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 (fourni 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 jugez correct correspond réellement.

Pour votre référence:

Obtenir les détails du certificat d'un apk

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

0
Juan

Sauf si vous faites quelque chose de spécial, lorsque vous cliquez sur le bouton "Jouer" dans Android Studio, il utilisera une clé de débogage temporaire spécifique à AS pour signer l'application, puis l'installera sur votre appareil.

Eclipse a fait quelque chose de très similaire.

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

  • Installez l’apk manuellement via adb, voyez si l’erreur persiste.
  • Signez l'apk vous-même à travers gradle, voyez si l'erreur persiste.

Si ces deux étapes ne fonctionnent pas, je pense qu'il est raisonnable de supposer que vous n'utilisez pas la même clé que celle que vous utilisiez auparavant.

0
Graeme

Publiez votre apk signé sur le Play Store en version bêta ou alpha si le Play Store refuse votre apk, ce qui 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é à partir de Play Store.

Si votre application ne figure pas sur le Play Store, vous pouvez extraire votre apk précédent de l'appareil et comparer les signatures de APK SHA1.

obtenir SHA1 de l'apk Comment savoir quel fichier de clés a été utilisé pour signer une application?

0
amorenew