Hai firmato con la chiave di debug per errore?
Google Play non ti consente di pubblicare un'app firmata con il tuo keystore di debug. Se provi a caricare un tale APK, Google Play fallirà con il messaggio "Hai caricato un APK che era stato firmato in modalità debug. Devi firmare il tuo APK in modalità di rilascio".
Tuttavia, se si tenta di caricare un aggiornamento che è firmato con il keystore di debug, si non vedere questo messaggio; Google Play visualizzerà il messaggio mostrato nella domanda, facendo riferimento alle impronte digitali SHA1.
Quindi, in primo luogo, controlla se hai firmato l'app con la chiave di debug per errore.
Come posso verificare quali chiavi di firma sono state utilizzate?
Raccogliere le informazioni dall'APK
È possibile verificare con quali certificati sono stati firmati l'APK originale e l'APK di aggiornamento utilizzando questi comandi, utilizzando Java keytool
:
keytool -list -printcert -jarfile original.apk
keytool -list -printcert -jarfile update.apk
Questo mostra informazioni dettagliate su come è stato firmato un APK, ad esempio:
Owner: CN=My App, O=My Company, L=Somewhere, C=DE
Issuer: CN=My App, O=My Company, L=Somewhere, C=DE
Serial number: 4790b086
Valid from: Mon Nov 11 15:01:28 GMT 2013 until: Fri Mar 29 16:01:28 BST 2041
Certificate fingerprints:
MD5: A3:2E:67:AF:74:3A:BD:DD:A2:A9:0D:CA:6C:D4:AF:20
SHA1: A6:E7:CE:64:17:45:0F:B4:C7:FC:76:43:90:04:DC:A7:84:EF:33:E9
SHA256: FB:6C:59:9E:B4:58:E3:62:AD:81:42:...:09:FC:BC:FE:E7:40:53:C3:D8:14:4F
Signature algorithm name: SHA256withRSA
Version: 3
Le parti importanti da notare qui - per ciascun APK - sono il valore dell'impronta digitale SHA1 , il valore dell'identità del proprietario e il Valido da / fino alle date.
Se quel keytool
comando non funziona (l' -jarfile
opzione richiede Java 7), è possibile ottenere ulteriori informazioni di base tramite il jarsigner
comando:
jarsigner -verify -verbose:summary -certs original.apk
jarsigner -verify -verbose:summary -certs update.apk
Questo purtroppo non mostra l'impronta digitale SHA1, ma mostra l'identità del proprietario X.509, insieme alle date di scadenza del certificato. Per esempio:
sm 4642892 Thu Apr 17 10:57:44 CEST 2014 classes.dex (and 412 more)
X.509, CN=My App, O=My Company, L=Somewhere, C=DE
[certificate is valid from 11/11/13 12:12 to 29/03/41 12:12]
[CertPath not validated: Path does not chain with any of the trust anchors]
È possibile ignorare qualsiasi messaggio "CertPath non convalidato", insieme ad avvertenze su catene di certificati o timestamp; non sono rilevanti in questo caso.
Confronta i valori Proprietario, SHA1 e Scadenza tra gli APK
Se il valore dell'identità del proprietario / X.509 è CN=Android Debug, O=Android, C=US
, allora hai firmato l'APK con la chiave di debug , non la chiave di rilascio originale
Se il valore dell'impronta digitale SHA1 è diverso tra gli APK originali e di aggiornamento, non è stata utilizzata la stessa chiave di firma per entrambi gli APK
Se i valori dell'identità del proprietario / X.509 sono diversi o le date di scadenza del certificato differiscono tra i due APK, non è stata utilizzata la stessa chiave di firma per entrambi gli APK
Si noti che anche se i valori Proprietario / X.509 sono identici tra i due certificati, ciò non significa che i certificati siano identici - se qualcos'altro non corrisponde - come i valori delle impronte digitali - i certificati sono diversi.
Cerca il keystore originale, controlla i backup
Se i due APK hanno informazioni sul certificato diverse, è necessario trovare il keystore originale, ovvero il file con il primo valore di impronta digitale SHA1 che Google Play (o keytool
) ti ha detto.
Cerca tra tutti i file di archivio chiavi che puoi trovare sul tuo computer e in tutti i backup che hai, fino a quando non hai quello con l'impronta digitale SHA1 corretta:
keytool -list -keystore my-release.keystore
Basta premere Enterse viene richiesta la password: non è necessario immetterla se si desidera verificare rapidamente il valore SHA1.
Non riesco a trovare il keystore originale da nessuna parte
Se non riesci a trovare il keystore originale, non potrai mai pubblicare aggiornamenti su questa particolare app.
Android lo menziona esplicitamente nella pagina Firma la tua applicazione :
Avviso: conservare il keystore e la chiave privata in un luogo sicuro e assicurarsi di disporre di backup sicuri. Se pubblichi un'app su Google Play e perdi la chiave con cui hai firmato l'app, non potrai pubblicare aggiornamenti sulla tua app, poiché devi sempre firmare tutte le versioni dell'app con la stessa chiave.
Dopo la prima versione di un APK, tutte le versioni successive devono essere firmate con la stessa chiave esatta.
Posso estrarre la chiave di firma originale dall'APK originale?
No, non è possibile. L'APK contiene solo informazioni pubbliche e non informazioni sulla chiave privata.
Posso migrare su una nuova chiave di firma?
No. Anche se trovi l'originale, non puoi firmare un APK con il tasto A, quindi firmare il prossimo aggiornamento con entrambi i tasti A e B, quindi firmare il successivo aggiornamento solo con il tasto B.
La firma di un APK (o di qualsiasi file JAR) con più chiavi è tecnicamente possibile, ma Google Play non accetta più APK con più firme.
Tentare di farlo comporterà il messaggio "Il tuo APK è stato firmato con più certificati. Firma solo con un certificato e caricalo di nuovo."
Cosa posso fare?
Dovrai creare la tua app con un nuovo ID applicazione (ad esempio passare da "com.example.myapp" a "com.example.myapp2") e creare una nuova inserzione su Google Play.
Probabilmente dovrai anche cambiare il tuo codice in modo che le persone possano installare la nuova app anche se hanno installata la vecchia app, ad esempio devi assicurarti di non avere provider di contenuti in conflitto.
Perderai la tua base di installazione esistente, recensioni ecc. E dovrai trovare un modo per convincere i tuoi clienti esistenti a disinstallare la vecchia app e installare la nuova versione.
Ancora una volta, assicurati di avere backup sicuri del keystore e delle password che usi per questa versione.