使用命令行發佈Android應用程式
若要散發 .NET 多平臺應用程式 UI (.NET MAUI) Android 應用程式,您必須使用密鑰存放區中的金鑰進行簽署。 金鑰 存放區 是使用 Java 開發工具套件 (JDK) 所 keytool
建立的安全性憑證資料庫。 發佈 .NET MAUI Android 應用程式時需要金鑰存放區,因為 Android 不會執行尚未簽署的應用程式。
建立金鑰存放區檔案
在開發期間,適用於 Android 的 .NET 會使用偵錯金鑰存放區來簽署應用程式,以便將它直接部署至模擬器或設定為執行可偵錯應用程式的裝置。 不過,為了散發應用程式,此密鑰存放區無法辨識為有效的密鑰存放區。 因此,必須建立並用於簽署發行組建的私鑰存放區。 這是只應該執行一次的步驟,因為相同的密鑰將用於發佈更新,而且可用來簽署其他應用程式。 產生金鑰存放區檔案之後,您會在建置應用程式時從命令行提供其詳細資料,或設定專案檔來參考它。
執行下列步驟來建立金鑰存放區檔案:
開啟終端機並流覽至項目的資料夾。
提示
如果 Visual Studio 已開啟,請使用 [檢視>終端機] 功能表,在方案或專案的位置開啟終端機。 瀏覽至專案資料夾。
使用下列參數執行keytool工具:
keytool -genkeypair -v -keystore {filename}.keystore -alias {keyname} -keyalg RSA -keysize 2048 -validity 10000
重要
如果您的電腦上安裝多個版本的 JDK,請確定您是從最新版的 JDK 執行
keytool
。系統會提示您提供並確認密碼,後面接著您的全名、組織單位、組織、城市或地區、州或省,以及國家/地區代碼。 此資訊不會顯示在您的應用程式中,但包含在您的憑證中。
例如,若要在與專案相同的資料夾中產生 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 發行組建。 |
您應該使用與 和 AndroidSigningStorePass
參數值AndroidSigningKeyPass
相同的密碼。
如需組建屬性的完整清單,請參閱 建置屬性。
重要
這些參數的值不需要在命令行上提供。 您也可以在項目檔中提供它們。 當在命令行和項目檔中提供參數時,命令行參數會優先使用。 如需在項目檔中提供建置屬性的詳細資訊,請參閱 在專案檔中定義組建屬性。
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:當 設定為 aab
時$(AndroidPackageFormat)
,不支援前置詞。
若要使用位於 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 檔案 - 一個未簽署,另一個已簽署。 帶正負號的變體在檔名中具有 -signed 。
如需命令的詳細資訊 dotnet publish
,請參閱 dotnet publish。
注意
針對 Android 應用程式, dotnet build
也可以用來建置和簽署您的應用程式。 不過,AAB 和 APK 檔案將會建立在 bin\Release\net8.0-android 資料夾中,而不是 publish 子資料夾。 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>
會新增條件檢查,除非條件檢查通過,否則無法處理這些設定。 條件檢查會尋找兩件事:
- 目標架構會設定為包含文字
-android
的內容。 - 組建組態會設定為
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:當 設定為 aab
時$(AndroidPackageFormat)
,不支援前置詞。
或者,若要使用位於 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 控制台
- APK 檔案可以透過網站或伺服器散發至 Android 裝置。 當使用者從其 Android 裝置瀏覽至下載連結時,會下載該檔案。 如果使用者已設定其設定,以允許從未知來源安裝應用程式,Android 會自動開始在裝置上安裝它。 如需選擇允許來自未知來源之應用程式的詳細資訊,請參閱 使用者針對未知的應用程式和 來源加入加入 developer.android.com。