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

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

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

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

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

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

    ヒント

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

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

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

    Important

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

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

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

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

    ヒント

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

キーストアの署名を取得する

キーストアに格納されているキーを一覧表示するには、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

Warnung

.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 としてパッケージ化するかどうかを示すセミコロンで区切られたプロパティ。 1 つの形式のみを生成するには、 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パラメーターの値と同じパスワードを使用する必要があります。

ビルド プロパティの完全な一覧については、「 ビルド プロパティ」を参照してください。

Important

これらのパラメーターの値をコマンド ラインで指定する必要はありません。 これらは、プロジェクト ファイルでも指定できます。 コマンド ラインとプロジェクト ファイルでパラメーターを指定すると、コマンド ライン パラメーターが優先されます。 プロジェクト ファイルでビルド プロパティを指定する方法の詳細については、「プロジェクト ファイルでビルド プロパティを定義する」をご覧ください。

次のパラメーターを指定して 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

Important

$(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 フォルダーにコピーします。 2 つの AAB ファイルがあります。1 つは符号なしで、もう 1 つは署名済みです。 署名されたバリアントには、ファイル名に -signed が含まれています。

dotnet publish コマンドの詳細については、「dotnet publish」を参照してください。

Android アプリの場合、 dotnet build を使用してアプリのビルドと署名を行うこともできます。 ただし、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 としてパッケージ化するかどうかを示すセミコロンで区切られたプロパティ。 1 つの形式のみを生成するには、 aab または apk に設定します。 リリース ビルドの既定値は aab;apk
<AndroidSigningKeyAlias> キーストア内のキーのエイリアス。 これは、キーストアの作成時に使用される keytool -alias 値です。
<AndroidSigningKeyPass> キーストア ファイル内のキーのパスワード。 これは、キーストア ファイルを作成するときに keytool するために指定された値であり、キーストアのパスワードを入力するように求められます。 これは、既定のキーストアの種類では、キー パスワードとキーストア パスワードが同一であると想定されているためです。 このプロパティは env: プレフィクスと file: のプレフィクスもサポートし、これらのプレフィクスを使って、パスワードが格納された環境変数やファイルを指定できます。 これらのオプションを使用すると、ビルド ログにパスワードが表示されないようにすることができます。
<AndroidSigningKeyStore> keytoolによって作成されたキーストア ファイルのファイル名。 これは、キーストアの作成時に使用される keytool -keystore 値です。
<AndroidSigningStorePass> キーストア ファイルのパスワード。 これは、キーストア ファイルを作成するときに keytool するために指定された値であり、キーストアのパスワードを入力するように求められます。 これは、デフォルトの鍵ストア・タイプは鍵ストア・パスワードと鍵パスワードが同一であると想定しているためです。 このプロパティは env: プレフィクスと file: のプレフィクスもサポートし、これらのプレフィクスを使って、パスワードが格納された環境変数やファイルを指定できます。 これらのオプションを使用すると、ビルド ログにパスワードが表示されないようにすることができます。
<PublishTrimmed> アプリをトリミングする必要があるかどうかを示すブール値。 既定値はリリース ビルドの true です。

ビルド プロパティの完全な一覧については、「 ビルド プロパティ」を参照してください。

Important

これらのビルド プロパティの値は、プロジェクト ファイルで指定する必要はありません。 これらは、アプリを公開するときにコマンド ラインで指定することもできます。 これにより、プロジェクト ファイルから特定の値を省略できます。

次の例は、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>

Important

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

こちらも参照ください