react-native-startup-time
This module helps you to measure your app launch time. It is measured from the earliest point in time available to the native module, that is the module's initialization. When getTimeSinceStartup
is called on JS side, you'll get a promise which resolves with difference between these two moments in ms. This is not very accurate, but should give you good enough base for further optimizations.
On iOS time measurement is based on this article. On Android SystemClock.uptimeMills is used.
As far as I know, there's no way to programmatically obtain time passed since the moment when user taps on app icon. For this you have to use native dev tools. On Android this module will call reportFullyDrawn
so you can inspect adb logs.
If you know a better way to measure startup time (in a module), let me know or better shoot a PR.
Getting started
$ yarn add react-native-startup-time
Mostly automatic installation
This module supports autolinking so if you use RN 0.60+ then no additional action is required.
Otherwise, run
$ react-native link react-native-startup-time
Manual linking installation
- Open
./android/settings.gradle
, add this:
include ':react-native-startup-time'
project(':react-native-startup-time').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-startup-time/android')
- Open
./android/app/build.gradle
, add this:
implementation project(':react-native-startup-time')
- In
MainApplication.java
, add this:
import com.github.doomsower.RNStartupTimePackage;
new RNStartupTimePackage()
Usage
Render startup time badge somewhere on your first screen:
import { StartupTime } from 'react-native-startup-time';
...
<StartupTime
ready={true }
style={styles.startupTime }
/>
Or use imperative call:
import { getTimeSinceStartup } from 'react-native-startup-time';
getTimeSinceStartup().then((time) => {
console.log(`Time since startup: ${time} ms`);
});
Ensuring purity of your analytics data
This section is applicable to Android only
In case you're going to use this library for collecting the performance analytics, be aware to discard redundant samples which may sometimes pop up.
Depending on which lifecycle hook you've attached your call to getTimeSinceStartup()
you might receive redundant invocations, e.g. when the app is brought from bg to fg. Because the app isn't really starting up, the measured time can be unrealistic; such unrealistic samples adulterate your data and should be avoided.
To enforce single-sampling strategy, create your package using constructor with parameter true
:
new RNStartupTimePackage(true)
then sample the startup time with catching the redundant invocation error:
getTimeSinceStartup().then((time) => {
})
.catch((e) => {
});