6.关于Xamarin Android对APK包大小的处理
降低学习成本是每个.NET传教士义务与责任。
建立生态,保护生态,见者有份。
对于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(使用快速部署) :

点击上方的保存即可
下次为调试构建应用程序时,程序集将直接安装在设备上(如果还没有安装的话)和一个较小的应用程序包(不包括程序集)将安装在设备上。这将缩短更改应用程序和运行测试所需的时间。通过首次较长时间部署共享运行时和共享平台,这样每次我们对应用程序进行更改时,我们就可以快速轻松地部署新版本,我们就可以有一个快速的变更/部署/运行周期。
总结
本文只讨论了关于包的一些基本处理逻辑。关于签名与发布在下一篇文章中进行介绍。
打包相关http://www.cnblogs.com/jasondun/p/8365637.html
进一步减小安装包 http://www.cnblogs.com/jasondun/p/8365983.html
6.关于Xamarin Android对APK包大小的处理的更多相关文章
- Android获取APK包名的几种方法
Android获取APK包名的几种方法:1.adb shell pm list package -f | findstr 关键字 #只能获取到包名,主Activity名无法获取到 2.使用aapt-- ...
- Android 演示 DownloadManager——Android 下载 apk 包并安装
本文内容 环境 项目结构 演示下载 参考资料 本文是 github 上 Trinea-Android-common 和 Trinea-Android-Demo 项目的一部分,将下载部分分离出来,看看如 ...
- 反编译Android的apk包得到源码(使用工具:dex2jar和jd-gui)
1. 先从 http://download.csdn.net/detail/dingyuming1991/9618125 下载反编译工具dex2jar和jd-gui(当然也可以google搜索下载): ...
- Android如何缩减APK包大小
代码 保持良好的编程习惯,不要重复或者不用的代码,谨慎添加libs,移除使用不到的libs. 使用proguard混淆代码,它会对不用的代码做优化,并且混淆后也能够减少安装包的大小. native c ...
- 减少apk包大小的一种思路
现在apk大小主要是决定于两个:一个是图片一个是.SO文件(这个尽量用release包),而对于图片,既要越小,又要保持质量. 之前是PNG --> JPG, 现在直接是PNG ---> ...
- android生成apk包出现Unable to add "XXX" Zip add failed问题
最近试图整合umeng至cocos2d-x围棋项目,一切好工作,准备生成apk当出现了大量的数据包 [2014-06-03 20:02:52 - MyApp] Unable to add 'G:\co ...
- 简单的Android之apk包反编译方法
网上相关的文章一大堆了,我只是总结下自己的反编译方法和工具 工具下载地址: http://download.csdn.net/detail/zsjangel/7104663 下载上面的三个工具的压缩包 ...
- 缩减APK包大小
1)开启minifyEnabled 开启混淆,删除没用的java文件 2)开启shrinkResources 去除无用资源 3)resConfigs "zh" 删除无用的语言资源 ...
- Xamarin.Android 关于so包报错问题
问题描述:使用so包时报错. 解决方法: 1.保证 libs > armeabi 和 armeabi-v7a 中的so包一致. 2.去掉 x86,x86_64,arm64-v8a. 3. so的 ...
随机推荐
- 2018.09.26洛谷P3957 跳房子(二分+单调队列优化dp)
传送门 表示去年考普及组的时候失了智,现在看来并不是很难啊. 直接二分答案然后单调队列优化dp检验就行了. 注意入队和出队的条件. 代码: #include<bits/stdc++.h> ...
- 20155218 2016-2017-2 《Java程序设计》第8周学习总结
20155218 2016-2017-2 <Java程序设计>第8周学习总结 教材学习内容总结 java.util.logging包提供了日志功能相关类与接口,不必额外配置日志组件,就可以 ...
- Python 运行 Python hello.py 出错,提示: File "<stdin>" , line 1
写了一个hello.py,仅有一句,print 'hello world', 运行 Python hello.py 出错,提示: File "<stdin>" , li ...
- PAT甲 1008. Elevator (20) 2016-09-09 23:00 22人阅读 评论(0) 收藏
1008. Elevator (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue The highest ...
- Android 广播代码的发送与接收
Android四大组件之一广播,使用的也比较多,广播可大致分为两种,一种是Android系统区域的广播,是由系统指令发出,例如:点亮屏幕广播,开机过程中的一些广播 省略-, 然而还有一种广播就是我们自 ...
- Mac突然没有声音但是重启后可以恢复
命令行操作方式 今天又发现了Mac上的一个BUG,有时候在工作之余我们去吃饭的时候Mac经常会进入睡眠状态,但是有的时候从睡眠状态激活后,本来想听个音乐,但是突然发现音乐不可以用了,以前每次都是重 ...
- Mongodb 与 SQL 语句对照表
In addition to the charts that follow, you might want to consider the Frequently Asked Questions sec ...
- INDEX--创建索引和删除索引时的SCH_M锁
最近有一个困惑,生产服务器上有一表索引建得乱七八糟,经过整理后需要新建几个索引,再删除几个索引,建立索引时使用联机(ONLINE=ON)创建,查看下服务器负载(磁盘和CPU压力均比较低的情况)后就选择 ...
- 使用JQuery插件Jcrop进行图片截取
Jcrop插件本身并不含有图片截取功能,它仅仅是在前端层面构建一套截取动画效果并产生4个坐标点,插件使用者将这4个坐标点传回至服务器接口上进行截取操作.其优点是具有较高的通用性.浏览器兼容性(IE6+ ...
- series dataframe 的 idxmax()
返回最大值的索引