应用程序经编码和测试后,必须准备一个包进行分发。 准备此包的第一个任务是生成供发布的应用程序,其中主要涉及到设置应用程序的一些属性。
有关较早版本的 Xamarin Android(版本 7.0 之前),请参阅 含 Xamarin Android 6.1 及更低版本的 Visual Studio 。
使用以下步骤生成供发布的应用:
下面详细说明了上述各步骤。
强烈建议每个 Xamarin.Android 应用程序都指定一个应用程序图标。 某些应用程序商城将不允许发布没有图标的 Android 应用程序。
Application 特性的 Icon 属性用于指定 Xamarin.Android 项目的应用程序图标。 此属性可在文件 Properties\AssemblyInfo.cs 中声明,如以下示例代码段中所示:
[assembly: Application(Icon = "@drawable/icon")]
在 Visual Studio 2013 及更高版本中,可通过项目“属性”的“Android 清单”部分指定应用程序图标,如以下屏幕截图所示:
在 Visual Studio 2010 中,通过应用程序特性的图标属性指定应用程序图标,如上所述。
对于 Android 应用程序维护和分发而言,版本控制很重要。 如果没有版本控制,则很难确定应用程序是否应更新或如何更新。 为了辅助版本控制,Android 可识别两种不同类型的信息:
版本号 – 表示应用程版本的整数值,供 Android 和应用程序内部使用。 对大多数应用程序而言,此值的初始设置为 1,之后随每个内部版本递增。 此值与版本名称属性(见下文)没有关系或关联。 应用程序和发布服务不应向用户显示此值。 此值在 AndroidManifest.xml 文件中存储为 android:versionCode。
版本名称 – 仅用于向用户传递应用程序(如安装在特定设备上)的版本相关信息的字符串。 版本名称将向用户显示,或在 Google Play 中显示。 此字符串不供 Android 内部使用。 版本名称可以是任何字符串值,它能帮助用户了解其设备上安装的版本。 此值在 AndroidManifest.xml 文件中存储为 android:versionName。
在 Visual Studio 中,可在项目“属性”的“Android 清单”部分设置这些值,如以下屏幕截图所示:
缩小 APK
可通过结合使用 Xamarin.Android 链接器(删除不必要的托管代码)和 Android SDK 中的 ProGuard 工具(删除未使用的 Java 字节码)缩小 Xamarin.Android APK。 生成过程首先使用 Xamarin.Android 链接器以托管代码 (C#) 级别优化应用,然后使用 ProGuard(如已启用)以 Java 字节码级别优化 APK。
配置链接器
发布模式会关闭共享运行时并打开链接,使应用程序只提供运行时需要的 Xamarin.Android 部分。 Xamarin.Android 中的链接器使用静态分析来确定 Xamarin.Android 应用程序所使用或引用的程序集、类型和类型成员。 然后,链接器将放弃所有未使用(或引用)的程序集、类型和成员。 这可显著减小包的大小。 例如,HelloWorld 示例,其 APK 的最终大小减少了 83%:
通过项目“属性”的“Android”部分设置链接器选项。 若要访问链接器选项,请单击“链接器”选项卡,如以下屏幕截图所示:
“链接”下拉菜单提供以下选项,用于控制链接器:
链接可能产生一些意外的副作用,因此必须在物理设备上的发布模式下重新测试应用程序。
ProGuard
ProGuard 是一种链接和模糊处理 Java 代码的 Android SDK 工具。 ProGuard 通常用于创建小型应用程序,工作原理是减少 APK 中包含的大型库的内存占用。 ProGuard 将删除未使用的 Java 字节码,使生成的应用变得更小。 例如,在小型 Xamarin.Android 应用中使用 ProGuard 通常可减少约 24% 大小– 在具有多个库依赖关系的大型应用中使用 ProGuard 通常可实现更大幅度的大小缩减。
ProGuard 不是 Xamarin.Android 链接器的替代工具。 Xamarin.Android 链接器链接托管代码,而 ProGuard 链接 Java 字节码。 生成过程首先在应用中使用 Xamarin.Android 链接器优化托管的 (C#) 代码,然后在 Java 字节码级别使用 ProGuard(若已启用)优化 APK。
选择“启用 ProGuard”P时,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 Community Edition (CE) 可用于模糊处理托管代码,并在生成时向 Xamarin.Android 应用插入运行时安全状态检测代码。
Dotfuscator CE 随附在 Visual Studio 中,但是仅 Visual Studio 2015 Update 3(及更高版本)具有用于 Xamarin.Android 的正确版本。 若要使用 Dotfuscator,请单击“工具”>“PreEmptive Protection - Dotfuscator”。
若要配置 Dotfuscator CE,请参阅 Using Dotfuscator Community Edition with Xamarin(结合使用 Dotfuscator Community Edition 和 Xamarin)。 完成配置后,Dotfuscator CE 将自动保护创建的每个生成。
此选项启用时,程序集会捆绑到本机共享库中。 此选项使代码保持安全;它通过在本机二进制文件中嵌入这些托管程序集来保护它们。
此选项需要 Enterprise 许可证,仅当“使用快速部署”禁用时才可用。 “将程序集捆绑到本机代码”在默认情况下处于禁用状态。
请注意,“捆绑到本机代码”选项执行不意味着程序集会编译到本机代码中。 无法使用 AOT 编译将程序集编译到本机代码中(当前只是试验性功能,不用于生产用途)。
AOT 目前是一项试验性功能。 不建议用于生产环境。 AOT 和 LLVM 在 Xamarin.Android 5.1 中可用,但在 Xamarin.Android 的更高版本中不再可用。 有关详细信息,请参阅 Xamarin.Android 6.1 发行说明
打包属性页上的AOT 编译选项支持预先编译程序集。 启用此选项后,通过在运行时之前预编译程序集可将实时 (JIT) 启动开销降到最低。 生成的本机代码包括在 APK 以及未编译程序集中。 这可缩短应用程序启动时间,但代价是 APK 大小会变得稍大。
“AOT 编译”选项要求使用 Enterprise 或更高版本的许可证。 仅在项目配置为发布模式时,才可使用“AOT 编译”,并且该选项默认处于禁用状态。 有关 AOT 编译的详细信息,请参阅 AOT。
LLVM 优化编译器会创建更小更快速的编译代码,并将 AOT 编译的程序集转换为本机代码,但生成时间会变缓慢。 默认情况下,LLVM 编译器处于禁用状态。 若要使用 LLVM 编译器,必须首先启用“AOT 编译”选项(在打包属性页上)。
LLVM 优化编译器选项需要业务许可证。
可在项目“属性”的“Android 选项”部分设置打包属性,如以下屏幕截图所示:
其中许多属性(例如“使用共享运行时”和“使用快速部署”)专用于调试模式。 但是,在发布模式下配置应用程序时,还需要进行其他设置,这些设置用于确定如何针对大小和执行速度优化应用、如何防止篡改应用,以及如何打包应用以支持不同的体系结构和大小限制。
准备 Xamarin.Android 应用进行发布时,必须指定支持的 CPU 体系结构。 单个 APK 可包含计算机代码,以支持多个不同的体系结构。 请参阅 CPU 体系结构,深入了解如何支持多个 CPU 体系结构。
每个选定 ABI 生成一个包 (.APK)
启用此选项后,会为每个支持的 ABI(在“高级”选项卡上进行选择,如 CPU 体系结构中所述)分别创建一个 APK,而不是为所有支持的 ABI 创建单个大型 APK。 仅在项目配置为用于发布模式时,才可使用此选项,并且其默认处于禁用状态。
如果启用“启用 Multi-Dex”选项,Android SDK 工具将用于绕过 .dex 文件格式的 65K 方法限制。 65K 方法限制基于应用引用的 Java 方法数(包括应用依赖的任何库中的方法数)– 不基于源代码中写入的方法数。 如果应用程序只定义了几个方法,却使用了多个方法或大型库,则可能超出 65K 限制。
应用可能未使用每个引用库中的每个方法;因此,ProGuard(见上文)等工具可能会将未使用的方法从代码中删除。 最佳做法是仅在绝对必要时启用“启用 Multi-Dex”,也就是说,即使使用 ProGuard,应用引用的 Java 方法仍然超过 65K。
若要深入了解 Multi-Dex,请参阅配置超出 64K 方法的应用。
完成上述所有步骤后,应用即可用于编译。 选择“生成”>“重新生成解决方案”以验证其是否在发布模式下成功生成。 请注意,此步骤尚不会产生 APK。
本指南的第 2 部分将更详细地介绍如何打包和签名。
若要开始发布过程,请在解决方案资源管理器中右键单击项目,然后选择“存档...”上下文菜单项:
选择“存档...”选项将启动存档管理器并开始应用程序包的存档过程,如以下屏幕截图所示:
另一种创建存档的方法是:在解决方案资源管理器中,右键单击“解决方案”,然后选择“全部存档...”,这会生成解决方案并存档可生成存档的所有 Xamarin 项目:
“存档”和“全部存档”均会自动启动存档管理器。 若要直接启动存档管理器,请单击“工具”>“存档管理器...”菜单项:
右键单击“解决方案”节点并选择“查看存档”可随时查看该解决方案的存档:
存档管理器由“解决方案列表”窗格、“存档列表”和“详细信息面板”组成:
“解决方案列表”将显示所有解决方案,其中至少有一个项目已存档。 “解决方案列表”包括以下各部分:
“存档列表”显示有关所选解决方案的所有存档的列表。 “存档列表”包括以下各部分:
“详细信息面板”显示有关每个存档的其他信息。 用户还可以从此面板启动分发工作流或打开创建分发的文件夹。 “生成注释”部分可将生成注释包括在存档中。
准备好发布存档版应用程序后,请在“存档管理器”中选择该存档,然后单击“分发...”按钮:
“分发通道”对话框包括以下方面的信息:应用、分发工作流进度指示以及分发渠道选项。 首次运行时,提供两个选项:
可选择以下分发通道之一:
Ad-Hoc – 将已签名的 APK 保存到磁盘,以将其旁加载到 Android 设备。 继续查看第 2 部分,了解如何创建 Android 签名标识、为 Android 应用程序创建新签名证书,以及将 ad hoc 版本的应用发布到磁盘。 这是为测试创建 APK 的好方法。
本指南介绍如何对 Android 应用程序包进行签名。 如果使用较旧版本的 Xamarin Studio(版本 5.9 之前),请参阅 Xamarin Studio 5.8 及更低版本。
在此部分中,我们会使用 Xamarin Studio 的集成发布工作流对 APK 进行签名。 在第 1 部分中,我们使用存档管理器生成应用并将它放置存档中以便进行签名和发布。 在此部分中,我们会了解如何创建 android 签名标识、为 Android 应用程序创建新签名证书以及将存档应用即席发布到磁盘。 生成的 APK 可以旁加载到 Android 设备中,而无需经过应用商店。
在存档以便进行发布中,“签名和分发...”对话框向我们提供了两种分发选择。 选择“即席”,然后单击“下一步”:
单击“即席”之后,Xamarin Studio 会打开“Android 签名标识”对话框,如下一个屏幕截图所示。 若要发布 .APK,必须首先使用签名密钥(也称为证书)对它进行签名。 如果证书已存在,则单击“导入现有密钥”按钮以导入它,然后前进到对 APK 进行签名。否则,单击“创建新密钥”按钮以创建新证书:
“创建新证书”对话框用于创建可以用于对 Android 应用程序进行签名的新签名证书。 输入所需信息之后,单击“确定”:
生成的密钥存储位于以下位置:
~/Library/Developer/Xamarin/Keystore/alias/alias.keystore
例如,以上步骤可能会在以下位置创建新签名密钥:
~/Library/Developer/Xamarin/Keystore/chimp/chimp.keystore
ℹ️注意:请确保将生成的密钥存储文件备份在安全的位置 – 不包含在解决方案中。 如果密钥存储文件(例如,因为移动到另一台计算机或重新安装了 Mac)丢失,将无法使用与以前版本相同的证书对应用签名。
有关密钥存储的详细信息,请参阅查找密钥存储的 MD5 或 SHA1 签名。
如此处所示,一个新证书已添加到密钥存储中。 若要在 Google Play 上发布应用,请单击“取消”,然后转到第 3 部分。 否则,单击“下一步”以即席发布应用(对于独立分发),如此示例所示:
“即席发布”对话框会在发布之前提供已签名应用的摘要。 如果此信息正确,则单击“发布”。
“输出 APK 文件”对话框会将 APK 保存到指定路径。 单击“保存” 。
接下来,为证书输入密码(在“创建新证书”对话框中使用的密码),然后单击“确定”:
APK 会使用证书进行签名并保存到指定位置。 单击“在查找器中展现”:
这会将查找器打开到已签名 APK 文件的位置:
APK 已准备好从查找器进行复制并发送到其最终目标。 最好在分发之前将 APK 安装在 Android 设备上并进行试用。 有关发布即席 APK 的详细信息,请参阅第 6 部分。
本指南介绍如何使用 Xamarin Android 7.0 或更高版本对 Android 应用程序包进行签名。 如果使用 Xamarin Android 版本 4.2.6 到 6.1,请参阅对 Android 应用程序包进行签名(Visual Studio XA 4.2.6 到 6.1)。
此部分介绍用于对 Visual Studio 提供的 APK 进行签名的集成发布工作流。 在第 1 部分中,使用了存档管理器生成应用并将它放置存档中以便进行签名和发布。 此部分说明如何创建 Android 签名标识、为 Android 应用程序创建新签名证书以及将存档应用即席发布到磁盘。 生成的 APK 可以旁加载到 Android 设备中,而无需经过应用商店。
在存档以便进行发布中,“分发渠道”对话框提供了两种分发选择。 选择“即席”:
选择“即席”之后,Visual Studio 会打开对话框的“签名标识”页,如下一个屏幕截图所示。 若要发布 .APK,必须首先使用签名密钥(也称为证书)对它进行签名。
可以通过单击“导入”按钮,然后前进到对 APK 进行签名,来使用现有证书。 否则,单击“+”按钮创建新证书:
会显示“创建 Android 密钥存储”对话框;使用此对话框可创建可以用于对 Android 应用程序进行签名的新签名证书。 输入所需信息(具有红色边框),如此对话框中所示:
下面的示例说明必须提供的信息的种类。 单击“创建”以创建新证书:
生成的密钥存储位于以下位置:
C:\Users\USERNAME\AppData\Local\Xamarin\Mono for Android\alias\alias.keystore
例如,以上步骤可能会在以下位置创建新签名密钥:
C:\Users\USERNAME\AppData\Local\Xamarin\Mono for Android\chimp\chimp.keystore
ℹ️注意:请确保将生成的密钥存储文件备份在安全的位置 – 不包含在解决方案中。 如果密钥存储文件(例如,因为移动到另一台计算机或重新安装了 Windows)丢失,将无法使用与以前版本相同的证书对应用签名。
有关密钥存储的详细信息,请参阅查找密钥存储的 MD5 或 SHA1 签名。
单击“创建”时,新密钥存储(包含新证书)会进行保存并在“签名标识”下列出,如下一个屏幕截图所示。 若要在 Google Play 上发布应用,请单击“取消”,然后转到第 3 部分。 若要即席发布,请选择要用于签名的签名标识并单击“另存为”以发布应用以用于独立分发。 例如,在此屏幕截图中选择了 chimp 签名标识(在前面创建):
接下来,存档管理器会显示发布进度。 发布过程完成时,“另存为”对话框会打开,要求提供要在其中存储生成的 .APK 文件的位置:
导航到所需位置并单击“保存”。 如果密钥密码未知,则“签名密码”对话框会出现,提示输入所选证书的密码:
签名过程完成之后,单击“打开文件夹”:
这会使 Windows 资源管理器打开包含生成的 APK 文件的文件夹。 此时,Visual Studio 已将 Xamarin.Android 应用程序编译为准备好进行分发的 APK。 下面的屏幕截图显示准备好进行发布的应用 (MyApp.MyApp.apk) 的示例:
Google Play – 将已签名的 APK 发布到 Google Play。 继续查看第 3 部分,了解如何对 APK 进行签名并将其发布到 Google Play 商店。