We are developing a cross platform app on a PCL, but for the time being we are only using android devices for testing.
Our concern is that its taking about 6 to 8 seconds (d
I'll put together all the solutions we found for this, so its all in one place.
One of the answers linked this post, which was very useful.
Besides that we also did the following things:
global::Xamarin.Forms.Forms.SetFlags("FastRenderers_Experimental");
on MainActivity.OnCreate()
method, before global::Xamarin.Forms.Forms.Init(this, bundle);
This is a common problem while using Xamarin.Forms there are many threads related to this specially this one:
https://forums.xamarin.com/discussion/93178/lets-talk-performance/p6
The good news is that the Xamarin team is working on it.
Here are some tips you can do improve it:
https://blog.xamarin.com/5-ways-boost-xamarin-forms-app-startup-time/
First thing I would recommend is to not benchmark a debug build of your app, the code paths of the Mono runtime and Jit'd code are not the same as a release build, the use of shared runtimes, assembly sizes, etc, etc, etc. will all effect the startup and execution times.
Here are examples of startup times of a "very large" aggressively tuned Android Forms-based app on high-end and low-end devices using an in-house benchmarker (conditionally compiled in, not injected, and using the OS's system clock).
MainActivity
will add:
Times are generated via a shell script that reboots the devices, monitors the startup to wait for the system to settle, launches a series of apps (GApps, Facebook, Instagram, Twitter, etc...), waits for the system to settle, and then launches the Forms app via:
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%.*}
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
Re: 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
I found solution for this. For example we have 5 tabs. And we have 5 viewmodel or 5 codebehind. Every tabs viewmodels constructors we defined start timer method. And first tab constructor initialize 700ms after timer start. And second tab is starting 1 seconds after. Lets code for this:
First tab Home and home viewmodel is 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
}
And second tab is MyPage and viewmodel is MyPageViewModel and constructor is the same:
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();
}
And this operation i delete 1 second from startup. Before this operation my app starting 3.2 second and now starting 2.2 second.