xamarin app

时间:2017-09-11 19:59:25

标签: xamarin xamarin.forms xamarin.android cross-platform app-startup

我们正在PCL上开发一个跨平台的应用程序,但目前我们只使用Android设备进行测试。
我们担心的是它需要大约6到8秒(取决于我们测试它的设备)来启动应用程序,这非常慢。
在放置几个断点之后,我们看到时间消耗非常均匀 我们注意到这个特定的部分需要更长的时间:

  • 在MainActivity上达到onCreate()之前1s(那里有一个启动画面,之前只有一个图像和一个背景颜色)
  • {li> 1s on base.OnCreate(bundle); {li> 1s on global::Xamarin.Forms.Forms.Init(this, bundle);
  • Page mainPage = new LogScreen();上的1.5s(创建主页面,然后将其设置为主导航页面)。

4 个答案:

答案 0 :(得分:4)

这是使用Xamarin.Forms时常见的问题,有很多与此相关的线程特别是这个:

https://forums.xamarin.com/discussion/93178/lets-talk-performance/p6

好消息是Xamarin团队正在研究它。

以下是一些可以改进的提示:

https://blog.xamarin.com/5-ways-boost-xamarin-forms-app-startup-time/

答案 1 :(得分:4)

我建议的第一件事是不对应用程序的调试版本进行基准测试,Mono运行时和Jit'd代码的代码路径与发布版本,共享运行时的使用,程序集大小等不同等等都将影响启动和执行时间。

以下是使用内部基准测试程序(有条件编译,未注入,并使用操作系统的系统)在高端和低端设备上“非常大”积极调整的基于Android Forms的应用程序启动时间的示例时钟)。

应用程序概述:

  • Xamarin.Forms v2.4.0.269-pre2
  • 基于编码和基于XAML的页面,控件等的混合......
  • 启用XAML编译器
  • 禁用“启动画面”
    • MainActivity上基于主题的启动会添加:
      • 在快速设备上启动时间超过200毫秒,
      • 在具有慢速闪存访问权限的设备上1-2秒
    • 只是不要使用基于活动的初始屏幕; - )
  • 多dex'd
  • Proguard(通过自动反馈循环的UI测试积极减少罐子)
  • 链接器(全部链接,使用通过自动反馈的UI测试生成的自定义链接描述文件,大幅减少装配尺寸)
  • 100%源代码构建,允许折叠命名空间和减少程序集
  • Viper架构没有第三方DI / IoC
  • 使用数据,资源广告网络优先级队列的延迟加载设计
  • 用于所有数据的Realm实时对象和查询(DB最小尺寸:250MB,最大尺寸1.2GB)

通过重新启动设备的shell脚本生成时间,监视启动以等待系统结算,启动一系列应用程序(GApps,Facebook,Instagram,Twitter等等),等待系统解决,然后通过以下方式启动Forms应用程序:

export deviceTime=$(echo "$(adb -s $deviceID shell cat /proc/uptime | awk '{print $1}') * 1000" | bc -l)
adb -s $deviceID shell am start -n com.sushihangover.GeneticCancerDNAMapper/com.sushihangover.GeneticCancerDNAMapper.DevOpsDashboard --el startTime ${deviceTime%.*}

Google Pixel(基于Oreo的)设备(应用程序可在约430毫秒内使用):

I GeneticCancerDNAMapper: 0.162 : Xamarin.Forms.Platform.Android.FormsAppCompatActivity.OnCreate
I GeneticCancerDNAMapper: 0.164 : Xamarin.Forms.Platform.Android.FormsAppCompatActivity.base.SetTheme
I GeneticCancerDNAMapper: 0.201 : Xamarin.Forms.Platform.Android.FormsAppCompatActivity.base.OnCreate
I GeneticCancerDNAMapper: 0.244 : Xamarin.Forms.Forms.Init
I GeneticCancerDNAMapper: 0.266 : Realms.Realm.GetInstanceAsync ~Get Instance & Data~
I GeneticCancerDNAMapper: 0.324 : Realms.Realm.GetInstanceAsync ~Obtained Instance & Data~
I GeneticCancerDNAMapper: 0.324 : Xamarin.Forms.Application Content
I GeneticCancerDNAMapper: 0.349 : Xamarin.Forms.Application Content ~Creation Completed~
I GeneticCancerDNAMapper: 0.353 : Xamarin.Forms.Application.MainPage ~Displayed~
I GeneticCancerDNAMapper: 0.43 : Xamarin.Forms.Platform.Android.FormsAppCompatActivity.LoadApplication

低端“Android One”512MB设备w / 非常慢 闪存(应用程序可在~4.5s内使用):

回复:https://en.wikipedia.org/wiki/Android_One

I/GeneticCancerDNAMapper(10904): 2.453 : Xamarin.Forms.Platform.Android.FormsAppCompatActivity.OnCreate
I/GeneticCancerDNAMapper(10904): 2.467 : Xamarin.Forms.Platform.Android.FormsAppCompatActivity.base.SetTheme
I/GeneticCancerDNAMapper(10904): 2.731 : Xamarin.Forms.Platform.Android.FormsAppCompatActivity.base.OnCreate
I/GeneticCancerDNAMapper(10904): 3.016 : Xamarin.Forms.Forms.Init
I/GeneticCancerDNAMapper(10904): 3.166 : Realms.Realm.GetInstanceAsync ~Get Instance & Data~
I/GeneticCancerDNAMapper(10904): 3.571 : Realms.Realm.GetInstanceAsync ~Obtained Instance & Data~
I/GeneticCancerDNAMapper(10904): 3.571 : Xamarin.Forms.Application Content
I/GeneticCancerDNAMapper(10904): 3.772 : Xamarin.Forms.Application Content ~Creation Completed~
I/GeneticCancerDNAMapper(10904): 3.799 : Xamarin.Forms.Application.MainPage ~Displayed~
I/GeneticCancerDNAMapper(10904): 4.457 : Xamarin.Forms.Platform.Android.FormsAppCompatActivity.LoadApplication

答案 2 :(得分:1)

我将为此找到的所有解决方案汇总在一起,因此全部集中在一个地方。

其中一个答案链接了 this 帖子,非常有用

除了我们还做了以下事情:

  • 在所有项目的属性中选中“ 优化代码”框。不确定是否可以专门缩短启动时间,但似乎对整体性能有所帮助。
  • 添加 AOT和LLVM 。即使该选项在我们的IDE中不可用,我们也找到了一种方法来实现。这会大大增加构建时间,因此,如果您要这样做,我建议仅对发行版本进行构建。
  • 启用 Xamarin快速渲染。这是一个实验性的事情,因此您应该阅读一些文档,但是可以通过在global::Xamarin.Forms.Forms.SetFlags("FastRenderers_Experimental");
  • 之前在MainActivity.OnCreate()方法上添加此行global::Xamarin.Forms.Forms.Init(this, bundle);来完成。
  • 更新我们的Xamarin.Forms Nuget 版本。在您解决方案的所有项目中,该版本都必须是相同的版本。我们在点击手势时遇到了一些问题,此问题也得到了改善。
  • 链接SDK程序集。在“链接”下的“属性”>“ Android选项”上,您可以设置为链接“仅SDK程序集”。您也可以设置为所有程序集,但是如果使用自定义程序集,则不建议这样做。
  • 预加载屏幕。通过将应用程序本身的性能提高了很多,这是我们在每个屏幕上加载的,背景,下一步需要的视图和视图模型的加载,因此将它们推入导航堆栈时,它们已经加载了。这大大减少了页面之间转换的时间。

答案 3 :(得分:0)

我找到了解决方案。例如,我们有5个标签。并且我们有5个viewmodel或5个代码隐藏。我们定义的每个选项卡的viewmodels构造函数的启动计时器方法。并且第一个制表符构造函数在计时器启动后初始化700ms。第二个标签页在1秒后开始播放。让我们为此:

第一个选项卡主页和主视图模型是HomeViewModel。

public void HomeTimer()
{
    timer.Interval = 700;

    timer.Elapsed += (sender, e) => OnTimedEvent(sender, e);

    timer.AutoReset = false;

    timer.Enabled = true;
}

private void OnTimedEvent(object sender, ElapsedEventArgs e)
{
    timer.Enabled = false;

    Yap(); // yap command all the page listview and get api.
}
System.Timers.Timer timer = new System.Timers.Timer();

public HomeViewModel()
{
    HomeTimer(); // hometimer starting
}

第二个选项卡是MyPage,viewmodel是MyPageViewModel,构造函数相同:

public void MyPageTimer()
{
    timer.Interval = 1000; //look. home page starting 0.7 seconds after and mypage starting 1 seconds after.

    timer.Elapsed += (sender, e) => OnTimedEvent(sender, e);

    timer.AutoReset = false;

    timer.Enabled = true;
}

private void OnTimedEvent(object sender, ElapsedEventArgs e)
{
    timer.Enabled = false;

    GetMypage(); // and getmypage method all the initialize the page and listview and webapi works.
}
System.Timers.Timer timer = new System.Timers.Timer();

public MyPageViewModel()
{
    MyPageTimer();
}

此操作我从启动删除1秒。在执行此操作之前,我的应用程序从3.2秒开始,而现在从2.2秒开始。