From 6b5ecf3afb22e22b9a4fcddbc750310791398505 Mon Sep 17 00:00:00 2001 From: Simo Kinnunen Date: Sat, 8 Nov 2014 13:15:30 +0900 Subject: [PATCH] Nexus 9 support. Home button doesn't work, presumably due to auto-unlocking. --- lib/units/device/resources/remote.js | 27 ++++++----- lib/units/device/support/abi.js | 45 ++++++++++++++++++ lib/util/pathutil.js | 16 +++++++ .../android-21/arm64-v8a/remote_external.so | Bin 0 -> 17912 bytes .../android-21/armeabi-v7a/remote_external.so | Bin 0 -> 13500 bytes .../android-21/x86/remote_external.so | Bin 0 -> 17588 bytes .../android-21/x86_64/remote_external.so | Bin 0 -> 22240 bytes 7 files changed, 77 insertions(+), 11 deletions(-) create mode 100644 lib/units/device/support/abi.js create mode 100755 vendor/remote/external/android-21/arm64-v8a/remote_external.so create mode 100755 vendor/remote/external/android-21/armeabi-v7a/remote_external.so create mode 100755 vendor/remote/external/android-21/x86/remote_external.so create mode 100755 vendor/remote/external/android-21/x86_64/remote_external.so 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 0000000000000000000000000000000000000000..3f5face3008827e3cc3327ee4b818dcecc42b5bd GIT binary patch literal 17912 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 Uo@2upQLoG3UNp$WU$g%I0o&@5*#H0l literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b412fbc89576167b49dc559435893ec1958b5c5d GIT binary patch literal 13500 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..846febd786a8f146aa29f56130b7f7be18ab56d6 GIT binary patch literal 17588 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 UI@+jnKy|G}h&OqmB(;wJ1&U?&#Q*>R literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f324a21b79fb5d7a744c794f543af6c7df996be0 GIT binary patch literal 22240 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 itB8=i#D;JQrWo*QTu$t4qsf#$br~iNZu!%DO literal 0 HcmV?d00001