18d307f52SEvan Baconimport { AndroidConfig } from '@expo/config-plugins'; 28d307f52SEvan Bacon 38d307f52SEvan Baconimport { AppIdResolver } from '../AppIdResolver'; 48d307f52SEvan Bacon 5*60392ac6SEvan Baconconst debug = require('debug')( 6*60392ac6SEvan Bacon 'expo:start:platforms:android:AndroidAppIdResolver' 7*60392ac6SEvan Bacon) as typeof console.log; 8*60392ac6SEvan Bacon 98d307f52SEvan Bacon/** Resolves the Android package name from the Expo config or native files. */ 108d307f52SEvan Baconexport class AndroidAppIdResolver extends AppIdResolver { 118d307f52SEvan Bacon constructor(projectRoot: string) { 128d307f52SEvan Bacon super(projectRoot, 'android', 'android.package'); 138d307f52SEvan Bacon } 148d307f52SEvan Bacon 158d307f52SEvan Bacon async hasNativeProjectAsync(): Promise<boolean> { 168d307f52SEvan Bacon try { 178d307f52SEvan Bacon await AndroidConfig.Paths.getProjectPathOrThrowAsync(this.projectRoot); 188d307f52SEvan Bacon return true; 19*60392ac6SEvan Bacon } catch (error: any) { 20*60392ac6SEvan Bacon debug('Expected error checking for native project:', error); 218d307f52SEvan Bacon return false; 228d307f52SEvan Bacon } 238d307f52SEvan Bacon } 248d307f52SEvan Bacon 258d307f52SEvan Bacon async resolveAppIdFromNativeAsync(): Promise<string | null> { 268d307f52SEvan Bacon const applicationIdFromGradle = await AndroidConfig.Package.getApplicationIdAsync( 278d307f52SEvan Bacon this.projectRoot 288d307f52SEvan Bacon ).catch(() => null); 298d307f52SEvan Bacon if (applicationIdFromGradle) { 308d307f52SEvan Bacon return applicationIdFromGradle; 318d307f52SEvan Bacon } 328d307f52SEvan Bacon 338d307f52SEvan Bacon try { 348d307f52SEvan Bacon const filePath = await AndroidConfig.Paths.getAndroidManifestAsync(this.projectRoot); 358d307f52SEvan Bacon const androidManifest = await AndroidConfig.Manifest.readAndroidManifestAsync(filePath); 368d307f52SEvan Bacon // Assert MainActivity defined. 378d307f52SEvan Bacon await AndroidConfig.Manifest.getMainActivityOrThrow(androidManifest); 388d307f52SEvan Bacon if (androidManifest.manifest?.$?.package) { 398d307f52SEvan Bacon return androidManifest.manifest.$.package; 408d307f52SEvan Bacon } 41*60392ac6SEvan Bacon } catch (error: any) { 42*60392ac6SEvan Bacon debug('Expected error resolving the package name from the AndroidManifest.xml:', error); 43*60392ac6SEvan Bacon } 448d307f52SEvan Bacon 458d307f52SEvan Bacon return null; 468d307f52SEvan Bacon } 478d307f52SEvan Bacon} 48