Jak podpisać już skompilowany apk

121

Odkodowałem plik APK za pomocą apktool (ponieważ oryginalny kod źródłowy został utracony), więc mogłem naprawić niektóre problemy z plikami XML układu. Następnie odbudowałem go z powrotem za pomocą apktool i kiedy próbowałem go zainstalować na moim urządzeniu (używając adb: adb install appname.apk), dał mi ten błąd:

[INSTALL_PARSE_FAILED_NO_CERTIFICATES]

oryginalny plik APK został jednak podpisany przez magazyn kluczy (w środowisku Eclipse IDE), a ten nie jest, jak mogę go poprawnie podpisać za pomocą oryginalnego pliku klucza poza Eclipse !?

svarog
źródło
tak, celem certyfikatów jest powstrzymanie ludzi przed robieniem tego ... Jeśli nie masz oryginalnego certyfikatu, będziesz musiał go zregenerować
edthethird
to po prostu to, mam oryginalny certyfikat, ale dekodowanie / przebudowanie apk usunęło go.
svarog

Odpowiedzi:

285

utwórz klucz za pomocą

keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000

następnie podpisz apk za pomocą:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore my_application.apk alias_name

sprawdź tutaj, aby uzyskać więcej informacji

user3854546
źródło
11
to powinna być odpowiedź, 27 głosów za w porównaniu z 3 przy pierwotnej odpowiedzi, no dalej!
Kyle
1
jeśli to zrobisz i spróbujesz zainstalować APK, możesz skończyć z błędem INSTALL_FAILED_DUPLICATE_PERMISSION. Dzieje się tak, gdy oryginalny plik APK nie może zostać nadpisany (na przykład system lub aplikacja wbudowana)
Couitchy,
@Couitchy adb shell pm install -r /data/tmp/myapk.apk
Dr Deo
14
jeśli nie chcesz zawracać sobie głowy tworzeniem klucza, możesz użyć klucza debugowania z: jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ~ ​​/ .android / debug.keystore app.apk androiddebugkey -storepass android
Pellet
3
Czy jest różnica między używaniem jarsignera apksigner? Jeden wymaga podpisania, a następnie zipaligning, a drugi zipaligning, a następnie podpisania
Maria Ines Parnisari
72

Zautomatyzowany proces:

Użyj tego narzędzia (używa nowego apksignera od Google):

https://github.com/patrickfav/uber-apk-signer

Zastrzeżenie: jestem programistą :)

Proces ręczny:

Krok 1: Wygeneruj magazyn kluczy (tylko raz)

Musisz raz wygenerować magazyn kluczy i użyć go do podpisania swojego unsignedapk. Skorzystaj z dostarczonego przez JDK wkeytool %JAVA_HOME%/bin/

keytool -genkey -v -keystore my.keystore -keyalg RSA -keysize 2048 -validity 10000 -alias app

Krok 2 lub 4: Zipalign

zipalign które jest narzędziem dostarczanym przez Android SDK znaleziony np. %ANDROID_HOME%/sdk/build-tools/24.0.2/jest obowiązkowym krokiem optymalizacji, jeśli chcesz przesłać apk do Sklepu Play.

zipalign -p 4 my.apk my-aligned.apk

Uwaga: w przypadku korzystania ze starego jarsignernależy wykonać zipalign PO podpisaniu. Korzystając z nowej apksignermetody robisz to PRZED podpisaniem (mylące, wiem). Wywołanie zipalign przed apksigner działa dobrze, ponieważ apksigner zachowuje wyrównanie i kompresję APK (w przeciwieństwie do jarsigner).

Możesz sprawdzić wyrównanie za pomocą

zipalign -c 4 my-aligned.apk

Krok 3: Podpisz i zweryfikuj

Korzystanie z narzędzi do kompilacji 24.0.2 i starszych

Użyj jarsignerktóre, podobnie jak keytool, jest dostarczane z dystrybucją JDK znalezioną w %JAVA_HOME%/bin/i używaj go w następujący sposób:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my.keystore my-app.apk my_alias_name

i można je zweryfikować za pomocą

jarsigner -verify -verbose my_application.apk

Korzystanie z narzędzi do kompilacji 24.0.3 i nowszych

Android 7.0 wprowadza APK Signature Scheme v2, nowy schemat podpisywania aplikacji, który zapewnia krótszy czas instalacji aplikacji i lepszą ochronę przed nieautoryzowanymi zmianami w plikach APK (zobacz tutaj i tutaj, aby uzyskać więcej informacji). Dlatego firma Google zaimplementowała własnego sygnatariusza apk o nazwieapksigner (duh!). Plik skryptu można znaleźć w %ANDROID_HOME%/sdk/build-tools/24.0.3/( plik .jar znajduje się w /libpodfolderze). Użyj tego w ten sposób

apksigner sign --ks my.keystore my-app.apk --ks-key-alias alias_name

i można je zweryfikować za pomocą

apksigner verify my-app.apk

Oficjalną dokumentację można znaleźć tutaj.

Patrick Favre
źródło
6
Dzięki za uber-apk-signer! Świetne narzędzie!
kantoni
2
W przypadku narzędzi do kompilacji 24.0.3 poprawnym sposobem wywołania zipalign jest: zipalign -p 4 my.apk my-aligned.apk
kinORnirvana
Dziękuję za opis! próbowałem najpierw uber-apk-signer, ale prawdopodobnie nie powiodło się, ponieważ mam zainstalowany openJDK w moim systemie zamiast „oficjalnej” javy wyroczni. Spróbowałem więc ręcznie i też się nie udało (nadal ten sam błąd [INSTALL_PARSE_FAILED_NO_CERTIFICATES]). Weryfikacja z uber-apk-signer dała mi więcej informacji signature VERIFY FAILED[...] ERROR: JAR signer CERT.RSA: JAR signature META-INF/CERT.RSA uses digest algorithm 2.16.840.1.101.3.4.2.1 and signature algorithm 1.2.840.113549.1.1.1 which is not supported on API Levels [[15, 17]]. Tak, nie ma Androida 4.2.2, SHA256? pomysły?
antypleks
@antiplex zgłoś problem na github, a nie SO
Patrick Favre
@ for3st Czy masz na myśli, że moje problemy mogą nie wynikać z mojej ograniczonej wiedzy na temat podpisywania apk, ale z jakiejś formy niekompatybilności uber-apk-signer? ale nawet wtedy sposób ręczny również zawodzi, co wydaje się niezwiązane z twoim narzędziem ...
antiplex
14

najszybszym sposobem jest podpisanie za pomocą magazynu kluczy debugowania:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ~/.android/debug.keystore app.apk androiddebugkey -storepass android

lub w systemie Windows:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore %USERPROFILE%/.android/debug.keystore test.apk androiddebugkey -storepass android
Śrut
źródło
4

Dla tych z Was, którzy nie chcą tworzyć pliku bat do edycji dla każdego projektu lub nie chcą zapamiętywać wszystkich poleceń związanych z programami keytools i jarsigner i chcą tylko zrobić to w jednym procesie, użyj tego programu:

http://lukealderton.com/projects/programs/android-apk-signer-aligner.aspx

Zbudowałem go, ponieważ miałem dość długiego procesu wpisywania wszystkich lokalizacji plików za każdym razem.

Ten program może zapisać konfigurację, więc następnym razem, gdy go uruchomisz, wystarczy nacisnąć przycisk Generuj, a zajmie się tym za Ciebie. Otóż ​​to.

Nie jest wymagana instalacja, jest całkowicie przenośna i zapisuje swoje konfiguracje w pliku CSV w tym samym folderze.

Luke Alderton
źródło