mirror of
https://github.com/apache/cordova-android.git
synced 2025-01-19 23:25:11 +08:00
CB-8119 Restart adb when we detect it's hung
This commit is contained in:
parent
132650df28
commit
66fa12a091
32
bin/templates/cordova/lib/build.js
vendored
32
bin/templates/cordova/lib/build.js
vendored
@ -398,6 +398,7 @@ module.exports.run = function(options, optResolvedTarget) {
|
|||||||
* Returns "arm" or "x86".
|
* Returns "arm" or "x86".
|
||||||
*/
|
*/
|
||||||
module.exports.detectArchitecture = function(target) {
|
module.exports.detectArchitecture = function(target) {
|
||||||
|
function helper() {
|
||||||
return exec('adb -s ' + target + ' shell cat /proc/cpuinfo')
|
return exec('adb -s ' + target + ' shell cat /proc/cpuinfo')
|
||||||
.then(function(output) {
|
.then(function(output) {
|
||||||
if (/intel/i.exec(output)) {
|
if (/intel/i.exec(output)) {
|
||||||
@ -405,6 +406,37 @@ module.exports.detectArchitecture = function(target) {
|
|||||||
}
|
}
|
||||||
return 'arm';
|
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) {
|
module.exports.findBestApkForArchitecture = function(buildResults, arch) {
|
||||||
|
24
bin/templates/cordova/lib/device.js
vendored
24
bin/templates/cordova/lib/device.js
vendored
@ -28,8 +28,10 @@ var exec = require('./exec'),
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a promise for the list of the device ID's found
|
* 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')
|
return exec('adb devices')
|
||||||
.then(function(output) {
|
.then(function(output) {
|
||||||
var response = output.split('\n');
|
var response = output.split('\n');
|
||||||
@ -42,9 +44,27 @@ module.exports.list = function() {
|
|||||||
return device_list;
|
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) {
|
module.exports.resolveTarget = function(target) {
|
||||||
return this.list()
|
return this.list(true)
|
||||||
.then(function(device_list) {
|
.then(function(device_list) {
|
||||||
if (!device_list || !device_list.length) {
|
if (!device_list || !device_list.length) {
|
||||||
return Q.reject('ERROR: Failed to deploy to device, no devices found.');
|
return Q.reject('ERROR: Failed to deploy to device, no devices found.');
|
||||||
|
Loading…
Reference in New Issue
Block a user