My solution after 2 weeks of work, for StartUp time on Android Without AOT is Dual SplashScreen.
Actually, there is no magic here. The same init time is remains. This solution is based on UX "Perceived Performance".
UX here will be much better. Instead of the user sees a long-time delay on one splash screen (or without splashscreen, which is worse),
Now, the user sees 2 splash screens:
1. The normal splash screen, and…
2. Screenshot of the first interactive screen the user engaging when the app starts.
I called it 'FirstScreen', which I implement it with MainActivity. The user sees what screen he going to get while progress bar is showing, and when
the rendering is finished, the image (as a background) is switched with the real Page.
If we analyze the delay at the start (cold start), there are 2 kinds of delay:
1. Init code of different components (Forms.init, DI init (e.g. autofac etc.))
2. Rendering of the page.
So, by splitting the init code to the first activity (SplashActivity) and leaving only the Render delay to FirstScreen (or MainActivity), we can split the
delay time by 2 pages, and that way the user sees half of the total delay, on each screen.
Users starts to count the seconds on static screen. So, if you move fast to another screen, you good.
The perception now is the app starts FASTER (even actually, as you'll see later the app starts even slower a little bit).
I put my solution on Github DualSplash.
Check it out.
Credits to Ideas and components:
1. Acr.UserDialogs of Allan Ritchie @AllanRitchie.
2. XF Page_Load event by Mohamed Yousuf @yousufctec .
3. Splash screen in XF by Adam Pedley @AdamP .
4. Thank you All!