my fork of the bluesky client

Add Profiler build for Android (#6510)

authored by danabra.mov and committed by

GitHub 9a57d2a5 7b6c1827

+82 -34
+14
metro.config.js
··· 9 9 if (cfg.resolver.resolveRequest) { 10 10 throw Error('Update this override because it is conflicting now.') 11 11 } 12 + 13 + if (process.env.BSKY_PROFILE) { 14 + cfg.cacheVersion += ':PROFILE' 15 + } 16 + 12 17 cfg.resolver.resolveRequest = (context, moduleName, platform) => { 13 18 // HACK: manually resolve a few packages that use `exports` in `package.json`. 14 19 // A proper solution is to enable `unstable_enablePackageExports` but this needs careful testing. ··· 28 33 } 29 34 if (moduleName === '@ipld/dag-cbor') { 30 35 return context.resolveRequest(context, '@ipld/dag-cbor/src', platform) 36 + } 37 + if (process.env.BSKY_PROFILE) { 38 + if (moduleName.endsWith('ReactNativeRenderer-prod')) { 39 + return context.resolveRequest( 40 + context, 41 + moduleName.replace('-prod', '-profiling'), 42 + platform, 43 + ) 44 + } 31 45 } 32 46 return context.resolveRequest(context, moduleName, platform) 33 47 }
+2
package.json
··· 11 11 "postinstall": "patch-package && yarn intl:compile", 12 12 "prebuild": "expo prebuild --clean", 13 13 "android": "expo run:android", 14 + "android:prod": "expo run:android --variant release", 15 + "android:profile": "BSKY_PROFILE=1 expo run:android --variant release", 14 16 "ios": "expo run:ios", 15 17 "web": "expo start --web", 16 18 "use-build-number": "./scripts/useBuildNumberEnv.sh",
+37 -34
src/App.native.tsx
··· 69 69 import {Splash} from '#/Splash' 70 70 import {BottomSheetProvider} from '../modules/bottom-sheet' 71 71 import {BackgroundNotificationPreferencesProvider} from '../modules/expo-background-notification-handler/src/BackgroundNotificationHandlerProvider' 72 + import {AppProfiler} from './AppProfiler' 72 73 73 74 SplashScreen.preventAutoHideAsync() 74 75 ··· 184 185 * that is set up in the InnerApp component above. 185 186 */ 186 187 return ( 187 - <GeolocationProvider> 188 - <A11yProvider> 189 - <KeyboardProvider enabled={false} statusBarTranslucent={true}> 190 - <SessionProvider> 191 - <PrefsStateProvider> 192 - <I18nProvider> 193 - <ShellStateProvider> 194 - <InvitesStateProvider> 195 - <ModalStateProvider> 196 - <DialogStateProvider> 197 - <LightboxStateProvider> 198 - <PortalProvider> 199 - <BottomSheetProvider> 200 - <StarterPackProvider> 201 - <SafeAreaProvider 202 - initialMetrics={initialWindowMetrics}> 203 - <IntentDialogProvider> 204 - <InnerApp /> 205 - </IntentDialogProvider> 206 - </SafeAreaProvider> 207 - </StarterPackProvider> 208 - </BottomSheetProvider> 209 - </PortalProvider> 210 - </LightboxStateProvider> 211 - </DialogStateProvider> 212 - </ModalStateProvider> 213 - </InvitesStateProvider> 214 - </ShellStateProvider> 215 - </I18nProvider> 216 - </PrefsStateProvider> 217 - </SessionProvider> 218 - </KeyboardProvider> 219 - </A11yProvider> 220 - </GeolocationProvider> 188 + <AppProfiler> 189 + <GeolocationProvider> 190 + <A11yProvider> 191 + <KeyboardProvider enabled={false} statusBarTranslucent={true}> 192 + <SessionProvider> 193 + <PrefsStateProvider> 194 + <I18nProvider> 195 + <ShellStateProvider> 196 + <InvitesStateProvider> 197 + <ModalStateProvider> 198 + <DialogStateProvider> 199 + <LightboxStateProvider> 200 + <PortalProvider> 201 + <BottomSheetProvider> 202 + <StarterPackProvider> 203 + <SafeAreaProvider 204 + initialMetrics={initialWindowMetrics}> 205 + <IntentDialogProvider> 206 + <InnerApp /> 207 + </IntentDialogProvider> 208 + </SafeAreaProvider> 209 + </StarterPackProvider> 210 + </BottomSheetProvider> 211 + </PortalProvider> 212 + </LightboxStateProvider> 213 + </DialogStateProvider> 214 + </ModalStateProvider> 215 + </InvitesStateProvider> 216 + </ShellStateProvider> 217 + </I18nProvider> 218 + </PrefsStateProvider> 219 + </SessionProvider> 220 + </KeyboardProvider> 221 + </A11yProvider> 222 + </GeolocationProvider> 223 + </AppProfiler> 221 224 ) 222 225 } 223 226
+29
src/AppProfiler.tsx
··· 1 + import React, {Profiler} from 'react' 2 + 3 + // Don't let it get stripped out in profiling builds (which apply production Babel preset). 4 + const log = (global as any)['con' + 'sole'].log 5 + 6 + function onRender(id: string, phase: string, actualDuration: number) { 7 + if (!__DEV__) { 8 + // This block of code will exist in the production build of the app. 9 + // However, only profiling builds of React call `onRender` so it's dead code in actual production. 10 + const message = `<Profiler> ${id}:${phase} ${ 11 + actualDuration > 500 12 + ? '(╯°□°)╯ ' 13 + : actualDuration > 100 14 + ? '[!!] ' 15 + : actualDuration > 16 16 + ? '[!] ' 17 + : '' 18 + }${Math.round(actualDuration)}ms` 19 + log(message) 20 + } 21 + } 22 + 23 + export function AppProfiler({children}: {children: React.ReactNode}) { 24 + return ( 25 + <Profiler id="app" onRender={onRender}> 26 + {children} 27 + </Profiler> 28 + ) 29 + }