apk 包的大小对大家都是很敏感的,虽然现在安卓手机的性能和存储越来越厉害了。本着能少一点是一点的态度,我们还是要深入理解下xamarin 生成的apk包里面有那些内容。
原文来自于:https://developer.xamarin.com/zh-cn/guides/android/advanced_topics/application_package_sizes/
本文研究了Xamarin.Android应用程序包和相关策略,可用于在调试和发布阶段进行高效的包部署。
概述
Xamarin.Android 使用了多种机制来最小化apk包,同时保证高效率的调试和发布过程。在这篇文章中我们将讨论Xamarin.Android的调试和发布工作流程以及Xamarin.Android平台如何确保我们构建最小化的apk包。
发布包
要承载一个完整的应用程序,一个apk包里面必须包含应用程序集,相关依赖库,资源内容,Mono运行时,以及一些依赖的基础类库(BCL)。比如说,我们默认模板创建的一个“Hello World” 编译后的包就包含如下:
15.8 MB是一个比我们想要的大得多的尺寸。 造成这个问题的原因是基础类库,其中包括 mscorlib, System, 和Mono.Android,等提供运行应用程序所必须的组件。但是,它们也提供了很多你应用程序用不到的功能,因此最好排除掉这些组件。
当我们构建一个用于分发的应用程序时,我们执行一个名为Linking的过程,它检查应用程序并删除不直接使用的任何代码。这个过程类似于GC为堆分配内存提供的功能,但是不同的地方在于一个是作用于对象,一个是作用于链接代码。 例如,系统中有一个命名空间是用于发送和接收邮件的代码,但是你的应用程序并没有使用这个功能,那么这个部分的代码就是浪费空间。当我们在Hello World程序上运行链接后,我们的包现在看起来如下:
正如我们所看到的,这消除了大量不被使用的BCL。注意,最终的BCL大小取决于应用程序实际使用的内容。 例如,如果我们查看一个更重要的示例应用程序ApiDemo,我们可以看到BCL组件的大小增加了,因为ApiDemo使用的BCL比Hello World多得多:
如图所示,通常您的应用程序包和依赖项都会大于2.9MB。
调试包
对于调试构建包而言,处理的方式会有所不同。当重复部署APK到设备调试时,应用程序需要尽可能快,因此我们优化调试包以实现快速部署而不是控制包的大小。Android在复制和安装包方面相对较慢,所以我们希望包的大小尽可能小。正如我们前面讨论的,最小化包大小的一种方法是通过链接器。但是,链接很慢我们通常只想部署自上次部署以来已经更改的应用程序的部分。为了实现这个,我们分离了核心的Xamarin.Android组件。当我们第一次调试安卓设备的时候,我们会复制2个非常大的安装包名叫 Shared Runtime 和 Shared Platform。Shared Runtime 包含了 Mono Runtime 和BCL,Shared Platform 包含了Android API 级别的特定的程序集:
复制这2个核心的组件只需要完成一次,因为它需要非常长的时间,但是允许后续应用程序在调试模式下运行使用。最后我们实际复制的应用程序是小而快的:
快速部署
Fast Assembly Deployment (快速部署)编译选项将进一步减少调试中安装包大小,不包括程序包中的应用程序集 。安装包只会在安卓设备中安装一次,并且只复制上次部署以来修改过的文件。
开启 Fast Assembly Deployment(快速部署), 操作如下:
-
鼠标右键点击你解决方案里下的安卓项目选择属性
-
从属性对话框中选择Android 选项 :
-
勾选使用共享运行时(Use shared Mono runtime checkbox )同时勾选 Fast assembly deployment(使用快速部署) :
-
点击上方的保存即可
下次为调试构建应用程序时,程序集将直接安装在设备上(如果还没有安装的话)和一个较小的应用程序包(不包括程序集)将安装在设备上。这将缩短更改应用程序和运行测试所需的时间。通过首次较长时间部署共享运行时和共享平台,这样每次我们对应用程序进行更改时,我们就可以快速轻松地部署新版本,我们就可以有一个快速的变更/部署/运行周期。
总结
本文只讨论了关于包的一些基本处理逻辑。关于签名与发布在下一篇文章中进行介绍。