Czy podpisałeś się przez pomyłkę?
Google Play nie zezwala na publikowanie aplikacji podpisanej przy użyciu magazynu kluczy debugowania. Jeśli spróbujesz przesłać taki plik APK, Google Play nie powiedzie się z komunikatem „Przesłałeś plik APK podpisany w trybie debugowania. Musisz podpisać swój plik APK w trybie zwolnienia”.
Jeśli jednak spróbujesz załadować aktualizację podpisaną przy użyciu magazynu kluczy debugowania, ten komunikat nie zostanie wyświetlony; Google Play wyświetli komunikat pokazany w pytaniu, odnoszący się do odcisków palców SHA1.
Najpierw sprawdź, czy aplikacja została podpisana przez pomyłkę.
Jak sprawdzić, które klucze podpisu zostały użyte?
Zbierz informacje z APK
Możesz sprawdzić, za pomocą których certyfikatów podpisano oryginalny APK i zaktualizować APK, używając następujących poleceń, używając Java keytool
:
keytool -list -printcert -jarfile original.apk
keytool -list -printcert -jarfile update.apk
To pokazuje szczegółowe informacje o tym, jak APK został podpisany, na przykład:
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
Ważne części, na które należy tutaj zwrócić uwagę - dla każdego pakietu APK - to wartość odcisku palca SHA1, wartość tożsamości właściciela i ważne od / do dat.
Jeśli to keytool
polecenie nie działa ( -jarfile
opcja wymaga Java 7), możesz uzyskać bardziej podstawowe informacje za pomocą jarsigner
polecenia:
jarsigner -verify -verbose:summary -certs original.apk
jarsigner -verify -verbose:summary -certs update.apk
To niestety nie pokazuje odcisku palca SHA1, ale pokazuje tożsamość właściciela X.509, wraz z datami wygaśnięcia certyfikatu. Na przykład:
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]
Możesz zignorować każdy komunikat „CertPath not validated”, a także ostrzeżenia o łańcuchach certyfikatów lub znacznikach czasu; w tym przypadku nie są istotne.
Porównaj wartości właściciela, SHA1 i wygaśnięcia między pakietami APK
Jeśli wartość właściciela / X.509 to CN=Android Debug, O=Android, C=US
, oznacza to, że podpisałeś pakiet APK za pomocą klucza debugowania , a nie oryginalnego klucza wydania
Jeśli wartość odcisku palca SHA1 różni się między oryginalnym i aktualizowanym pakietem APK, to nie użyto tego samego klucza podpisu dla obu pakietów APK
Jeśli wartości tożsamości Owner / X.509 są różne lub daty wygaśnięcia certyfikatu różnią się między dwoma pakietami APK, nie użyto tego samego klucza podpisu dla obu plików APK
Zauważ, że nawet jeśli wartości Owner / X.509 są identyczne między dwoma certyfikatami, nie oznacza to, że certyfikaty są identyczne - jeśli cokolwiek innego się nie zgadza - na przykład wartości odcisku palca - to certyfikaty są różne.
Wyszukaj oryginalny magazyn kluczy, sprawdź kopie zapasowe
Jeśli dwa pliki APK mają różne informacje o certyfikacie, musisz znaleźć oryginalny plik kluczy, tj. Plik z pierwszą wartością odcisku palca SHA1, którą keytool
podałeś Google Play (lub ).
Przeszukuj wszystkie pliki kluczy, które możesz znaleźć na komputerze, i we wszystkich posiadanych kopiach zapasowych, dopóki nie znajdziesz tego z prawidłowym odciskiem palca SHA1:
keytool -list -keystore my-release.keystore
Po prostu naciśnij, Enterjeśli pojawi się monit o hasło - niekoniecznie musisz go wprowadzić, jeśli chcesz szybko sprawdzić wartość SHA1.
Nigdzie nie mogę znaleźć oryginalnego magazynu kluczy
Jeśli nie możesz znaleźć oryginalnego magazynu kluczy, nigdy nie będziesz w stanie opublikować żadnych aktualizacji tej konkretnej aplikacji.
Android wspomina o tym wyraźnie na stronie Podpisywanie aplikacji :
Ostrzeżenie: przechowuj swój plik kluczy i klucz prywatny w bezpiecznym miejscu i upewnij się, że masz ich bezpieczne kopie zapasowe. Jeśli opublikujesz aplikację w Google Play, a następnie zgubisz klucz, za pomocą którego ją podpisałeś, nie będziesz w stanie opublikować żadnych aktualizacji aplikacji, ponieważ zawsze musisz podpisywać wszystkie wersje aplikacji za pomocą tego samego klucza.
Po pierwszym wydaniu pakietu APK wszystkie kolejne wydania muszą być podpisane dokładnie tym samym kluczem.
Czy mogę wyodrębnić oryginalny klucz podpisu z oryginalnego pliku APK?
Nie. Nie jest to możliwe. Plik APK zawiera tylko informacje publiczne, a nie informacje o kluczu prywatnym.
Czy mogę przeprowadzić migrację do nowego klucza do podpisywania?
Nie. Nawet jeśli znajdziesz oryginał, nie możesz podpisać pakietu APK za pomocą klucza A, a następnie podpisać następną aktualizację za pomocą obu kluczy A i B, a następnie podpisać następną aktualizację tylko za pomocą klucza B.
Podpisanie pliku APK (lub dowolnego pliku JAR) wieloma kluczami jest technicznie możliwe, ale Google Play nie akceptuje już plików APK z wieloma podpisami.
Próba zrobienia tego spowoduje wyświetlenie komunikatu „Twój plik APK został podpisany wieloma certyfikatami. Podpisz go tylko jednym certyfikatem i prześlij go ponownie”.
Co mogę zrobić?
Musisz zbudować aplikację z nowym identyfikatorem aplikacji (np. Zmienić z „com.example.myapp” na „com.example.myapp2”) i utworzyć zupełnie nowy wpis w Google Play.
Być może będziesz musiał także zmienić kod, aby ludzie mogli zainstalować nową aplikację, nawet jeśli mają zainstalowaną starą aplikację, np. Musisz upewnić się, że nie masz sprzecznych dostawców treści.
Utracisz istniejącą bazę instalacyjną, recenzje itp. I będziesz musiał znaleźć sposób, aby zachęcić obecnych klientów do odinstalowania starej aplikacji i zainstalowania nowej wersji.
Ponownie upewnij się, że masz bezpieczne kopie zapasowe magazynu kluczy i hasła używanych w tej wersji.