@@ -4,6 +4,7 @@ import path from "path";
44import semver from "semver" ;
55import { AndroidConfig } from "@expo/config-plugins" ;
66import loadConfig from "@react-native-community/cli-config" ;
7+ import { getAppBuildGradleAsync } from "@expo/config-plugins/build/android/Paths.js" ;
78import { calculateAppArtifactHash , getNativeABI } from "../utilities/common" ;
89import { ANDROID_HOME , findJavaHome } from "../utilities/android" ;
910import { Logger } from "../Logger" ;
@@ -81,19 +82,28 @@ async function getApplicationManifest(
8182 return undefined ;
8283}
8384
85+ async function getNamespaceFromGradle ( projectRoot : string ) : Promise < string | null > {
86+ const gradleBuild = await getAppBuildGradleAsync ( projectRoot ) ;
87+ if ( ! gradleBuild ) {
88+ return null ;
89+ }
90+
91+ // The namespace field in build.gradle defines the Java package name for the app's code.
92+ const matchResult = gradleBuild . contents . match ( / n a m e s p a c e \s + [ ' " ] .* [ ' " ] / ) ;
93+ return matchResult ?. [ 1 ] ?? null ;
94+ }
95+
8496async function resolveAppIdFromNative ( projectRoot : string ) : Promise < string | null > {
85- const applicationIdFromGradle = await AndroidConfig . Package . getApplicationIdAsync (
86- projectRoot
87- ) . catch ( ( ) => null ) ;
88- if ( applicationIdFromGradle ) {
89- return applicationIdFromGradle ;
97+ const namespaceFromGradle = await getNamespaceFromGradle ( projectRoot ) ;
98+ if ( namespaceFromGradle ) {
99+ return namespaceFromGradle ;
90100 }
91101
92102 try {
93103 const filePath = await AndroidConfig . Paths . getAndroidManifestAsync ( projectRoot ) ;
94104 const androidManifest = await AndroidConfig . Manifest . readAndroidManifestAsync ( filePath ) ;
95105 // Assert MainActivity defined.
96- await AndroidConfig . Manifest . getMainActivityOrThrow ( androidManifest ) ;
106+ AndroidConfig . Manifest . getMainActivityOrThrow ( androidManifest ) ;
97107 const appId = androidManifest . manifest ?. $ ?. package ;
98108 if ( appId ) {
99109 return appId ;
@@ -111,10 +121,14 @@ async function getLaunchActivity(
111121 baseAppId : string
112122) : Promise < string | undefined > {
113123 const manifest = await getApplicationManifest ( projectRoot ) ;
114- if ( ! manifest ) return undefined ;
124+ if ( ! manifest ) {
125+ return undefined ;
126+ }
115127
116- const mainActivity = await AndroidConfig . Manifest . getRunnableActivity ( manifest ) ;
117- if ( ! mainActivity ) return undefined ;
128+ const mainActivity = AndroidConfig . Manifest . getRunnableActivity ( manifest ) ;
129+ if ( ! mainActivity ) {
130+ return undefined ;
131+ }
118132
119133 const mainActivityName = mainActivity . $ [ "android:name" ] ;
120134
0 commit comments