Add Profiler build for Android (#6510)

This commit is contained in:
dan
2024-11-19 02:20:58 +00:00
committed by GitHub
parent 7b6c182723
commit 9a57d2a538
4 changed files with 82 additions and 34 deletions
+14
View File
@@ -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)
} }
+2
View File
@@ -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
View File
@@ -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>
) )
} }
+29
View File
@@ -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>
)
}