Skip to content

Commit 1b97b1b

Browse files
feat: extract android applicationId (#1951)
* feat: extract android applicationId * (fix) tests * fix: e2e snapshot * fix: update snapshot * fix: update snap * update variable name --------- Co-authored-by: Tomasz Misiukiewicz <[email protected]>
1 parent 8c15e16 commit 1b97b1b

File tree

7 files changed

+50
-5
lines changed

7 files changed

+50
-5
lines changed

__e2e__/__snapshots__/config.test.ts.snap

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ exports[`shows up current config without unnecessary output 1`] = `
6666
"sourceDir": "<<REPLACED_ROOT>>/TestProject/android",
6767
"appName": "app",
6868
"packageName": "com.testproject",
69+
"applicationId": "com.testproject",
6970
"mainActivity": ".MainActivity"
7071
}
7172
}

packages/cli-platform-android/src/commands/runAndroid/tryLaunchAppOnDevice.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,10 @@ function tryLaunchAppOnDevice(
1717
args: Flags,
1818
) {
1919
const {appId, appIdSuffix} = args;
20-
const {packageName, mainActivity} = androidProject;
2120

22-
const packageNameWithSuffix = [appId || packageName, appIdSuffix]
21+
const {packageName, mainActivity, applicationId} = androidProject;
22+
23+
const applicationIdWithSuffix = [appId || applicationId, appIdSuffix]
2324
.filter(Boolean)
2425
.join('.');
2526

@@ -34,7 +35,7 @@ function tryLaunchAppOnDevice(
3435
'am',
3536
'start',
3637
'-n',
37-
`${packageNameWithSuffix}/${activityToLaunch}`,
38+
`${applicationIdWithSuffix}/${activityToLaunch}`,
3839
'-a',
3940
'android.intent.action.MAIN',
4041
'-c',

packages/cli-platform-android/src/config/__fixtures__/files/build.gradle

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@ apply package: "com.android.application"
22
apply package: "com.facebook.react"
33

44
android {
5-
namespace 'com.some.example'
5+
namespace "com.some.example"
6+
defaultConfig {
7+
applicationId "com.example"
8+
}
69
}
710

811
react {

packages/cli-platform-android/src/config/__tests__/__snapshots__/getProjectConfig.test.ts.snap

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
exports[`android::getProjectConfig returns an object with android project configuration for flat structure 1`] = `
44
Object {
55
"appName": "",
6+
"applicationId": "com.some.example",
67
"dependencyConfiguration": undefined,
78
"mainActivity": ".MainActivity",
89
"packageName": "com.some.example",
@@ -15,6 +16,7 @@ Object {
1516
exports[`android::getProjectConfig returns an object with android project configuration for multiple 1`] = `
1617
Object {
1718
"appName": "",
19+
"applicationId": "com.some.example",
1820
"dependencyConfiguration": undefined,
1921
"mainActivity": ".MainActivity",
2022
"packageName": "com.some.example",
@@ -27,6 +29,7 @@ Object {
2729
exports[`android::getProjectConfig returns an object with android project configuration for nested structure 1`] = `
2830
Object {
2931
"appName": "app",
32+
"applicationId": "com.example",
3033
"dependencyConfiguration": undefined,
3134
"mainActivity": ".MainActivity",
3235
"packageName": "com.some.example",

packages/cli-platform-android/src/config/getAndroidProject.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,3 +106,22 @@ export function parseNamespaceFromBuildGradleFile(buildGradle: string) {
106106
export function validatePackageName(packageName: string) {
107107
return /^[a-z][a-z0-9_]*(\.[a-z][a-z0-9_]*)+$/i.test(packageName);
108108
}
109+
110+
// Search for applicationId at defaultConfig object
111+
export function parseApplicationIdFromBuildGradleFile(buildGradlePath: string) {
112+
if (!buildGradlePath) {
113+
return null;
114+
}
115+
const buildGradle = fs.readFileSync(buildGradlePath, 'utf8');
116+
117+
const matchArray = buildGradle.match(/defaultConfig\s*{([\s\S]*?)}/);
118+
119+
if (matchArray && matchArray.length > 0) {
120+
const appIdMatchArray = matchArray[1].match(
121+
/applicationId\s*[=]*\s*["'](.+?)["']/,
122+
);
123+
return appIdMatchArray?.[1] ?? '';
124+
} else {
125+
return null;
126+
}
127+
}

packages/cli-platform-android/src/config/index.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@ import {
1717
AndroidDependencyParams,
1818
AndroidDependencyConfig,
1919
} from '@react-native-community/cli-types';
20-
import {getPackageName} from './getAndroidProject';
20+
import {
21+
getPackageName,
22+
parseApplicationIdFromBuildGradleFile,
23+
} from './getAndroidProject';
2124
import {findLibraryName} from './findLibraryName';
2225
import {findComponentDescriptors} from './findComponentDescriptors';
2326
import {findBuildGradle} from './findBuildGradle';
@@ -60,6 +63,9 @@ export function projectConfig(
6063
);
6164
}
6265

66+
const applicationId = buildGradlePath
67+
? getApplicationId(buildGradlePath, packageName)
68+
: packageName;
6369
const mainActivity = getMainActivity(manifestPath || '');
6470

6571
if (!mainActivity) {
@@ -70,6 +76,7 @@ export function projectConfig(
7076
sourceDir,
7177
appName,
7278
packageName,
79+
applicationId,
7380
mainActivity,
7481
dependencyConfiguration: userConfig.dependencyConfiguration,
7582
watchModeCommandParams: userConfig.watchModeCommandParams,
@@ -78,6 +85,16 @@ export function projectConfig(
7885
};
7986
}
8087

88+
function getApplicationId(buildGradlePath: string, packageName: string) {
89+
let appId = packageName;
90+
91+
const applicationId = parseApplicationIdFromBuildGradleFile(buildGradlePath);
92+
if (applicationId) {
93+
appId = applicationId;
94+
}
95+
return appId;
96+
}
97+
8198
function getAppName(sourceDir: string, userConfigAppName: string | undefined) {
8299
let appName = '';
83100
if (

packages/cli-types/src/android.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ export interface AndroidProjectConfig {
22
sourceDir: string;
33
appName: string;
44
packageName: string;
5+
applicationId: string;
56
mainActivity: string;
67
dependencyConfiguration?: string;
78
watchModeCommandParams?: string[];

0 commit comments

Comments
 (0)