CB-8119 Restart adb when we detect it's hung

This commit is contained in:
Andrew Grieve 2014-12-04 09:58:00 -05:00
parent 132650df28
commit 66fa12a091
2 changed files with 67 additions and 15 deletions

View File

@ -398,6 +398,7 @@ module.exports.run = function(options, optResolvedTarget) {
* Returns "arm" or "x86".
*/
module.exports.detectArchitecture = function(target) {
function helper() {
return exec('adb -s ' + target + ' shell cat /proc/cpuinfo')
.then(function(output) {
if (/intel/i.exec(output)) {
@ -405,6 +406,37 @@ module.exports.detectArchitecture = function(target) {
}
return 'arm';
});
}
// It sometimes happens (at least on OS X), that this command will hang forever.
// To fix it, either unplug & replug device, or restart adb server.
return helper().timeout(1000, 'Device communication timed out. Try unplugging & replugging the device.')
.then(null, function(err) {
if (/timed out/.exec('' + err)) {
// adb kill-server doesn't seem to do the trick.
// Could probably find a x-platform version of killall, but I'm not actually
// sure that this scenario even happens on non-OSX machines.
return exec('killall adb')
.then(function() {
console.log('adb seems hung. retrying.');
return helper()
.then(null, function() {
// The double kill is sadly often necessary, at least on mac.
console.log('Now device not found... restarting adb again.');
return exec('killall adb')
.then(function() {
return helper()
.then(null, function() {
return Q.reject('USB is flakey. Try unplugging & replugging the device.');
});
});
});
}, function() {
// For non-killall OS's.
return Q.reject(err);
})
}
throw err;
});
};
module.exports.findBestApkForArchitecture = function(buildResults, arch) {

View File

@ -28,8 +28,10 @@ var exec = require('./exec'),
/**
* Returns a promise for the list of the device ID's found
* @param lookHarder When true, try restarting adb if no devices are found.
*/
module.exports.list = function() {
module.exports.list = function(lookHarder) {
function helper() {
return exec('adb devices')
.then(function(output) {
var response = output.split('\n');
@ -42,9 +44,27 @@ module.exports.list = function() {
return device_list;
});
}
return helper()
.then(function(list) {
if (list.length === 0 && lookHarder) {
// adb kill-server doesn't seem to do the trick.
// Could probably find a x-platform version of killall, but I'm not actually
// sure that this scenario even happens on non-OSX machines.
return exec('killall adb')
.then(function() {
console.log('Restarting adb to see if more devices are detected.');
return helper();
}, function() {
// For non-killall OS's.
return list;
});
}
return list;
});
}
module.exports.resolveTarget = function(target) {
return this.list()
return this.list(true)
.then(function(device_list) {
if (!device_list || !device_list.length) {
return Q.reject('ERROR: Failed to deploy to device, no devices found.');