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的 ...
随机推荐
- IntelliJ IDEA 2017版 spring-boot 报错Consider defining a bean of type 'xxx' in your configuration问题解决方案
问题分析: 通过问题的英文可知,这个错误是service的bean注入失败,那么为什么会产生这个问题呢? 主要是框架的Application产生的,所以我们建立项目的时候,要保证项目中的类跟Appli ...
- The class cn.itcast.web.common.util.UtilFuns specified in TLD for the function selffn:htmlNewline cannot be found: cn.itcast.web.common.util.UtilFuns
我的一个Util方法的包名更改了,运行时候报这个错误.找到tld文件,把包名重新改为我改的名字就好使了.
- faceswap requirements
tqdm psutil pathlib==1.0.1 scandir==1.7 opencv-python scikit-image scikit-learn matplotlib==2.2.2 ff ...
- PHP编译安装完成之后没有'php.ini'文件的处理方法
在我们编译安装PHP的时候,编译安装完成是不会自动生成php.ini文件的,所以需要我们手动生成. 1.通过命令行确定php.ini文件的位置 php -r "phpinfo();" ...
- Back to December -- Taylor Swift
Back to December 泰勒·斯威夫特(Taylor Swift),美国乡村音乐女创作歌手,会用木吉他.钢琴演奏. 曾获得美国乡村音 ...
- CS中窗体的基类(BaseForm)注意点
窗体基类最好新建一个窗体(BaseForm) 1.这样能够保证在VS中保证他的派生窗口也能够可视化. 2.如果基类直接是一个cs类文件,对于处理派生窗口就很复杂,比如按钮权限之类的操作; 如果直接继承 ...
- Python3------装饰器详解
装饰器 定义:本质是函数.(装饰其他函数)就是为其他函数添加附加功能 原则:1.不能修改被装饰的函数的源代码 2.不能修改被装饰的函数的调用方式 理解装饰器前提条件: 1.函数即"变量&qu ...
- C# npoi 从excel导入datagridviews 批量联网核查
DataSet ds = new DataSet(); OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Fil ...
- C#委托总结-匿名方法&Lambda表达式
1,匿名方法 匿名方法可以在声明委托变量时初始化表达式,语法如下 之前写过这么一段代码: delegate void MyDel(string value); class Program { void ...
- Hello World! 我的程序员入坑之旅!
先说下本文标题,各行各业都有自己的行规和一些内行人玩的梗什么的,这是我开始写技术博客的第一篇,所以它的标题毫无疑问只能是Hello World! 介绍一下我自己 我算是一个少见的科班出身的开发者了,1 ...