Udostępnij za pośrednictwem


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:

  1. 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.

  2. 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 keytoolprogram . 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 AndroidSigningKeyPassenv: 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 keytoolprogram . 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:

  1. Platforma docelowa jest ustawiona na wartość zawierającą tekst -android.
  2. Konfiguracja kompilacji jest ustawiona na Releasewartość .

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ż