适用于iOS和Android的Xamarin SDK为构建Xamarin.Forms跨平台应用程序提供了非常强大的基础。 当您努力调整Xamarin.Forms应用程序的速度和响应速度时,请记住,改善使用Xamarin SDK for iOS和Android构建的应用程序体验的相同原则也将改善与Xamarin.Forms跨平台的应用程序。 形式 - 这种经验从启动开始。

当你说启动...

我将首先将启动定义为从用户点击您的应用程序图标到第一个可用屏幕显示准备就绪的所有事情。 当您将一个空白的Xamarin.Android应用程序与一个空白的Xamarin.Forms应用程序进行比较时,您会注意到Xamarin.Android应用程序加载更快。 这是怎么回事?

Xamarin.Forms不仅提供了在目标之间共享UI的功能,而且通用的应用功能(如深层链接的AppLinksNavigationMessagingCenterDependencyService)以及跨平台UI警报,操作工具栏,工具栏, 状态栏等。当您开始向Xamarin.Android应用程序添加可比较的实现时,您将开始看到性能差异消失。 这开始解释发生了什么,那么您可以控制什么来影响启动? 以下是我的五大技巧,以调整iOS,Android和UWP目标的启动体验。

1. 首先加载本地内容

一旦我们的应用程序启动,我们经常要加载新的数据,但这只会减慢第一个屏幕的出现和填充。 如果你从前一个运行状态,那么使用它,或者有准备好的内容,这是第一次运行。

如果您的应用程序已经离线准备就绪,我们建议您这样做,那么您将立即为第一个屏幕填充内容。 Azure移动应用程序和Azure的领域是很好的选择。

当您必须访问网站,您的第一次运行的内容,提供一些UI告诉用户您正在做什么使用加载指示器。 这也是一个完美的机会,用有用的占位符内容来替换屏幕的空白部分,以增强屏幕的存在原因,用户可以从应用程序中获得什么,或者只是一些有趣的东西! 无论你在这里选择什么,只是不要把屏幕留空。

有效载荷提示 最小化您的网页有效载荷,只需要你所需要的。 不要花费时间来处理诸如解析字符串等昂贵的流程,而是在需要显示数据的同时提供数据。

2. 优化您的资产

图像和视频很重,可以显着减慢屏幕的初始渲染速度。 减少对重物资的依赖,并优化您所需尺寸的任何媒体。 不要依靠操作系统为您调整资产的大小。

对于Android目标屏幕,资产将放置在表示密度的文件夹中。

  • ldpi (low) ~120dpi
  • mdpi (medium) ~160dpi
  • hdpi (high) ~240dpi
  • xhdpi (extra-high) ~320dpi
  • xxhdpi (extra-extra-high) ~480dpi
  • xxxhdpi (extra-extra-extra-high) ~640dpi

还有一个特殊的密度的nodpi,告诉Android不管屏幕密度如何扩展资源。

当您将大图像放在ldpi文件夹中,并在xxhdpi的屏幕上使用该资产时,Android会将其缩放。 这很慢,会使您的运行时内存消耗膨胀,有时甚至会导致您的应用程序崩溃; 我做到了

为了管理许多密度和许多资产,使用和/或等应用程序从单个设计源生成多个尺寸是非常有益的。

Xamarin.Android 7.0最近添加了一个实验性选项来预先压缩名为AndroidExplicitCrunch的PNG文件。 这进一步减少了您的资产(和应用程序)的大小,加快了构建时间,并确保对运行时进行了优化。 要启用此功能,请编辑您的Android csproj的文本,并修改您的构建配置的PropertyGroup:

点击(此处)折叠或打开

  1. <PropertyGroup>
  2.     ...
  3.     <AndroidExplicitCrunch>true</AndroidExplicitCrunch>
  4. </PropertyGroup>


3. 延迟加载任何你不需要立即需要的资源

App.xaml资源是放置您将在整个应用程序中使用的样式,字体和其他资源的便利位置,但它也在启动时加载。 如果您尝试从启动时间清除每个不必要的毫秒数,请删除您不需要的任何东西,并通过页面或其他方法轻松加载。

4. 启用XAML汇编

XAML是一种流行且功能强大的方式来声明用户界面。 如果您选择停留在C#并在其中构建UI,那么自然会编译其余的代码,从而为您编译时间检查和速度。 当您希望在使用XAML时获得同样的优势,您可以启用XAML编译(XAMLC)。 这将将您的XAML编译成中级语言(IL),并将其添加到编译的程序集中,从而实现更快的启动和运行时性能。 我们来看看如何启用:

在应用程序级别,您可以声明您的XAMLC选项,并会影响整个应用程序。

点击(此处)折叠或打开

  1. using Xamarin.Forms.Xaml;
  2. ...
  3. [assembly: XamlCompilation (XamlCompilationOptions.Compile)]
  4. namespace PhotoApp
  5. {
  6.     ...
  7. }


当你想在类级别设置XAMLC选项时,可以!

点击(此处)折叠或打开

  1. using Xamarin.Forms.Xaml;
  2. ...
  3. [XamlCompilation (XamlCompilationOptions.Compile)]
  4. public class HomePage : ContentPage
  5. {
  6.     ...
  7. }


当XAMLC启用时,您将获得大多数所有属性的编译时XAML检查,并且UI将呈现更快的速度。 文件大小可能保持不变或稍微增加,因为您在汇编中为IL交易.xaml文件大小。

5. 减少装配数量

像往常一样,便利性成本高昂。 这可能是一个非常小的成本,但是当调整性能时,你不想放弃任何石头。 虽然NuGet软件包非常适合利用其他库,但实际情况是,移动应用程序所依赖的(或更大)的程序集随着呼叫通过边界自然会减慢执行速度。Xamarin.Forms例如检查所有程序集的[ExportRenderer]`属性,并且目前没有选择或选择退出的方法。 这是我们正在努力改进的。

衡量每个依赖关系的优缺点,并在可能的情况下将该代码带入您的主要应用程序。 你的里程可能有所不同,所以看看吧。 这是经常被忽视的表现考虑,可能会为您带来红利。

奖金1:时间编译(AOT)

我打电话给这个奖金,因为我们仍然将AOT分类为Android的实验,并不适用于所有人。 当然,iOS默认使用AOT和LLVM编译器,所以没有什么可做的。

启用实验Android AOT,通过减少一些即时编译开销,即可立即改进启动和整体速度。 支付的价格是APK的大小增加,所以您应该尝试这一点,并权衡您的应用程序的利弊。 要启用AOT,请打开项目配置并选中该框。


注意:AOT可用于Xamarin Android 5.1和7.0+

奖金2:构建时间改进

虽然不是直接适用于启动改进,我们的一个令人敬畏的移动解决方案架构师分享了他的构建优化配置的集合。 在上查看。

下一步做什么

这些只是我最喜欢的几个提示,它们可以应用于应用程序的所有屏幕,而不仅仅是启动屏幕。 我可以继续关于平坦化的布局,优化布局周期的测量等等。 我们的Xamarin.Forms性能指南涵盖了大部分内容和更多内容。

社区和Xamarin.Forms工程团队一直在Xamarin论坛上交易技巧并讨论痛点和可能的解决方案。 请加入该对话以分享您的发现,并继续探索,以改进Xamarin.Forms中所有平台的启动和运行时性能。