65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Visual Studio 和 Nant 构建 Xamarin.Android 应用程序

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (1投票)

2014年6月27日

CPOL

4分钟阅读

viewsIcon

24851

使用 Nant 构建 Xamarin.Android / Visual Studio 应用程序

引言

本文介绍如何编写 Nant 脚本来构建使用 Visual Studio 开发的 Xamarin.Android 应用程序。使用 Nant 构建 Xamarin.Android 应用程序时,需要考虑几个关键差异。

背景

本文假设您已经熟悉 Nant 和使用 MSBUILD 构建应用程序。有关简单 Nant 构建脚本的示例,请参阅我在 GitHub 上发布的脚本。我使用了 Nant 0.92 版本。

本文重点介绍构建 Xamarin.Android 应用程序时需要对 Nant 脚本进行的修改。因此,假设读者熟悉使用 Nant 编写构建脚本,并希望学习如何为使用 Visual Studio 开发的 Xamarin.Android 应用程序编写构建脚本。

Android 系统要求所有已安装的应用程序都必须使用证书进行数字签名,该证书的私钥由应用程序的开发者持有。

有两种构建模式:调试模式和发布模式。您将在开发和测试应用程序时使用调试模式。当您想要构建应用程序的发布版本(例如分发或在 Google Play 上发布)时,您将使用发布模式。

假设读者已经获得了合适的私钥。

使用脚本

可以从命令行、批处理文件或 CruiseControl.NET(或其他集成服务器)运行构建脚本。 将 Nant 的路径添加到您的 PATH 环境变量可能会有所帮助,这样您就不需要在引用 Nant 可执行文件时键入完整路径。

Android 应用程序不会被编译成 EXE 或 DLL 文件。 相反,它们会被编译成 APK(Android 包)文件。 编译以 Windows 平台为目标的应用程序和以 Android 平台为目标的应用程序之间的主要区别在于,您还需要对 APK 文件进行签名和对齐。

您可以使用 Java Development Kit (JDK) 附带的命令行工具来执行应用程序的签名和对齐任务。 这些工具分别是 jarsigner 和 zipalign。 但是,如果您已经在使用 MSBUILD,则无需调用任何外部工具,因为 MSBUILD 可以为您调用它们。

脚本

有两个 MSBUILD 目标是构建 Visual Studio 的 Xamarin.Android 应用程序的关键。

这些是:

  • PackageAndroid
  • SignAlignAndroid

注意:关键词“target”被 Nant 和 MSBUIILD 使用,但含义不同,重要的是不要混淆它们。 Nant 中的目标是一个命名的脚本块,类似于模块或函数。 在 MSBUILD 中,目标是按顺序执行的任务。

下面的骨架脚本显示了三个 Nant 目标。 Release 目标对您的应用程序执行标准重建(已经执行了任何其他与构建相关的任务,例如 Debug 和/或 Clean 构建)。 PackageAndroidSignAlignAndroid 执行创建、签名和对齐 APK 文件的 Android 特定任务

Release Nant 目标使用 MSBUILD 构建应用程序,指定 RELEASE 作为 MSBUUILD 目标

<target name="Release" depends="Build"></target>

PackageAndroid Nant 目标使用 MSBUUILD 构建应用程序,指定 PackageAndroid 作为 MSBUUILD 目标。

<target name="PackageAndroid" depends="Release"></target>

SignAlignAndroid Nant 目标使用 MSBUUILD 构建应用程序,指定 SignAlignAndroid 作为 MSBUILD 目标。

<target name="SignAlignAndroid" depends="PackageAndroid"></target>

让我们仔细看看这些 Nant 目标。 希望属性 build.dirproject.dirproject.name 都是不言自明的。

PackageAndroid

这将创建您的 APK 文件,但重要的是,它不会对其进行签名。 当您只想编译您的应用程序以进行非分发时,这很有用。

    <target name="PackageAndroid" depends="Release">
    <!-- Package the Android APK file -->
    <echo message="Task execution started at : ${script::format-to-string(datetime::now())}" />

    <!-- Actually package the APK file -->
    <property name="build.item" value="${build.dir}\${project.dir}\${project.name}" />
    <property name="config.type"        value="Release" />
    <property name="target"               value="PackageForAndroid" />
    <msbuild project="${build.item}" target="${target}"  verbose="${verbose}" failonerror="true">
      <property name="Configuration" value="${config.type}" verbose="${verbose}" />
    </msbuild>
    <echo message="Task execution finished at : ${script::format-to-string(datetime::now())}" />
  </target>

SignAlignAndroid

这将创建您的 APK 文件并对其进行签名。

  <target name="SignAlignAndroid" depends="PackageAndroid">
    <!-- Sign the Android APK file -->
    <echo message="Task execution started at : ${script::format-to-string(datetime::now())}" />

    <!-- Actually sign the APK file -->
    <property name="build.item" value="${build.dir}\${project.dir}\${project.name}" /> 
    <property name="config.type"        value="Release" />
    <property name="target"               value="SignAndroidPackage" />
    <msbuild project="${build.item}" target="${target}" verbose="${verbose}" failonerror="true">
      <property name="Configuration" value="${config.type}" verbose="${verbose}" />
    </msbuild>

    <echo message="Task execution finished at : ${script::format-to-string(datetime::now())}" />
  </target>

构建 Xamarin.Android 应用程序时,默认情况下,构建过程将使用位于您的用户配置文件中的临时私钥。 如果您在开发机器上本地测试您的应用程序,这很好。 如果您想将您的应用程序分发给您的测试团队或用于生产,您需要使用您的实际私钥对您的应用程序进行签名。 您可以通过将它们添加到您的.CSPROJ文件中来指定它们。 请参阅下面的示例。 为每个目标平台添加这些元素。

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <AndroidKeyStore>True</AndroidKeyStore>
    <AndroidSigningKeyStore>\\mykeystorefolder\keystore.file</AndroidSigningKeyStore>
    <AndroidSigningStorePass>password</AndroidSigningStorePass>
    <AndroidSigningKeyAlias>alias</AndroidSigningKeyAlias>
    <AndroidSigningKeyPass>password</AndroidSigningKeyPass>
</PropertyGroup>

我已经在 GitHub 上发布了整个构建脚本,所以请随时查看。

© . All rights reserved.