1import { AndroidConfig } from '@expo/config-plugins'; 2 3import { AndroidAppIdResolver } from '../../start/platforms/android/AndroidAppIdResolver'; 4import { CommandError } from '../../utils/errors'; 5 6export interface LaunchProps { 7 packageName: string; 8 mainActivity: string; 9 launchActivity: string; 10} 11 12async function getMainActivityAsync(projectRoot: string): Promise<string> { 13 const filePath = await AndroidConfig.Paths.getAndroidManifestAsync(projectRoot); 14 const androidManifest = await AndroidConfig.Manifest.readAndroidManifestAsync(filePath); 15 16 // Assert MainActivity defined. 17 const activity = await AndroidConfig.Manifest.getRunnableActivity(androidManifest); 18 if (!activity) { 19 throw new CommandError( 20 'ANDROID_MALFORMED', 21 `${filePath} is missing a runnable activity element.` 22 ); 23 } 24 // Often this is ".MainActivity" 25 return activity.$['android:name']; 26} 27 28export async function resolveLaunchPropsAsync(projectRoot: string): Promise<LaunchProps> { 29 // Often this is ".MainActivity" 30 const mainActivity = await getMainActivityAsync(projectRoot); 31 32 const packageName = await new AndroidAppIdResolver(projectRoot).getAppIdFromNativeAsync(); 33 const launchActivity = `${packageName}/${mainActivity}`; 34 35 return { 36 mainActivity, 37 launchActivity, 38 packageName, 39 }; 40} 41