1import { AndroidConfig } from '@expo/config-plugins'; 2 3import { AppIdResolver } from '../AppIdResolver'; 4 5/** Resolves the Android package name from the Expo config or native files. */ 6export class AndroidAppIdResolver extends AppIdResolver { 7 constructor(projectRoot: string) { 8 super(projectRoot, 'android', 'android.package'); 9 } 10 11 async hasNativeProjectAsync(): Promise<boolean> { 12 try { 13 await AndroidConfig.Paths.getProjectPathOrThrowAsync(this.projectRoot); 14 return true; 15 } catch { 16 return false; 17 } 18 } 19 20 async resolveAppIdFromNativeAsync(): Promise<string | null> { 21 const applicationIdFromGradle = await AndroidConfig.Package.getApplicationIdAsync( 22 this.projectRoot 23 ).catch(() => null); 24 if (applicationIdFromGradle) { 25 return applicationIdFromGradle; 26 } 27 28 try { 29 const filePath = await AndroidConfig.Paths.getAndroidManifestAsync(this.projectRoot); 30 const androidManifest = await AndroidConfig.Manifest.readAndroidManifestAsync(filePath); 31 // Assert MainActivity defined. 32 await AndroidConfig.Manifest.getMainActivityOrThrow(androidManifest); 33 if (androidManifest.manifest?.$?.package) { 34 return androidManifest.manifest.$.package; 35 } 36 } catch {} 37 38 return null; 39 } 40} 41