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.07.22 洛谷P1967 货车运输(kruskal重构树)
传送门 这道题以前只会树剖和最小生成树+倍增. 而现在学习了一个叫做kruskal" role="presentation" style="position: ...
- Eclipse出现An error has occurred,See error log for more details的错误
因为加入了Aptana组件所以一直报这个错误,用了cmd的方法依然不奏效,最后选择 Window > perferences > General > Startup and Shut ...
- 20155336 2016-2017-2《JAVA程序设计》第六周学习总结
20155336 2016-2017-2<JAVA程序设计>第六周学习总结 教材学习内容总结 第十章 串流(Stream): 数据有来源及目的地,衔接两者的是串流对象.如果要将数据从来源取 ...
- ZOJ2478 Encoding 2017-04-18 23:02 43人阅读 评论(0) 收藏
Encoding Time Limit: 2 Seconds Memory Limit: 65536 KB Given a string containing only 'A' - 'Z', ...
- C++主流编译器整理(编译器版本--供应商--C++11支持情况)
C++标准 年份 C++标准 俗称 备注 2011 ISO/IEC 14882:2011 C++11 第三个C++标准 2007 ISO/IEC TR ...
- 通过hbase实现日志的转存(MR AnalyserLogDataRunner和AnalyserLogDataMapper)
操作代码(提前启动集群(start-all.sh).zookeeper(zkServer.sh start).启动历史任务服务器(mr-jobhistory-daemon.sh start histo ...
- C++ sort()函数的用法
C++sort()函数的用法 C++sort()函数的用法 近来看了c++标准库这本书,学到了很多,就把这其中的一点C++sort()函数的用法写下来和大家分享吧! (一)为什么要用c++标准库里的排 ...
- shell 脚本 删除文件内容为空的文件
#!/bin/bask # cd /tmp for a in * ;do if [ ! -s $a ] ;then #[ ! -s $a ] 文件为空返回为真 rm -rf $a fi done 测试 ...
- 105032014138_牟平_z作业1
2)NextDate函数问题 NextDate函数说明一种复杂的关系,即输入变量之间逻辑关系的复杂性 NextDate函数包含三个变量month.day和year,函数的输出为输入日期后一天的日期. ...
- opencv学习_4(opencv基础数据结构 CvPoint & CvSize & CvRect & CvScalar & CvArr & CvMat)
1:包含在cxcore/include/cxtypes.h头文件中. 2:CvPoint系列 -----(x,y) CvPoint:表示图像中的点 CvPoint2D32f:二维空间中的点 CvP ...