Add Profiler build for Android (#6510)
This commit is contained in:
@@ -9,6 +9,11 @@ cfg.resolver.sourceExts = process.env.RN_SRC_EXT
|
|||||||
if (cfg.resolver.resolveRequest) {
|
if (cfg.resolver.resolveRequest) {
|
||||||
throw Error('Update this override because it is conflicting now.')
|
throw Error('Update this override because it is conflicting now.')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (process.env.BSKY_PROFILE) {
|
||||||
|
cfg.cacheVersion += ':PROFILE'
|
||||||
|
}
|
||||||
|
|
||||||
cfg.resolver.resolveRequest = (context, moduleName, platform) => {
|
cfg.resolver.resolveRequest = (context, moduleName, platform) => {
|
||||||
// HACK: manually resolve a few packages that use `exports` in `package.json`.
|
// HACK: manually resolve a few packages that use `exports` in `package.json`.
|
||||||
// A proper solution is to enable `unstable_enablePackageExports` but this needs careful testing.
|
// A proper solution is to enable `unstable_enablePackageExports` but this needs careful testing.
|
||||||
@@ -29,6 +34,15 @@ cfg.resolver.resolveRequest = (context, moduleName, platform) => {
|
|||||||
if (moduleName === '@ipld/dag-cbor') {
|
if (moduleName === '@ipld/dag-cbor') {
|
||||||
return context.resolveRequest(context, '@ipld/dag-cbor/src', platform)
|
return context.resolveRequest(context, '@ipld/dag-cbor/src', platform)
|
||||||
}
|
}
|
||||||
|
if (process.env.BSKY_PROFILE) {
|
||||||
|
if (moduleName.endsWith('ReactNativeRenderer-prod')) {
|
||||||
|
return context.resolveRequest(
|
||||||
|
context,
|
||||||
|
moduleName.replace('-prod', '-profiling'),
|
||||||
|
platform,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
return context.resolveRequest(context, moduleName, platform)
|
return context.resolveRequest(context, moduleName, platform)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,8 @@
|
|||||||
"postinstall": "patch-package && yarn intl:compile",
|
"postinstall": "patch-package && yarn intl:compile",
|
||||||
"prebuild": "expo prebuild --clean",
|
"prebuild": "expo prebuild --clean",
|
||||||
"android": "expo run:android",
|
"android": "expo run:android",
|
||||||
|
"android:prod": "expo run:android --variant release",
|
||||||
|
"android:profile": "BSKY_PROFILE=1 expo run:android --variant release",
|
||||||
"ios": "expo run:ios",
|
"ios": "expo run:ios",
|
||||||
"web": "expo start --web",
|
"web": "expo start --web",
|
||||||
"use-build-number": "./scripts/useBuildNumberEnv.sh",
|
"use-build-number": "./scripts/useBuildNumberEnv.sh",
|
||||||
|
|||||||
+37
-34
@@ -69,6 +69,7 @@ import {Provider as PortalProvider} from '#/components/Portal'
|
|||||||
import {Splash} from '#/Splash'
|
import {Splash} from '#/Splash'
|
||||||
import {BottomSheetProvider} from '../modules/bottom-sheet'
|
import {BottomSheetProvider} from '../modules/bottom-sheet'
|
||||||
import {BackgroundNotificationPreferencesProvider} from '../modules/expo-background-notification-handler/src/BackgroundNotificationHandlerProvider'
|
import {BackgroundNotificationPreferencesProvider} from '../modules/expo-background-notification-handler/src/BackgroundNotificationHandlerProvider'
|
||||||
|
import {AppProfiler} from './AppProfiler'
|
||||||
|
|
||||||
SplashScreen.preventAutoHideAsync()
|
SplashScreen.preventAutoHideAsync()
|
||||||
|
|
||||||
@@ -184,40 +185,42 @@ function App() {
|
|||||||
* that is set up in the InnerApp component above.
|
* that is set up in the InnerApp component above.
|
||||||
*/
|
*/
|
||||||
return (
|
return (
|
||||||
<GeolocationProvider>
|
<AppProfiler>
|
||||||
<A11yProvider>
|
<GeolocationProvider>
|
||||||
<KeyboardProvider enabled={false} statusBarTranslucent={true}>
|
<A11yProvider>
|
||||||
<SessionProvider>
|
<KeyboardProvider enabled={false} statusBarTranslucent={true}>
|
||||||
<PrefsStateProvider>
|
<SessionProvider>
|
||||||
<I18nProvider>
|
<PrefsStateProvider>
|
||||||
<ShellStateProvider>
|
<I18nProvider>
|
||||||
<InvitesStateProvider>
|
<ShellStateProvider>
|
||||||
<ModalStateProvider>
|
<InvitesStateProvider>
|
||||||
<DialogStateProvider>
|
<ModalStateProvider>
|
||||||
<LightboxStateProvider>
|
<DialogStateProvider>
|
||||||
<PortalProvider>
|
<LightboxStateProvider>
|
||||||
<BottomSheetProvider>
|
<PortalProvider>
|
||||||
<StarterPackProvider>
|
<BottomSheetProvider>
|
||||||
<SafeAreaProvider
|
<StarterPackProvider>
|
||||||
initialMetrics={initialWindowMetrics}>
|
<SafeAreaProvider
|
||||||
<IntentDialogProvider>
|
initialMetrics={initialWindowMetrics}>
|
||||||
<InnerApp />
|
<IntentDialogProvider>
|
||||||
</IntentDialogProvider>
|
<InnerApp />
|
||||||
</SafeAreaProvider>
|
</IntentDialogProvider>
|
||||||
</StarterPackProvider>
|
</SafeAreaProvider>
|
||||||
</BottomSheetProvider>
|
</StarterPackProvider>
|
||||||
</PortalProvider>
|
</BottomSheetProvider>
|
||||||
</LightboxStateProvider>
|
</PortalProvider>
|
||||||
</DialogStateProvider>
|
</LightboxStateProvider>
|
||||||
</ModalStateProvider>
|
</DialogStateProvider>
|
||||||
</InvitesStateProvider>
|
</ModalStateProvider>
|
||||||
</ShellStateProvider>
|
</InvitesStateProvider>
|
||||||
</I18nProvider>
|
</ShellStateProvider>
|
||||||
</PrefsStateProvider>
|
</I18nProvider>
|
||||||
</SessionProvider>
|
</PrefsStateProvider>
|
||||||
</KeyboardProvider>
|
</SessionProvider>
|
||||||
</A11yProvider>
|
</KeyboardProvider>
|
||||||
</GeolocationProvider>
|
</A11yProvider>
|
||||||
|
</GeolocationProvider>
|
||||||
|
</AppProfiler>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,29 @@
|
|||||||
|
import React, {Profiler} from 'react'
|
||||||
|
|
||||||
|
// Don't let it get stripped out in profiling builds (which apply production Babel preset).
|
||||||
|
const log = (global as any)['con' + 'sole'].log
|
||||||
|
|
||||||
|
function onRender(id: string, phase: string, actualDuration: number) {
|
||||||
|
if (!__DEV__) {
|
||||||
|
// This block of code will exist in the production build of the app.
|
||||||
|
// However, only profiling builds of React call `onRender` so it's dead code in actual production.
|
||||||
|
const message = `<Profiler> ${id}:${phase} ${
|
||||||
|
actualDuration > 500
|
||||||
|
? '(╯°□°)╯ '
|
||||||
|
: actualDuration > 100
|
||||||
|
? '[!!] '
|
||||||
|
: actualDuration > 16
|
||||||
|
? '[!] '
|
||||||
|
: ''
|
||||||
|
}${Math.round(actualDuration)}ms`
|
||||||
|
log(message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function AppProfiler({children}: {children: React.ReactNode}) {
|
||||||
|
return (
|
||||||
|
<Profiler id="app" onRender={onRender}>
|
||||||
|
{children}
|
||||||
|
</Profiler>
|
||||||
|
)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user