[译]:Xamarin.Android部署——应用程序发布准备

标签: Xamarin.Android, 官方教程, 中文翻译

博客分类: 官方教程

返回索引目录
原文链接:Part 1 - Preparing an Application for Release
译文链接:Xamarin.Android部署——应用程序发布准备

Part 1 - 应用程序发布准备

在应用程序完成编码和测试后,就要准备分发包了。准备分发包的第一个任务就是生成release版的应用 —— 主要是设置一些应用属性。如果你使用旧版的Xamarin Android(7.0)之前,请参阅:原文:Visual Studio with Xamarin Android 6.1 and earlier

注:关于上面提到的Xamarin.Android的版本号,查看方式:打开Visual Studio > 点击帮助 > 点击关于Microsoft Visual Studio > 滚动到最下面查看Xamarin.Android版本号
若在其他位置只能找到Xamarin的版本,与上面是对不上的。

使用以下步骤来生成应用的发布版:

  • 指定应用的图标 —— 每个Xamarin.Android应用都应该指定一个应用图标。它在技术上不是必须的;但是在某些市场(如Google Play)上需要它。
  • 应用程序版本处理 —— 此步骤涉及初始化或更新版本信息。这对于将来应用程序的更新很重要,同时确保用户知道他们安装了哪个版本的应用。
  • APK压缩 —— 通过使用托管代码上的Xamarin.Android链接器和Java字节码上的Proguard,可以大大减小最终APK的大小。
  • 保护应用程序 —— 通过禁用调试、混淆托管代码、添加反调试和防篡改,以及使用本机编译等方式来防止用户或攻击者对应用进行调试、篡改或反向工程。
  • 设置打包属性 —— 打包属性控制Android应用程序包(APK)的创建。此步骤优化APK,保护资源,并依据需要对包装进行模块化。
  • 编译 —— 此步骤编译代码和资源,以此验证它是否以Release模式生成。
  • 发布存档 —— 此步骤生成应用程序,并将其存档,以便于后面进行签名和发布 。

关于每一步的详细内容将在下面讨论。

指定应用图标

强烈建议每个Xamarin.Android应用程序都指定一个应用图标。一些应用市场不允许没有图标的Android应用发布。

Xamarin.Android项目使用Application特性的Icon属性指定应用图标。此特性可以在Properties\AssemblyInfo.cs文件中声明。代码如下所示:

[assembly: Application(Icon = "@drawable/icon")]

而在Visual Studio 2013/2015中,你可以在项目属性Android Manifest标签内 指定应用程序图标,如下图所示:

如果你使用的是Visual Studio 2010,则你可以通过Apllication特性的Icon属性来指定应用程序图标 —— 如本节开头所示。

应用程序版本处理

版本控制对于Android应用的维护和分发非常重要。如果没有版本控制,将很难确定应用是否更新,以及如何更新。为了辅助处理版本控制,Android可以识别以下两种不同类型的信息:

  • 版本号-Version Number —— 应用程序版本的整数值(由Android和应用在内部使用)。大多数应用首先将此值设置为1,然后每次构建都会递增。此值与版本名称属性没有任何关系(见下文)。应用程序和发布服务不会像用户显示此值。此值以android:versionCode存储在AndroidManifest.xml文件中。
  • 版本名称-Version Name —— 一个用于向用户传递应用(安装在特定设备上应用)版本信息的字符串。版本名称主要用于向用户或在Google Play中显示。Android也不会在内部使用此字符串。版本名称可以是任何字符串值,这是用于辅助用户识别安装在他们设备上的构建。此值以android:versionName存储在AndroidManifest.xml中。

在Visual Studio中,这些 值都可以在项目属性中的Android Manifest标签中设置,如下图所示:

APK压缩

通过Xamarin.Android链接器(删除不必要的托管代码)与Android SDK的Proguard工具(删除未使用的Java字节码)的配合使用可以将Xamarin.Android APK处理的更小。在构建过程中,首先使用Xamarin.Android链接器在托管代码(C#)级别优化应用,然后使用ProGuard(需已启用)在Java字节码级别进一步优化APK。

配置链接器

在Release模式下关闭共享运行时,并打开链接,这样应用可以仅在运行时中处理Xamarin.Android所需的部分。在 Xamarin.Android中,链接器使用静态分析来确定哪些程序集、类型和类型成员有被Xamarin.Android应用所使用或引用。然后,链接器会将所有未使用(或引用)的程序集、类型以及类型成员丢弃。这样可以让安装包的尺寸大大减小。例如,以HelloWorld为例,它的APK大小最总可以减少83%:

比较项
Configuration Xamarin.Android 4.2.5 Size
None 17.4 MB
SDK Assemblies Only 3.0 MB

在Visual Studio中,你可以在项目属性中的Android Options页面中配置链接器。关于访问链接器选项,请点击Linker标签,如下图所示:

其中Linking下拉菜单中提供以下几个选项:

  • None —— 关闭链接器;将不会执行链接。
  • Sdk Assemblies Only —— 只链接Xamarin.Android所需的程序集。其他程序集将不会链接。
  • Sdk and User Assemblies —— 链接应用所需的所有程序集,而不仅仅是 Xamarin.Android所需的程序集。

链接可能导致一些意外影响,因此应用在Release模式下重新测试是很重要的。测试也必须在物理设备上进行。

ProGuard

ProGuard是一个用于链接和混淆Java代码的Android SDK工具。ProGuard通常用于减少APK中的大型库(如Google Play服务)的占用量,以此创建较小的应用。ProGuard可以删除未使用的Java字节码,以此来减小最终的应用大小。例如,在Xamarin.Android应用中使用ProGuard通常可以减小大约24%的大小 —— 在含有多个库依赖的大型应用中,会有更加明显的缩减。

当在Packaging属性页中勾选了Enable ProGuard后,Xamarin.Android会在最终生成APK时运行ProGuard工具。Xamarin.Android还支持自定义 ProguardConfiguration 生成操作。你可以向项目中添加自定义的ProGuard配置文件,然后右键它打开属性,将生成操作设置为如下图所示内容:

关于ProGuard配置文件可以设置的选项见:ProGuard on SourceForge。当我们在属性页面中勾选Enable ProGuard时,Xamarin.Android会在生成时,自动创建并使用ProGuard配置文件 —— 文件生成位置为:obj/Release/proguard/proguard_xamarin.cfg。请记住,你的配置文件(如果自己建立配置文件)不会替换proguard_xamarin.cfg文件,ProGuard会同时使用它们。

注:如果出现以下类似错误提示,则你的配置文件包含字节顺序标记(BOM),ProGuard工具无法处理该字节顺序标记:

Unknown option '-keep' in line 1 of file 'proguard.cfg'

要防止此类问题,请在文本编辑器保存你的自定义配置文件时,设置省略BOM。例如,如果你使用Notepad++保存,你可以在菜单中设置(选择格式(M)-以UTF-8无BOM格式编码),这样,保存的ProGuard配置文件就没有BOM了。

默认情况下,ProGuard是禁用的。你可以仅在Release模式下勾选Enable ProGuard选项。若Enable ProGuard没有勾选,则所有的ProGuard生成操作将都会忽略。Xamarin.Android中的ProGuard配置不会混淆APK,即使你自定义配置文件,ProGuard也不会启用混淆。如果你想使用混淆,请参阅下一节内容。

关于更多ProGuard工具和Android内容,参见:Shrink Your Code and Resources —— 谷歌Android文档,墙外资源。

应用程序保护

禁用调试

在开发Android应用时,我们通过Java Debug Wire Protocol(JDWP)来进行调试。它是一种让工具(如adb)在调试的时候,可以与JVM通信的技术。在调试Xamarin.Android应用时,JDWP是默认启用的。虽然JDWP在开发 期间很重要,但是它对已经发布的应用造成安全问题。

注意:建议在发布应用情况下始终禁用调试状态。因为如果调试状态未禁用,别人可能通过JDWP获得对Java进程的完全访问权限,并且可以在应用的上下文环境中执行任意代码。

在Android Manifest中包含android:debuggable属性,它用于控制是否可以调试应用程序。最好是将android:debuggable属性设置为false。最简单的方法是在AssemblyInfo.cs中添加如下编译语句:

#if DEBUG
[assembly: Application(Debuggable=true)]
#else
[assembly: Application(Debuggable=false)]
#endif

注意,Debug生成会自动设置一些权限,以便于更易调试(如Internet和ReadExternalStorage)。但是在Release生成时,它仅仅含有你明确配置的权限。如果你发现你从Debug模式切换到Release模式时,丢失了部分需要的权限,请验证是否在Android Manifest中的Required permissions列表中显示勾选了相应的权限。

使用Dotfuscator保护应用

即使禁用了调试,攻击者仍然可以通过重新打包应用程序来使用任何所需的配置选项或权限。这允许他们对应用进行逆向工程,调试或篡改。为了帮助对抗这些攻击,你可以使用Dotfuscator Community Edition来混淆托管代码,并在生成时将运行时安全状态检测代码注入到你的应用中。

Dotfuscator Community Edition包含在Visual Studio中 —— 至少需要Visual Studio 2015 Update 3。要使用Dotfuscator,点击工具 > PreEmptive Protection - Dotfuscator

关于配置Dotfuscator CE内容,参阅:原文:Using Dotfuscator Community Edition with Xamarin 。一旦配置好,Dotfuscator CE会自动保护你保护你创建的每次构建。

将程序集处理为本机代码

启用此选项时,程序集将捆绑到本机共享库中。此选项可以确保代码安全;它通过将托管程序集嵌入到本机二进制文件中来保护它。

此选项需要Enterprise许可证,并且仅在禁用Use Fast Deployment时可以用。Bundle assemblies into native code是默认禁用的。

注意,Bundle into Native Code选项并不意味着程序集被编译成本地代码。你可以使用AOT编辑将程序集编译为本机代码(目前只是一个实验性功能,不适用于正式生产环境)

AOT编译

注意:AOT目前是一个实验性功能。不推荐在真实生产环境中使用。AOT和LLVM在Xamarin.Android 5.1中可用,但在后面的Xamarin.Android版中是不可用的。关于更多信息见:release notes

鉴于此节内容新版中没有,此处不做翻译,原文内容见AOT Compilation

打包属性设置

在Visual Studio中,包的属性可以在项目属性Android Options标签页面内设置,如下图所示:

注:新版(或社区版)中没有图中所示那么多内容。

许多属性是为调试模式设计的,如Use Shared RuntimeUse Fast Deployment。当然,当应用配置为Release模式时,会有其他的一些设置,其中有:如何优化应用大小及运行速度、如何防止篡改,以及如何进行打包,以此支持不同架构和大小。

指定支持的体系架构

在准备发布应用时,必须指定你应用支持什么样的平台CPU体系架构。单个APK可以包含机器代码来支持多个不同的体系结构。关于配置应用程序支持一个或多个CPU体系结构的详细信息,参见:原文:CPU Architectures

为每个选定的ABI生成一个包(.apk)

启用此选项时,将为每个受支持的ABI(Advanced标签内的CPU Architecture)创建一个APK,而不是为所有支持ABI创建一个大的APK。此选项仅在项目为Release模式下可用,且默认情况下是禁用状态。

Multi-Dex

当勾选Enable Multi-Dex选项时,Android SDK工具将会绕过.dex文件格式的65K方法限制。65K方法限制基于你应用所引用的Java方法的数量(包括你使用的任何库的Java方法)—— 它并不是基于你定义的方法的数量。也就是说,即使你的应用只定义了少量的方法,你也可能会达到限制。

你的应用很有可能并没有使用它包含的库中的每个方法,因此,你可以通过使用ProGuard来删除APK中未使用的代码,以此避免达到限制。最好是在你使用了ProGuard了之后,应用仍然引用了超过65K的Java方法的情况下,在使用Enable Multi-Dex选项。

更多关于Multi-Dex内容,参阅:Configure Apps with Over 64K Methods —— 谷歌Android文档,墙外资源。

编译

在完成上述所有步骤后,你就可以编译应用程序(生成 > 重新生成解决方案),以此验证其是否在Release模式下可以成功生成。注意,至此仍未生成APK。

在第二部分中,我们将会创建APK并为应用签名。链接:原文:Part 2 - Signing the Android Application Package译文:Xamarin.Android部署——Android应用包签名

发布存档

要发布应用,在解决方案管理器中右键项目,然后选择Archive...菜单项:

Archive...操作会启动Archive Manager,然后开始进行存档应用程序包,如下图所示:

或者,你可以在解决方案管理器中右键解决方案,然后选择Archive All...菜单项,这将生成解决方案并将生成所有可以生成归档的Xamarin项目:

ArchiveArchive All都将自动启动Archive Manager。要直接启动Archive Manager,请点击工具 > Archive Manager菜单项:

你可以随时查看解决方案的归档,方法是右键解决方案,选择View Archives菜单项:

归档管理器——Archive Manager

Archive Manager包括解决方案列表-Solution List面板、归档列表-Archives List详细信息-Details面板:

解决方案列表中显示了所有含有存档项目(至少一个)的解决方案。解决方案列表主要包含以下一个部分:

  • 当前解决方案-Current Solution —— 显示当前解决方案。注意,如果当前解决方案没有归档,则此区域显示为空。
  • 所有归档-All Archives —— 显示具有归档的所有解决方案。
  • 搜索文本框-Search text box(在面板顶部) —— 依据文本框输入的字符串,筛选所有归档-All Archives列表,以此列出匹配的解决方案。

归档列表中显示所有当前选择解决方案的所有归档。归档列表主要包含以下一个部分:

  • 所选的解决方案名称 —— 显示在解决方案列表中选择的解决方案名称。归档列表中显示的所有信息内容均属于此解决方案。
  • Platforms筛选下拉框 —— 此字段可以按照平台类型筛选过滤归档(如IOS或Android)。
  • 归档项 —— 选中解决方案的归档列表。列表中的每一项都包含项目名称、创建日期和平台。它还可以显示其他信息,如项目正在归档或发布时的进度。

详细信息面板显示了关于每一个归档的额外信息。它还允许用户启动分发工作流或打开已创建分发的文件夹。Build Comments部分让我们可以在归档中加入生成注释内容。

分发

当应用归档好准备发布时,可以点击Archive Manager中的Distribute...按钮:

Distribution Channel对话框中显示有关应用的信息、分发工作流的进度,以及分发渠道的选择。第一次运行时,将有如下两个选择:

在此页面中,你可以选择以下分发渠道之一:

  • Ad-Hoc —— 将已签名的APK存储到磁盘,以便于你可以将它用于Android设备使用。在第二部分中,你将会了解如何创建 Android签名标识,和如何为Android应用创建新的签名证书,以及如何将应用版本发布到磁盘上。生成的APK可以转移到Android设备安装,而无需通过应用商店。在应用发布到Google Play之前,这是一个测试应用的好方法。
  • Google Play —— 将已签名的APK发布到Google Play。关于如何在Google Play商店中签名和发布APK见:原文:Part 3 - Publishing an Application on Google Play

译:奇葩史

没有评论