I'm using NativeScript 6.1.2 with Appium to run End to End tests using the Android emulator. I have a requirement to run the appium tests on a different port than the default (5546) as it's colliding with another user on the same machine trying to do the same tests.
I've setup an Android Virtual Device with the following capabilities in the appium.capabilities.json file;
"samsung": {
"platformName": "Android",
"platformVersion": "7.0",
"deviceName": "samsung_galaxy_s8",
"avd": "samsung_galaxy_s8",
"lt": 60000,
"newCommandTimeout": 720,
"noReset": false,
"fullReset": false,
"app": ""
}
When I start the tests with;
npm run e2e -- --runType samsung
I get the following;
Executing "/bin/ps aux | grep -ie 'sdk/emulator/qemu' | grep -ie 'samsung_galaxy_s8' | grep -v grep | xargs kill -9"
No matching processes to kill!
Starting emulator with options: -avd samsung_galaxy_s8 -port 5546 ["-no-audio","-no-boot-anim","-wipe-data","-no-snapshot-load","-no-snapshot-save"]
Booting emulator ...
Check if "emulator-5546" is running.
Check has "passed".
Check if emulator is responding
Emulator is booted!
Started device: {"name":"samsung_galaxy_s8","apiLevel":"24","releaseVersion":"7.0","platform":"android","type":"emulator","status":"booted","token":"5546","pid":26944,"startedAt":1572236203683,"config":{"density":1.6,"offsetPixels":25}}
NOTE: The "-avd samsung_galaxy_s8 -port 5546" line there is what I want to change.
Update
I found where appium starts the process and that the port is set by using the attribute 'token' on the emulator object.
This is in the /node_modules/mobile-devices-controller/lib/android-controller.js file;
static startEmulatorProcess(emulator, logPath, options) {
return __awaiter(this, void 0, void 0, function* () {
options = options || ["-no-audio", "-no-snapshot-save", "-no-boot-anim"];
if (logPath) {
options.push(` > ${logPath} 2 >& 1`);
}
utils_1.logInfo(`Starting emulator with options: -avd ${emulator.name} -port ${emulator.token}`, options);
const process = child_process_1.spawn(AndroidController.EMULATOR, [" -avd ", emulator.name, " -port ", emulator.token, ...options], {
shell: true,
detached: false,
});
process.stdout.on("data", (data) => {
console.log(data.toString());
});
process.stdout.on("error", (data) => {
console.log(data.toString());
});
emulator.pid = process.pid;
emulator.process = process;
return emulator;
});
}
Where do I set this token? It's current set to 5546.
Update: Full commands I used as per WiRa's answer
Start emulator
${ANDROID_HOME}emulator/emulator -avd samsung_galaxy_s8 -gpu guest -no-audio -verbose -port 3500
Start e2e tests
DEVICE_TOKEN=3500 npm run e2e -- --runType device.samsung
NOTE: Because of the constant crashing of the emulator I also use a loop
while true; do pkill -f android; sleep 2; tnsa &; em &> ~/emulator.log; done
You can set environment variable "DEVICE_TOKEN" to the desired port number.