diff --git a/lib/units/device/resources/remote.js b/lib/units/device/resources/remote.js index 54cbb519..d0efd166 100644 --- a/lib/units/device/resources/remote.js +++ b/lib/units/device/resources/remote.js @@ -11,26 +11,31 @@ var streamutil = require('../../../util/streamutil') module.exports = syrup.serial() .dependency(require('../support/adb')) .dependency(require('../support/properties')) - .define(function(options, adb, properties) { + .dependency(require('../support/abi')) + .define(function(options, adb, properties, abi) { var log = logger.createLogger('device:resources:remote') var resources = { bin: { - src: pathutil.vendor(util.format( - 'remote/libs/%s/remote%s' - , properties['ro.product.cpu.abi'] - , properties['ro.build.version.sdk'] < 16 ? '-nopie' : '' - )) + src: pathutil.requiredMatch(abi.b32.map(function(supportedAbi) { + return pathutil.vendor(util.format( + 'remote/libs/%s/remote%s' + , supportedAbi + , abi.pie ? '' : '-nopie' + )) + })) , dest: '/data/local/tmp/remote' , comm: 'remote' , mode: 0755 } , lib: { - src: pathutil.vendor(util.format( - 'remote/external/android-%d/%s/remote_external.so' - , properties['ro.build.version.sdk'] - , properties['ro.product.cpu.abi'] - )) + src: pathutil.requiredMatch(abi.b32.map(function(supportedAbi) { + return pathutil.vendor(util.format( + 'remote/external/android-%d/%s/remote_external.so' + , properties['ro.build.version.sdk'] + , supportedAbi + )) + })) , dest: '/data/local/tmp/remote_external.so' , mode: 0755 } diff --git a/lib/units/device/support/abi.js b/lib/units/device/support/abi.js new file mode 100644 index 00000000..0533f67c --- /dev/null +++ b/lib/units/device/support/abi.js @@ -0,0 +1,45 @@ +var syrup = require('stf-syrup') +var _ = require('lodash') + +var logger = require('../../../util/logger') + +module.exports = syrup.serial() + .dependency(require('./properties')) + .define(function(options, properties) { + var log = logger.createLogger('device:support:abi') + return (function() { + + function split(list) { + return list ? list.split(',') : [] + } + + var abi = { + primary: properties['ro.product.cpu.abi'] + , pie: properties['ro.build.version.sdk'] >= 16 + , all: [] + , b32: [] + , b64: [] + } + + // Since Android 5.0 + if (properties['ro.product.cpu.abilist']) { + abi.all = split(properties['ro.product.cpu.abilist']) + abi.b64 = split(properties['ro.product.cpu.abilist64']) + abi.b32 = split(properties['ro.product.cpu.abilist32']) + } + // Up to Android 4.4 + else { + abi.all.push(abi.primary) + abi.b32.push(abi.primary) + if (properties['ro.product.cpu.abi2']) { + abi.all.push(properties['ro.product.cpu.abi2']) + abi.b32.push(properties['ro.product.cpu.abi2']) + } + } + + log.info('Supports ABIs %s', abi.all.join(', ')) + + return abi + + })() + }) diff --git a/lib/util/pathutil.js b/lib/util/pathutil.js index f88bbb71..5c2091c4 100644 --- a/lib/util/pathutil.js +++ b/lib/util/pathutil.js @@ -1,4 +1,6 @@ var path = require('path') +var fs = require('fs') +var util = require('util') // Export module.exports.root = function(target) { @@ -19,3 +21,17 @@ module.exports.vendor = function(target) { module.exports.module = function(target) { return path.resolve(__dirname, '../../node_modules', target) } + +// Export +module.exports.requiredMatch = function(candidates) { + for (var i = 0, l = candidates.length; i < l; ++i) { + if (fs.existsSync(candidates[i])) { + return candidates[i] + } + } + + throw new Error(util.format( + 'At least one of these paths should exist: %s' + , candidates.join(', ') + )) +} diff --git a/vendor/remote/external/android-21/arm64-v8a/remote_external.so b/vendor/remote/external/android-21/arm64-v8a/remote_external.so new file mode 100755 index 00000000..3f5face3 Binary files /dev/null and b/vendor/remote/external/android-21/arm64-v8a/remote_external.so differ diff --git a/vendor/remote/external/android-21/armeabi-v7a/remote_external.so b/vendor/remote/external/android-21/armeabi-v7a/remote_external.so new file mode 100755 index 00000000..b412fbc8 Binary files /dev/null and b/vendor/remote/external/android-21/armeabi-v7a/remote_external.so differ diff --git a/vendor/remote/external/android-21/x86/remote_external.so b/vendor/remote/external/android-21/x86/remote_external.so new file mode 100755 index 00000000..846febd7 Binary files /dev/null and b/vendor/remote/external/android-21/x86/remote_external.so differ diff --git a/vendor/remote/external/android-21/x86_64/remote_external.so b/vendor/remote/external/android-21/x86_64/remote_external.so new file mode 100755 index 00000000..f324a21b Binary files /dev/null and b/vendor/remote/external/android-21/x86_64/remote_external.so differ