コマンド ラインを使用して Android アプリを発行する

.NET Multi-platform App UI (.NET MAUI) Android アプリを配布するには、キーストアのキーで署名する必要があります。 キーストアは、Java 開発キット (JDK) の keytool を使用して作成されるセキュリティ証明書のデータベースです。 Android では署名されていないアプリは実行されないため、.NET MAUI Android アプリを発行する場合は、キーストアが必要です。

キーストア ファイルを作成する

開発中、.NET Android はデバッグ キーストアを使用し、アプリケーションに署名します。これにより、アプリをエミュレーターまたはデバッグ可能アプリを実行するように構成されたデバイスに直接配布できるようになります。 ただし、このキーストアは、アプリの配信目的では有効なキーストアとして認識されません。 そのため、プライベート キーストアを作成し、リリース ビルドの署名に使用する必要があります。 これは 1 回のみ実行する手順です。同じキーが更新プログラムの公開に利用されます。また、他のアプリの署名に利用できます。 キーストア ファイルを生成した後、アプリのビルド時にコマンド ラインからその詳細を指定するか、プロジェクト ファイルで参照するように構成します。

キーストア ファイルを作成するには、次の手順を実行します。

  1. ターミナルを開いて、プロジェクトのフォルダーに移動します。

    ヒント

    Visual Studio が開いている場合は、[表示]>[ターミナル]] メニューを使用して、ソリューションまたはプロジェクトの場所でターミナルを開きます。 プロジェクト フォルダーに移動します。

  2. 次のパラメーターを指定して keytool ツールを実行します。

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

    重要

    お使いのコンピューターに複数のバージョンの JDK がインストールされている場合は、最新バージョンの JDK から keytool を実行するようにしてください。

    パスワードの入力と確認を求めるメッセージが表示され、その後に氏名、組織単位、組織、市区町村、都道府県、国コードが表示されます。 この情報はアプリには表示されませんが、証明書に含まれています。

    たとえば、プロジェクトと同じフォルダーに myapp のエイリアスを指定して myapp.keystore ファイルを生成するには、次のコマンドを使用します。

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

    ヒント

    キーストアとパスワードをバックアップします。 この情報を紛失した場合、同じ署名 ID でアプリに署名できなくなります。

キーストアの署名を検索する

キーストアに保存されているキーを一覧表示するには、-list オプションを指定して keytool を使用します。

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 に設定すると、1 つの形式のみを生成します。 リリース ビルドの既定値は 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}

Note

.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

重要

$(AndroidPackageFormat)aab に設定されている場合、env: プレフィックスはサポートされません。

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 ファイルは 2 つあり、1 つは署名なし、もう 1 つは署名ありです。 署名されたバリアントには、ファイル名に -signed が含まれています。

dotnet publish コマンドの詳細については、「dotnet の発行」をご覧ください。

Note

Android アプリの場合、アプリのビルドと署名に dotnet build を使用することもできます。 ただし、AAB ファイルと APK ファイルは、[公開] サブフォルダーではなく、bin\Release\net8.0-android に作成されます。 dotnet build も既定値が Debug 構成であるため、Release 構成を指定するために -c パラメーターが必要です。

プロジェクト ファイルでビルド プロパティを定義する

コマンド ラインでビルド パラメーターを指定する代わりに、<PropertyGroup> のプロジェクト ファイルでビルド パラメーターを指定することもできます。 次の表は、一般的なビルド プロパティの一覧です。

プロパティ
<ApplicationTitle> ユーザーに表示されるアプリ名。
<ApplicationId> アプリの一意識別子 (com.companyname.mymauiapp など)。
<ApplicationVersion> アプリのイテレーションを識別するビルドのバージョン。
<ApplicationDisplayVersion> アプリのバージョン番号です。
<AndroidKeyStore> アプリに署名する必要があるかどうかを示すブール値。 既定値は false です。
<AndroidPackageFormats> アプリを APK ファイルと AAB のどちらの形式でパッケージ化するかを示す、セミコロン区切りのプロパティ。 1 つの形式のみを生成する場合は、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> では、条件チェックを追加し、条件チェックを通過しない限りこれらの設定が処理されないようにします。 条件チェックでは、次の 2 つの項目を確認します。

  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>

重要

$(AndroidPackageFormat)aab に設定されている場合、env: プレフィックスはサポートされません。

また、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 の「アプリを Google Play Console にアップロードする」をご覧ください。
  • APK ファイルは、Web サイトまたはサーバーを介して Android デバイスに配布できます。 ユーザーが Android デバイスからダウンロード リンクを参照すると、ファイルがダウンロードされます。 ユーザーが不明なソースからのアプリのインストールを許可するように設定を構成している場合、Android は自動的にデバイスへのインストールを開始します。 不明なソースからのアプリの許可を選択する方法の詳細については、developer.android.com の「提供元不明のアプリとソースに対するユーザーのオプトイン」をご覧ください。

関連項目