CB-12546: tweak parsing of avdmanager output to match the old output from android list avd. also explicitly set the CWD of the spawned emulator process to workaround a recent google android sdk bug.

This commit is contained in:
filmaj 2017-03-08 09:12:44 -08:00
parent 73f28541ab
commit 8fc099b8f1
2 changed files with 32 additions and 2 deletions

View File

@ -62,3 +62,17 @@ module.exports.run = function() {
return Q.all([get_sdks()]);
};
module.exports.version_string_to_api_level = {
"4.0": 14,
"4.0.3": 15,
"4.1": 16,
"4.2": 17,
"4.3": 18,
"4.4": 19,
"4.4W": 20,
"5.0": 21,
"5.1": 22,
"6.0": 23,
"7.0": 24,
"7.1": 25
};

View File

@ -22,6 +22,7 @@
/* jshint sub:true */
var retry = require('./retry');
var android_sdk = require('./android_sdk_version');
var build = require('./build');
var path = require('path');
var Adb = require('./Adb');
@ -76,10 +77,22 @@ function list_images_using_avdmanager() {
if (response[i + 1].match(/ABI:\s/)) {
img_obj['abi'] = response[i + 1].split('ABI: ')[1].replace('\r', '');
}
// This next conditional just aims to match the old output of `android list avd`
// We do so so that we don't have to change the logic when parsing for the
// best emulator target to spawn (see below in `best_image`)
// This allows us to transitionally support both `android` and `avdmanager` binaries,
// depending on what SDK version the user has
if (response[i + 1].match(/Based\son:\s/)) {
img_obj['target'] = response[i + 1].split('Based on:')[1];
if (img_obj['target'].match(/Tag\/ABI:\s/)) {
img_obj['target'] = img_obj['target'].split('Tag/ABI:')[0].replace('\r', '');
img_obj['target'] = img_obj['target'].split('Tag/ABI:')[0].replace('\r', '').trim();
if (img_obj['target'].indexOf('(') > -1) {
img_obj['target'] = img_obj['target'].substr(0, img_obj['target'].indexOf('(') - 1).trim();
}
}
var version_string = img_obj['target'].replace(/Android\s+/, '');
if (android_sdk.version_string_to_api_level[version_string]) {
img_obj['target'] += ' (API level ' + android_sdk.version_string_to_api_level[version_string] + ')';
}
}
}
@ -270,10 +283,13 @@ module.exports.start = function(emulator_ID, boot_timeout) {
}).then(function(emulatorId) {
return self.get_available_port()
.then(function (port) {
// Figure out the directory the emulator binary runs in, and set the cwd to that directory.
// Workaround for https://code.google.com/p/android/issues/detail?id=235461
var emulator_dir = path.dirname(shelljs.which('emulator'));
var args = ['-avd', emulatorId, '-port', port];
// Don't wait for it to finish, since the emulator will probably keep running for a long time.
child_process
.spawn('emulator', args, { stdio: 'inherit', detached: true })
.spawn('emulator', args, { stdio: 'inherit', detached: true, cwd: emulator_dir })
.unref();
// wait for emulator to start