建置流程

Xamarin.Android 建置程序負責將所有作業結合在一起:產生 Resource.designer.cs、支援 @(AndroidAsset)@(AndroidResource) 和其他建置動作、產生 Android 可呼叫包裝函式,以及產生 .apk 以便在 Android 裝置上執行。

應用程式套件

廣泛來說,Xamarin.Android 建置系統可以產生的 Android 應用程式套件 (.apk 檔案) 類型有兩種:

  • 完全獨立且不需要執行額外套件的發行 組建。 這些是提供給 App Store 的套件。

  • 偵錯組建則非如此。

這些封裝類型符合產生封裝的 MSBuild Configuration

共用執行階段

在 Xamarin.Android 11.2 之前, 共用運行時間 是一組額外的 Android 套件,可提供基類連結庫(mscorlib.dll等)和 Android 系結連結庫(Mono.Android.dll等等)。 偵錯組建依賴共用執行階段來取代在 Android 應用程式套件內納入基底類別庫和繫結組件,讓偵錯套件能夠小一些。

藉由設定 ,即可在偵錯組建中停用共用運行時間 $(AndroidUseSharedRuntime) 屬性為 False

Xamarin.Android 11.2 已移除共用運行時間的支援。

快速部署

快速部署 的運作方式是進一步壓縮 Android 應用程式套件大小。 這可藉由從套件中排除應用程式的元件,而改為將應用程式的元件直接部署到應用程式的內部 files 目錄,通常位於 /data/data/com.some.package。 內部 files 目錄不是全域可寫入的資料夾,因此 run-as 此工具會用來執行所有命令,將檔案複製到該目錄。

此程式可加速建置/部署/偵錯循環,因為只有元件變更時,不會重新安裝套件。 只有更新的元件會重新同步處理至目標裝置。

警告

已知快速部署會在封鎖 run-as的裝置上失敗,這通常包含Android 5.0之前的裝置。

快速部署預設為啟用狀態,藉由將 $(EmbedAssembliesIntoApk) 屬性設定為 True 即可在偵錯組建中加以停用。

增強型快速部署模式可與此功能搭配使用,以進一步加速部署。 這會將這兩個元件、原生連結庫、typemap 和 dexes 部署至 files 目錄。 但是,如果您變更原生連結庫、系結或 Java 程式代碼,您才應該真的需要啟用此功能。

MSBuild 專案

Xamarin.Android 建置程序是以 MSBuild 作為基礎,而這也是 Visual Studio for Mac 和 Visual Studio 所使用的專案檔格式。 一般而言,使用者不需要手動編輯 MSBuild 檔案 – IDE 會建立功能完整的專案,並使用所做的任何變更加以更新,並視需要自動叫用建置目標。

進階使用者或許會想執行 IDE 之 GUI 所不支援的作業,因此建置程序是可藉由直接編輯專案檔來加以自訂。 此頁面僅記載 Xamarin.Android 特定功能和自定義專案 – 許多專案可以搭配一般 MSBuild 專案、屬性和目標使用。

系結專案

下列 MSBuild 屬性可與繫結專案搭配使用:

Resource.designer.cs 生成

下列 MSBuild 屬性可用來控制檔案的 Resource.designer.cs 產生:

簽署屬性

簽署屬性可控制應用程式套件的簽署方式,以便能夠將它安裝到 Android 裝置。 為了加快建置反覆運算,Xamarin.Android 工作不會在建置程序進行期間簽署套件,因為簽署作業很慢。 相反地,會在安裝前或匯出期間由 IDE 或安裝建置目標簽署套件 (如有必要)。 叫用 SignAndroidPackage 目標會在輸出目錄中產生後置詞為 -Signed.apk 的套件。

根據預設,簽署目標會產生新的偵錯簽署金鑰 (如有必要)。 如果您想要使用特定金鑰,例如在組建伺服器上,則會使用下列 MSBuild 屬性:

keytool 選項對應

請考慮下列 keytool 呼叫:

$ keytool -genkey -v -keystore filename.keystore -alias keystore.alias -keyalg RSA -keysize 2048 -validity 10000
Enter keystore password: keystore.filename password
Re-enter new password: keystore.filename password
...
Is CN=... correct?
  [no]:  yes

Generating 2,048 bit RSA key pair and self-signed certificate (SHA1withRSA) with a validity of 10,000 days
        for: ...
Enter key password for keystore.alias
        (RETURN if same as keystore password): keystore.alias password
[Storing filename.keystore]

若要使用上面所產生的金鑰儲存區,請使用屬性群組:

<PropertyGroup>
    <AndroidKeyStore>True</AndroidKeyStore>
    <AndroidSigningKeyStore>filename.keystore</AndroidSigningKeyStore>
    <AndroidSigningStorePass>keystore.filename password</AndroidSigningStorePass>
    <AndroidSigningKeyAlias>keystore.alias</AndroidSigningKeyAlias>
    <AndroidSigningKeyPass>keystore.alias password</AndroidSigningKeyPass>
</PropertyGroup>

建置擴充點

Xamarin. Android 建置系統為想要在我們的建置系統中建立掛鉤的使用者,提供了一些公用擴充點。 若要使用其中任何一個擴充點,您必須將您的自訂目標新增到 PropertyGroup 中的適當 MSBuild 屬性內。 例如:

<PropertyGroup>
   <AfterGenerateAndroidManifest>
      $(AfterGenerateAndroidManifest);
      YourTarget;
   </AfterGenerateAndroidManifest>
</PropertyGroup>

延伸點包括:

關於擴充建置程式的警告:如果未正確撰寫,建置延伸模組可能會影響您的組建效能,尤其是在每次建置上執行時。 極力建議您先閱讀 MSBuild 文件,然後再執行這類延伸模組。

目標定義

建置程序的 Xamarin.Android 特有組件會定義在 $(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets 中,但還需要有一般的語言特有目標 (例如 Microsoft.CSharp.targets) 才能建置組件。

在匯入任何語言目標之前,必須先設定下列組建屬性:

<PropertyGroup>
  <TargetFrameworkIdentifier>MonoDroid</TargetFrameworkIdentifier>
  <MonoDroidVersion>v1.0</MonoDroidVersion>
  <TargetFrameworkVersion>v2.2</TargetFrameworkVersion>
</PropertyGroup>

藉由匯入 Xamarin.Android.CSharp.targets,即可針對 C# 納入這些目標和屬性:

<Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets" />

此檔案可輕鬆地適用於其他語言。