6.关于Xamarin Android对APK包大小的处理

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 RuntimeShared Platform。Shared Runtime 包含了 Mono Runtime 和BCL,Shared Platform 包含了Android API 级别的特定的程序集:

复制这2个核心的组件只需要完成一次,因为它需要非常长的时间,但是允许后续应用程序在调试模式下运行使用。最后我们实际复制的应用程序是小而快的:

快速部署

Fast Assembly Deployment (快速部署)编译选项将进一步减少调试中安装包大小,不包括程序包中的应用程序集 。安装包只会在安卓设备中安装一次,并且只复制上次部署以来修改过的文件。

开启 Fast Assembly Deployment(快速部署), 操作如下:

  1. 鼠标右键点击你解决方案里下的安卓项目选择属性
  2. 从属性对话框中选择Android 选项 :

  3. 勾选使用共享运行时(Use shared Mono runtime checkbox )同时勾选 Fast assembly deployment(使用快速部署) :

  4. 点击上方的保存即可

下次为调试构建应用程序时,程序集将直接安装在设备上(如果还没有安装的话)和一个较小的应用程序包(不包括程序集)将安装在设备上。这将缩短更改应用程序和运行测试所需的时间。通过首次较长时间部署共享运行时和共享平台,这样每次我们对应用程序进行更改时,我们就可以快速轻松地部署新版本,我们就可以有一个快速的变更/部署/运行周期。

总结

本文只讨论了关于包的一些基本处理逻辑。关于签名与发布在下一篇文章中进行介绍。

原文地址:https://www.cnblogs.com/jasondun/p/8360066.html

时间: 2024-08-25 11:44:22

6.关于Xamarin Android对APK包大小的处理的相关文章

Android获取APK包名的几种方法

Android获取APK包名的几种方法:1.adb shell pm list package -f | findstr 关键字 #只能获取到包名,主Activity名无法获取到 2.使用aapt--aapt是sdk自带的一个工具,在sdk\builds-tools\目录下 运行后的结果中以下两行分别是应用包名package和入口activity名称 package: name=’com.estrongs.android.pop’ launchable-activity: name=’com.e

Xamarin.Android 打包Apk

由于大部分内容来自Xamarin的官网,因此这篇文章定义为翻译,原文地址: http://developer.xamarin.com/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/ 转载请注明出处:http://blog.csdn.net/supluo/article/details/43950105 个

手动打Android Wear Apk包

如果使用Google官方推荐的集成开发IDE Android Studio开发,会自动生成两个工程,一个是手机端的,一个是手表端的. 但是如果用Eclipse环境,如果要将手表的apk打到手机apk中,需要注意以下几点: 1.在wearable app中声明的permission在mobile app中也要加上: 2.确保wearable app和mobile app有同样的包名和版本号: 3.将签名的wearable app放到mobile app工程的res/raw目录下,假设wearabl

【转载】android中APK包的安装以及adb命令的使用

apk包安装步骤: 1,首先将../android-sdk/platform/tools添加都path路径下 2,在控制台窗口中进入到你apk包所在的目录中 3,输入:abd unremount,第一次使用该命令的时候需要获取该命令的操作权限 4,打开android的模拟器 5,在控制台中执行:adb install 包名.apk 6,如果显示success,那么久安装apk包成功,显示Failure,则安装失败. 7,检查错误,排错,再执行如下命令:abd install -r 包名.apk

反编译Android的apk包得到源码(使用工具:dex2jar和jd-gui)

1. 先从 http://download.csdn.net/detail/dingyuming1991/9618125 下载反编译工具dex2jar和jd-gui(当然也可以google搜索下载): 2. 将要反编译的apk包改扩展名为zip(apk包实则为zip压缩包),解压zip文件: 3. 在解压出来的文件夹中会有个classes.dex文件(程序的二进制文件),在下载dex2jar和jd-gui中找到dex2jar程序,在cmd窗 口中运行  dex2jar classes.dex ,

android生成apk包出现Unable to add "XXX" Zip add failed问题

最近试图整合umeng至cocos2d-x围棋项目,一切好工作,准备生成apk当出现了大量的数据包 [2014-06-03 20:02:52 - MyApp] Unable to add 'G:\cocos2d-x-2.2.3\projects\MyApp\proj.android\assets\crystal_guardian\background.jpg': Zip add failed [2014-06-03 20:02:52 - MyApp] ERROR: unable to proce

android通过apk包得到apk包信息

//安装包路径 String weicharFilePath="sdcard/weichar.apk"; PackageManager pm = getPackageManager(); PackageInfo info = pm.getPackageArchiveInfo(weicharFilePath, PackageManager.GET_ACTIVITIES); if(info != null){ ApplicationInfo appInfo = info.applicati

如何使用Ant脚本编译出Jar和Apk包

一.前言 今天我们来看一个非常出名的工具ant,我们知道AndroidStudio中已经集成了gradle了,那么ant已经没有往日的辉煌了,但是他并没有被淘汰,因为在web项目中打出war包的时候也是可以用到的,虽然maven也很火,其实我开始工作已经快三年了,但是真心的还没用过ant脚本,因为在第一年的时候,我没有实际的出过release包,后面又开始用gradle了,所以直接略过了ant脚本了,但是今天因为有一个需求,就是想自动化的打出一个jar包,所以就想到了ant脚本,正好也算是学习了

Android 系统安装 apk 时解压 so 的逻辑问题

0X0 前言 在 Android 系统中,当我们安装apk文件的时候,lib 目录下的 so 文件会被解压到 app 的原生库目录,一般来说是放到 /data/data/<package-name>/lib 目录下,而根据系统和CPU架构的不同,其拷贝策略也是不一样的,在我们测试过程中发现不正确地配置了 so 文件,比如某些 app 使用第三方的 so 时,只配置了其中某一种 CPU 架构的 so,可能会造成 app 在某些机型上的适配问题.所以这篇文章主要介绍一下在不同版本的 Android