diff --git a/lib/roles/device.js b/lib/roles/device.js index 69e376ce..a1a8fd04 100644 --- a/lib/roles/device.js +++ b/lib/roles/device.js @@ -1,4 +1,5 @@ var assert = require('assert') +var util = require('util') var Promise = require('bluebird') var zmq = require('zmq') @@ -8,11 +9,14 @@ var logger = require('../util/logger') var wire = require('../wire') var wireutil = require('../util/wireutil')(wire) var devutil = require('../util/devutil') +var pathutil = require('../util/pathutil') +var promiseutil = require('../util/promiseutil') var ChannelManager = require('../wire/channelmanager') module.exports = function(options) { var log = logger.createLogger('device') var identity = Object.create(null) + var vendor = Object.create(null) var solo = wireutil.makePrivateChannel() var channels = new ChannelManager() @@ -43,18 +47,44 @@ module.exports = function(options) { push.send([channel, wireutil.makeLeaveGroupMessage(options.serial)]) }) + promiseutil.periodicNotify(adb.waitBootCompleteAsync(options.serial), 1000) + .progressed(function() { + log.info('Waiting for boot to complete') + }) + .then(function() { + log.info('Gathering properties') + return adb.getPropertiesAsync(options.serial) + }) + .then(function(properties) { + log.info('Solving identity') + return identity = devutil.makeIdentity(options.serial, properties) + }) + .then(function() { + vendor = devutil.vendorFiles(identity) + return Promise.all(Object.keys(vendor).map(function(id) { + var res = vendor[id] + log.info(util.format('Pushing vendor file "%s"', res.dest)) + return adb.pushAsync(options.serial, res.src, res.dest, res.mode) + .then(function(transfer) { + return new Promise(function(resolve, reject) { + transfer.on('end', resolve) + }) + }) + })) + }) + .done(function() { + log.info('Ready for instructions') + poke() + }) + sub.on('message', function(channel, data) { var wrapper = wire.Envelope.decode(data) channels.keepalive(channel) switch (wrapper.type) { case wire.MessageType.PROBE: var message = wire.ProbeMessage.decode(wrapper.message) - adb.getPropertiesAsync(options.serial) - .then(function(properties) { - identity = devutil.makeIdentity(options.serial, properties) - push.send([channel, - wireutil.makeDeviceIdentityMessage(options.serial, identity)]) - }) + push.send([channel, + wireutil.makeDeviceIdentityMessage(options.serial, identity)]) break case wire.MessageType.GROUP: var message = wire.GroupMessage.decode(wrapper.message) @@ -145,6 +175,4 @@ module.exports = function(options) { process.on('SIGTERM', function() { gracefullyExit() }) - - poke() } diff --git a/lib/util/devutil.js b/lib/util/devutil.js index 7ef540ac..50904fe8 100644 --- a/lib/util/devutil.js +++ b/lib/util/devutil.js @@ -1,9 +1,27 @@ var util = require('util') var wire = require('../wire') +var pathutil = require('./pathutil') var devutil = module.exports = Object.create(null) +devutil.vendorFiles = function(identity) { + return { + bin: { + src: pathutil.vendor(util.format( + 'remote/libs/%s/remote', identity.abi)) + , dest: '/data/local/tmp/remote' + , mode: 0755 + } + , so: { + src: pathutil.vendor(util.format( + 'remote/external/android-%d/remote_external.so', identity.sdk)) + , dest: '/data/local/tmp/remote_external.so' + , mode: 0755 + } + } +} + devutil.platform = function(platform) { switch (platform) { case 'android': diff --git a/lib/util/pathutil.js b/lib/util/pathutil.js index fd57d2d0..ba8d2d46 100644 --- a/lib/util/pathutil.js +++ b/lib/util/pathutil.js @@ -4,3 +4,8 @@ var path = require('path') module.exports.resource = function(target) { return path.resolve(__dirname, '../../res', target) } + +// Export +module.exports.vendor = function(target) { + return path.resolve(__dirname, '../../vendor', target) +} diff --git a/lib/util/promiseutil.js b/lib/util/promiseutil.js new file mode 100644 index 00000000..0d3482dd --- /dev/null +++ b/lib/util/promiseutil.js @@ -0,0 +1,24 @@ +var Promise = require('bluebird') + +module.exports.periodicNotify = function(promise, interval) { + var resolver = Promise.defer() + , timer = setInterval(notify, interval) + + function notify() { + resolver.progress() + } + + function resolve() { + resolver.resolve() + } + + function reject() { + resolver.reject() + } + + promise.then(resolve, reject) + + return resolver.promise.finally(function() { + clearInterval(timer) + }) +} diff --git a/vendor/remote/external/android-10/remote_external.so b/vendor/remote/external/android-10/remote_external.so new file mode 100755 index 00000000..e2d8740c Binary files /dev/null and b/vendor/remote/external/android-10/remote_external.so differ diff --git a/vendor/remote/external/android-14/remote_external.so b/vendor/remote/external/android-14/remote_external.so new file mode 100755 index 00000000..52ecaa44 Binary files /dev/null and b/vendor/remote/external/android-14/remote_external.so differ diff --git a/vendor/remote/external/android-15/remote_external.so b/vendor/remote/external/android-15/remote_external.so new file mode 100755 index 00000000..88170e64 Binary files /dev/null and b/vendor/remote/external/android-15/remote_external.so differ diff --git a/vendor/remote/external/android-16/remote_external.so b/vendor/remote/external/android-16/remote_external.so new file mode 100755 index 00000000..519cb35e Binary files /dev/null and b/vendor/remote/external/android-16/remote_external.so differ diff --git a/vendor/remote/external/android-17/remote_external.so b/vendor/remote/external/android-17/remote_external.so new file mode 100755 index 00000000..3e4fe5e3 Binary files /dev/null and b/vendor/remote/external/android-17/remote_external.so differ diff --git a/vendor/remote/external/android-18/remote_external.so b/vendor/remote/external/android-18/remote_external.so new file mode 100755 index 00000000..b6f1d6b1 Binary files /dev/null and b/vendor/remote/external/android-18/remote_external.so differ diff --git a/vendor/remote/external/android-19/remote_external.so b/vendor/remote/external/android-19/remote_external.so new file mode 100755 index 00000000..549a4e26 Binary files /dev/null and b/vendor/remote/external/android-19/remote_external.so differ diff --git a/vendor/remote/libs/armeabi-v7a/remote b/vendor/remote/libs/armeabi-v7a/remote new file mode 100755 index 00000000..6f6bed9e Binary files /dev/null and b/vendor/remote/libs/armeabi-v7a/remote differ