@expo/build-tools 1.0.182 → 1.0.183
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -23,6 +23,11 @@ function createStartAndroidEmulatorBuildFunction() {
|
|
|
23
23
|
defaultValue: 'EasAndroidDevice01',
|
|
24
24
|
allowedValueTypeName: steps_1.BuildStepInputValueTypeName.STRING,
|
|
25
25
|
}),
|
|
26
|
+
steps_1.BuildStepInput.createProvider({
|
|
27
|
+
id: 'device_identifier',
|
|
28
|
+
required: false,
|
|
29
|
+
allowedValueTypeName: steps_1.BuildStepInputValueTypeName.STRING,
|
|
30
|
+
}),
|
|
26
31
|
steps_1.BuildStepInput.createProvider({
|
|
27
32
|
id: 'system_image_package',
|
|
28
33
|
required: false,
|
|
@@ -38,8 +43,20 @@ function createStartAndroidEmulatorBuildFunction() {
|
|
|
38
43
|
],
|
|
39
44
|
fn: async ({ logger }, { inputs, env }) => {
|
|
40
45
|
var _a, _b, _c;
|
|
46
|
+
try {
|
|
47
|
+
const availableDevices = await getAvailableEmulatorDevices({ env });
|
|
48
|
+
logger.info(`Available Android devices:\n- ${availableDevices.join(`\n- `)}`);
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
logger.info('Failed to list available Android devices.', error);
|
|
52
|
+
}
|
|
53
|
+
finally {
|
|
54
|
+
logger.info('');
|
|
55
|
+
}
|
|
41
56
|
const deviceName = `${inputs.device_name.value}`;
|
|
42
57
|
const systemImagePackage = `${inputs.system_image_package.value}`;
|
|
58
|
+
// We can cast because allowedValueTypeName validated this is a string.
|
|
59
|
+
const deviceIdentifier = inputs.device_identifier.value;
|
|
43
60
|
logger.info('Making sure system image is installed');
|
|
44
61
|
await (0, retry_1.retryAsync)(async () => {
|
|
45
62
|
await (0, turtle_spawn_1.default)('sdkmanager', [systemImagePackage], {
|
|
@@ -54,7 +71,16 @@ function createStartAndroidEmulatorBuildFunction() {
|
|
|
54
71
|
},
|
|
55
72
|
});
|
|
56
73
|
logger.info('Creating emulator device');
|
|
57
|
-
const avdManager = (0, turtle_spawn_1.default)('avdmanager', [
|
|
74
|
+
const avdManager = (0, turtle_spawn_1.default)('avdmanager', [
|
|
75
|
+
'create',
|
|
76
|
+
'avd',
|
|
77
|
+
'--name',
|
|
78
|
+
deviceName,
|
|
79
|
+
'--package',
|
|
80
|
+
systemImagePackage,
|
|
81
|
+
'--force',
|
|
82
|
+
...(deviceIdentifier ? ['--device', deviceIdentifier] : []),
|
|
83
|
+
], {
|
|
58
84
|
env,
|
|
59
85
|
stdio: 'pipe',
|
|
60
86
|
});
|
|
@@ -205,4 +231,11 @@ async function ensureEmulatorIsReadyAsync({ deviceName, env, logger, }) {
|
|
|
205
231
|
});
|
|
206
232
|
return { serialId };
|
|
207
233
|
}
|
|
234
|
+
async function getAvailableEmulatorDevices({ env }) {
|
|
235
|
+
const result = await (0, turtle_spawn_1.default)('avdmanager', ['list', 'device', '--compact', '--null'], {
|
|
236
|
+
env,
|
|
237
|
+
mode: logger_1.PipeMode.COMBINED_AS_STDOUT,
|
|
238
|
+
});
|
|
239
|
+
return result.stdout.split('\0').filter((line) => line !== '');
|
|
240
|
+
}
|
|
208
241
|
//# sourceMappingURL=startAndroidEmulator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"startAndroidEmulator.js","sourceRoot":"","sources":["../../../src/steps/functions/startAndroidEmulator.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'assert';\nimport fs from 'fs/promises';\n\nimport { PipeMode, bunyan } from '@expo/logger';\nimport {\n BuildFunction,\n BuildStepEnv,\n BuildStepInput,\n BuildStepInputValueTypeName,\n spawnAsync,\n} from '@expo/steps';\nimport spawn, { SpawnPromise, SpawnResult } from '@expo/turtle-spawn';\n\nimport { retryAsync } from '../../utils/retry';\n\nconst defaultSystemImagePackage = `system-images;android-30;default;${\n process.arch === 'arm64' ? 'arm64-v8a' : 'x86_64'\n}`;\n\nexport function createStartAndroidEmulatorBuildFunction(): BuildFunction {\n return new BuildFunction({\n namespace: 'eas',\n id: 'start_android_emulator',\n name: 'Start Android Emulator',\n inputProviders: [\n BuildStepInput.createProvider({\n id: 'device_name',\n required: false,\n defaultValue: 'EasAndroidDevice01',\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n BuildStepInput.createProvider({\n id: 'system_image_package',\n required: false,\n defaultValue: defaultSystemImagePackage,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n BuildStepInput.createProvider({\n id: 'count',\n required: false,\n defaultValue: 1,\n allowedValueTypeName: BuildStepInputValueTypeName.NUMBER,\n }),\n ],\n fn: async ({ logger }, { inputs, env }) => {\n const deviceName = `${inputs.device_name.value}`;\n const systemImagePackage = `${inputs.system_image_package.value}`;\n logger.info('Making sure system image is installed');\n await retryAsync(\n async () => {\n await spawn('sdkmanager', [systemImagePackage], {\n env,\n logger,\n });\n },\n {\n logger,\n retryOptions: {\n retries: 3, // Retry 3 times\n retryIntervalMs: 1_000,\n },\n }\n );\n\n logger.info('Creating emulator device');\n const avdManager = spawn(\n 'avdmanager',\n ['create', 'avd', '--name', deviceName, '--package', systemImagePackage, '--force'],\n {\n env,\n stdio: 'pipe',\n }\n );\n // `avdmanager create` always asks about creating a custom hardware profile.\n // > Do you wish to create a custom hardware profile? [no]\n // We answer \"no\".\n avdManager.child.stdin?.write('no');\n avdManager.child.stdin?.end();\n await avdManager;\n\n logger.info('Starting emulator device');\n const { emulatorPromise } = await startAndroidSimulator({ deviceName, env });\n\n logger.info('Waiting for emulator to become ready');\n const { serialId } = await ensureEmulatorIsReadyAsync({\n deviceName,\n env,\n logger,\n });\n\n logger.info(`${deviceName} is ready.`);\n\n const count = Number(inputs.count.value ?? 1);\n if (count > 1) {\n logger.info(`Requested ${count} emulators, shutting down ${deviceName} for cloning.`);\n await spawn('adb', ['-s', serialId, 'shell', 'reboot', '-p'], {\n logger,\n env,\n });\n // Waiting for source emulator to shutdown.\n await emulatorPromise;\n\n for (let i = 0; i < count; i++) {\n const cloneIdentifier = `eas-simulator-${i + 1}`;\n logger.info(`Cloning ${deviceName} to ${cloneIdentifier}...`);\n const cloneIniFile = `${process.env.HOME}/.android/avd/${cloneIdentifier}.ini`;\n\n await fs.rm(`${process.env.HOME}/.android/avd/${cloneIdentifier}.avd`, {\n recursive: true,\n force: true,\n });\n await fs.rm(cloneIniFile, { force: true });\n\n await fs.cp(\n `${process.env.HOME}/.android/avd/${deviceName}.avd`,\n `${process.env.HOME}/.android/avd/${cloneIdentifier}.avd`,\n { recursive: true, verbatimSymlinks: true, force: true }\n );\n\n await fs.cp(`${process.env.HOME}/.android/avd/${deviceName}.ini`, cloneIniFile, {\n verbatimSymlinks: true,\n force: true,\n });\n\n const filesToReplaceDeviceNameIn = (\n await spawnAsync('grep', [\n '--binary-files=without-match',\n '--recursive',\n '--files-with-matches',\n `${deviceName}`,\n `${process.env.HOME}/.android/avd/${cloneIdentifier}.avd`,\n ])\n ).stdout\n .split('\\n')\n .filter((file) => file !== '');\n\n for (const file of [...filesToReplaceDeviceNameIn, cloneIniFile]) {\n const txtFile = await fs.readFile(file, 'utf-8');\n const replaceRegex = new RegExp(`${deviceName}`, 'g');\n const updatedTxtFile = txtFile.replace(replaceRegex, cloneIdentifier);\n await fs.writeFile(file, updatedTxtFile);\n }\n\n logger.info('Starting emulator device');\n await startAndroidSimulator({ deviceName: cloneIdentifier, env });\n\n logger.info('Waiting for emulator to become ready');\n await ensureEmulatorIsReadyAsync({\n deviceName: cloneIdentifier,\n env,\n logger,\n });\n\n logger.info(`${cloneIdentifier} is ready.`);\n }\n }\n },\n });\n}\n\nasync function startAndroidSimulator({\n deviceName,\n env,\n}: {\n deviceName: string;\n env: BuildStepEnv;\n}): Promise<{ emulatorPromise: SpawnPromise<SpawnResult> }> {\n const emulatorPromise = spawn(\n `${process.env.ANDROID_HOME}/emulator/emulator`,\n [\n '-no-window',\n '-no-boot-anim',\n '-writable-system',\n '-noaudio',\n '-memory',\n '8192',\n '-no-snapshot-save',\n '-avd',\n deviceName,\n ],\n {\n detached: true,\n stdio: 'inherit',\n env,\n }\n );\n // If emulator fails to start, throw its error.\n if (!emulatorPromise.child.pid) {\n await emulatorPromise;\n }\n emulatorPromise.child.unref();\n\n // We don't want to await the SpawnPromise here.\n // eslint-disable-next-line @typescript-eslint/return-await\n return { emulatorPromise };\n}\n\nasync function getEmulatorSerialId({\n deviceName,\n env,\n}: {\n deviceName: string;\n env: BuildStepEnv;\n}): Promise<string | null> {\n const adbDevices = await spawn('adb', ['devices'], { mode: PipeMode.COMBINED, env });\n for (const adbDeviceLine of adbDevices.stdout.split('\\n')) {\n if (!adbDeviceLine.startsWith('emulator')) {\n continue;\n }\n\n const matches = adbDeviceLine.match(/^(\\S+)/);\n if (!matches) {\n continue;\n }\n\n const [, serialId] = matches;\n // Previously we were using `qemu.uuid` to identify the emulator,\n // but this does not work for newer emulators, because there is\n // a limit on properties and custom properties get ignored.\n // See https://stackoverflow.com/questions/2214377/how-to-get-serial-number-or-id-of-android-emulator-after-it-runs#comment98259121_42038655\n const adbEmuAvdName = await spawn('adb', ['-s', serialId, 'emu', 'avd', 'name'], {\n mode: PipeMode.COMBINED,\n env,\n });\n if (adbEmuAvdName.stdout.replace(/\\r\\n/g, '\\n').split('\\n')[0] === deviceName) {\n return serialId;\n }\n }\n\n return null;\n}\n\nasync function ensureEmulatorIsReadyAsync({\n deviceName,\n env,\n logger,\n}: {\n deviceName: string;\n env: BuildStepEnv;\n logger: bunyan;\n}): Promise<{ serialId: string }> {\n const serialId = await retryAsync(\n async () => {\n const serialId = await getEmulatorSerialId({ deviceName, env });\n assert(\n serialId,\n `Failed to configure emulator (${deviceName}): emulator with required ID not found.`\n );\n return serialId;\n },\n {\n logger,\n retryOptions: {\n retries: 3 * 60,\n retryIntervalMs: 1_000,\n },\n }\n );\n\n await retryAsync(\n async () => {\n const { stdout } = await spawn(\n 'adb',\n ['-s', serialId, 'shell', 'getprop', 'sys.boot_completed'],\n {\n env,\n mode: PipeMode.COMBINED,\n }\n );\n\n if (!stdout.startsWith('1')) {\n throw new Error(`Emulator (${deviceName}) boot has not completed.`);\n }\n },\n {\n // Retry every second for 3 minutes.\n retryOptions: {\n retries: 3 * 60,\n retryIntervalMs: 1_000,\n },\n }\n );\n\n return { serialId };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"startAndroidEmulator.js","sourceRoot":"","sources":["../../../src/steps/functions/startAndroidEmulator.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'assert';\nimport fs from 'fs/promises';\n\nimport { PipeMode, bunyan } from '@expo/logger';\nimport {\n BuildFunction,\n BuildStepEnv,\n BuildStepInput,\n BuildStepInputValueTypeName,\n spawnAsync,\n} from '@expo/steps';\nimport spawn, { SpawnPromise, SpawnResult } from '@expo/turtle-spawn';\n\nimport { retryAsync } from '../../utils/retry';\n\nconst defaultSystemImagePackage = `system-images;android-30;default;${\n process.arch === 'arm64' ? 'arm64-v8a' : 'x86_64'\n}`;\n\nexport function createStartAndroidEmulatorBuildFunction(): BuildFunction {\n return new BuildFunction({\n namespace: 'eas',\n id: 'start_android_emulator',\n name: 'Start Android Emulator',\n inputProviders: [\n BuildStepInput.createProvider({\n id: 'device_name',\n required: false,\n defaultValue: 'EasAndroidDevice01',\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n BuildStepInput.createProvider({\n id: 'device_identifier',\n required: false,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n BuildStepInput.createProvider({\n id: 'system_image_package',\n required: false,\n defaultValue: defaultSystemImagePackage,\n allowedValueTypeName: BuildStepInputValueTypeName.STRING,\n }),\n BuildStepInput.createProvider({\n id: 'count',\n required: false,\n defaultValue: 1,\n allowedValueTypeName: BuildStepInputValueTypeName.NUMBER,\n }),\n ],\n fn: async ({ logger }, { inputs, env }) => {\n try {\n const availableDevices = await getAvailableEmulatorDevices({ env });\n logger.info(`Available Android devices:\\n- ${availableDevices.join(`\\n- `)}`);\n } catch (error) {\n logger.info('Failed to list available Android devices.', error);\n } finally {\n logger.info('');\n }\n\n const deviceName = `${inputs.device_name.value}`;\n const systemImagePackage = `${inputs.system_image_package.value}`;\n // We can cast because allowedValueTypeName validated this is a string.\n const deviceIdentifier = inputs.device_identifier.value as string | undefined;\n\n logger.info('Making sure system image is installed');\n await retryAsync(\n async () => {\n await spawn('sdkmanager', [systemImagePackage], {\n env,\n logger,\n });\n },\n {\n logger,\n retryOptions: {\n retries: 3, // Retry 3 times\n retryIntervalMs: 1_000,\n },\n }\n );\n\n logger.info('Creating emulator device');\n const avdManager = spawn(\n 'avdmanager',\n [\n 'create',\n 'avd',\n '--name',\n deviceName,\n '--package',\n systemImagePackage,\n '--force',\n ...(deviceIdentifier ? ['--device', deviceIdentifier] : []),\n ],\n {\n env,\n stdio: 'pipe',\n }\n );\n // `avdmanager create` always asks about creating a custom hardware profile.\n // > Do you wish to create a custom hardware profile? [no]\n // We answer \"no\".\n avdManager.child.stdin?.write('no');\n avdManager.child.stdin?.end();\n await avdManager;\n\n logger.info('Starting emulator device');\n const { emulatorPromise } = await startAndroidSimulator({ deviceName, env });\n\n logger.info('Waiting for emulator to become ready');\n const { serialId } = await ensureEmulatorIsReadyAsync({\n deviceName,\n env,\n logger,\n });\n\n logger.info(`${deviceName} is ready.`);\n\n const count = Number(inputs.count.value ?? 1);\n if (count > 1) {\n logger.info(`Requested ${count} emulators, shutting down ${deviceName} for cloning.`);\n await spawn('adb', ['-s', serialId, 'shell', 'reboot', '-p'], {\n logger,\n env,\n });\n // Waiting for source emulator to shutdown.\n await emulatorPromise;\n\n for (let i = 0; i < count; i++) {\n const cloneIdentifier = `eas-simulator-${i + 1}`;\n logger.info(`Cloning ${deviceName} to ${cloneIdentifier}...`);\n const cloneIniFile = `${process.env.HOME}/.android/avd/${cloneIdentifier}.ini`;\n\n await fs.rm(`${process.env.HOME}/.android/avd/${cloneIdentifier}.avd`, {\n recursive: true,\n force: true,\n });\n await fs.rm(cloneIniFile, { force: true });\n\n await fs.cp(\n `${process.env.HOME}/.android/avd/${deviceName}.avd`,\n `${process.env.HOME}/.android/avd/${cloneIdentifier}.avd`,\n { recursive: true, verbatimSymlinks: true, force: true }\n );\n\n await fs.cp(`${process.env.HOME}/.android/avd/${deviceName}.ini`, cloneIniFile, {\n verbatimSymlinks: true,\n force: true,\n });\n\n const filesToReplaceDeviceNameIn = (\n await spawnAsync('grep', [\n '--binary-files=without-match',\n '--recursive',\n '--files-with-matches',\n `${deviceName}`,\n `${process.env.HOME}/.android/avd/${cloneIdentifier}.avd`,\n ])\n ).stdout\n .split('\\n')\n .filter((file) => file !== '');\n\n for (const file of [...filesToReplaceDeviceNameIn, cloneIniFile]) {\n const txtFile = await fs.readFile(file, 'utf-8');\n const replaceRegex = new RegExp(`${deviceName}`, 'g');\n const updatedTxtFile = txtFile.replace(replaceRegex, cloneIdentifier);\n await fs.writeFile(file, updatedTxtFile);\n }\n\n logger.info('Starting emulator device');\n await startAndroidSimulator({ deviceName: cloneIdentifier, env });\n\n logger.info('Waiting for emulator to become ready');\n await ensureEmulatorIsReadyAsync({\n deviceName: cloneIdentifier,\n env,\n logger,\n });\n\n logger.info(`${cloneIdentifier} is ready.`);\n }\n }\n },\n });\n}\n\nasync function startAndroidSimulator({\n deviceName,\n env,\n}: {\n deviceName: string;\n env: BuildStepEnv;\n}): Promise<{ emulatorPromise: SpawnPromise<SpawnResult> }> {\n const emulatorPromise = spawn(\n `${process.env.ANDROID_HOME}/emulator/emulator`,\n [\n '-no-window',\n '-no-boot-anim',\n '-writable-system',\n '-noaudio',\n '-memory',\n '8192',\n '-no-snapshot-save',\n '-avd',\n deviceName,\n ],\n {\n detached: true,\n stdio: 'inherit',\n env,\n }\n );\n // If emulator fails to start, throw its error.\n if (!emulatorPromise.child.pid) {\n await emulatorPromise;\n }\n emulatorPromise.child.unref();\n\n // We don't want to await the SpawnPromise here.\n // eslint-disable-next-line @typescript-eslint/return-await\n return { emulatorPromise };\n}\n\nasync function getEmulatorSerialId({\n deviceName,\n env,\n}: {\n deviceName: string;\n env: BuildStepEnv;\n}): Promise<string | null> {\n const adbDevices = await spawn('adb', ['devices'], { mode: PipeMode.COMBINED, env });\n for (const adbDeviceLine of adbDevices.stdout.split('\\n')) {\n if (!adbDeviceLine.startsWith('emulator')) {\n continue;\n }\n\n const matches = adbDeviceLine.match(/^(\\S+)/);\n if (!matches) {\n continue;\n }\n\n const [, serialId] = matches;\n // Previously we were using `qemu.uuid` to identify the emulator,\n // but this does not work for newer emulators, because there is\n // a limit on properties and custom properties get ignored.\n // See https://stackoverflow.com/questions/2214377/how-to-get-serial-number-or-id-of-android-emulator-after-it-runs#comment98259121_42038655\n const adbEmuAvdName = await spawn('adb', ['-s', serialId, 'emu', 'avd', 'name'], {\n mode: PipeMode.COMBINED,\n env,\n });\n if (adbEmuAvdName.stdout.replace(/\\r\\n/g, '\\n').split('\\n')[0] === deviceName) {\n return serialId;\n }\n }\n\n return null;\n}\n\nasync function ensureEmulatorIsReadyAsync({\n deviceName,\n env,\n logger,\n}: {\n deviceName: string;\n env: BuildStepEnv;\n logger: bunyan;\n}): Promise<{ serialId: string }> {\n const serialId = await retryAsync(\n async () => {\n const serialId = await getEmulatorSerialId({ deviceName, env });\n assert(\n serialId,\n `Failed to configure emulator (${deviceName}): emulator with required ID not found.`\n );\n return serialId;\n },\n {\n logger,\n retryOptions: {\n retries: 3 * 60,\n retryIntervalMs: 1_000,\n },\n }\n );\n\n await retryAsync(\n async () => {\n const { stdout } = await spawn(\n 'adb',\n ['-s', serialId, 'shell', 'getprop', 'sys.boot_completed'],\n {\n env,\n mode: PipeMode.COMBINED,\n }\n );\n\n if (!stdout.startsWith('1')) {\n throw new Error(`Emulator (${deviceName}) boot has not completed.`);\n }\n },\n {\n // Retry every second for 3 minutes.\n retryOptions: {\n retries: 3 * 60,\n retryIntervalMs: 1_000,\n },\n }\n );\n\n return { serialId };\n}\n\nasync function getAvailableEmulatorDevices({ env }: { env: BuildStepEnv }): Promise<string[]> {\n const result = await spawn('avdmanager', ['list', 'device', '--compact', '--null'], {\n env,\n mode: PipeMode.COMBINED_AS_STDOUT,\n });\n return result.stdout.split('\\0').filter((line) => line !== '');\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@expo/build-tools",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.183",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"files": [
|
|
@@ -76,5 +76,5 @@
|
|
|
76
76
|
"node": "20.14.0",
|
|
77
77
|
"yarn": "1.22.21"
|
|
78
78
|
},
|
|
79
|
-
"gitHead": "
|
|
79
|
+
"gitHead": "277dcd76d4d3c2a7f72cdf041e1e3e4438c91dad"
|
|
80
80
|
}
|