Xamarin - apk应用程序大小

时间:2017-03-31 02:18:59

标签: xamarin xamarin.android xamarin.forms

所以,在使用Xamarin.Forms开发应用程序的所有艰苦工作之后,当我今天尝试创建发布版本时,我惊讶地发现应用程序大小约为25MB - ~31MB(仅限SDK链接后,ProGuard) ,为每个abi创建apk)。我的资源文件夹仅以KB为单位。在调试模式下,apk实际上只有5MB,很高兴看到它。我后来意识到这是因为选项"使用共享运行时"我们不应该在发布模式中使用它。

然后我尝试创建一个空白的Xamarin.Android应用程序,但发布版本使用Linking SDK&用户组件,ProGuard,APK每个abi仍然是~8MB到~13MB。

根据以下链接,Hello World应用程序的最小大小为2.9MB,但我无法创建此类大小。 https://developer.xamarin.com/guides/android/advanced_topics/application_package_sizes/

对于我的应用程序和我创建的空白应用程序,必要的dll似乎很高(例如mscorlib.dll是2.2mb等,链接后链接说它将变为1 mb)这就是我所看到的解压apk后的程序集文件夹 enter image description here

在最近的一次微软科技大会上,我碰巧知道" 9新闻" app(链接如下)是使用xamarin构建的,创作者出现在舞台上。但是我对它的应用程序大小感到惊讶。它只有5.85 MB。我不确定如何实现这一目标?

任何人都可以帮助我吗?

https://play.google.com/store/apps/details?id=nineNewsAlerts.nine.com

我也很想知道微软是否会采取措施来改善应用包的尺寸?或者,如果他们将.NET核心带到xamarin,这会得到解决吗?

3 个答案:

答案 0 :(得分:11)

Xamarin Android APK文件的大小比平常大,因为它们包含Xamarin库,可将C#代码转换为Java代码,在Android OS中运行。

使用以下选项,您可以减小APK尺寸:

  • 配置有效(发布)
  • 平台有效(任何CPU)。这些是为Google Play商店制作APK所必需的。
  • 使用共享运行时 false 。如果将其设置为true,则APK将使用Mono Runtime执行。通过USB调试时会自动安装Mono Runtime,但不会在Release APK中安装。如果设备中未安装Mono Runtime且此版本在发布APK中设置为true,则应用程序将崩溃。
  • 为每个选定的ABI生成一个包(.apk) false 。出于兼容性原因,尽可能多地为平台创建APK。
  • 启用Multi-Dex true ,但如果您的应用不是很复杂(即,少于65536个变量或方法,则可以将其设置为false) see here)。
  • 为发布APK启用开发人员工具(调试和分析) false
  • 关联 SDK和用户程序集。这将使Xamarin编译器从SDK和您的代码中删除所有未使用的类,从而减小APK大小。
  • 支持的体系结构全选,出于兼容性原因。

这是一个打印屏幕示例:

enter image description here

答案 1 :(得分:1)

这是我在Google Play控制台中Xamarin.Forms应用大小的统计信息。您会发现,一旦我认真对待该主题并离开了默认的Xamarin设置,它就会下降多少:

enter image description here

除了谷歌搜索主题时通常发现的措施(链接,关注自己的资源,每个ABI的APK等)之外,还有一些我自己的发现和怪癖:

  • 启用〜1MB的托管TLS提供程序-默认情况下,您在 Project Options-> Android Options-> Advanced button-> SSL / TLS Implementation中选择了“ Native TLS 1.2”选项下拉菜单。托管TLS仅是1.1版,可能是某人的问题
  • 升级到Xamarin.Forms 4.1 减少了约1MB(与3.x和4.0相比)-他们删除了一些未使用但尚未引用的Android兼容性库
  • 启用aapt2 打包程序仅会使App Compat libs资源(Xamarin.Forms引用和包含的资源)减少约1MB。如果您拥有许多自己的资源,可能会付出更多。您可以使用aapt2在Android的.csproj文件中使用以下额外的参数来进一步精简资源:

    <PropertyGroup>
       <AndroidUseAapt2>true</AndroidUseAapt2>
       <AndroidAapt2LinkExtraArgs>--no-version-vectors -c en-rUS</AndroidAapt2LinkExtraArgs>
    </PropertyGroup>
    
  • 打开D8和R8 会为小型Xamarin.Forms应用(项目选项-> Android选项或.csproj)提供另外的〜1MB

    >
    <PropertyGroup>
        <AndroidDexTool>d8</AndroidDexTool>
        <AndroidLinkTool>r8</AndroidLinkTool>
    </PropertyGroup>
    
  • SkiaSharp 1.60.3 与较新版本(例如1.68.0)相比,每个体系结构可节省约2MB的内存。值得一提的是,依赖项及其版本会使您的APK膨胀。

  • 禁用AoT (如果您之前启用了AoT,则默认情况下处于禁用状态)可以轻松地将您的应用程序尺寸缩小一半。提前启用复杂性可能是提高应用程序启动性能的有意步骤。有一个明显的权衡取舍,要么您使用AoT并拥有庞大的应用程序大小,要么没有它,并通过缓慢的应用程序启动将大小保持最小。决定权衡时要考虑的要点之一...大多数ASO文章(以及Google Play控制台)都提到减小应用程序尺寸以增加安装转换的重要性。显然,在浏览Google Play时,显示的是应用下载大小,而不是应用开始时间。

  • 调整AoT 以最小化其占用空间,请在.csproj中为您的Release配置添加以下内容:

    <PropertyGroup>
        <AotAssemblies>true</AotAssemblies>
        <AndroidAotAdditionalArguments>no-write-symbols,nodebug</AndroidAotAdditionalArguments>
    </PropertyGroup>
    
  • 执行部分AoT 。默认情况下,AoT会遍历该项目解析的所有程序集,并在APK的/ lib目录中添加30多个.so文件。有许多应用程序兼容库,BCL和系统库。为了找到性能与应用程序大小之间的最佳结合点,人们可能希望控制要通过AoT放置的程序集以及要忽略的组件。嗯,没有这样的东西可以作为标准功能(至少我没有找到)。您可以通过更改 Xamarin.Android.Common.targets 来处理Xamarin的构建过程-您可以在here的过程中找到一些见解。通过AoT仅使用三个库(我自己的XF共享UI库和两个XF库),我发现了我的中庸之道:

      

    <_ ResolvedUserAssemblies2   Include =“ Tmp / android / assets / Xamarin.Forms.Core.dll; Tmp / android / assets / Saplin.CPDT.UICore.dll; Tmp / android / assets / Xamarin.Forms.Platform.Android.dll;”   />

P.S .:启用链接(SDK和用户程序集)-如果您广泛使用XAML和绑定,则有90%的机会发现应用程序损坏。将自己的库添加到链接器异常-XF类库,用于承载UI,您创建的任何类库以及可能使用反射的类库。

PPS:通过我的压缩工作,部分AoT和使用异步/延迟的Xamarin.Forms UI加载(herehere)付款,我的应用程序尺寸显着减小(参见上图)应用程序启动时间显着改善(通过ADB在诺基亚N1上测得):

  • 没有AOT,同步UI(ms):3613、3586、3576
  • 部分AOT,异步UI(毫秒):2202、2255、2258

答案 2 :(得分:-1)

我在您创建移动应用时了解您的问题,您一直想创建小尺寸的apk文件,用户可以轻松下载和使用。 为此尝试减少项目中的代码重复并减少所有图像大小。 使用以下步骤,它将帮助您减少您的apk大小。 右键单击机器人属性。 打开Android选项 - &gt; 单击包装然后检查每个选定的ABI生成一个包(.apk)。 检查Multi-Dex和proguard选项。 现在转到链接器选项,选择仅在链接下拉列表下的SDK程序集。 现在转到Advance选项卡 - 选中Supported architecture下的所有选项。 保存所有设置并保持项目处于发布模式清理并构建项目,然后您可以创建缩小的apk文件大小。 使用以下链接获取更多信息。

http://motzcod.es/post/112072508362/how-to-keep-your-android-app-size-down