在对应用程序进行编码和测试后,必须准备用于分发的包。 准备此包的第一项任务是生成应用程序以供发布,这主要需要设置一些应用程序属性。
使用以下步骤生成应用以供发布:
- 指定应用程序图标 – 每个 Xamarin.Android 应用程序都应指定应用程序图标。 虽然在技术上并不必要,但某些市场(如 Google Play)需要它。 
- 版本应用程序 – 此步骤涉及初始化或更新版本控制信息。 这对于将来的应用程序更新非常重要,并确保用户知道他们已安装的应用程序的版本。 
- 收缩 APK - 通过使用托管代码上的 Xamarin.Android 链接器和 Java 字节码上的 ProGuard,最终 APK 的大小可以大幅减少。 
- 保护应用程序 – 通过禁用调试、模糊处理托管代码、添加反调试和防篡改以及使用本机编译来防止用户或攻击者调试、篡改或反向工程应用程序。 
- 设置打包属性 - 打包 属性控制 Android 应用程序包(APK)的创建。 此步骤优化 APK,保护其资产,并根据需要模块化打包。 此外,还可以为用户提供针对其设备优化的 Android 应用捆绑包。 
- 编译 – 此步骤编译代码和资产,以验证它在发布模式下生成。 
- 用于发布的存档 – 此步骤会构建应用程序并将其置于存档中,以便进行签名和发布。 
下面详细介绍了上述每个步骤。
指定应用程序图标
强烈建议每个 Xamarin.Android 应用程序指定应用程序图标。 某些应用程序市场不允许在没有 Android 应用程序的情况下发布。 Application 特性的 Icon 属性用于指定 Xamarin.Android 项目的应用程序图标。
在 Visual Studio 2017 及更高版本中,通过项目属性的 Android 清单部分指定应用程序图标,如以下屏幕截图所示:
在这些示例中, @drawable/icon 引用位于 Resources/drawable/icon.png 的图标文件(请注意,资源名称中不包含 .png 扩展名)。 还可以在文件 Properties\AssemblyInfo.cs 中声明此属性,如此示例代码片段所示:
[assembly: Application(Icon = "@drawable/icon")]
通常, using Android.App 在 AssemblyInfo.cs 顶部声明(属性的 Application 命名空间为 Android.App);但是,如果它尚不存在,则可能需要添加此 using 语句。
应用程序版本控制
版本控制对于 Android 应用程序维护和分发非常重要。 如果没有某种版本控制,很难确定应用程序是否应更新或更新方式。 为了协助版本控制,Android 可识别两种不同类型的信息:
- 版本号 – 表示应用程序的版本的整数值(由 Android 和应用程序在内部使用)。 大多数应用程序一开始将此值设置为 1,然后在每次构建时递增。 此值与版本名称属性没有关系或相关性(请参阅下文)。 应用程序和发布服务不应向用户显示此值。 此值以 AndroidManifest.xml 文件的形式 - android:versionCode存储。
- 版本名称 – 一个字符串,仅用于向用户传达有关应用程序版本的信息(安装在特定设备上)。 版本名称旨在向用户或 Google Play 中显示。 Android 不会在内部使用此字符串。 版本名称可以是任何字符串值,以帮助用户识别其设备上安装的构建。 此值以 AndroidManifest.xml 文件的形式 - android:versionName存储。
在 Visual Studio 中,可以在项目属性的“Android 清单”部分中设置这些值,如以下屏幕截图所示:
缩小 APK
通过组合使用 Xamarin.Android 链接器和 Android SDK 中的 ProGuard 工具,可以缩小 Xamarin.Android APK。链接器将删除不必要的 托管 代码,而 ProGuard 将删除未使用的 Java 字节码。 生成过程首先使用 Xamarin.Android 链接器在托管代码(C#)级别优化应用,然后它稍后使用 ProGuard(如果启用)在 Java 字节码级别优化 APK。
配置链接器
发布模式关闭共享运行时并启用链接,以便应用程序仅在运行时提供所需的 Xamarin.Android 部分。 Xamarin.Android 中的 链接器 使用静态分析来确定 Xamarin.Android 应用程序使用或引用的程序集、类型和类型成员。 然后,链接器将丢弃所有未使用或未引用的程序集、类型和成员。 这可能会导致包大小显著减少。 例如,假设 HelloWorld 示例的 APK 的最终大小减少了 83%:
- 配置:无 – Xamarin.Android 4.2.5 大小 = 17.4 MB。 
- 配置:仅 SDK 程序集 - Xamarin.Android 4.2.5 大小 = 3.0 MB。 
通过项目属性的“Android 选项”部分设置链接器选项:
“链接”下拉菜单提供以下用于控制链接器的选项:
- 无 – 这会关闭链接器;不会执行任何链接。 
- 仅 SDK 程序集 - 这仅链接 Xamarin.Android 所需的程序集。 不会链接其他程序集。 
- SDK 和用户程序集 – 这将链接应用程序所需的所有程序集,而不仅仅是 Xamarin.Android 所需的程序集。 
链接可能会产生一些意外的副作用,因此在物理设备上的发布模式下重新测试应用程序非常重要。
ProGuard
ProGuard 是一种 Android SDK 工具,用于链接和模糊处理 Java 代码。 ProGuard 通常用于通过减少 APK 中大型包含库(如 Google Play Services)的占用空间来创建较小的应用程序。 ProGuard 删除未使用的 Java 字节码,从而使生成的应用更小。 例如,在小型 Xamarin.Android 应用中使用 ProGuard 通常可实现大约 24% 大小缩减 - 对具有多个库依赖项的大型应用使用 ProGuard 通常可实现更大的大小缩减。
ProGuard 不是 Xamarin.Android 链接器的替代方法。 Xamarin.Android 链接器链接 托管 代码,而 ProGuard 链接 Java 字节码。 生成过程首先使用 Xamarin.Android 链接器优化应用中的托管(C#)代码,然后它稍后使用 ProGuard(如果已启用)优化 Java 字节码级别的 APK。
选中 “启用 ProGuard” 后,Xamarin.Android 会在生成的 APK 上运行 ProGuard 工具。 ProGuard 配置文件是在构建时由 ProGuard 生成和使用的。 Xamarin.Android 还支持自定义 ProguardConfiguration 构建操作。 可以将自定义 ProGuard 配置文件添加到项目,右键单击它,并将其选为生成作,如以下示例所示:
ProGuard 默认处于禁用状态。 仅当项目设置为“发布”模式时,“启用 ProGuard”选项才可用。 除非选中 “启用 ProGuard” ,否则将忽略所有 ProGuard 构建操作。 Xamarin.Android ProGuard 配置不会模糊化 APK,即使使用自定义配置文件,也不可能启用模糊处理。 如果想要模糊处理,请参阅使用 Dotfuscator 保护应用程序。
有关使用 ProGuard 工具的更多详细信息,请参阅 ProGuard。
保护应用程序
禁用调试
在开发 Android 应用程序期间,使用 Java 调试线路协议 (JDWP)执行调试。 这是一种技术,允许 adb 等工具与 JVM 通信,以便进行调试。 对于 Xamarin.Android 应用程序的调试版本,JDWP 默认处于打开状态。 虽然 JDWP 在开发过程中很重要,但它可能会给已发布的应用程序带来安全问题。
重要
始终禁用已发布应用程序中的调试状态,因为(通过 JDWP)可以完全访问 Java 进程,并在应用程序上下文中执行任意代码(如果未禁用此调试状态)。
Android 清单包含属性 android:debuggable ,用于控制是否可以调试应用程序。 最好将 android:debuggable 属性设置为 false。 执行此作的最简单方法是在 AssemblyInfo.cs中添加条件编译语句:
#if DEBUG
[assembly: Application(Debuggable=true)]
#else
[assembly: Application(Debuggable=false)]
#endif
请注意,调试版本会自动设置某些权限,以使调试更加轻松(例如 Internet 和 ReadExternalStorage)。 但是,发布版本只使用显式配置的权限。 如果发现切换到发布版本会导致应用失去调试版本中可用的权限,请验证是否已在 “所需权限 ”列表中显式启用此权限,如 “权限”中所述。
使用 Dotfuscator 进行应用程序保护
即使 调试已禁用,攻击者仍可能重新打包应用程序、添加或删除配置选项或权限。 这样,他们就可以反向工程、调试或篡改应用程序。 Dotfuscator Community Edition (CE) 可用于模糊处理托管代码,并在生成时将运行时安全状态检测代码注入 Xamarin.Android 应用,以检测和响应应用是否在根设备上运行。
Visual Studio 2017 随附了 Dotfuscator CE。 若要使用 Dotfuscator,请单击“工具”>“PreEmptive 保护”-“Dotfuscator”。
若要配置 Dotfuscator CE,请参阅 将 Dotfuscator Community Edition 与 Xamarin 配合使用。 完成配置后,Dotfuscator CE 将自动保护创建的每个生成。
将程序集捆绑到本机代码
启用此选项后,程序集将捆绑到本机共享库中。 借助这种方法,程序集可以被压缩,使得 .apk 文件更小。 程序集压缩还赋予了 最小 形式的模糊处理;不应依赖这种模糊处理。
此选项需要企业许可证,仅在禁用 使用快速部署 时可用。 将程序集捆绑到本机代码在默认情况下处于禁用状态。
请注意,“捆绑到本机代码”选项执行不意味着程序集会编译到本机代码中。 无法使用 AOT 编译 将程序集编译为本机代码。
AOT 编译
AOT 编译选项(在打包属性页上)启用程序集的提前编译。 启用此选项后,通过在运行时之前预编译程序集来最小化即时(JIT)启动开销。 生成的本机代码与未编译的程序集一起包含在 APK 中。 这会导致应用程序启动时间较短,但代价是 APK 大小略大。
AOT 编译选项需要企业许可证或更高版本。 AOT 编译 仅在项目配置为发布模式时可用,并且默认处于禁用状态。 有关 AOT 编译的详细信息,请参阅 AOT。
LLVM 优化编译器
LLVM 优化编译器将创建更小、更快的编译代码,并将 AOT 编译的程序集转换为本机代码,但代价是生成时间变慢。 默认情况下,LLVM 编译器处于禁用状态。 若要使用 LLVM 编译器,必须先启用 AOT 编译 选项(在 “打包属性 ”页上)。
注释
LLVM 优化编译器选项需要企业许可证。
设置打包属性
可以在项目“属性”的“Android 选项”部分中设置打包属性,如以下屏幕截图所示:
其中许多属性(如 使用共享运行时)和 “使用快速部署 ”适用于调试模式。 但是,当应用程序配置为发布模式时,还有其他设置用于确定应用如何 针对大小和执行速度进行优化、 如何保护它免受篡改,以及如何打包它以支持不同的体系结构和大小限制。
指定支持的体系结构
为发布准备 Xamarin.Android 应用时,必须指定支持的 CPU 体系结构。 单个 APK 可以包含支持多个不同体系结构的计算机代码。 有关支持多个 CPU 体系结构的详细信息,请参阅 CPU 体系结构 。
每个选定 ABI 生成一个包 (.APK)
启用此选项后,将为每个受支持的 ABI(如 CPU 体系结构中所述的“高级”选项卡上选择)创建一个 APK,而不是针对所有受支持的 ABI 的单个大型 APK。 仅当项目配置为发布模式并且默认禁用此选项时,此选项才可用。
Multi-Dex
如果启用“启用 Multi-Dex”选项,Android SDK 工具将用于绕过 .dex 文件格式的 65K 方法限制。 65K 方法限制基于应用 引用 的 Java 方法数(包括应用依赖的任何库中的方法)-它不基于 源代码中写入的方法数。 如果应用程序只定义几个方法,但使用许多(或大型库),则可能超出 65K 限制。
应用可能不使用引用的每个库中的每个方法;因此,ProGuard 等工具可能会从代码中删除未使用的方法。 最佳做法是仅在必要时启用 多索引 ,即即使使用 ProGuard,应用仍引用超过 65K Java 方法。
有关 Multi-Dex 的详细信息,请参阅 配置应用程序以支持超过 64K 方法。
Android 应用捆绑包
应用捆绑包不同于 APK,因为它们无法直接部署到设备。 相反,它是一种格式,旨在随所有已编译的代码和资源一起上传。 上传已签名的应用捆绑包后,Google Play 将拥有生成和签名应用程序的 APK 所需的一切内容,并使用动态交付向用户提供服务。
为了启用对 Android 应用捆绑包的支持,您需要在 Android 项目选项中选择加入 bundle 值中的 Android 程序包格式 属性。 在执行此操作之前,请确保将项目更改为 Release 配置,因为应用捆绑包仅适用于发布包。
现在可以按照 存档流生成应用捆绑包。 这将为应用程序生成应用捆绑包。
有关 Android 应用捆绑包的详细信息,请参阅 Android 应用捆绑包。
编译
完成上述所有步骤后,应用即可进行编译。 选择“生成”>“重新生成解决方案”以验证其是否在发布模式下成功生成。 请注意,此步骤尚未生成 APK。
《应用包签名》 详细讨论了打包和签名的过程。
存档以供发布
若要开始发布过程,请在 解决方案资源管理器 中右键单击项目,然后选择 “存档...” 上下文菜单项:
档案。。。 启动 存档管理器 并开始存档应用捆绑包的过程,如以下屏幕截图所示:
创建存档的另一种方法是在 解决方案资源管理器 中右键单击解决方案并选择“ 全部存档...”,这将生成解决方案并存档可生成存档的所有 Xamarin 项目:
存档和存档全部自动启动存档管理器。 若要直接启动 存档管理器 ,请单击 “工具 > 存档管理器...” 菜单项:
通过右键单击 解决方案 节点并选择 查看存档,您可以随时查看解决方案的存档。
存档管理器
存档管理器由“解决方案列表”窗格、“存档列表”和“详细信息”面板组成:
解决方案列表显示具有至少一个存档项目的所有解决方案。 解决方案列表包含以下部分:
- 当前解决方案 – 显示当前解决方案。 请注意,如果当前解决方案没有现有存档,则此区域可能为空。
- 所有存档 - 显示具有存档的所有解决方案。
- 搜索 文本框(顶部) - 根据文本框中输入的搜索字符串筛选 所有存档 列表中列出的解决方案。
存档列表显示所选解决方案的所有存档的列表。 存档列表包含以下部分:
- 所选解决方案名称 – 显示解决方案 列表中所选解决方案的名称。 存档列表中显示的所有信息都指此所选解决方案。
- 平台筛选器 – 此字段使可以按平台类型(如 iOS 或 Android)筛选存档。
- 存档项 - 所选解决方案的存档列表。 此列表中的每个项都包含项目名称、创建日期和平台。 它还可以显示其他信息,例如在项目存档或发布过程中显示进度。
详细信息面板显示有关每个存档的其他信息。 它还允许用户启动分发工作流或打开已创建分发的文件夹。 “ 生成注释 ”部分使可以在存档中包含生成注释。
分销
当应用程序的存档版本准备好发布时,请在 存档管理器中选择存档 ,然后单击“ 分发...” 按钮:
“ 分发通道 ”对话框显示有关应用的信息、分发工作流进度的指示以及分发通道的选择。 在第一次运行时,会显示两个选项:
可以选择以下分发渠道之一:
- Ad-Hoc - 将已签名的 APK 保存到磁盘,以将其旁加载到 Android 设备。 继续 对应用包进行签名 ,了解如何创建 Android 签名标识、为 Android 应用程序创建新的签名证书,并将应用的 临时 版本发布到磁盘。 这是创建用于测试的 APK 的好方法。 
- Google Play - 将已签名的 APK 发布到 Google Play。 继续 发布到 Google Play ,了解如何在 Google Play 商店中对 APK 进行签名和发布。 




















