Поделиться через


Публикация приложения Android с помощью командной строки

Для распространения мультиплатформенного пользовательского интерфейса приложений .NET (.NET MAUI) Android необходимо подписать его с помощью ключа из хранилища ключей. Хранилище ключей — это база данных сертификатов безопасности, созданных с помощью keytool пакета средств разработки Java (JDK). Хранилище ключей требуется при публикации приложения Android для .NET MAUI, так как Android не будет запускать приложения, которые не были подписаны.

Создание файла хранилища ключей

Во время разработки .NET для Android использует отладочное хранилище ключей для подписывания приложения, что позволяет развертывать его непосредственно в эмуляторе или на устройствах, настроенных для запуска отладочных приложений. Однако это хранилище ключей не распознано как допустимое хранилище ключей в целях распространения приложений. Поэтому необходимо создать и использовать закрытое хранилище ключей для подписывания сборок выпуска. Это шаг, который должен выполняться только один раз, так как тот же ключ будет использоваться для публикации обновлений и может использоваться для подписывания других приложений. После создания файла хранилища ключей вы укажите сведения из командной строки при создании приложения или настроите файл проекта для его ссылки.

Выполните следующие действия, чтобы создать файл хранилища ключей:

  1. Откройте терминал и перейдите в папку проекта.

    Совет

    Если Visual Studio открыт, используйте меню "Вид>терминала", чтобы открыть терминал в расположении решения или проекта. Перейдите в папку проекта.

  2. Запустите средство keytool со следующими параметрами:

    keytool -genkeypair -v -keystore {filename}.keystore -alias {keyname} -keyalg RSA -keysize 2048 -validity 10000
    

    Внимание

    Если на компьютере установлено несколько версий JDK, убедитесь, что вы запускаете keytool из последней версии JDK.

    Вам будет предложено указать и подтвердить пароль, за которым следует полное имя, подразделение организации, организация, город или регион, штат или провинция и код страны. Эта информация не отображается в приложении, но включена в сертификат.

    Например, чтобы создать файл myapp.keystore в той же папке, что и проект, с псевдонимом myappиспользуйте следующую команду:

    keytool -genkeypair -v -keystore myapp.keystore -alias myapp -keyalg RSA -keysize 2048 -validity 10000
    

    Совет

    Резервное копирование хранилища ключей и пароля. Если вы потеряете его, вы не сможете подписать приложение с помощью того же удостоверения подписи.

Поиск подписи хранилища ключей

Чтобы получить список ключей, хранящихся в хранилище ключей, используйте keytool этот -list параметр:

keytool -list -keystore {filename}.keystore

Например, чтобы перечислить ключи в хранилище ключей с именем myapp.keystore, используйте следующую команду:

keytool -list -keystore myapp.keystore

Создание и подпись приложения

Чтобы создать приложение из командной строки и подписать его с помощью хранилища ключей, откройте терминал и перейдите в папку для проекта приложения .NET MAUI. dotnet publish Выполните команду, указав следующие параметры:

Параметр Значение
-f или --framework Целевая платформа, которая является net8.0-android.
-c или --configuration Конфигурация сборки, которая является Release.

Предупреждение

Попытка опубликовать решение .NET MAUI приведет dotnet publish к попытке опубликовать каждый проект в решении по отдельности, что может привести к проблемам при добавлении других типов проектов в решение. dotnet publish Поэтому команда должна быть область в проект приложения .NET MAUI.

Дополнительные параметры сборки можно указать в командной <PropertyGroup> строке, если они не указаны в файле проекта. В следующей таблице перечислены некоторые распространенные параметры:

Параметр Значение
-p:ApplicationTitle Отображаемая пользователем имя приложения.
-p:ApplicationId Уникальный идентификатор приложения, например com.companyname.mymauiapp.
-p:ApplicationVersion Версия сборки, идентифицирующая итерацию приложения.
-p:ApplicationDisplayVersion Номер версии приложения.
-p:AndroidKeyStore Логическое значение, указывающее, следует ли подписать приложение. Значение по умолчанию — false.
-p:AndroidPackageFormats Свойство с разделителями с запятой, указывающее, нужно ли упаковать приложение в виде APK-файла или AAB. Задайте значение aab apk "Либо создать только один формат". Значением по умолчанию для сборок выпуска является aab;apk.
-p:AndroidSigningKeyAlias Псевдоним ключа в хранилище ключей. Это значение, используемое keytool -alias при создании хранилища ключей.
-p:AndroidSigningKeyPass Пароль ключа в файле хранилища ключей. Это значение, предоставленное keytool при создании файла хранилища ключей, и вам будет предложено ввести пароль хранилища ключей. Это связано с тем, что тип хранилища ключей по умолчанию предполагает, что пароль ключа и пароль хранилища ключей идентичны. Это свойство также поддерживает env: и file: префиксы, которые можно использовать для указания переменной среды или файла, содержащего пароль. Эти варианты позволяют избежать отображения пароля в журналах сборки.
-p:AndroidSigningKeyStore Имя файла хранилища ключей, созданного keytool. Это значение, используемое keytool -keystore при создании хранилища ключей.
-p:AndroidSigningStorePass Пароль для файла хранилища ключей. Это значение, предоставленное keytool при создании файла хранилища ключей, и вам будет предложено ввести пароль хранилища ключей. Это связано с тем, что тип хранилища ключей по умолчанию предполагает, что пароль хранилища ключей и пароль ключа идентичны. Это свойство также поддерживает env: и file: префиксы, которые можно использовать для указания переменной среды или файла, содержащего пароль. Эти варианты позволяют избежать отображения пароля в журналах сборки.
-p:PublishTrimmed Логическое значение, указывающее, следует ли обрезать приложение. Значение по умолчанию — true для сборок выпуска.

Следует использовать тот же пароль, что и значения значений AndroidSigningKeyPass и AndroidSigningStorePass параметров.

Полный список свойств сборки см. в разделе "Свойства сборки".

Внимание

Значения этих параметров не должны быть предоставлены в командной строке. Они также могут быть предоставлены в файле проекта. Если параметр указан в командной строке и в файле проекта, параметр командной строки имеет приоритет. Дополнительные сведения о предоставлении свойств сборки в файле проекта см. в разделе "Определение свойств сборки" в файле проекта.

Выполните команду со следующими параметрами dotnet publish , чтобы создать и подписать приложение:

dotnet publish -f net8.0-android -c Release -p:AndroidKeyStore=true -p:AndroidSigningKeyStore={filename}.keystore -p:AndroidSigningKeyAlias={keyname} -p:AndroidSigningKeyPass={password} -p:AndroidSigningStorePass={password}

Примечание.

В .NET 8 dotnet publish команда по умолчанию использует Release конфигурацию. Поэтому конфигурация сборки может быть опущена из командной строки.

Например, используйте следующую команду, чтобы создать и подписать приложение с помощью ранее созданного хранилища ключей:

dotnet publish -f net8.0-android -c Release -p:AndroidKeyStore=true -p:AndroidSigningKeyStore=myapp.keystore -p:AndroidSigningKeyAlias=myapp -p:AndroidSigningKeyPass=mypassword -p:AndroidSigningStorePass=mypassword

Поддерживаются AndroidSigningKeyPass и AndroidSigningStorePass свойства env: , и file: префиксы, которые можно использовать для указания переменной среды или файла, содержащего пароль. Указание пароля таким образом предотвращает его отображение в журналах сборки. Например, чтобы использовать переменную среды с именем 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

Внимание

Env: префикс не поддерживается, если $(AndroidPackageFormat) задано значение aab.

Чтобы использовать файл, расположенный в папке 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

Публикация создает и подписывает приложение, а затем копирует файлы AAB и APK в папку bin\Release\net8.0-android\publish . Существует два файла AAB - один без знака и другой подписанный. Подписанный вариант вошел в имя файла.

Дополнительные сведения о команде dotnet publish см. в статье dotnet publish.

Примечание.

Для приложений dotnet build Android можно также использовать для создания и подписывания приложения. Однако файлы AAB и APK будут созданы в папке bin\Release\net8.0-android , а не вложенной папке публикации . dotnet build также по умолчанию используется Debug конфигурация, поэтому -c параметр требуется для указания Release конфигурации.

Определение свойств сборки в файле проекта

Альтернативой указанию параметров сборки в командной строке является указание параметров в файле проекта.<PropertyGroup> В следующей таблице перечислены некоторые распространенные свойства сборки:

Свойство Значение
<ApplicationTitle> Отображаемая пользователем имя приложения.
<ApplicationId> Уникальный идентификатор приложения, например com.companyname.mymauiapp.
<ApplicationVersion> Версия сборки, идентифицирующая итерацию приложения.
<ApplicationDisplayVersion> Номер версии приложения.
<AndroidKeyStore> Логическое значение, указывающее, следует ли подписать приложение. Значение по умолчанию — false.
<AndroidPackageFormats> Свойство с разделителями с запятой, указывающее, нужно ли упаковать приложение в виде APK-файла или AAB. Задайте значение aab apk "Либо создать только один формат". Значением по умолчанию для сборок выпуска является aab;apk.
<AndroidSigningKeyAlias> Псевдоним ключа в хранилище ключей. Это значение, используемое keytool -alias при создании хранилища ключей.
<AndroidSigningKeyPass> Пароль ключа в файле хранилища ключей. Это значение, предоставленное keytool при создании файла хранилища ключей, и вам будет предложено ввести пароль хранилища ключей. Это связано с тем, что тип хранилища ключей по умолчанию предполагает, что пароль ключа и пароль хранилища ключей идентичны. Это свойство также поддерживает env: и file: префиксы, которые можно использовать для указания переменной среды или файла, содержащего пароль. Эти варианты позволяют избежать отображения пароля в журналах сборки.
<AndroidSigningKeyStore> Имя файла хранилища ключей, созданного keytool. Это значение, используемое keytool -keystore при создании хранилища ключей.
<AndroidSigningStorePass> Пароль для файла хранилища ключей. Это значение, предоставленное keytool при создании файла хранилища ключей, и вам будет предложено ввести пароль хранилища ключей. Это связано с тем, что тип хранилища ключей по умолчанию предполагает, что пароль хранилища ключей и пароль ключа идентичны. Это свойство также поддерживает env: и file: префиксы, которые можно использовать для указания переменной среды или файла, содержащего пароль. Эти варианты позволяют избежать отображения пароля в журналах сборки.
<PublishTrimmed> Логическое значение, указывающее, следует ли обрезать приложение. Значение по умолчанию — true для сборок выпуска.

Полный список свойств сборки см. в разделе "Свойства сборки".

Внимание

Значения этих свойств сборки не должны быть предоставлены в файле проекта. Они также могут быть предоставлены в командной строке при публикации приложения. Это позволяет опущению определенных значений из файла проекта.

В следующем примере показана типичная группа свойств для создания и подписывания приложения Android:

<PropertyGroup Condition="$(TargetFramework.Contains('-android')) and '$(Configuration)' == 'Release'">
    <AndroidSigningKeyStore>myapp.keystore</AndroidSigningKeyStore>
    <AndroidSigningKeyAlias>myapp</AndroidSigningKeyAlias>
</PropertyGroup>

В этом примере <PropertyGroup> добавляется условие проверка, предотвращающее обработку этих параметров, если условие не проходит проверка. Условие проверка ищет две вещи:

  1. Целевая платформа имеет значение, содержащее текст -android.
  2. Для конфигурации сборки задано значение Release.

Если одно из этих условий завершается ошибкой, параметры не обрабатываются. Более важно, что <AndroidSigningKeyStore> <AndroidSigningKeyAlias> параметры не заданы, предотвращая подпись приложения.

По соображениям безопасности не следует указать значение <AndroidSigningKeyPass> и <AndroidSigningStorePass> в файле проекта. Эти значения можно указать в командной строке при публикации приложения или использовать env: префиксы, file: чтобы предотвратить отображение пароля в журналах сборки. Например, чтобы использовать переменную среды с именем 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>

Внимание

Env: префикс не поддерживается, если $(AndroidPackageFormat) задано значение aab.

Кроме того, чтобы использовать файл, расположенный в папке 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>

Распространение приложения

Подписанный APK-файл или файл AAB можно распространять одним из следующих подходов:

  • Наиболее распространенный подход к распространению приложений Android пользователям — через Google Play. Google Play требует отправки приложения в виде пакета приложений Android (AAB). Дополнительные сведения см. в статье "Отправка приложения в консоль воспроизведения" на developer.android.com
  • APK-файлы можно распространять на устройства Android через веб-сайт или сервер. Когда пользователи переходят по ссылке на скачивание с устройства Android, скачиваются файлы. Android автоматически запускает установку на устройстве, если пользователь настроил свои параметры, чтобы разрешить установку приложений из неизвестных источников. Дополнительные сведения о том, как разрешить приложения из неизвестных источников, см. в разделе "Пользователь" для неизвестных приложений и источников в developer.android.com.

См. также