Publikowanie aplikacji systemu Android przy użyciu wiersza polecenia
Aby dystrybuować wieloplatformową aplikację interfejsu użytkownika aplikacji platformy .NET (.NET MAUI) dla systemu Android, musisz podpisać ją przy użyciu klucza z magazynu kluczy. Magazyn kluczy to baza danych certyfikatów zabezpieczeń utworzonych przy użyciu zestawu keytool
Java Development Kit (JDK). Magazyn kluczy jest wymagany podczas publikowania aplikacji .NET MAUI dla systemu Android, ponieważ system Android nie będzie uruchamiał aplikacji, które nie zostały podpisane.
Tworzenie pliku magazynu kluczy
Podczas programowania platforma .NET dla systemu Android używa magazynu kluczy debugowania do podpisywania aplikacji, co umożliwia jej wdrożenie bezpośrednio w emulatorze lub na urządzeniach skonfigurowanych do uruchamiania aplikacji debugowalnych. Jednak ten magazyn kluczy nie jest rozpoznawany jako prawidłowy magazyn kluczy do celów dystrybucji aplikacji. W związku z tym należy utworzyć prywatny magazyn kluczy i używać go do podpisywania kompilacji wydania. Jest to krok, który należy wykonać tylko raz, ponieważ ten sam klucz będzie używany do publikowania aktualizacji i może służyć do podpisywania innych aplikacji. Po wygenerowaniu pliku magazynu kluczy należy podać jego szczegóły z wiersza polecenia podczas kompilowania aplikacji lub skonfigurować plik projektu, aby się do niego odwoływać.
Wykonaj następujące kroki, aby utworzyć plik magazynu kluczy:
Otwórz terminal i przejdź do folderu projektu.
Napiwek
Jeśli program Visual Studio jest otwarty, użyj menu Wyświetl>terminal, aby otworzyć terminal w lokalizacji rozwiązania lub projektu. Przejdź do folderu projektu.
Uruchom narzędzie keytool z następującymi parametrami:
keytool -genkeypair -v -keystore {filename}.keystore -alias {keyname} -keyalg RSA -keysize 2048 -validity 10000
Ważne
Jeśli na komputerze jest zainstalowanych wiele wersji zestawu JDK, upewnij się, że uruchomiono
keytool
z najnowszej wersji zestawu JDK.Zostanie wyświetlony monit o podanie i potwierdzenie hasła, po którym następuje pełna nazwa, jednostka organizacji, organizacja, miasto lub lokalizacja, stan lub prowincja oraz kod kraju. Te informacje nie są wyświetlane w aplikacji, ale są zawarte w certyfikacie.
Aby na przykład wygenerować plik myapp.keystore w tym samym folderze co projekt, z aliasem
myapp
, użyj następującego polecenia:keytool -genkeypair -v -keystore myapp.keystore -alias myapp -keyalg RSA -keysize 2048 -validity 10000
Napiwek
Utwórz kopię zapasową magazynu kluczy i hasła. Jeśli utracisz ją, nie będzie można podpisać aplikacji przy użyciu tej samej tożsamości podpisywania.
Znajdowanie podpisu magazynu kluczy
Aby wyświetlić listę kluczy przechowywanych w magazynie kluczy, użyj keytool
opcji -list
:
keytool -list -keystore {filename}.keystore
Aby na przykład wyświetlić listę kluczy w magazynie kluczy o nazwie myapp.keystore, użyj następującego polecenia:
keytool -list -keystore myapp.keystore
Kompilowanie i podpisywanie aplikacji
Aby skompilować aplikację z poziomu wiersza polecenia i podpisać ją przy użyciu magazynu kluczy, otwórz terminal i przejdź do folderu projektu aplikacji .NET MAUI. dotnet publish
Uruchom polecenie , podając następujące parametry:
Parametr | Wartość |
---|---|
-f lub --framework |
Struktura docelowa, czyli net8.0-android . |
-c lub --configuration |
Konfiguracja kompilacji, czyli Release . |
Ostrzeżenie
Próba opublikowania rozwiązania MAUI platformy .NET spowoduje dotnet publish
, że polecenie podejmie próbę opublikowania każdego projektu w rozwiązaniu osobno, co może powodować problemy podczas dodawania innych typów projektów do rozwiązania. W związku z dotnet publish
tym polecenie powinno być ograniczone do projektu aplikacji .NET MAUI.
Dodatkowe parametry kompilacji można określić w wierszu polecenia, jeśli nie są one podane w <PropertyGroup>
pliku projektu. W poniższej tabeli wymieniono niektóre typowe parametry:
Parametr | Wartość |
---|---|
-p:ApplicationTitle |
Nazwa widoczna dla użytkownika dla aplikacji. |
-p:ApplicationId |
Unikatowy identyfikator aplikacji, taki jak com.companyname.mymauiapp . |
-p:ApplicationVersion |
Wersja kompilacji identyfikującej iterację aplikacji. |
-p:ApplicationDisplayVersion |
Numer wersji aplikacji. |
-p:AndroidKeyStore |
Wartość logiczna wskazująca, czy aplikacja ma być podpisana. Domyślna wartość to false . |
-p:AndroidPackageFormats |
Właściwość rozdzielana średnikami wskazująca, czy chcesz spakować aplikację jako plik APK lub AAB. Ustaw wartość na aab lub apk , aby wygenerować tylko jeden format. Wartość domyślna kompilacji wydania to aab;apk . |
-p:AndroidSigningKeyAlias |
Alias klucza w magazynie kluczy. Jest keytool -alias to wartość używana podczas tworzenia magazynu kluczy. |
-p:AndroidSigningKeyPass |
Hasło klucza w pliku magazynu kluczy. Jest to wartość podana keytool podczas tworzenia pliku magazynu kluczy i zostanie wyświetlona prośba o wprowadzenie hasła magazynu kluczy. Dzieje się tak, ponieważ domyślny typ magazynu kluczy zakłada, że hasło klucza i hasło magazynu kluczy są identyczne. Ta właściwość obsługuje env: również prefiksy, file: których można użyć do określenia zmiennej środowiskowej lub pliku zawierającego hasło. Te opcje umożliwiają zapobieganie wyświetlaniu hasła w dziennikach kompilacji. |
-p:AndroidSigningKeyStore |
Nazwa pliku magazynu kluczy utworzona przez keytool program . Jest keytool -keystore to wartość używana podczas tworzenia magazynu kluczy. |
-p:AndroidSigningStorePass |
Hasło do pliku magazynu kluczy. Jest to wartość podana keytool podczas tworzenia pliku magazynu kluczy i zostanie wyświetlona prośba o wprowadzenie hasła magazynu kluczy. Dzieje się tak, ponieważ domyślny typ magazynu kluczy zakłada, że hasło magazynu kluczy i hasło klucza są identyczne. Ta właściwość obsługuje env: również prefiksy, file: których można użyć do określenia zmiennej środowiskowej lub pliku zawierającego hasło. Te opcje umożliwiają zapobieganie wyświetlaniu hasła w dziennikach kompilacji. |
-p:PublishTrimmed |
Wartość logiczna wskazująca, czy aplikacja powinna zostać przycięta. Wartość domyślna dotyczy true kompilacji wydania. |
Należy użyć tego samego hasła co wartości parametrów AndroidSigningKeyPass
i AndroidSigningStorePass
.
Aby uzyskać pełną listę właściwości kompilacji, zobacz Właściwości kompilacji.
Ważne
Wartości tych parametrów nie muszą być podane w wierszu polecenia. Można je również udostępnić w pliku projektu. Jeśli parametr jest udostępniany w wierszu polecenia i w pliku projektu, parametr wiersza polecenia ma pierwszeństwo. Aby uzyskać więcej informacji na temat udostępniania właściwości kompilacji w pliku projektu, zobacz Definiowanie właściwości kompilacji w pliku projektu.
Uruchom polecenie z następującymi parametrami, dotnet publish
aby skompilować i podpisać aplikację:
dotnet publish -f net8.0-android -c Release -p:AndroidKeyStore=true -p:AndroidSigningKeyStore={filename}.keystore -p:AndroidSigningKeyAlias={keyname} -p:AndroidSigningKeyPass={password} -p:AndroidSigningStorePass={password}
Uwaga
W programie .NET 8 dotnet publish
polecenie jest domyślnie ustawione na konfigurację Release
. W związku z tym konfigurację kompilacji można pominąć z wiersza polecenia.
Na przykład użyj następującego polecenia, aby skompilować i podpisać aplikację przy użyciu wcześniej utworzonego magazynu kluczy:
dotnet publish -f net8.0-android -c Release -p:AndroidKeyStore=true -p:AndroidSigningKeyStore=myapp.keystore -p:AndroidSigningKeyAlias=myapp -p:AndroidSigningKeyPass=mypassword -p:AndroidSigningStorePass=mypassword
Obsługa AndroidSigningKeyPass
env:
właściwości i AndroidSigningStorePass
oraz file:
prefiksy, których można użyć do określenia zmiennej środowiskowej lub pliku zawierającego hasło. Określenie hasła w ten sposób uniemożliwia wyświetlenie go w dziennikach kompilacji. Aby na przykład użyć zmiennej środowiskowej o nazwie AndroidSigningPassword
:
dotnet publish -f net8.0-android -c Release -p:AndroidKeyStore=true -p:AndroidSigningKeyStore=myapp.keystore -p:AndroidSigningKeyAlias=myapp -p:AndroidSigningKeyPass=env:AndroidSigningPassword -p:AndroidSigningStorePass=env:AndroidSigningPassword
Ważne
Env: prefiks nie jest obsługiwany, gdy $(AndroidPackageFormat)
jest ustawiony na aab
.
Aby użyć pliku znajdującego się w folderze C:\Users\user1\AndroidSigningPassword.txt:
dotnet publish -f net8.0-android -c Release -p:AndroidKeyStore=true -p:AndroidSigningKeyStore=myapp.keystore -p:AndroidSigningKeyAlias=myapp -p:AndroidSigningKeyPass=file:C:\Users\user1\AndroidSigningPassword.txt -p:AndroidSigningStorePass=file:C:\Users\user1\AndroidSigningPassword.txt
Publikowanie kompilacji i podpisuje aplikację, a następnie kopiuje pliki AAB i APK do folderu bin\Release\net8.0-android\publish . Istnieją dwa pliki AAB — jeden bez znaku, a drugi podpisany. Podpisany wariant ma -signed in the file name (Podpisany wariant ma nazwę pliku).
Aby uzyskać więcej informacji o poleceniu dotnet publish
, zobacz dotnet publish (Publikowanie dotnet).
Uwaga
W przypadku aplikacji dotnet build
systemu Android można również użyć do kompilowania i podpisywania aplikacji. Pliki AAB i APK zostaną jednak utworzone w folderze bin\Release\net8.0-android, a nie w podfolderze publikowania. dotnet build
parametr jest również domyślnie ustawiony na konfigurację Debug
, więc -c
parametr jest wymagany do określenia Release
konfiguracji.
Definiowanie właściwości kompilacji w pliku projektu
Alternatywą do określenia parametrów kompilacji w wierszu polecenia jest określenie ich w pliku projektu w pliku <PropertyGroup>
. W poniższej tabeli wymieniono niektóre typowe właściwości kompilacji:
Właściwości | Wartość |
---|---|
<ApplicationTitle> |
Nazwa widoczna dla użytkownika dla aplikacji. |
<ApplicationId> |
Unikatowy identyfikator aplikacji, taki jak com.companyname.mymauiapp . |
<ApplicationVersion> |
Wersja kompilacji identyfikującej iterację aplikacji. |
<ApplicationDisplayVersion> |
Numer wersji aplikacji. |
<AndroidKeyStore> |
Wartość logiczna wskazująca, czy aplikacja ma być podpisana. Domyślna wartość to false . |
<AndroidPackageFormats> |
Właściwość rozdzielana średnikami wskazująca, czy chcesz spakować aplikację jako plik APK lub AAB. Ustaw wartość na aab lub apk , aby wygenerować tylko jeden format. Wartość domyślna kompilacji wydania to aab;apk . |
<AndroidSigningKeyAlias> |
Alias klucza w magazynie kluczy. Jest keytool -alias to wartość używana podczas tworzenia magazynu kluczy. |
<AndroidSigningKeyPass> |
Hasło klucza w pliku magazynu kluczy. Jest to wartość podana keytool podczas tworzenia pliku magazynu kluczy i zostanie wyświetlona prośba o wprowadzenie hasła magazynu kluczy. Dzieje się tak, ponieważ domyślny typ magazynu kluczy zakłada, że hasło klucza i hasło magazynu kluczy są identyczne. Ta właściwość obsługuje env: również prefiksy, file: których można użyć do określenia zmiennej środowiskowej lub pliku zawierającego hasło. Te opcje umożliwiają zapobieganie wyświetlaniu hasła w dziennikach kompilacji. |
<AndroidSigningKeyStore> |
Nazwa pliku magazynu kluczy utworzona przez keytool program . Jest keytool -keystore to wartość używana podczas tworzenia magazynu kluczy. |
<AndroidSigningStorePass> |
Hasło do pliku magazynu kluczy. Jest to wartość podana keytool podczas tworzenia pliku magazynu kluczy i zostanie wyświetlona prośba o wprowadzenie hasła magazynu kluczy. Dzieje się tak, ponieważ domyślny typ magazynu kluczy zakłada, że hasło magazynu kluczy i hasło klucza są identyczne. Ta właściwość obsługuje env: również prefiksy, file: których można użyć do określenia zmiennej środowiskowej lub pliku zawierającego hasło. Te opcje umożliwiają zapobieganie wyświetlaniu hasła w dziennikach kompilacji. |
<PublishTrimmed> |
Wartość logiczna wskazująca, czy aplikacja powinna zostać przycięta. Wartość domyślna dotyczy true kompilacji wydania. |
Aby uzyskać pełną listę właściwości kompilacji, zobacz Właściwości kompilacji.
Ważne
Wartości tych właściwości kompilacji nie muszą być podane w pliku projektu. Można je również udostępnić w wierszu polecenia podczas publikowania aplikacji. Dzięki temu można pominąć określone wartości z pliku projektu.
W poniższym przykładzie przedstawiono typową grupę właściwości do kompilowania i podpisywania aplikacji dla systemu Android:
<PropertyGroup Condition="$(TargetFramework.Contains('-android')) and '$(Configuration)' == 'Release'">
<AndroidSigningKeyStore>myapp.keystore</AndroidSigningKeyStore>
<AndroidSigningKeyAlias>myapp</AndroidSigningKeyAlias>
</PropertyGroup>
W tym przykładzie <PropertyGroup>
dodano sprawdzanie warunku, co uniemożliwia przetworzenie tych ustawień, chyba że sprawdzanie warunku przebiegnie pomyślnie. Sprawdzanie warunku wyszukuje dwie rzeczy:
- Platforma docelowa jest ustawiona na wartość zawierającą tekst
-android
. - Konfiguracja kompilacji jest ustawiona na
Release
wartość .
Jeśli którykolwiek z tych warunków nie powiedzie się, ustawienia nie są przetwarzane. Co ważniejsze, <AndroidSigningKeyStore>
ustawienia i <AndroidSigningKeyAlias>
nie są ustawione, uniemożliwiając podpisanie aplikacji.
Ze względów bezpieczeństwa nie należy podawać wartości <AndroidSigningKeyPass>
i <AndroidSigningStorePass>
w pliku projektu. Te wartości można podać w wierszu polecenia podczas publikowania aplikacji lub użyć env:
prefiksów lub file:
, aby zapobiec wyświetlaniu hasła w dziennikach kompilacji. Aby na przykład użyć zmiennej środowiskowej o nazwie AndroidSigningPassword
:
<PropertyGroup Condition="$(TargetFramework.Contains('-android')) and '$(Configuration)' == 'Release'">
<AndroidSigningKeyStore>myapp.keystore</AndroidSigningKeyStore>
<AndroidSigningKeyAlias>myapp</AndroidSigningKeyAlias>
<AndroidSigningKeyPass>env:AndroidSigningPassword</AndroidSigningKeyPass>
<AndroidSigningStorePass>env:AndroidSigningPassword</AndroidSigningStorePass>
</PropertyGroup>
Ważne
Env: prefiks nie jest obsługiwany, gdy $(AndroidPackageFormat)
jest ustawiony na aab
.
Alternatywnie, aby użyć pliku znajdującego się w folderze C:\Users\user1\AndroidSigningPassword.txt:
<PropertyGroup Condition="$(TargetFramework.Contains('-android')) and '$(Configuration)' == 'Release'">
<AndroidSigningKeyStore>myapp.keystore</AndroidSigningKeyStore>
<AndroidSigningKeyAlias>key</AndroidSigningKeyAlias>
<AndroidSigningKeyPass>file:C:\Users\user1\AndroidSigningPassword.txt</AndroidSigningKeyPass>
<AndroidSigningStorePass>file:C:\Users\user1\AndroidSigningPassword.txt</AndroidSigningStorePass>
</PropertyGroup>
Dystrybuowanie aplikacji
Podpisany plik APK lub AAB można rozpowszechniać przy użyciu jednego z następujących metod:
- Najczęstszym podejściem do dystrybucji aplikacji systemu Android do użytkowników jest sklep Google Play. Sklep Google Play wymaga przesłania aplikacji jako pakietu aplikacji systemu Android (AAB). Aby uzyskać więcej informacji, zobacz Przekazywanie aplikacji do konsoli odtwarzania w developer.android.com
- Pliki APK można rozpowszechniać na urządzeniach z systemem Android za pośrednictwem witryny internetowej lub serwera. Gdy użytkownicy przejdą do linku pobierania z urządzenia z systemem Android, zostanie pobrany plik. System Android automatycznie uruchamia instalowanie go na urządzeniu, jeśli użytkownik skonfigurował ustawienia, aby umożliwić instalację aplikacji z nieznanych źródeł. Aby uzyskać więcej informacji o wyrażeniu zgody na zezwalanie aplikacjom z nieznanych źródeł, zobacz Opcja użytkownika dla nieznanych aplikacji i źródeł w developer.android.com.
Zobacz też
- Informacje o pakietach aplikacji systemu Android w developer.android.com