Udostępnij za pośrednictwem


Ręczne podpisywanie zestawu APK

Po utworzeniu aplikacji do wydania pakiet APK musi zostać podpisany przed dystrybucją, aby można było go uruchomić na urządzeniu z systemem Android. Ten proces jest zwykle obsługiwany w środowisku IDE, jednak w niektórych sytuacjach konieczne jest ręczne podpisanie pakietu APK w wierszu polecenia. Poniższe kroki są związane z podpisywaniem pakietu APK:

  1. Utwórz klucz prywatny — ten krok należy wykonać tylko raz. Klucz prywatny jest niezbędny do cyfrowego podpisania pakietu APK. Po przygotowaniu klucza prywatnego ten krok można pominąć w przyszłych kompilacjach wersji.

  2. Zipalign APKZipalign to proces optymalizacji wykonywany w aplikacji. Umożliwia systemowi Android wydajniejszą interakcję z pakietem APK w czasie wykonywania. Platforma Xamarin.Android przeprowadza sprawdzanie w czasie wykonywania i nie zezwoli aplikacji na uruchomienie, jeśli plik APK nie został spakowany.

  3. Podpisz plik APK — ten krok obejmuje użycie narzędzia apksigner z zestawu Sdk systemu Android i podpisanie pakietu APK przy użyciu klucza prywatnego utworzonego w poprzednim kroku. Aplikacje opracowane ze starszymi wersjami narzędzi kompilacji zestawu Android SDK przed wersją 24.0.3 będą używać aplikacji jarsigner z zestawu JDK. Oba te narzędzia zostaną omówione bardziej szczegółowo poniżej.

Kolejność kroków jest ważna i zależy od tego, które narzędzie zostało użyte do podpisania pakietu APK. W przypadku korzystania z aplikacji apksigner ważne jest, aby najpierw spakować aplikację, a następnie podpisać ją za pomocą pliku apksigner. Jeśli konieczne jest użycie narzędzia jarsigner do podpisania pliku APK, ważne jest, aby najpierw podpisać plik APK, a następnie uruchomić zipalign.

Wymagania wstępne

Ten przewodnik koncentruje się na używaniu elementu apksigner z narzędzi kompilacji zestawu Android SDK, w wersji 24.0.3 lub nowszej. Przyjęto założenie, że plik APK został już zbudowany.

Aplikacje utworzone przy użyciu starszej wersji narzędzi kompilacji zestawu Android SDK muszą używać narzędzia jarsigner zgodnie z opisem w temacie Sign the APK with jarsigner below (Podpisywanie pakietu APK przy użyciu narzędzia jarsigner poniżej).

Tworzenie prywatnego magazynu kluczy

Magazyn kluczy to baza danych certyfikatów zabezpieczeń tworzonych przy użyciu narzędzia keytool programu z zestawu JAVA SDK. Magazyn kluczy ma kluczowe znaczenie dla publikowania aplikacji platformy Xamarin.Android, ponieważ system Android nie będzie uruchamiał aplikacji, które nie zostały podpisane cyfrowo.

Podczas programowania platforma Xamarin.Android używa magazynu kluczy debugowania do podpisywania aplikacji, co umożliwia wdrożenie aplikacji bezpośrednio w emulatorze lub na urządzeniach skonfigurowanych do używania aplikacji do debugowania. Jednak ten magazyn kluczy nie jest rozpoznawany jako prawidłowy magazyn kluczy do celów dystrybucji aplikacji.

Z tego powodu należy utworzyć prywatny magazyn kluczy i używać go do podpisywania aplikacji. Jest to krok, który należy wykonać tylko raz, ponieważ ten sam klucz będzie używany do publikowania aktualizacji, a następnie może służyć do podpisywania innych aplikacji.

Ważne jest, aby chronić ten magazyn kluczy. W przypadku jego utraty nie będzie możliwe publikowanie aktualizacji w aplikacji za pomocą sklepu Google Play. Jedynym rozwiązaniem problemu spowodowanego przez utracony magazyn kluczy byłoby utworzenie nowego magazynu kluczy, ponowne podpisanie pliku APK przy użyciu nowego klucza, a następnie przesłanie nowej aplikacji. Następnie stara aplikacja musiałaby zostać usunięta ze sklepu Google Play. Podobnie, jeśli ten nowy magazyn kluczy zostanie naruszony lub publicznie dystrybuowany, możliwe jest rozpowszechnianie nieoficjalnych lub złośliwych wersji aplikacji.

Tworzenie nowego magazynu kluczy

Utworzenie nowego magazynu kluczy wymaga narzędzia wiersza polecenia narzędzia keytool z zestawu JAVA SDK. Poniższy fragment kodu to przykład użycia narzędzia keytool (zastąp <my-filename> ciąg nazwą pliku magazynu kluczy i <key-name> nazwą klucza w magazynie kluczy):

$ keytool -genkeypair -v -keystore <filename>.keystore -alias <key-name> -keyalg RSA \
          -keysize 2048 -validity 10000

Pierwszą rzeczą, o którą zapytamy, jest hasło magazynu kluczy. Następnie zostanie wyświetlony monit o podanie pewnych informacji, które pomogą w utworzeniu klucza. Poniższy fragment kodu to przykład tworzenia nowego klucza o nazwie publishingdoc , który będzie przechowywany w pliku xample.keystore:

$ keytool -genkeypair -v -keystore xample.keystore -alias publishingdoc -keyalg RSA -keysize 2048 -validity 10000
Enter keystore password:
Re-enter new password:
What is your first and last name?
  [Unknown]:  Ham Chimpanze
What is the name of your organizational unit?
  [Unknown]:  NASA
What is the name of your organization?
  [Unknown]:  NASA
What is the name of your City or Locality?
  [Unknown]:  Cape Canaveral
What is the name of your State or Province?
  [Unknown]:  Florida
What is the two-letter country code for this unit?
  [Unknown]:  US
Is CN=Ham Chimpanze, OU=NASA, O=NASA, L=Cape Canaveral, ST=Florida, C=US correct?
  [no]:  yes

Generating 2,048 bit RSA key pair and self-signed certificate (SHA1withRSA) with a validity of 10,000 days
        for: CN=Ham Chimpanze, OU=NASA, O=NASA, L=Cape Canaveral, ST=Florida, C=US
Enter key password for <publishingdoc>
        (RETURN if same as keystore password):
Re-enter new password:
[Storing xample.keystore]

Aby wyświetlić listę kluczy przechowywanych w magazynie kluczy, użyj narzędzia keytool z opcją — list :

$ keytool -list -keystore xample.keystore

Spakuj plik APK

Przed podpisaniem pliku APK przy użyciu pliku apksigner należy najpierw zoptymalizować plik przy użyciu narzędzia zipalign z zestawu Android SDK. zipalign zrestrukturyzuje zasoby w apk wzdłuż granic 4 bajtów. To wyrównanie umożliwia systemowi Android szybkie ładowanie zasobów z pakietu APK, zwiększenie wydajności aplikacji i potencjalnie zmniejszenie użycia pamięci. Platforma Xamarin.Android przeprowadzi sprawdzanie czasu wykonywania, aby ustalić, czy plik APK został spakowany. Jeśli plik APK nie jest spakowany, aplikacja nie zostanie uruchomiona.

Następujące polecenie użyje podpisanego pliku APK i utworzy podpisany, spakowany plik APK o nazwie helloworld.apk , który jest gotowy do dystrybucji.

$ zipalign -f -v 4 mono.samples.helloworld-unsigned.apk helloworld.apk

Podpisywanie pakietu APK

Po spakowaniu pliku APK należy go podpisać przy użyciu magazynu kluczy. Odbywa się to za pomocą narzędzia apksigner znajdującego się w katalogu build-tools wersji narzędzi kompilacji zestawu SDK. Jeśli na przykład zainstalowano narzędzia kompilacji zestawu ANDROID SDK w wersji 25.0.3, plik apksigner można znaleźć w katalogu:

$ ls $ANDROID_HOME/build-tools/25.0.3/apksigner
/Users/tom/android-sdk-macosx/build-tools/25.0.3/apksigner*

Poniższy fragment kodu zakłada, że element apksigner jest dostępny dla zmiennej środowiskowej PATH . Podpisze plik APK przy użyciu aliasu publishingdoc klucza zawartego w pliku xample.keystore:

$ apksigner sign --ks xample.keystore --ks-key-alias publishingdoc mono.samples.helloworld.apk

Po uruchomieniu tego polecenia plik apksigner poprosi o podanie hasła do magazynu kluczy w razie potrzeby.

Aby uzyskać więcej informacji na temat korzystania z aplikacji apksigner, zobacz dokumentację firmy Google.

Uwaga

Zgodnie z 62696222 problemu Google, apksigner jest "brakuje" z zestawu Android SDK. Obejściem tego problemu jest zainstalowanie narzędzi kompilacji zestawu SDK systemu Android w wersji 25.0.3 i użycie tej wersji pliku apksigner.

Podpisywanie pliku APK przy użyciu narzędzia jarsigner

Ostrzeżenie

Ta sekcja ma zastosowanie tylko wtedy, gdy jest to nececssary, aby podpisać plik APK za pomocą narzędzia jarsigner . Deweloperzy są zachęcani do używania apksigner do podpisywania pakietu APK.

Ta technika obejmuje podpisywanie pliku APK przy użyciu polecenia jarsigner z zestawu JAVA SDK. Narzędzie jarsigner jest dostarczane przez zestaw JAVA SDK.

Poniżej pokazano, jak podpisać plik APK przy użyciu narzędzia jarsigner i klucza publishingdoc zawartego w pliku magazynu kluczy o nazwie xample.keystore :

$ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore xample.keystore mono.samples.helloworld.apk publishingdoc

Uwaga

W przypadku korzystania z narzędzia jarsigner ważne jest, aby najpierw podpisać plik APK, a następnie użyć pliku zipalign.