如何减小包装尺寸
Posted
技术标签:
【中文标题】如何减小包装尺寸【英文标题】:How to reduce the package size 【发布时间】:2013-12-13 14:56:49 【问题描述】:我已经使用 Xamarin 实现了一个 android 应用程序:
.apk 的大小为 13.6MB,其中:
配置:发布 链接:仅限 SDK 程序集 支持的架构:armeabi、armeabi-v7a以下是从已编译的 .apk 中获取的主要组件的大小概览:
(这些是未压缩大小,我将 .apk 解压缩到一个目录并在 Windows Explorer 中查看文件):
classes.dex (1.23 KB) 两个 libmonodroid.iso (armeabi + armeabi-v7a) (5.58 MB) 所有 Mono.xxx.dll (3.89 MB) mscorlib.dll (1.51 MB)所有 System.xxx.dll (2.56 MB)
我的应用程序集(Droid 应用 + 一个 PCL)(204 KB)
MvvmCross + 插件 (599 KB) Xamarin ActionbarSherlock (348 KB) ZXing.monoandroid (413 KB) PCL Newtonsoft.Json (398 KB)PCL Microsoft HTTP 客户端库 (System.Net.Http.dll) (110KB)
'res' 文件夹(大小:451KB 磁盘大小:816KB) - 因为有些文件是 1KB,所以会产生碎片,所以 实际大小 vs 磁盘大小明显不同
所有 PNG 文件(大小:325KB 磁盘大小:496KB 磁盘)我可以做些什么来减少编译后的 .apk 的大小?
我觉得它很大。
【问题讨论】:
您是否在 .apk 中包含任何图标或闪屏? 其中一些库对于 Android 的库(如 Newtonsoft.Json 和 System.Net.Http)是多余的。 @joostmakaay 好问题;我更新了我的列表 @CoreyOgburn 好点,但我使用的是 PCL 版本的库,它们由我的 PCL 程序集引用;我更新了我的清单。 13MB 是普通 Xamarin.Android 应用程序的平均大小。我从来没有设法在 Android 上低于 8MB。在 ios 上,我设法获得了 4 MB。 【参考方案1】:使用链接:Sdk + 用户程序集,并经历用 Preserve 属性标记类的困难过程(请参阅http://docs.xamarin.com/guides/ios/advanced_topics/linker/)。当您的应用在 android 日志中崩溃时,您可以检查缺少哪个类。它应该只是通过反射或使用 IoC 动态使用的类。
您还可以创建 2 个单独的包,一个仅使用 armeabi(适用于非常旧的设备),一个使用 armeabiv7a,一个使用 x86(目前您的应用只会在 x86 android 设备上崩溃)。 Google play 支持拥有 3 个具有不同功能的独立包(不要忘记在清单文件中为每个包更改功能)
【讨论】:
很棒的答案。我已经知道这些选项。第二个选项看起来很简单而且非常可行。第一个但是我不认为这很容易。想象一个非常具体的类,它只在应用程序的特定时刻和场景中使用。需要彻底测试并针对应用程序中完成的每个新功能或修改重复测试。在将您的评论标记为答案之前,我会再等一会儿。再次感谢 我想知道为什么在使用 Sdk + 用户程序集时,链接器无法自己知道正在使用的类。如果太多了 它知道正在使用的类,但不知道动态加载或通过反射实例化的类。它不知道通过反射调用的方法。您的应用程序中应该没有太多内容。但可以肯定的是,这是一个艰难的过程。 是的,动态加载的代码可能有点超出链接器的范围,但也许 Xamarin 或其他人编写了一个工具?我想这意味着能够解析 IL 以捕获动态加载。我自己可能不会做太多的动态加载,但我正在使用的库可能是。 如果您使用 mvvmcross 或 IoC,那么是的,您使用动态加载。动态程序的完整静态分析仅适用于 F# 等函数式语言或任何基于 lambda 的程序。请参阅en.wikipedia.org/wiki/Lambda_calculus 了解更多信息。以上是关于如何减小包装尺寸的主要内容,如果未能解决你的问题,请参考以下文章