appium-adb 9.10.11 → 9.10.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/index.js +1 -5
- package/build/lib/adb.js +1 -26
- package/build/lib/adb.js.map +1 -1
- package/build/lib/helpers.js +7 -211
- package/build/lib/helpers.js.map +1 -1
- package/build/lib/logcat.js +1 -46
- package/build/lib/logcat.js.map +1 -1
- package/build/lib/logger.js +1 -5
- package/build/lib/logger.js.map +1 -1
- package/build/lib/tools/aab-utils.js +1 -42
- package/build/lib/tools/aab-utils.js.map +1 -1
- package/build/lib/tools/adb-commands.js +6 -163
- package/build/lib/tools/adb-commands.js.map +1 -1
- package/build/lib/tools/adb-emu-commands.js +2 -66
- package/build/lib/tools/adb-emu-commands.js.map +1 -1
- package/build/lib/tools/android-manifest.js +1 -60
- package/build/lib/tools/android-manifest.js.map +1 -1
- package/build/lib/tools/apk-signing.js +1 -77
- package/build/lib/tools/apk-signing.js.map +1 -1
- package/build/lib/tools/apk-utils.js +4 -229
- package/build/lib/tools/apk-utils.js.map +1 -1
- package/build/lib/tools/apks-utils.js +1 -53
- package/build/lib/tools/apks-utils.js.map +1 -1
- package/build/lib/tools/index.js +1 -17
- package/build/lib/tools/index.js.map +1 -1
- package/build/lib/tools/keyboard-commands.js +1 -12
- package/build/lib/tools/keyboard-commands.js.map +1 -1
- package/build/lib/tools/lockmgmt.js +1 -46
- package/build/lib/tools/lockmgmt.js.map +1 -1
- package/build/lib/tools/settings-client-commands.js +3 -71
- package/build/lib/tools/settings-client-commands.js.map +1 -1
- package/build/lib/tools/system-calls.js +5 -190
- package/build/lib/tools/system-calls.js.map +1 -1
- package/lib/tools/settings-client-commands.js +2 -2
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adb-emu-commands.js","names":["PHONE_NUMBER_PATTERN","emuMethods","POWER_AC_STATES","Object","freeze","POWER_AC_ON","POWER_AC_OFF","GSM_CALL_ACTIONS","GSM_CALL","GSM_ACCEPT","GSM_CANCEL","GSM_HOLD","GSM_VOICE_STATES","GSM_VOICE_UNREGISTERED","GSM_VOICE_HOME","GSM_VOICE_ROAMING","GSM_VOICE_SEARCHING","GSM_VOICE_DENIED","GSM_VOICE_OFF","GSM_VOICE_ON","GSM_SIGNAL_STRENGTHS","NETWORK_SPEED","GSM","SCSD","GPRS","EDGE","UMTS","HSDPA","LTE","EVDO","FULL","SENSORS","ACCELERATION","GYROSCOPE","MAGNETIC_FIELD","ORIENTATION","TEMPERATURE","PROXIMITY","LIGHT","PRESSURE","HUMIDITY","MAGNETIC_FIELD_UNCALIBRATED","GYROSCOPE_UNCALIBRATED","HINGE_ANGLE0","HINGE_ANGLE1","HINGE_ANGLE2","HEART_RATE","RGBC_LIGHT","listEmulators","avdsRoot","process","env","ANDROID_AVD_HOME","dirExists","getAvdConfigPaths","log","warn","prefsRoot","getAndroidPrefsRoot","path","resolve","debug","configs","fs","glob","cwd","absolute","map","confPath","avdName","basename","split","slice","join","name","config","filter","_","trim","isEmulatorConnected","emulators","getConnectedEmulators","find","x","udid","curDeviceId","verifyEmulatorConnected","Error","fingerprint","fingerprintId","level","getApiLevel","adbExecEmu","rotate","powerAC","state","values","indexOf","TypeError","sensorSet","sensor","value","includes","isNil","powerCapacity","percent","parseInt","isNaN","powerOFF","sendSMS","phoneNumber","message","replace","test","gsmCall","action","gsmSignal","strength","info","gsmVoice","networkSpeed","speed","execEmuConsoleCommand","execTelnet","cmd","opts","port","portMatch","exec","host","execTimeout","connTimeout","initTimeout","resetTelnetAuthToken","okFlag","nokFlag","eol","client","net","connect","B","reject","connTimeoutObj","setTimeout","execTimeoutObj","initTimeoutObj","isCommandSent","serverResponse","once","e","clearTimeout","on","chunk","push","output","Buffer","concat","toString","cmdStr","isArray","util","quote","write","end","outputArr","length","last","getEmuVersionInfo","propsPath","sdkRoot","exists","content","readFile","revisionMatch","result","revision","buildIdMatch","buildId","getEmuImageProperties","avds","avd","msg","isEmpty","ini","parse","checkAvdExist","some"],"sources":["../../../lib/tools/adb-emu-commands.js"],"sourcesContent":["import log from '../logger.js';\nimport { getAndroidPrefsRoot, dirExists } from '../helpers';\nimport _ from 'lodash';\nimport net from 'net';\nimport { util, fs } from '@appium/support';\nimport B from 'bluebird';\nimport path from 'path';\nimport ini from 'ini';\n\nconst PHONE_NUMBER_PATTERN = /^[+]?[(]?[0-9]*[)]?[-\\s.]?[0-9]*[-\\s.]?[0-9]{2,}$/im;\n\nconst emuMethods = {};\nemuMethods.POWER_AC_STATES = Object.freeze({\n POWER_AC_ON: 'on',\n POWER_AC_OFF: 'off'\n});\nemuMethods.GSM_CALL_ACTIONS = Object.freeze({\n GSM_CALL: 'call',\n GSM_ACCEPT: 'accept',\n GSM_CANCEL: 'cancel',\n GSM_HOLD: 'hold'\n});\nemuMethods.GSM_VOICE_STATES = Object.freeze({\n GSM_VOICE_UNREGISTERED: 'unregistered',\n GSM_VOICE_HOME: 'home',\n GSM_VOICE_ROAMING: 'roaming',\n GSM_VOICE_SEARCHING: 'searching',\n GSM_VOICE_DENIED: 'denied',\n GSM_VOICE_OFF: 'off',\n GSM_VOICE_ON: 'on'\n});\nemuMethods.GSM_SIGNAL_STRENGTHS = [0, 1, 2, 3, 4];\n\nemuMethods.NETWORK_SPEED = Object.freeze({\n GSM: 'gsm', // GSM/CSD (up: 14.4, down: 14.4).\n SCSD: 'scsd', // HSCSD (up: 14.4, down: 57.6).\n GPRS: 'gprs', // GPRS (up: 28.8, down: 57.6).\n EDGE: 'edge', // EDGE/EGPRS (up: 473.6, down: 473.6).\n UMTS: 'umts', // UMTS/3G (up: 384.0, down: 384.0).\n HSDPA: 'hsdpa', // HSDPA (up: 5760.0, down: 13,980.0).\n LTE: 'lte', // LTE (up: 58,000, down: 173,000).\n EVDO: 'evdo', // EVDO (up: 75,000, down: 280,000).\n FULL: 'full' // No limit, the default (up: 0.0, down: 0.0).\n});\n\nemuMethods.SENSORS = Object.freeze({\n ACCELERATION: 'acceleration',\n GYROSCOPE: 'gyroscope',\n MAGNETIC_FIELD: 'magnetic-field',\n ORIENTATION: 'orientation',\n TEMPERATURE: 'temperature',\n PROXIMITY: 'proximity',\n LIGHT: 'light',\n PRESSURE: 'pressure',\n HUMIDITY: 'humidity',\n MAGNETIC_FIELD_UNCALIBRATED: 'magnetic-field-uncalibrated',\n GYROSCOPE_UNCALIBRATED: 'gyroscope-uncalibrated',\n HINGE_ANGLE0: 'hinge-angle0',\n HINGE_ANGLE1: 'hinge-angle1',\n HINGE_ANGLE2: 'hinge-angle2',\n HEART_RATE: 'heart-rate',\n RGBC_LIGHT: 'rgbc-light',\n});\n\n/**\n * @typedef {Object} EmuInfo\n * @property {string} name Emulator name, for example `Pixel_XL_API_30`\n * @property {string} config Full path to the emulator config .ini file,\n * for example `/Users/user/.android/avd/Pixel_XL_API_30.ini`\n */\n\n/**\n * Retrieves the list of available Android emulators\n *\n * @returns {Array<EmuInfo>}\n */\nasync function listEmulators () {\n let avdsRoot = process.env.ANDROID_AVD_HOME;\n if (await dirExists(avdsRoot)) {\n return await getAvdConfigPaths(avdsRoot);\n }\n\n if (avdsRoot) {\n log.warn(`The value of the ANDROID_AVD_HOME environment variable '${avdsRoot}' is not an existing directory`);\n }\n\n const prefsRoot = await getAndroidPrefsRoot();\n if (!prefsRoot) {\n return [];\n }\n\n avdsRoot = path.resolve(prefsRoot, 'avd');\n if (!await dirExists(avdsRoot)) {\n log.debug(`Virtual devices config root '${avdsRoot}' is not an existing directory`);\n return [];\n }\n\n return await getAvdConfigPaths(avdsRoot);\n}\n\n/**\n * Get configuration paths of all virtual devices\n *\n * @param {string} avdsRoot Path to the directory that contains the AVD .ini files\n * @returns {Array<EmuInfo>}\n */\nasync function getAvdConfigPaths (avdsRoot) {\n const configs = await fs.glob('*.ini', {\n cwd: avdsRoot,\n absolute: true,\n });\n return configs.map((confPath) => {\n const avdName = path.basename(confPath).split('.').slice(0, -1).join('.');\n return {name: avdName, config: confPath};\n }).filter(({name}) => _.trim(name));\n}\n\n/**\n * Check the emulator state.\n *\n * @return {boolean} True if Emulator is visible to adb.\n */\nemuMethods.isEmulatorConnected = async function isEmulatorConnected () {\n let emulators = await this.getConnectedEmulators();\n return !!_.find(emulators, (x) => x && x.udid === this.curDeviceId);\n};\n\n/**\n * Verify the emulator is connected.\n *\n * @throws {error} If Emulator is not visible to adb.\n */\nemuMethods.verifyEmulatorConnected = async function verifyEmulatorConnected () {\n if (!(await this.isEmulatorConnected())) {\n throw new Error(`The emulator \"${this.curDeviceId}\" was unexpectedly disconnected`);\n }\n};\n\n/**\n * Emulate fingerprint touch event on the connected emulator.\n *\n * @param {string} fingerprintId - The ID of the fingerprint.\n */\nemuMethods.fingerprint = async function fingerprint (fingerprintId) {\n if (!fingerprintId) {\n throw new Error('Fingerprint id parameter must be defined');\n }\n // the method used only works for API level 23 and above\n let level = await this.getApiLevel();\n if (level < 23) {\n throw new Error(`Device API Level must be >= 23. Current Api level '${level}'`);\n }\n await this.adbExecEmu(['finger', 'touch', fingerprintId]);\n};\n\n/**\n * Change the display orientation on the connected emulator.\n * The orientation is changed (PI/2 is added) every time\n * this method is called.\n */\nemuMethods.rotate = async function rotate () {\n await this.adbExecEmu(['rotate']);\n};\n\n/**\n * Emulate power state change on the connected emulator.\n *\n * @param {string} state ['on'] - Either 'on' or 'off'.\n */\nemuMethods.powerAC = async function powerAC (state = 'on') {\n if (_.values(emuMethods.POWER_AC_STATES).indexOf(state) === -1) {\n throw new TypeError(`Wrong power AC state sent '${state}'. `\n + `Supported values: ${_.values(emuMethods.POWER_AC_STATES)}]`);\n }\n await this.adbExecEmu(['power', 'ac', state]);\n};\n\n/**\n * Emulate sensors values on the connected emulator.\n *\n * @param {string} sensor - Sensor type declared in SENSORS items.\n * @param {number|string} value - Number to set as the sensor value.\n * @throws {Error} - If sensor type or sensor value is not defined\n */\nemuMethods.sensorSet = async function sensorSet (sensor, value) {\n if (!_.includes(emuMethods.SENSORS, sensor)) {\n throw new TypeError(`Unsupported sensor sent '${sensor}'. `\n + `Supported values: ${_.values(emuMethods.SENSORS)}]`);\n }\n if (_.isNil(value) || value === '') {\n throw new TypeError(`Missing/invalid sensor value argument. `\n + `You need to provide a valid value to set to the sensor in `\n + `format <value-a>[:<value-b>[:<value-c>[...]]].`);\n }\n await this.adbExecEmu(['sensor', 'set', sensor, value]);\n};\n\n/**\n * Emulate power capacity change on the connected emulator.\n *\n * @param {string|number} percent [100] - Percentage value in range [0, 100].\n */\nemuMethods.powerCapacity = async function powerCapacity (percent = 100) {\n percent = parseInt(percent, 10);\n if (isNaN(percent) || percent < 0 || percent > 100) {\n throw new Error(`The percentage value should be valid integer between 0 and 100`);\n }\n await this.adbExecEmu(['power', 'capacity', percent]);\n};\n\n/**\n * Emulate power off event on the connected emulator.\n */\nemuMethods.powerOFF = async function powerOFF () {\n await this.powerAC(emuMethods.POWER_AC_STATES.POWER_AC_OFF);\n await this.powerCapacity(0);\n};\n\n/**\n * Emulate send SMS event on the connected emulator.\n *\n * @param {string|number} phoneNumber - The phone number of message sender.\n * @param {string} message [''] - The message content.\n * @throws {error} If phone number has invalid format.\n */\nemuMethods.sendSMS = async function sendSMS (phoneNumber, message = '') {\n message = message.trim();\n if (message === '') {\n throw new Error('Sending an SMS requires a message');\n }\n phoneNumber = `${phoneNumber}`.replace(/\\s*/, '');\n if (!PHONE_NUMBER_PATTERN.test(phoneNumber)) {\n throw new Error(`Invalid sendSMS phoneNumber param ${phoneNumber}`);\n }\n await this.adbExecEmu(['sms', 'send', phoneNumber, message]);\n};\n\n/**\n * Emulate GSM call event on the connected emulator.\n *\n * @param {string|number} phoneNumber - The phone number of the caller.\n * @param {string} action [''] - One of available GSM call actions.\n * @throws {error} If phone number has invalid format.\n * @throws {error} If _action_ value is invalid.\n */\nemuMethods.gsmCall = async function gsmCall (phoneNumber, action = '') {\n if (_.values(emuMethods.GSM_CALL_ACTIONS).indexOf(action) === -1) {\n throw new Error(`Invalid gsm action param ${action}. Supported values: ${_.values(emuMethods.GSM_CALL_ACTIONS)}`);\n }\n phoneNumber = `${phoneNumber}`.replace(/\\s*/, '');\n if (!PHONE_NUMBER_PATTERN.test(phoneNumber)) {\n throw new Error(`Invalid gsmCall phoneNumber param ${phoneNumber}`);\n }\n await this.adbExecEmu(['gsm', action, phoneNumber]);\n};\n\n/**\n * Emulate GSM signal strength change event on the connected emulator.\n *\n * @param {string|number} strength [4] - A number in range [0, 4];\n * @throws {error} If _strength_ value is invalid.\n */\nemuMethods.gsmSignal = async function gsmSignal (strength = 4) {\n strength = parseInt(strength, 10);\n if (emuMethods.GSM_SIGNAL_STRENGTHS.indexOf(strength) === -1) {\n throw new Error(`Invalid signal strength param ${strength}. Supported values: ${_.values(emuMethods.GSM_SIGNAL_STRENGTHS)}`);\n }\n log.info('gsm signal-profile <strength> changes the reported strength on next (15s) update.');\n await this.adbExecEmu(['gsm', 'signal-profile', strength]);\n};\n\n/**\n * Emulate GSM voice event on the connected emulator.\n *\n * @param {string} state ['on'] - Either 'on' or 'off'.\n * @throws {error} If _state_ value is invalid.\n */\nemuMethods.gsmVoice = async function gsmVoice (state = 'on') {\n // gsm voice <state> allows you to change the state of your GPRS connection\n if (_.values(emuMethods.GSM_VOICE_STATES).indexOf(state) === -1) {\n throw new Error(`Invalid gsm voice state param ${state}. Supported values: ${_.values(emuMethods.GSM_VOICE_STATES)}`);\n }\n await this.adbExecEmu(['gsm', 'voice', state]);\n};\n\n/**\n * Emulate network speed change event on the connected emulator.\n *\n * @param {string} speed ['full'] - One of possible NETWORK_SPEED values.\n * @throws {error} If _speed_ value is invalid.\n */\nemuMethods.networkSpeed = async function networkSpeed (speed = 'full') {\n // network speed <speed> allows you to set the network speed emulation.\n if (_.values(emuMethods.NETWORK_SPEED).indexOf(speed) === -1) {\n throw new Error(`Invalid network speed param ${speed}. Supported values: ${_.values(emuMethods.NETWORK_SPEED)}`);\n }\n await this.adbExecEmu(['network', 'speed', speed]);\n};\n\n/**\n * @typedef {Object} ExecTelnetOptions\n * @property {number} execTimeout [60000] A timeout used to wait for a server\n * reply to the given command\n * @property {number} connTimeout [5000] Console connection timeout in milliseconds\n * @property {number} initTimeout [5000] Telnet console initialization timeout\n * in milliseconds (the time between connection happens and the command prompt\n * is available)\n * @property {?number|string} port The emulator port number. The method will try to parse it\n * from the current device identifier if unset\n */\n\n/**\n * Executes a command through emulator telnet console interface and returns its output\n *\n * @param {Array<string>|string} cmd - The actual command to execute. See\n * https://developer.android.com/studio/run/emulator-console for more details\n * on available commands\n * @param {ExecTelnetOptions} opts\n * @returns {string} The command output\n * @throws {Error} If there was an error while connecting to the Telnet console\n * or if the given command returned non-OK response\n */\nemuMethods.execEmuConsoleCommand = async function execTelnet (cmd, opts = {}) {\n let port = parseInt(opts.port, 10);\n if (!port) {\n const portMatch = /emulator-(\\d+)/i.exec(this.curDeviceId);\n if (!portMatch) {\n throw new Error(`Cannot parse the console port number from the device identifier '${this.curDeviceId}'. ` +\n `Is it an emulator?`);\n }\n port = parseInt(portMatch[1], 10);\n }\n const host = '127.0.0.1';\n const {\n execTimeout = 60000,\n connTimeout = 5000,\n initTimeout = 5000,\n } = opts;\n await this.resetTelnetAuthToken();\n\n const okFlag = /^OK$/m;\n const nokFlag = /^KO\\b/m;\n const eol = '\\r\\n';\n const client = net.connect({\n host,\n port,\n });\n\n return await new B((resolve, reject) => {\n const connTimeoutObj = setTimeout(\n () => reject(new Error(`Cannot connect to the Emulator console at ${host}:${port} ` +\n `after ${connTimeout}ms`)), connTimeout);\n let execTimeoutObj;\n let initTimeoutObj;\n let isCommandSent = false;\n let serverResponse = [];\n\n client.once('error', (e) => {\n clearTimeout(connTimeoutObj);\n reject(new Error(`Cannot connect to the Emulator console at ${host}:${port}. ` +\n `Original error: ${e.message}`));\n });\n\n client.once('connect', () => {\n clearTimeout(connTimeoutObj);\n initTimeoutObj = setTimeout(\n () => reject(new Error(`Did not get the initial response from the Emulator console at ${host}:${port} ` +\n `after ${initTimeout}ms`)), initTimeout);\n });\n\n client.on('data', (chunk) => {\n serverResponse.push(chunk);\n const output = Buffer.concat(serverResponse).toString('utf8').trim();\n if (okFlag.test(output)) {\n // The initial incoming data chunk confirms the interface is ready for input\n if (!isCommandSent) {\n clearTimeout(initTimeoutObj);\n serverResponse = [];\n const cmdStr = _.isArray(cmd) ? util.quote(cmd) : `${cmd}`;\n log.debug(`Executing Emulator console command: ${cmdStr}`);\n client.write(cmdStr);\n client.write(eol);\n isCommandSent = true;\n execTimeoutObj = setTimeout(\n () => reject(new Error(`Did not get any response from the Emulator console at ${host}:${port} ` +\n `to '${cmd}' command after ${execTimeout}ms`)), execTimeout);\n return;\n }\n clearTimeout(execTimeoutObj);\n client.end();\n const outputArr = output.split(eol);\n // remove the redundant OK flag from the resulting command output\n return resolve(outputArr.slice(0, outputArr.length - 1).join('\\n').trim());\n } else if (nokFlag.test(output)) {\n clearTimeout(initTimeoutObj);\n clearTimeout(execTimeoutObj);\n client.end();\n const outputArr = output.split(eol);\n return reject(_.trim(_.last(outputArr)));\n }\n });\n });\n};\n\n/**\n * @typedef {Object} EmuVersionInfo\n * @property {?string} revision The actual revision number, for example '30.0.5'\n * @property {?number} buildId The build identifier, for example 6306047\n */\n\n/**\n * Retrieves emulator version from the file system\n *\n * @returns {EmuVersionInfo} If no version info could be parsed then an empty\n * object is returned\n */\nemuMethods.getEmuVersionInfo = async function getEmuVersionInfo () {\n const propsPath = path.join(this.sdkRoot, 'emulator', 'source.properties');\n if (!await fs.exists(propsPath)) {\n return {};\n }\n\n const content = await fs.readFile(propsPath, 'utf8');\n const revisionMatch = /^Pkg\\.Revision=([\\d.]+)$/m.exec(content);\n const result = {};\n if (revisionMatch) {\n result.revision = revisionMatch[1];\n }\n const buildIdMatch = /^Pkg\\.BuildId=(\\d+)$/m.exec(content);\n if (buildIdMatch) {\n result.buildId = parseInt(buildIdMatch[1], 10);\n }\n return result;\n};\n\n/**\n * Retrieves emulator image properties from the local file system\n *\n * @param {string} avdName Emulator name. Should NOT start with '@' character\n * @throws {Error} if there was a failure while extracting the properties\n * @returns {Object} The content of emulator image properties file.\n * Usually this configuration .ini file has the following content:\n * avd.ini.encoding=UTF-8\n * path=/Users/username/.android/avd/Pixel_XL_API_30.avd\n * path.rel=avd/Pixel_XL_API_30.avd\n * target=android-30\n */\nemuMethods.getEmuImageProperties = async function getEmuImageProperties (avdName) {\n const avds = await listEmulators();\n const avd = avds.find(({name}) => name === avdName);\n if (!avd) {\n let msg = `Cannot find '${avdName}' emulator. `;\n if (_.isEmpty(avds)) {\n msg += `No emulators have been detected on your system`;\n } else {\n msg += `Available avd names are: ${avds.map(({name}) => name)}`;\n }\n throw new Error(msg);\n }\n return ini.parse(await fs.readFile(avd.config, 'utf8'));\n};\n\n/**\n * Check if given emulator exists in the list of available avds.\n *\n * @param {string} avdName - The name of emulator to verify for existence.\n * Should NOT start with '@' character\n * @throws {Error} If the emulator with given name does not exist.\n */\nemuMethods.checkAvdExist = async function checkAvdExist (avdName) {\n const avds = await listEmulators();\n if (!avds.some(({name}) => name === avdName)) {\n let msg = `Avd '${avdName}' is not available. `;\n if (_.isEmpty(avds)) {\n msg += `No emulators have been detected on your system`;\n } else {\n msg += `Please select your avd name from one of these: '${avds.map(({name}) => name)}'`;\n }\n throw new Error(msg);\n }\n return true;\n};\n\nexport default emuMethods;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"adb-emu-commands.js","names":["PHONE_NUMBER_PATTERN","emuMethods","POWER_AC_STATES","Object","freeze","POWER_AC_ON","POWER_AC_OFF","GSM_CALL_ACTIONS","GSM_CALL","GSM_ACCEPT","GSM_CANCEL","GSM_HOLD","GSM_VOICE_STATES","GSM_VOICE_UNREGISTERED","GSM_VOICE_HOME","GSM_VOICE_ROAMING","GSM_VOICE_SEARCHING","GSM_VOICE_DENIED","GSM_VOICE_OFF","GSM_VOICE_ON","GSM_SIGNAL_STRENGTHS","NETWORK_SPEED","GSM","SCSD","GPRS","EDGE","UMTS","HSDPA","LTE","EVDO","FULL","SENSORS","ACCELERATION","GYROSCOPE","MAGNETIC_FIELD","ORIENTATION","TEMPERATURE","PROXIMITY","LIGHT","PRESSURE","HUMIDITY","MAGNETIC_FIELD_UNCALIBRATED","GYROSCOPE_UNCALIBRATED","HINGE_ANGLE0","HINGE_ANGLE1","HINGE_ANGLE2","HEART_RATE","RGBC_LIGHT","listEmulators","avdsRoot","process","env","ANDROID_AVD_HOME","dirExists","getAvdConfigPaths","log","warn","prefsRoot","getAndroidPrefsRoot","path","resolve","debug","configs","fs","glob","cwd","absolute","map","confPath","avdName","basename","split","slice","join","name","config","filter","_","trim","isEmulatorConnected","emulators","getConnectedEmulators","find","x","udid","curDeviceId","verifyEmulatorConnected","Error","fingerprint","fingerprintId","level","getApiLevel","adbExecEmu","rotate","powerAC","state","values","indexOf","TypeError","sensorSet","sensor","value","includes","isNil","powerCapacity","percent","parseInt","isNaN","powerOFF","sendSMS","phoneNumber","message","replace","test","gsmCall","action","gsmSignal","strength","info","gsmVoice","networkSpeed","speed","execEmuConsoleCommand","execTelnet","cmd","opts","port","portMatch","exec","host","execTimeout","connTimeout","initTimeout","resetTelnetAuthToken","okFlag","nokFlag","eol","client","net","connect","B","reject","connTimeoutObj","setTimeout","execTimeoutObj","initTimeoutObj","isCommandSent","serverResponse","once","e","clearTimeout","on","chunk","push","output","Buffer","concat","toString","cmdStr","isArray","util","quote","write","end","outputArr","length","last","getEmuVersionInfo","propsPath","sdkRoot","exists","content","readFile","revisionMatch","result","revision","buildIdMatch","buildId","getEmuImageProperties","avds","avd","msg","isEmpty","ini","parse","checkAvdExist","some"],"sources":["../../../lib/tools/adb-emu-commands.js"],"sourcesContent":["import log from '../logger.js';\nimport { getAndroidPrefsRoot, dirExists } from '../helpers';\nimport _ from 'lodash';\nimport net from 'net';\nimport { util, fs } from '@appium/support';\nimport B from 'bluebird';\nimport path from 'path';\nimport ini from 'ini';\n\nconst PHONE_NUMBER_PATTERN = /^[+]?[(]?[0-9]*[)]?[-\\s.]?[0-9]*[-\\s.]?[0-9]{2,}$/im;\n\nconst emuMethods = {};\nemuMethods.POWER_AC_STATES = Object.freeze({\n POWER_AC_ON: 'on',\n POWER_AC_OFF: 'off'\n});\nemuMethods.GSM_CALL_ACTIONS = Object.freeze({\n GSM_CALL: 'call',\n GSM_ACCEPT: 'accept',\n GSM_CANCEL: 'cancel',\n GSM_HOLD: 'hold'\n});\nemuMethods.GSM_VOICE_STATES = Object.freeze({\n GSM_VOICE_UNREGISTERED: 'unregistered',\n GSM_VOICE_HOME: 'home',\n GSM_VOICE_ROAMING: 'roaming',\n GSM_VOICE_SEARCHING: 'searching',\n GSM_VOICE_DENIED: 'denied',\n GSM_VOICE_OFF: 'off',\n GSM_VOICE_ON: 'on'\n});\nemuMethods.GSM_SIGNAL_STRENGTHS = [0, 1, 2, 3, 4];\n\nemuMethods.NETWORK_SPEED = Object.freeze({\n GSM: 'gsm', // GSM/CSD (up: 14.4, down: 14.4).\n SCSD: 'scsd', // HSCSD (up: 14.4, down: 57.6).\n GPRS: 'gprs', // GPRS (up: 28.8, down: 57.6).\n EDGE: 'edge', // EDGE/EGPRS (up: 473.6, down: 473.6).\n UMTS: 'umts', // UMTS/3G (up: 384.0, down: 384.0).\n HSDPA: 'hsdpa', // HSDPA (up: 5760.0, down: 13,980.0).\n LTE: 'lte', // LTE (up: 58,000, down: 173,000).\n EVDO: 'evdo', // EVDO (up: 75,000, down: 280,000).\n FULL: 'full' // No limit, the default (up: 0.0, down: 0.0).\n});\n\nemuMethods.SENSORS = Object.freeze({\n ACCELERATION: 'acceleration',\n GYROSCOPE: 'gyroscope',\n MAGNETIC_FIELD: 'magnetic-field',\n ORIENTATION: 'orientation',\n TEMPERATURE: 'temperature',\n PROXIMITY: 'proximity',\n LIGHT: 'light',\n PRESSURE: 'pressure',\n HUMIDITY: 'humidity',\n MAGNETIC_FIELD_UNCALIBRATED: 'magnetic-field-uncalibrated',\n GYROSCOPE_UNCALIBRATED: 'gyroscope-uncalibrated',\n HINGE_ANGLE0: 'hinge-angle0',\n HINGE_ANGLE1: 'hinge-angle1',\n HINGE_ANGLE2: 'hinge-angle2',\n HEART_RATE: 'heart-rate',\n RGBC_LIGHT: 'rgbc-light',\n});\n\n/**\n * @typedef {Object} EmuInfo\n * @property {string} name Emulator name, for example `Pixel_XL_API_30`\n * @property {string} config Full path to the emulator config .ini file,\n * for example `/Users/user/.android/avd/Pixel_XL_API_30.ini`\n */\n\n/**\n * Retrieves the list of available Android emulators\n *\n * @returns {Array<EmuInfo>}\n */\nasync function listEmulators () {\n let avdsRoot = process.env.ANDROID_AVD_HOME;\n if (await dirExists(avdsRoot)) {\n return await getAvdConfigPaths(avdsRoot);\n }\n\n if (avdsRoot) {\n log.warn(`The value of the ANDROID_AVD_HOME environment variable '${avdsRoot}' is not an existing directory`);\n }\n\n const prefsRoot = await getAndroidPrefsRoot();\n if (!prefsRoot) {\n return [];\n }\n\n avdsRoot = path.resolve(prefsRoot, 'avd');\n if (!await dirExists(avdsRoot)) {\n log.debug(`Virtual devices config root '${avdsRoot}' is not an existing directory`);\n return [];\n }\n\n return await getAvdConfigPaths(avdsRoot);\n}\n\n/**\n * Get configuration paths of all virtual devices\n *\n * @param {string} avdsRoot Path to the directory that contains the AVD .ini files\n * @returns {Array<EmuInfo>}\n */\nasync function getAvdConfigPaths (avdsRoot) {\n const configs = await fs.glob('*.ini', {\n cwd: avdsRoot,\n absolute: true,\n });\n return configs.map((confPath) => {\n const avdName = path.basename(confPath).split('.').slice(0, -1).join('.');\n return {name: avdName, config: confPath};\n }).filter(({name}) => _.trim(name));\n}\n\n/**\n * Check the emulator state.\n *\n * @return {boolean} True if Emulator is visible to adb.\n */\nemuMethods.isEmulatorConnected = async function isEmulatorConnected () {\n let emulators = await this.getConnectedEmulators();\n return !!_.find(emulators, (x) => x && x.udid === this.curDeviceId);\n};\n\n/**\n * Verify the emulator is connected.\n *\n * @throws {error} If Emulator is not visible to adb.\n */\nemuMethods.verifyEmulatorConnected = async function verifyEmulatorConnected () {\n if (!(await this.isEmulatorConnected())) {\n throw new Error(`The emulator \"${this.curDeviceId}\" was unexpectedly disconnected`);\n }\n};\n\n/**\n * Emulate fingerprint touch event on the connected emulator.\n *\n * @param {string} fingerprintId - The ID of the fingerprint.\n */\nemuMethods.fingerprint = async function fingerprint (fingerprintId) {\n if (!fingerprintId) {\n throw new Error('Fingerprint id parameter must be defined');\n }\n // the method used only works for API level 23 and above\n let level = await this.getApiLevel();\n if (level < 23) {\n throw new Error(`Device API Level must be >= 23. Current Api level '${level}'`);\n }\n await this.adbExecEmu(['finger', 'touch', fingerprintId]);\n};\n\n/**\n * Change the display orientation on the connected emulator.\n * The orientation is changed (PI/2 is added) every time\n * this method is called.\n */\nemuMethods.rotate = async function rotate () {\n await this.adbExecEmu(['rotate']);\n};\n\n/**\n * Emulate power state change on the connected emulator.\n *\n * @param {string} state ['on'] - Either 'on' or 'off'.\n */\nemuMethods.powerAC = async function powerAC (state = 'on') {\n if (_.values(emuMethods.POWER_AC_STATES).indexOf(state) === -1) {\n throw new TypeError(`Wrong power AC state sent '${state}'. `\n + `Supported values: ${_.values(emuMethods.POWER_AC_STATES)}]`);\n }\n await this.adbExecEmu(['power', 'ac', state]);\n};\n\n/**\n * Emulate sensors values on the connected emulator.\n *\n * @param {string} sensor - Sensor type declared in SENSORS items.\n * @param {number|string} value - Number to set as the sensor value.\n * @throws {Error} - If sensor type or sensor value is not defined\n */\nemuMethods.sensorSet = async function sensorSet (sensor, value) {\n if (!_.includes(emuMethods.SENSORS, sensor)) {\n throw new TypeError(`Unsupported sensor sent '${sensor}'. `\n + `Supported values: ${_.values(emuMethods.SENSORS)}]`);\n }\n if (_.isNil(value) || value === '') {\n throw new TypeError(`Missing/invalid sensor value argument. `\n + `You need to provide a valid value to set to the sensor in `\n + `format <value-a>[:<value-b>[:<value-c>[...]]].`);\n }\n await this.adbExecEmu(['sensor', 'set', sensor, value]);\n};\n\n/**\n * Emulate power capacity change on the connected emulator.\n *\n * @param {string|number} percent [100] - Percentage value in range [0, 100].\n */\nemuMethods.powerCapacity = async function powerCapacity (percent = 100) {\n percent = parseInt(percent, 10);\n if (isNaN(percent) || percent < 0 || percent > 100) {\n throw new Error(`The percentage value should be valid integer between 0 and 100`);\n }\n await this.adbExecEmu(['power', 'capacity', percent]);\n};\n\n/**\n * Emulate power off event on the connected emulator.\n */\nemuMethods.powerOFF = async function powerOFF () {\n await this.powerAC(emuMethods.POWER_AC_STATES.POWER_AC_OFF);\n await this.powerCapacity(0);\n};\n\n/**\n * Emulate send SMS event on the connected emulator.\n *\n * @param {string|number} phoneNumber - The phone number of message sender.\n * @param {string} message [''] - The message content.\n * @throws {error} If phone number has invalid format.\n */\nemuMethods.sendSMS = async function sendSMS (phoneNumber, message = '') {\n message = message.trim();\n if (message === '') {\n throw new Error('Sending an SMS requires a message');\n }\n phoneNumber = `${phoneNumber}`.replace(/\\s*/, '');\n if (!PHONE_NUMBER_PATTERN.test(phoneNumber)) {\n throw new Error(`Invalid sendSMS phoneNumber param ${phoneNumber}`);\n }\n await this.adbExecEmu(['sms', 'send', phoneNumber, message]);\n};\n\n/**\n * Emulate GSM call event on the connected emulator.\n *\n * @param {string|number} phoneNumber - The phone number of the caller.\n * @param {string} action [''] - One of available GSM call actions.\n * @throws {error} If phone number has invalid format.\n * @throws {error} If _action_ value is invalid.\n */\nemuMethods.gsmCall = async function gsmCall (phoneNumber, action = '') {\n if (_.values(emuMethods.GSM_CALL_ACTIONS).indexOf(action) === -1) {\n throw new Error(`Invalid gsm action param ${action}. Supported values: ${_.values(emuMethods.GSM_CALL_ACTIONS)}`);\n }\n phoneNumber = `${phoneNumber}`.replace(/\\s*/, '');\n if (!PHONE_NUMBER_PATTERN.test(phoneNumber)) {\n throw new Error(`Invalid gsmCall phoneNumber param ${phoneNumber}`);\n }\n await this.adbExecEmu(['gsm', action, phoneNumber]);\n};\n\n/**\n * Emulate GSM signal strength change event on the connected emulator.\n *\n * @param {string|number} strength [4] - A number in range [0, 4];\n * @throws {error} If _strength_ value is invalid.\n */\nemuMethods.gsmSignal = async function gsmSignal (strength = 4) {\n strength = parseInt(strength, 10);\n if (emuMethods.GSM_SIGNAL_STRENGTHS.indexOf(strength) === -1) {\n throw new Error(`Invalid signal strength param ${strength}. Supported values: ${_.values(emuMethods.GSM_SIGNAL_STRENGTHS)}`);\n }\n log.info('gsm signal-profile <strength> changes the reported strength on next (15s) update.');\n await this.adbExecEmu(['gsm', 'signal-profile', strength]);\n};\n\n/**\n * Emulate GSM voice event on the connected emulator.\n *\n * @param {string} state ['on'] - Either 'on' or 'off'.\n * @throws {error} If _state_ value is invalid.\n */\nemuMethods.gsmVoice = async function gsmVoice (state = 'on') {\n // gsm voice <state> allows you to change the state of your GPRS connection\n if (_.values(emuMethods.GSM_VOICE_STATES).indexOf(state) === -1) {\n throw new Error(`Invalid gsm voice state param ${state}. Supported values: ${_.values(emuMethods.GSM_VOICE_STATES)}`);\n }\n await this.adbExecEmu(['gsm', 'voice', state]);\n};\n\n/**\n * Emulate network speed change event on the connected emulator.\n *\n * @param {string} speed ['full'] - One of possible NETWORK_SPEED values.\n * @throws {error} If _speed_ value is invalid.\n */\nemuMethods.networkSpeed = async function networkSpeed (speed = 'full') {\n // network speed <speed> allows you to set the network speed emulation.\n if (_.values(emuMethods.NETWORK_SPEED).indexOf(speed) === -1) {\n throw new Error(`Invalid network speed param ${speed}. Supported values: ${_.values(emuMethods.NETWORK_SPEED)}`);\n }\n await this.adbExecEmu(['network', 'speed', speed]);\n};\n\n/**\n * @typedef {Object} ExecTelnetOptions\n * @property {number} execTimeout [60000] A timeout used to wait for a server\n * reply to the given command\n * @property {number} connTimeout [5000] Console connection timeout in milliseconds\n * @property {number} initTimeout [5000] Telnet console initialization timeout\n * in milliseconds (the time between connection happens and the command prompt\n * is available)\n * @property {?number|string} port The emulator port number. The method will try to parse it\n * from the current device identifier if unset\n */\n\n/**\n * Executes a command through emulator telnet console interface and returns its output\n *\n * @param {Array<string>|string} cmd - The actual command to execute. See\n * https://developer.android.com/studio/run/emulator-console for more details\n * on available commands\n * @param {ExecTelnetOptions} opts\n * @returns {string} The command output\n * @throws {Error} If there was an error while connecting to the Telnet console\n * or if the given command returned non-OK response\n */\nemuMethods.execEmuConsoleCommand = async function execTelnet (cmd, opts = {}) {\n let port = parseInt(opts.port, 10);\n if (!port) {\n const portMatch = /emulator-(\\d+)/i.exec(this.curDeviceId);\n if (!portMatch) {\n throw new Error(`Cannot parse the console port number from the device identifier '${this.curDeviceId}'. ` +\n `Is it an emulator?`);\n }\n port = parseInt(portMatch[1], 10);\n }\n const host = '127.0.0.1';\n const {\n execTimeout = 60000,\n connTimeout = 5000,\n initTimeout = 5000,\n } = opts;\n await this.resetTelnetAuthToken();\n\n const okFlag = /^OK$/m;\n const nokFlag = /^KO\\b/m;\n const eol = '\\r\\n';\n const client = net.connect({\n host,\n port,\n });\n\n return await new B((resolve, reject) => {\n const connTimeoutObj = setTimeout(\n () => reject(new Error(`Cannot connect to the Emulator console at ${host}:${port} ` +\n `after ${connTimeout}ms`)), connTimeout);\n let execTimeoutObj;\n let initTimeoutObj;\n let isCommandSent = false;\n let serverResponse = [];\n\n client.once('error', (e) => {\n clearTimeout(connTimeoutObj);\n reject(new Error(`Cannot connect to the Emulator console at ${host}:${port}. ` +\n `Original error: ${e.message}`));\n });\n\n client.once('connect', () => {\n clearTimeout(connTimeoutObj);\n initTimeoutObj = setTimeout(\n () => reject(new Error(`Did not get the initial response from the Emulator console at ${host}:${port} ` +\n `after ${initTimeout}ms`)), initTimeout);\n });\n\n client.on('data', (chunk) => {\n serverResponse.push(chunk);\n const output = Buffer.concat(serverResponse).toString('utf8').trim();\n if (okFlag.test(output)) {\n // The initial incoming data chunk confirms the interface is ready for input\n if (!isCommandSent) {\n clearTimeout(initTimeoutObj);\n serverResponse = [];\n const cmdStr = _.isArray(cmd) ? util.quote(cmd) : `${cmd}`;\n log.debug(`Executing Emulator console command: ${cmdStr}`);\n client.write(cmdStr);\n client.write(eol);\n isCommandSent = true;\n execTimeoutObj = setTimeout(\n () => reject(new Error(`Did not get any response from the Emulator console at ${host}:${port} ` +\n `to '${cmd}' command after ${execTimeout}ms`)), execTimeout);\n return;\n }\n clearTimeout(execTimeoutObj);\n client.end();\n const outputArr = output.split(eol);\n // remove the redundant OK flag from the resulting command output\n return resolve(outputArr.slice(0, outputArr.length - 1).join('\\n').trim());\n } else if (nokFlag.test(output)) {\n clearTimeout(initTimeoutObj);\n clearTimeout(execTimeoutObj);\n client.end();\n const outputArr = output.split(eol);\n return reject(_.trim(_.last(outputArr)));\n }\n });\n });\n};\n\n/**\n * @typedef {Object} EmuVersionInfo\n * @property {?string} revision The actual revision number, for example '30.0.5'\n * @property {?number} buildId The build identifier, for example 6306047\n */\n\n/**\n * Retrieves emulator version from the file system\n *\n * @returns {EmuVersionInfo} If no version info could be parsed then an empty\n * object is returned\n */\nemuMethods.getEmuVersionInfo = async function getEmuVersionInfo () {\n const propsPath = path.join(this.sdkRoot, 'emulator', 'source.properties');\n if (!await fs.exists(propsPath)) {\n return {};\n }\n\n const content = await fs.readFile(propsPath, 'utf8');\n const revisionMatch = /^Pkg\\.Revision=([\\d.]+)$/m.exec(content);\n const result = {};\n if (revisionMatch) {\n result.revision = revisionMatch[1];\n }\n const buildIdMatch = /^Pkg\\.BuildId=(\\d+)$/m.exec(content);\n if (buildIdMatch) {\n result.buildId = parseInt(buildIdMatch[1], 10);\n }\n return result;\n};\n\n/**\n * Retrieves emulator image properties from the local file system\n *\n * @param {string} avdName Emulator name. Should NOT start with '@' character\n * @throws {Error} if there was a failure while extracting the properties\n * @returns {Object} The content of emulator image properties file.\n * Usually this configuration .ini file has the following content:\n * avd.ini.encoding=UTF-8\n * path=/Users/username/.android/avd/Pixel_XL_API_30.avd\n * path.rel=avd/Pixel_XL_API_30.avd\n * target=android-30\n */\nemuMethods.getEmuImageProperties = async function getEmuImageProperties (avdName) {\n const avds = await listEmulators();\n const avd = avds.find(({name}) => name === avdName);\n if (!avd) {\n let msg = `Cannot find '${avdName}' emulator. `;\n if (_.isEmpty(avds)) {\n msg += `No emulators have been detected on your system`;\n } else {\n msg += `Available avd names are: ${avds.map(({name}) => name)}`;\n }\n throw new Error(msg);\n }\n return ini.parse(await fs.readFile(avd.config, 'utf8'));\n};\n\n/**\n * Check if given emulator exists in the list of available avds.\n *\n * @param {string} avdName - The name of emulator to verify for existence.\n * Should NOT start with '@' character\n * @throws {Error} If the emulator with given name does not exist.\n */\nemuMethods.checkAvdExist = async function checkAvdExist (avdName) {\n const avds = await listEmulators();\n if (!avds.some(({name}) => name === avdName)) {\n let msg = `Avd '${avdName}' is not available. `;\n if (_.isEmpty(avds)) {\n msg += `No emulators have been detected on your system`;\n } else {\n msg += `Please select your avd name from one of these: '${avds.map(({name}) => name)}'`;\n }\n throw new Error(msg);\n }\n return true;\n};\n\nexport default emuMethods;\n"],"mappings":"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"}
|
|
@@ -1,55 +1,38 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
4
|
Object.defineProperty(exports, "__esModule", {
|
|
6
5
|
value: true
|
|
7
6
|
});
|
|
8
7
|
exports.default = void 0;
|
|
9
|
-
|
|
10
8
|
require("source-map-support/register");
|
|
11
|
-
|
|
12
9
|
var _teen_process = require("teen_process");
|
|
13
|
-
|
|
14
10
|
var _logger = _interopRequireDefault(require("../logger.js"));
|
|
15
|
-
|
|
16
11
|
var _helpers = require("../helpers.js");
|
|
17
|
-
|
|
18
12
|
var _support = require("@appium/support");
|
|
19
|
-
|
|
20
13
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
21
|
-
|
|
22
14
|
var _path = _interopRequireDefault(require("path"));
|
|
23
|
-
|
|
24
15
|
var _adbkitApkreader = _interopRequireDefault(require("adbkit-apkreader"));
|
|
25
|
-
|
|
26
16
|
let manifestMethods = {};
|
|
27
17
|
|
|
28
18
|
manifestMethods.packageAndLaunchActivityFromManifest = async function packageAndLaunchActivityFromManifest(appPath) {
|
|
29
19
|
if (appPath.endsWith(_helpers.APKS_EXTENSION)) {
|
|
30
20
|
appPath = await this.extractBaseApk(appPath);
|
|
31
21
|
}
|
|
32
|
-
|
|
33
22
|
let manifest;
|
|
34
|
-
|
|
35
23
|
try {
|
|
36
24
|
const apkReader = await _adbkitApkreader.default.open(appPath);
|
|
37
25
|
manifest = await apkReader.readManifest();
|
|
38
26
|
} catch (e) {
|
|
39
27
|
_logger.default.debug(e);
|
|
40
|
-
|
|
41
28
|
throw new Error(`Cannot extract a manifest from '${appPath}'. ` + `Is it a valid Android application?`);
|
|
42
29
|
}
|
|
43
|
-
|
|
44
30
|
const {
|
|
45
31
|
pkg,
|
|
46
32
|
activity
|
|
47
33
|
} = (0, _helpers.parseManifest)(manifest);
|
|
48
|
-
|
|
49
34
|
_logger.default.info(`Package name: '${pkg}'`);
|
|
50
|
-
|
|
51
35
|
_logger.default.info(`Main activity name: '${activity}'`);
|
|
52
|
-
|
|
53
36
|
return {
|
|
54
37
|
apkPackage: pkg,
|
|
55
38
|
apkActivity: activity
|
|
@@ -58,24 +41,18 @@ manifestMethods.packageAndLaunchActivityFromManifest = async function packageAnd
|
|
|
58
41
|
|
|
59
42
|
manifestMethods.targetSdkVersionFromManifest = async function targetSdkVersionFromManifest(appPath) {
|
|
60
43
|
_logger.default.debug(`Extracting target SDK version of '${appPath}'`);
|
|
61
|
-
|
|
62
44
|
const originalAppPath = appPath;
|
|
63
|
-
|
|
64
45
|
if (appPath.endsWith(_helpers.APKS_EXTENSION)) {
|
|
65
46
|
appPath = await this.extractBaseApk(appPath);
|
|
66
47
|
}
|
|
67
|
-
|
|
68
48
|
const getTargetSdkViaApkReader = async () => {
|
|
69
49
|
const apkReader = await _adbkitApkreader.default.open(appPath);
|
|
70
50
|
const manifest = await apkReader.readManifest();
|
|
71
|
-
|
|
72
51
|
if (manifest.usesSdk && _lodash.default.isInteger(manifest.usesSdk.targetSdkVersion)) {
|
|
73
52
|
return manifest.usesSdk.targetSdkVersion;
|
|
74
53
|
}
|
|
75
|
-
|
|
76
54
|
throw new Error('Cannot find the information about targetSdkVersion in the manifest');
|
|
77
55
|
};
|
|
78
|
-
|
|
79
56
|
const getTargetSdkViaAapt = async () => {
|
|
80
57
|
await this.initAapt();
|
|
81
58
|
const args = ['dump', 'badging', appPath];
|
|
@@ -83,18 +60,13 @@ manifestMethods.targetSdkVersionFromManifest = async function targetSdkVersionFr
|
|
|
83
60
|
stdout
|
|
84
61
|
} = await (0, _teen_process.exec)(this.binaries.aapt, args);
|
|
85
62
|
const targetSdkVersion = /targetSdkVersion:'([^']+)'/g.exec(stdout);
|
|
86
|
-
|
|
87
63
|
if (!targetSdkVersion) {
|
|
88
64
|
_logger.default.debug(stdout);
|
|
89
|
-
|
|
90
65
|
throw new Error('Cannot parse the command output');
|
|
91
66
|
}
|
|
92
|
-
|
|
93
67
|
return parseInt(targetSdkVersion[1], 10);
|
|
94
68
|
};
|
|
95
|
-
|
|
96
69
|
const versionGetters = [['ApkReader', getTargetSdkViaApkReader], ['aapt', getTargetSdkViaAapt]];
|
|
97
|
-
|
|
98
70
|
for (const [toolName, versionGetter] of versionGetters) {
|
|
99
71
|
try {
|
|
100
72
|
return await versionGetter();
|
|
@@ -102,20 +74,17 @@ manifestMethods.targetSdkVersionFromManifest = async function targetSdkVersionFr
|
|
|
102
74
|
_logger.default.info(`Cannot extract targetSdkVersion of '${originalAppPath}' using ${toolName}. ` + `Original error: ${e.message}`);
|
|
103
75
|
}
|
|
104
76
|
}
|
|
105
|
-
|
|
106
77
|
throw new Error(`Cannot extract the target SDK version number of '${originalAppPath}' using either of ` + `${JSON.stringify(versionGetters.map(pair => pair[0]))} tools. ` + `Check the server log for more details`);
|
|
107
78
|
};
|
|
108
79
|
|
|
109
80
|
manifestMethods.targetSdkVersionUsingPKG = async function targetSdkVersionUsingPKG(pkg, cmdOutput = null) {
|
|
110
81
|
let stdout = cmdOutput || (await this.shell(['dumpsys', 'package', pkg]));
|
|
111
82
|
let targetSdkVersion = new RegExp(/targetSdk=([^\s\s]+)/g).exec(stdout);
|
|
112
|
-
|
|
113
83
|
if (targetSdkVersion && targetSdkVersion.length >= 2) {
|
|
114
84
|
targetSdkVersion = targetSdkVersion[1];
|
|
115
85
|
} else {
|
|
116
86
|
targetSdkVersion = 0;
|
|
117
87
|
}
|
|
118
|
-
|
|
119
88
|
return parseInt(targetSdkVersion, 10);
|
|
120
89
|
};
|
|
121
90
|
|
|
@@ -124,81 +93,57 @@ manifestMethods.compileManifest = async function compileManifest(manifest, manif
|
|
|
124
93
|
platform,
|
|
125
94
|
platformPath
|
|
126
95
|
} = await (0, _helpers.getAndroidPlatformAndPath)(this.sdkRoot);
|
|
127
|
-
|
|
128
96
|
if (!platform) {
|
|
129
97
|
throw new Error('Cannot compile the manifest. The required platform does not exist (API level >= 17)');
|
|
130
98
|
}
|
|
131
|
-
|
|
132
99
|
const resultPath = `${manifest}.apk`;
|
|
133
|
-
|
|
134
100
|
const androidJarPath = _path.default.resolve(platformPath, 'android.jar');
|
|
135
|
-
|
|
136
101
|
if (await _support.fs.exists(resultPath)) {
|
|
137
102
|
await _support.fs.rimraf(resultPath);
|
|
138
103
|
}
|
|
139
|
-
|
|
140
104
|
try {
|
|
141
105
|
await this.initAapt2();
|
|
142
106
|
const args = ['link', '-o', resultPath, '--manifest', manifest, '--rename-manifest-package', manifestPackage, '--rename-instrumentation-target-package', targetPackage, '-I', androidJarPath, '-v'];
|
|
143
|
-
|
|
144
107
|
_logger.default.debug(`Compiling the manifest using '${_support.util.quote([this.binaries.aapt2, ...args])}'`);
|
|
145
|
-
|
|
146
108
|
await (0, _teen_process.exec)(this.binaries.aapt2, args);
|
|
147
109
|
} catch (e) {
|
|
148
110
|
_logger.default.debug('Cannot compile the manifest using aapt2. Defaulting to aapt. ' + `Original error: ${e.stderr || e.message}`);
|
|
149
|
-
|
|
150
111
|
await this.initAapt();
|
|
151
112
|
const args = ['package', '-M', manifest, '--rename-manifest-package', manifestPackage, '--rename-instrumentation-target-package', targetPackage, '-I', androidJarPath, '-F', resultPath, '-f'];
|
|
152
|
-
|
|
153
113
|
_logger.default.debug(`Compiling the manifest using '${_support.util.quote([this.binaries.aapt, ...args])}'`);
|
|
154
|
-
|
|
155
114
|
try {
|
|
156
115
|
await (0, _teen_process.exec)(this.binaries.aapt, args);
|
|
157
116
|
} catch (e1) {
|
|
158
117
|
throw new Error(`Cannot compile the manifest. Original error: ${e1.stderr || e1.message}`);
|
|
159
118
|
}
|
|
160
119
|
}
|
|
161
|
-
|
|
162
120
|
_logger.default.debug(`Compiled the manifest at '${resultPath}'`);
|
|
163
121
|
};
|
|
164
122
|
|
|
165
123
|
manifestMethods.insertManifest = async function insertManifest(manifest, srcApk, dstApk) {
|
|
166
124
|
_logger.default.debug(`Inserting manifest '${manifest}', src: '${srcApk}', dst: '${dstApk}'`);
|
|
167
|
-
|
|
168
125
|
await _support.zip.assertValidZip(srcApk);
|
|
169
126
|
await (0, _helpers.unzipFile)(`${manifest}.apk`);
|
|
170
|
-
|
|
171
127
|
const manifestName = _path.default.basename(manifest);
|
|
172
|
-
|
|
173
128
|
try {
|
|
174
129
|
await this.initAapt();
|
|
175
130
|
await _support.fs.copyFile(srcApk, dstApk);
|
|
176
|
-
|
|
177
131
|
_logger.default.debug('Moving manifest');
|
|
178
|
-
|
|
179
132
|
try {
|
|
180
133
|
await (0, _teen_process.exec)(this.binaries.aapt, ['remove', dstApk, manifestName]);
|
|
181
134
|
} catch (ign) {}
|
|
182
|
-
|
|
183
135
|
await (0, _teen_process.exec)(this.binaries.aapt, ['add', dstApk, manifestName], {
|
|
184
136
|
cwd: _path.default.dirname(manifest)
|
|
185
137
|
});
|
|
186
138
|
} catch (e) {
|
|
187
139
|
_logger.default.debug('Cannot insert manifest using aapt. Defaulting to zip. ' + `Original error: ${e.stderr || e.message}`);
|
|
188
|
-
|
|
189
140
|
const tmpRoot = await _support.tempDir.openDir();
|
|
190
|
-
|
|
191
141
|
try {
|
|
192
142
|
_logger.default.debug(`Extracting the source apk at '${srcApk}'`);
|
|
193
|
-
|
|
194
143
|
await _support.zip.extractAllTo(srcApk, tmpRoot);
|
|
195
|
-
|
|
196
144
|
_logger.default.debug('Moving manifest');
|
|
197
|
-
|
|
198
145
|
await _support.fs.mv(manifest, _path.default.resolve(tmpRoot, manifestName));
|
|
199
|
-
|
|
200
146
|
_logger.default.debug(`Collecting the destination apk at '${dstApk}'`);
|
|
201
|
-
|
|
202
147
|
await _support.zip.toArchive(dstApk, {
|
|
203
148
|
cwd: tmpRoot
|
|
204
149
|
});
|
|
@@ -206,24 +151,20 @@ manifestMethods.insertManifest = async function insertManifest(manifest, srcApk,
|
|
|
206
151
|
await _support.fs.rimraf(tmpRoot);
|
|
207
152
|
}
|
|
208
153
|
}
|
|
209
|
-
|
|
210
154
|
_logger.default.debug(`Manifest insertion into '${dstApk}' is completed`);
|
|
211
155
|
};
|
|
212
156
|
|
|
213
157
|
manifestMethods.hasInternetPermissionFromManifest = async function hasInternetPermissionFromManifest(appPath) {
|
|
214
158
|
_logger.default.debug(`Checking if '${appPath}' requires internet access permission in the manifest`);
|
|
215
|
-
|
|
216
159
|
if (appPath.endsWith(_helpers.APKS_EXTENSION)) {
|
|
217
160
|
appPath = await this.extractBaseApk(appPath);
|
|
218
161
|
}
|
|
219
|
-
|
|
220
162
|
const apkReader = await _adbkitApkreader.default.open(appPath);
|
|
221
163
|
const manifest = await apkReader.readManifest();
|
|
222
164
|
return (manifest.usesPermissions || []).some(({
|
|
223
165
|
name
|
|
224
166
|
}) => name === 'android.permission.INTERNET');
|
|
225
167
|
};
|
|
226
|
-
|
|
227
168
|
var _default = manifestMethods;
|
|
228
169
|
exports.default = _default;
|
|
229
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJtYW5pZmVzdE1ldGhvZHMiLCJwYWNrYWdlQW5kTGF1bmNoQWN0aXZpdHlGcm9tTWFuaWZlc3QiLCJhcHBQYXRoIiwiZW5kc1dpdGgiLCJBUEtTX0VYVEVOU0lPTiIsImV4dHJhY3RCYXNlQXBrIiwibWFuaWZlc3QiLCJhcGtSZWFkZXIiLCJBcGtSZWFkZXIiLCJvcGVuIiwicmVhZE1hbmlmZXN0IiwiZSIsImxvZyIsImRlYnVnIiwiRXJyb3IiLCJwa2ciLCJhY3Rpdml0eSIsInBhcnNlTWFuaWZlc3QiLCJpbmZvIiwiYXBrUGFja2FnZSIsImFwa0FjdGl2aXR5IiwidGFyZ2V0U2RrVmVyc2lvbkZyb21NYW5pZmVzdCIsIm9yaWdpbmFsQXBwUGF0aCIsImdldFRhcmdldFNka1ZpYUFwa1JlYWRlciIsInVzZXNTZGsiLCJfIiwiaXNJbnRlZ2VyIiwidGFyZ2V0U2RrVmVyc2lvbiIsImdldFRhcmdldFNka1ZpYUFhcHQiLCJpbml0QWFwdCIsImFyZ3MiLCJzdGRvdXQiLCJleGVjIiwiYmluYXJpZXMiLCJhYXB0IiwicGFyc2VJbnQiLCJ2ZXJzaW9uR2V0dGVycyIsInRvb2xOYW1lIiwidmVyc2lvbkdldHRlciIsIm1lc3NhZ2UiLCJKU09OIiwic3RyaW5naWZ5IiwibWFwIiwicGFpciIsInRhcmdldFNka1ZlcnNpb25Vc2luZ1BLRyIsImNtZE91dHB1dCIsInNoZWxsIiwiUmVnRXhwIiwibGVuZ3RoIiwiY29tcGlsZU1hbmlmZXN0IiwibWFuaWZlc3RQYWNrYWdlIiwidGFyZ2V0UGFja2FnZSIsInBsYXRmb3JtIiwicGxhdGZvcm1QYXRoIiwiZ2V0QW5kcm9pZFBsYXRmb3JtQW5kUGF0aCIsInNka1Jvb3QiLCJyZXN1bHRQYXRoIiwiYW5kcm9pZEphclBhdGgiLCJwYXRoIiwicmVzb2x2ZSIsImZzIiwiZXhpc3RzIiwicmltcmFmIiwiaW5pdEFhcHQyIiwidXRpbCIsInF1b3RlIiwiYWFwdDIiLCJzdGRlcnIiLCJlMSIsImluc2VydE1hbmlmZXN0Iiwic3JjQXBrIiwiZHN0QXBrIiwiemlwIiwiYXNzZXJ0VmFsaWRaaXAiLCJ1bnppcEZpbGUiLCJtYW5pZmVzdE5hbWUiLCJiYXNlbmFtZSIsImNvcHlGaWxlIiwiaWduIiwiY3dkIiwiZGlybmFtZSIsInRtcFJvb3QiLCJ0ZW1wRGlyIiwib3BlbkRpciIsImV4dHJhY3RBbGxUbyIsIm12IiwidG9BcmNoaXZlIiwiaGFzSW50ZXJuZXRQZXJtaXNzaW9uRnJvbU1hbmlmZXN0IiwidXNlc1Blcm1pc3Npb25zIiwic29tZSIsIm5hbWUiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvdG9vbHMvYW5kcm9pZC1tYW5pZmVzdC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleGVjIH0gZnJvbSAndGVlbl9wcm9jZXNzJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7XG4gIGdldEFuZHJvaWRQbGF0Zm9ybUFuZFBhdGgsIHVuemlwRmlsZSxcbiAgQVBLU19FWFRFTlNJT04sIHBhcnNlTWFuaWZlc3QgfSBmcm9tICcuLi9oZWxwZXJzLmpzJztcbmltcG9ydCB7IGZzLCB6aXAsIHRlbXBEaXIsIHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IEFwa1JlYWRlciBmcm9tICdhZGJraXQtYXBrcmVhZGVyJztcblxubGV0IG1hbmlmZXN0TWV0aG9kcyA9IHt9O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEFQS0luZm9cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcGtQYWNrYWdlIC0gVGhlIG5hbWUgb2YgYXBwbGljYXRpb24gcGFja2FnZSwgZm9yIGV4YW1wbGUgJ2NvbS5hY21lLmFwcCcuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXBrQWN0aXZpdHkgLSBUaGUgbmFtZSBvZiBtYWluIGFwcGxpY2F0aW9uIGFjdGl2aXR5LlxuICovXG5cbi8qKlxuICogRXh0cmFjdCBwYWNrYWdlIGFuZCBtYWluIGFjdGl2aXR5IG5hbWUgZnJvbSBhcHBsaWNhdGlvbiBtYW5pZmVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBwUGF0aCAtIFRoZSBmdWxsIHBhdGggdG8gYXBwbGljYXRpb24gLmFwayhzKSBwYWNrYWdlXG4gKiBAcmV0dXJuIHtBUEtJbmZvfSBUaGUgcGFyc2VkIGFwcGxpY2F0aW9uIGluZm8uXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGdldHRpbmcgdGhlIGRhdGEgZnJvbSB0aGUgZ2l2ZW5cbiAqICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBwYWNrYWdlLlxuICovXG5tYW5pZmVzdE1ldGhvZHMucGFja2FnZUFuZExhdW5jaEFjdGl2aXR5RnJvbU1hbmlmZXN0ID0gYXN5bmMgZnVuY3Rpb24gcGFja2FnZUFuZExhdW5jaEFjdGl2aXR5RnJvbU1hbmlmZXN0IChhcHBQYXRoKSB7XG4gIGlmIChhcHBQYXRoLmVuZHNXaXRoKEFQS1NfRVhURU5TSU9OKSkge1xuICAgIGFwcFBhdGggPSBhd2FpdCB0aGlzLmV4dHJhY3RCYXNlQXBrKGFwcFBhdGgpO1xuICB9XG5cbiAgbGV0IG1hbmlmZXN0O1xuICB0cnkge1xuICAgIGNvbnN0IGFwa1JlYWRlciA9IGF3YWl0IEFwa1JlYWRlci5vcGVuKGFwcFBhdGgpO1xuICAgIG1hbmlmZXN0ID0gYXdhaXQgYXBrUmVhZGVyLnJlYWRNYW5pZmVzdCgpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nLmRlYnVnKGUpO1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGV4dHJhY3QgYSBtYW5pZmVzdCBmcm9tICcke2FwcFBhdGh9Jy4gYCArXG4gICAgICBgSXMgaXQgYSB2YWxpZCBBbmRyb2lkIGFwcGxpY2F0aW9uP2ApO1xuICB9XG4gIGNvbnN0IHtwa2csIGFjdGl2aXR5fSA9IHBhcnNlTWFuaWZlc3QobWFuaWZlc3QpO1xuICBsb2cuaW5mbyhgUGFja2FnZSBuYW1lOiAnJHtwa2d9J2ApO1xuICBsb2cuaW5mbyhgTWFpbiBhY3Rpdml0eSBuYW1lOiAnJHthY3Rpdml0eX0nYCk7XG4gIHJldHVybiB7XG4gICAgYXBrUGFja2FnZTogcGtnLFxuICAgIGFwa0FjdGl2aXR5OiBhY3Rpdml0eSxcbiAgfTtcbn07XG5cbi8qKlxuICogRXh0cmFjdCB0YXJnZXQgU0RLIHZlcnNpb24gZnJvbSBhcHBsaWNhdGlvbiBtYW5pZmVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBwUGF0aCAtIFRoZSBmdWxsIHBhdGggdG8gLmFwayhzKSBwYWNrYWdlLlxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgdmVyc2lvbiBvZiB0aGUgdGFyZ2V0IFNESy5cbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgZ2V0dGluZyB0aGUgZGF0YSBmcm9tIHRoZSBnaXZlblxuICogICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHBhY2thZ2UuXG4gKi9cbm1hbmlmZXN0TWV0aG9kcy50YXJnZXRTZGtWZXJzaW9uRnJvbU1hbmlmZXN0ID0gYXN5bmMgZnVuY3Rpb24gdGFyZ2V0U2RrVmVyc2lvbkZyb21NYW5pZmVzdCAoYXBwUGF0aCkge1xuICBsb2cuZGVidWcoYEV4dHJhY3RpbmcgdGFyZ2V0IFNESyB2ZXJzaW9uIG9mICcke2FwcFBhdGh9J2ApO1xuICBjb25zdCBvcmlnaW5hbEFwcFBhdGggPSBhcHBQYXRoO1xuICBpZiAoYXBwUGF0aC5lbmRzV2l0aChBUEtTX0VYVEVOU0lPTikpIHtcbiAgICBhcHBQYXRoID0gYXdhaXQgdGhpcy5leHRyYWN0QmFzZUFwayhhcHBQYXRoKTtcbiAgfVxuXG4gIGNvbnN0IGdldFRhcmdldFNka1ZpYUFwa1JlYWRlciA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhcGtSZWFkZXIgPSBhd2FpdCBBcGtSZWFkZXIub3BlbihhcHBQYXRoKTtcbiAgICBjb25zdCBtYW5pZmVzdCA9IGF3YWl0IGFwa1JlYWRlci5yZWFkTWFuaWZlc3QoKTtcbiAgICBpZiAobWFuaWZlc3QudXNlc1NkayAmJiBfLmlzSW50ZWdlcihtYW5pZmVzdC51c2VzU2RrLnRhcmdldFNka1ZlcnNpb24pKSB7XG4gICAgICByZXR1cm4gbWFuaWZlc3QudXNlc1Nkay50YXJnZXRTZGtWZXJzaW9uO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBmaW5kIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0YXJnZXRTZGtWZXJzaW9uIGluIHRoZSBtYW5pZmVzdCcpO1xuICB9O1xuICBjb25zdCBnZXRUYXJnZXRTZGtWaWFBYXB0ID0gYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHRoaXMuaW5pdEFhcHQoKTtcbiAgICBjb25zdCBhcmdzID0gWydkdW1wJywgJ2JhZGdpbmcnLCBhcHBQYXRoXTtcbiAgICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IGV4ZWModGhpcy5iaW5hcmllcy5hYXB0LCBhcmdzKTtcbiAgICBjb25zdCB0YXJnZXRTZGtWZXJzaW9uID0gL3RhcmdldFNka1ZlcnNpb246JyhbXiddKyknL2cuZXhlYyhzdGRvdXQpO1xuICAgIGlmICghdGFyZ2V0U2RrVmVyc2lvbikge1xuICAgICAgbG9nLmRlYnVnKHN0ZG91dCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBwYXJzZSB0aGUgY29tbWFuZCBvdXRwdXQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlSW50KHRhcmdldFNka1ZlcnNpb25bMV0sIDEwKTtcbiAgfTtcbiAgY29uc3QgdmVyc2lvbkdldHRlcnMgPSBbXG4gICAgWydBcGtSZWFkZXInLCBnZXRUYXJnZXRTZGtWaWFBcGtSZWFkZXJdLFxuICAgIFsnYWFwdCcsIGdldFRhcmdldFNka1ZpYUFhcHRdLFxuICBdO1xuICBmb3IgKGNvbnN0IFt0b29sTmFtZSwgdmVyc2lvbkdldHRlcl0gb2YgdmVyc2lvbkdldHRlcnMpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHZlcnNpb25HZXR0ZXIoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2cuaW5mbyhgQ2Fubm90IGV4dHJhY3QgdGFyZ2V0U2RrVmVyc2lvbiBvZiAnJHtvcmlnaW5hbEFwcFBhdGh9JyB1c2luZyAke3Rvb2xOYW1lfS4gYCArXG4gICAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGV4dHJhY3QgdGhlIHRhcmdldCBTREsgdmVyc2lvbiBudW1iZXIgb2YgJyR7b3JpZ2luYWxBcHBQYXRofScgdXNpbmcgZWl0aGVyIG9mIGAgK1xuICAgIGAke0pTT04uc3RyaW5naWZ5KHZlcnNpb25HZXR0ZXJzLm1hcCgocGFpcikgPT4gcGFpclswXSkpfSB0b29scy4gYCArXG4gICAgYENoZWNrIHRoZSBzZXJ2ZXIgbG9nIGZvciBtb3JlIGRldGFpbHNgKTtcbn07XG5cbi8qKlxuICogRXh0cmFjdCB0YXJnZXQgU0RLIHZlcnNpb24gZnJvbSBwYWNrYWdlIGluZm9ybWF0aW9uLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgY2xhc3MgbmFtZSBvZiB0aGUgcGFja2FnZSBpbnN0YWxsZWQgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICogQHBhcmFtIHs/c3RyaW5nfSBjbWRPdXRwdXQgLSBPcHRpb25hbCBwYXJhbWV0ZXIgY29udGFpbmluZyB0aGUgb3V0cHV0IG9mXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kdW1wc3lzIHBhY2thZ2VfIGNvbW1hbmQuIEl0IG1heSBzcGVlZCB1cCB0aGUgbWV0aG9kIGV4ZWN1dGlvbi5cbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHZlcnNpb24gb2YgdGhlIHRhcmdldCBTREsuXG4gKi9cbm1hbmlmZXN0TWV0aG9kcy50YXJnZXRTZGtWZXJzaW9uVXNpbmdQS0cgPSBhc3luYyBmdW5jdGlvbiB0YXJnZXRTZGtWZXJzaW9uVXNpbmdQS0cgKHBrZywgY21kT3V0cHV0ID0gbnVsbCkge1xuICBsZXQgc3Rkb3V0ID0gY21kT3V0cHV0IHx8IGF3YWl0IHRoaXMuc2hlbGwoWydkdW1wc3lzJywgJ3BhY2thZ2UnLCBwa2ddKTtcbiAgbGV0IHRhcmdldFNka1ZlcnNpb24gPSBuZXcgUmVnRXhwKC90YXJnZXRTZGs9KFteXFxzXFxzXSspL2cpLmV4ZWMoc3Rkb3V0KTtcbiAgaWYgKHRhcmdldFNka1ZlcnNpb24gJiYgdGFyZ2V0U2RrVmVyc2lvbi5sZW5ndGggPj0gMikge1xuICAgIHRhcmdldFNka1ZlcnNpb24gPSB0YXJnZXRTZGtWZXJzaW9uWzFdO1xuICB9IGVsc2Uge1xuICAgIC8vIHRhcmdldFNkayBub3QgZm91bmQgaW4gdGhlIGR1bXAsIGFzc2lnbmluZyAwIHRvIHRhcmdldFNka1ZlcnNpb25cbiAgICB0YXJnZXRTZGtWZXJzaW9uID0gMDtcbiAgfVxuICByZXR1cm4gcGFyc2VJbnQodGFyZ2V0U2RrVmVyc2lvbiwgMTApO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIHBhY2thZ2UgbWFuaWZlc3QgKHVzdWFsbHkgQW5kcm9pZE1hbmlmZXN0LnhtbCkuXG4gKiBgJHttYW5pZmVzdH0uYXBrYCBmaWxlIHdpbGwgYmUgY3JlYXRlZCBhcyB0aGUgcmVzdWx0IG9mIHRoaXMgbWV0aG9kXG4gKiBjb250YWluaW5nIHRoZSBjb21waWxlZCBtYW5pZmVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbWFuaWZlc3QgLSBGdWxsIHBhdGggdG8gdGhlIGluaXRpYWwgbWFuaWZlc3QgdGVtcGxhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBtYW5pZmVzdFBhY2thZ2UgLSBUaGUgbmFtZSBvZiB0aGUgbWFuaWZlc3QgcGFja2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IHRhcmdldFBhY2thZ2UgLSBUaGUgbmFtZSBvZiB0aGUgZGVzdGluYXRpb24gcGFja2FnZVxuICovXG5tYW5pZmVzdE1ldGhvZHMuY29tcGlsZU1hbmlmZXN0ID0gYXN5bmMgZnVuY3Rpb24gY29tcGlsZU1hbmlmZXN0IChtYW5pZmVzdCwgbWFuaWZlc3RQYWNrYWdlLCB0YXJnZXRQYWNrYWdlKSB7XG4gIGNvbnN0IHtwbGF0Zm9ybSwgcGxhdGZvcm1QYXRofSA9IGF3YWl0IGdldEFuZHJvaWRQbGF0Zm9ybUFuZFBhdGgodGhpcy5zZGtSb290KTtcbiAgaWYgKCFwbGF0Zm9ybSkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNvbXBpbGUgdGhlIG1hbmlmZXN0LiBUaGUgcmVxdWlyZWQgcGxhdGZvcm0gZG9lcyBub3QgZXhpc3QgKEFQSSBsZXZlbCA+PSAxNyknKTtcbiAgfVxuICBjb25zdCByZXN1bHRQYXRoID0gYCR7bWFuaWZlc3R9LmFwa2A7XG4gIGNvbnN0IGFuZHJvaWRKYXJQYXRoID0gcGF0aC5yZXNvbHZlKHBsYXRmb3JtUGF0aCwgJ2FuZHJvaWQuamFyJyk7XG4gIGlmIChhd2FpdCBmcy5leGlzdHMocmVzdWx0UGF0aCkpIHtcbiAgICBhd2FpdCBmcy5yaW1yYWYocmVzdWx0UGF0aCk7XG4gIH1cbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLmluaXRBYXB0MigpO1xuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3N0dWRpby9jb21tYW5kLWxpbmUvYWFwdDJcbiAgICBjb25zdCBhcmdzID0gW1xuICAgICAgJ2xpbmsnLFxuICAgICAgJy1vJywgcmVzdWx0UGF0aCxcbiAgICAgICctLW1hbmlmZXN0JywgbWFuaWZlc3QsXG4gICAgICAnLS1yZW5hbWUtbWFuaWZlc3QtcGFja2FnZScsIG1hbmlmZXN0UGFja2FnZSxcbiAgICAgICctLXJlbmFtZS1pbnN0cnVtZW50YXRpb24tdGFyZ2V0LXBhY2thZ2UnLCB0YXJnZXRQYWNrYWdlLFxuICAgICAgJy1JJywgYW5kcm9pZEphclBhdGgsXG4gICAgICAnLXYnLFxuICAgIF07XG4gICAgbG9nLmRlYnVnKGBDb21waWxpbmcgdGhlIG1hbmlmZXN0IHVzaW5nICcke3V0aWwucXVvdGUoW3RoaXMuYmluYXJpZXMuYWFwdDIsIC4uLmFyZ3NdKX0nYCk7XG4gICAgYXdhaXQgZXhlYyh0aGlzLmJpbmFyaWVzLmFhcHQyLCBhcmdzKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZy5kZWJ1ZygnQ2Fubm90IGNvbXBpbGUgdGhlIG1hbmlmZXN0IHVzaW5nIGFhcHQyLiBEZWZhdWx0aW5nIHRvIGFhcHQuICcgK1xuICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2Uuc3RkZXJyIHx8IGUubWVzc2FnZX1gKTtcbiAgICBhd2FpdCB0aGlzLmluaXRBYXB0KCk7XG4gICAgY29uc3QgYXJncyA9IFtcbiAgICAgICdwYWNrYWdlJyxcbiAgICAgICctTScsIG1hbmlmZXN0LFxuICAgICAgJy0tcmVuYW1lLW1hbmlmZXN0LXBhY2thZ2UnLCBtYW5pZmVzdFBhY2thZ2UsXG4gICAgICAnLS1yZW5hbWUtaW5zdHJ1bWVudGF0aW9uLXRhcmdldC1wYWNrYWdlJywgdGFyZ2V0UGFja2FnZSxcbiAgICAgICctSScsIGFuZHJvaWRKYXJQYXRoLFxuICAgICAgJy1GJywgcmVzdWx0UGF0aCxcbiAgICAgICctZicsXG4gICAgXTtcbiAgICBsb2cuZGVidWcoYENvbXBpbGluZyB0aGUgbWFuaWZlc3QgdXNpbmcgJyR7dXRpbC5xdW90ZShbdGhpcy5iaW5hcmllcy5hYXB0LCAuLi5hcmdzXSl9J2ApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGVjKHRoaXMuYmluYXJpZXMuYWFwdCwgYXJncyk7XG4gICAgfSBjYXRjaCAoZTEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvbXBpbGUgdGhlIG1hbmlmZXN0LiBPcmlnaW5hbCBlcnJvcjogJHtlMS5zdGRlcnIgfHwgZTEubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cbiAgbG9nLmRlYnVnKGBDb21waWxlZCB0aGUgbWFuaWZlc3QgYXQgJyR7cmVzdWx0UGF0aH0nYCk7XG59O1xuXG4vKipcbiAqIFJlcGxhY2UvaW5zZXJ0IHRoZSBzcGVjaWFsbHkgcHJlY29tcGlsZWQgbWFuaWZlc3QgZmlsZSBpbnRvIHRoZVxuICogcGFydGljdWxhciBwYWNrYWdlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtYW5pZmVzdCAtIEZ1bGwgcGF0aCB0byB0aGUgcHJlY29tcGlsZWQgbWFuaWZlc3RcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWQgYnkgYGNvbXBpbGVNYW5pZmVzdGAgbWV0aG9kIGNhbGxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhvdXQgLmFwayBleHRlbnNpb25cbiAqIEBwYXJhbSB7c3RyaW5nfSBzcmNBcGsgLSBGdWxsIHBhdGggdG8gdGhlIGV4aXN0aW5nIHZhbGlkIGFwcGxpY2F0aW9uIHBhY2thZ2UsIHdoZXJlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBtYW5pZmVzdCBoYXMgdG8gYmUgaW5zZXRyZWQgdG8uIFRoaXMgcGFja2FnZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgTk9UIGJlIG1vZGlmaWVkLlxuICogQHBhcmFtIHtzdHJpbmd9IGRzdEFwayAtIEZ1bGwgcGF0aCB0byB0aGUgcmVzdWx0aW5nIHBhY2thZ2UuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGZpbGUgd2lsbCBiZSBvdmVycmlkZGVuIGlmIGl0IGFscmVhZHkgZXhpc3RzLlxuICovXG5tYW5pZmVzdE1ldGhvZHMuaW5zZXJ0TWFuaWZlc3QgPSBhc3luYyBmdW5jdGlvbiBpbnNlcnRNYW5pZmVzdCAobWFuaWZlc3QsIHNyY0FwaywgZHN0QXBrKSB7XG4gIGxvZy5kZWJ1ZyhgSW5zZXJ0aW5nIG1hbmlmZXN0ICcke21hbmlmZXN0fScsIHNyYzogJyR7c3JjQXBrfScsIGRzdDogJyR7ZHN0QXBrfSdgKTtcbiAgYXdhaXQgemlwLmFzc2VydFZhbGlkWmlwKHNyY0Fwayk7XG4gIGF3YWl0IHVuemlwRmlsZShgJHttYW5pZmVzdH0uYXBrYCk7XG4gIGNvbnN0IG1hbmlmZXN0TmFtZSA9IHBhdGguYmFzZW5hbWUobWFuaWZlc3QpO1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuaW5pdEFhcHQoKTtcbiAgICBhd2FpdCBmcy5jb3B5RmlsZShzcmNBcGssIGRzdEFwayk7XG4gICAgbG9nLmRlYnVnKCdNb3ZpbmcgbWFuaWZlc3QnKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZXhlYyh0aGlzLmJpbmFyaWVzLmFhcHQsIFtcbiAgICAgICAgJ3JlbW92ZScsIGRzdEFwaywgbWFuaWZlc3ROYW1lXG4gICAgICBdKTtcbiAgICB9IGNhdGNoIChpZ24pIHt9XG4gICAgYXdhaXQgZXhlYyh0aGlzLmJpbmFyaWVzLmFhcHQsIFtcbiAgICAgICdhZGQnLCBkc3RBcGssIG1hbmlmZXN0TmFtZVxuICAgIF0sIHtjd2Q6IHBhdGguZGlybmFtZShtYW5pZmVzdCl9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZy5kZWJ1ZygnQ2Fubm90IGluc2VydCBtYW5pZmVzdCB1c2luZyBhYXB0LiBEZWZhdWx0aW5nIHRvIHppcC4gJyArXG4gICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5zdGRlcnIgfHwgZS5tZXNzYWdlfWApO1xuICAgIGNvbnN0IHRtcFJvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgICB0cnkge1xuICAgICAgLy8gVW5mb3J0dW5hdGVseSBOb2RlSlMgZG9lcyBub3QgcHJvdmlkZSBhbnkgcmVsaWFibGUgbWV0aG9kc1xuICAgICAgLy8gdG8gcmVwbGFjZSBmaWxlcyBpbnNpZGUgemlwIGFyY2hpdmVzIHdpdGhvdXQgbG9hZGluZyB0aGVcbiAgICAgIC8vIHdob2xlIGFyY2hpdmUgY29udGVudCBpbnRvIFJBTVxuICAgICAgbG9nLmRlYnVnKGBFeHRyYWN0aW5nIHRoZSBzb3VyY2UgYXBrIGF0ICcke3NyY0Fwa30nYCk7XG4gICAgICBhd2FpdCB6aXAuZXh0cmFjdEFsbFRvKHNyY0FwaywgdG1wUm9vdCk7XG4gICAgICBsb2cuZGVidWcoJ01vdmluZyBtYW5pZmVzdCcpO1xuICAgICAgYXdhaXQgZnMubXYobWFuaWZlc3QsIHBhdGgucmVzb2x2ZSh0bXBSb290LCBtYW5pZmVzdE5hbWUpKTtcbiAgICAgIGxvZy5kZWJ1ZyhgQ29sbGVjdGluZyB0aGUgZGVzdGluYXRpb24gYXBrIGF0ICcke2RzdEFwa30nYCk7XG4gICAgICBhd2FpdCB6aXAudG9BcmNoaXZlKGRzdEFwaywge1xuICAgICAgICBjd2Q6IHRtcFJvb3QsXG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgZnMucmltcmFmKHRtcFJvb3QpO1xuICAgIH1cbiAgfVxuICBsb2cuZGVidWcoYE1hbmlmZXN0IGluc2VydGlvbiBpbnRvICcke2RzdEFwa30nIGlzIGNvbXBsZXRlZGApO1xufTtcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHBhY2thZ2UgbWFuaWZlc3QgY29udGFpbnMgSW50ZXJuZXQgcGVybWlzc2lvbnMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwcFBhdGggLSBUaGUgZnVsbCBwYXRoIHRvIC5hcGsocykgcGFja2FnZS5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIG1hbmlmZXN0IHJlcXVpcmVzIEludGVybmV0IGFjY2VzcyBwZXJtaXNzaW9uLlxuICovXG5tYW5pZmVzdE1ldGhvZHMuaGFzSW50ZXJuZXRQZXJtaXNzaW9uRnJvbU1hbmlmZXN0ID0gYXN5bmMgZnVuY3Rpb24gaGFzSW50ZXJuZXRQZXJtaXNzaW9uRnJvbU1hbmlmZXN0IChhcHBQYXRoKSB7XG4gIGxvZy5kZWJ1ZyhgQ2hlY2tpbmcgaWYgJyR7YXBwUGF0aH0nIHJlcXVpcmVzIGludGVybmV0IGFjY2VzcyBwZXJtaXNzaW9uIGluIHRoZSBtYW5pZmVzdGApO1xuICBpZiAoYXBwUGF0aC5lbmRzV2l0aChBUEtTX0VYVEVOU0lPTikpIHtcbiAgICBhcHBQYXRoID0gYXdhaXQgdGhpcy5leHRyYWN0QmFzZUFwayhhcHBQYXRoKTtcbiAgfVxuXG4gIGNvbnN0IGFwa1JlYWRlciA9IGF3YWl0IEFwa1JlYWRlci5vcGVuKGFwcFBhdGgpO1xuICBjb25zdCBtYW5pZmVzdCA9IGF3YWl0IGFwa1JlYWRlci5yZWFkTWFuaWZlc3QoKTtcbiAgcmV0dXJuIChtYW5pZmVzdC51c2VzUGVybWlzc2lvbnMgfHwgW10pLnNvbWUoKHtuYW1lfSkgPT4gbmFtZSA9PT0gJ2FuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCcpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgbWFuaWZlc3RNZXRob2RzO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUdBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLElBQUlBLGVBQWUsR0FBRyxFQUF0Qjs7QUFnQkFBLGVBQWUsQ0FBQ0Msb0NBQWhCLEdBQXVELGVBQWVBLG9DQUFmLENBQXFEQyxPQUFyRCxFQUE4RDtFQUNuSCxJQUFJQSxPQUFPLENBQUNDLFFBQVIsQ0FBaUJDLHVCQUFqQixDQUFKLEVBQXNDO0lBQ3BDRixPQUFPLEdBQUcsTUFBTSxLQUFLRyxjQUFMLENBQW9CSCxPQUFwQixDQUFoQjtFQUNEOztFQUVELElBQUlJLFFBQUo7O0VBQ0EsSUFBSTtJQUNGLE1BQU1DLFNBQVMsR0FBRyxNQUFNQyx3QkFBQSxDQUFVQyxJQUFWLENBQWVQLE9BQWYsQ0FBeEI7SUFDQUksUUFBUSxHQUFHLE1BQU1DLFNBQVMsQ0FBQ0csWUFBVixFQUFqQjtFQUNELENBSEQsQ0FHRSxPQUFPQyxDQUFQLEVBQVU7SUFDVkMsZUFBQSxDQUFJQyxLQUFKLENBQVVGLENBQVY7O0lBQ0EsTUFBTSxJQUFJRyxLQUFKLENBQVcsbUNBQWtDWixPQUFRLEtBQTNDLEdBQ2Isb0NBREcsQ0FBTjtFQUVEOztFQUNELE1BQU07SUFBQ2EsR0FBRDtJQUFNQztFQUFOLElBQWtCLElBQUFDLHNCQUFBLEVBQWNYLFFBQWQsQ0FBeEI7O0VBQ0FNLGVBQUEsQ0FBSU0sSUFBSixDQUFVLGtCQUFpQkgsR0FBSSxHQUEvQjs7RUFDQUgsZUFBQSxDQUFJTSxJQUFKLENBQVUsd0JBQXVCRixRQUFTLEdBQTFDOztFQUNB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
|
|
170
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJtYW5pZmVzdE1ldGhvZHMiLCJwYWNrYWdlQW5kTGF1bmNoQWN0aXZpdHlGcm9tTWFuaWZlc3QiLCJhcHBQYXRoIiwiZW5kc1dpdGgiLCJBUEtTX0VYVEVOU0lPTiIsImV4dHJhY3RCYXNlQXBrIiwibWFuaWZlc3QiLCJhcGtSZWFkZXIiLCJBcGtSZWFkZXIiLCJvcGVuIiwicmVhZE1hbmlmZXN0IiwiZSIsImxvZyIsImRlYnVnIiwiRXJyb3IiLCJwa2ciLCJhY3Rpdml0eSIsInBhcnNlTWFuaWZlc3QiLCJpbmZvIiwiYXBrUGFja2FnZSIsImFwa0FjdGl2aXR5IiwidGFyZ2V0U2RrVmVyc2lvbkZyb21NYW5pZmVzdCIsIm9yaWdpbmFsQXBwUGF0aCIsImdldFRhcmdldFNka1ZpYUFwa1JlYWRlciIsInVzZXNTZGsiLCJfIiwiaXNJbnRlZ2VyIiwidGFyZ2V0U2RrVmVyc2lvbiIsImdldFRhcmdldFNka1ZpYUFhcHQiLCJpbml0QWFwdCIsImFyZ3MiLCJzdGRvdXQiLCJleGVjIiwiYmluYXJpZXMiLCJhYXB0IiwicGFyc2VJbnQiLCJ2ZXJzaW9uR2V0dGVycyIsInRvb2xOYW1lIiwidmVyc2lvbkdldHRlciIsIm1lc3NhZ2UiLCJKU09OIiwic3RyaW5naWZ5IiwibWFwIiwicGFpciIsInRhcmdldFNka1ZlcnNpb25Vc2luZ1BLRyIsImNtZE91dHB1dCIsInNoZWxsIiwiUmVnRXhwIiwibGVuZ3RoIiwiY29tcGlsZU1hbmlmZXN0IiwibWFuaWZlc3RQYWNrYWdlIiwidGFyZ2V0UGFja2FnZSIsInBsYXRmb3JtIiwicGxhdGZvcm1QYXRoIiwiZ2V0QW5kcm9pZFBsYXRmb3JtQW5kUGF0aCIsInNka1Jvb3QiLCJyZXN1bHRQYXRoIiwiYW5kcm9pZEphclBhdGgiLCJwYXRoIiwicmVzb2x2ZSIsImZzIiwiZXhpc3RzIiwicmltcmFmIiwiaW5pdEFhcHQyIiwidXRpbCIsInF1b3RlIiwiYWFwdDIiLCJzdGRlcnIiLCJlMSIsImluc2VydE1hbmlmZXN0Iiwic3JjQXBrIiwiZHN0QXBrIiwiemlwIiwiYXNzZXJ0VmFsaWRaaXAiLCJ1bnppcEZpbGUiLCJtYW5pZmVzdE5hbWUiLCJiYXNlbmFtZSIsImNvcHlGaWxlIiwiaWduIiwiY3dkIiwiZGlybmFtZSIsInRtcFJvb3QiLCJ0ZW1wRGlyIiwib3BlbkRpciIsImV4dHJhY3RBbGxUbyIsIm12IiwidG9BcmNoaXZlIiwiaGFzSW50ZXJuZXRQZXJtaXNzaW9uRnJvbU1hbmlmZXN0IiwidXNlc1Blcm1pc3Npb25zIiwic29tZSIsIm5hbWUiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvdG9vbHMvYW5kcm9pZC1tYW5pZmVzdC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleGVjIH0gZnJvbSAndGVlbl9wcm9jZXNzJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7XG4gIGdldEFuZHJvaWRQbGF0Zm9ybUFuZFBhdGgsIHVuemlwRmlsZSxcbiAgQVBLU19FWFRFTlNJT04sIHBhcnNlTWFuaWZlc3QgfSBmcm9tICcuLi9oZWxwZXJzLmpzJztcbmltcG9ydCB7IGZzLCB6aXAsIHRlbXBEaXIsIHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IEFwa1JlYWRlciBmcm9tICdhZGJraXQtYXBrcmVhZGVyJztcblxubGV0IG1hbmlmZXN0TWV0aG9kcyA9IHt9O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEFQS0luZm9cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcGtQYWNrYWdlIC0gVGhlIG5hbWUgb2YgYXBwbGljYXRpb24gcGFja2FnZSwgZm9yIGV4YW1wbGUgJ2NvbS5hY21lLmFwcCcuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXBrQWN0aXZpdHkgLSBUaGUgbmFtZSBvZiBtYWluIGFwcGxpY2F0aW9uIGFjdGl2aXR5LlxuICovXG5cbi8qKlxuICogRXh0cmFjdCBwYWNrYWdlIGFuZCBtYWluIGFjdGl2aXR5IG5hbWUgZnJvbSBhcHBsaWNhdGlvbiBtYW5pZmVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBwUGF0aCAtIFRoZSBmdWxsIHBhdGggdG8gYXBwbGljYXRpb24gLmFwayhzKSBwYWNrYWdlXG4gKiBAcmV0dXJuIHtBUEtJbmZvfSBUaGUgcGFyc2VkIGFwcGxpY2F0aW9uIGluZm8uXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGdldHRpbmcgdGhlIGRhdGEgZnJvbSB0aGUgZ2l2ZW5cbiAqICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBwYWNrYWdlLlxuICovXG5tYW5pZmVzdE1ldGhvZHMucGFja2FnZUFuZExhdW5jaEFjdGl2aXR5RnJvbU1hbmlmZXN0ID0gYXN5bmMgZnVuY3Rpb24gcGFja2FnZUFuZExhdW5jaEFjdGl2aXR5RnJvbU1hbmlmZXN0IChhcHBQYXRoKSB7XG4gIGlmIChhcHBQYXRoLmVuZHNXaXRoKEFQS1NfRVhURU5TSU9OKSkge1xuICAgIGFwcFBhdGggPSBhd2FpdCB0aGlzLmV4dHJhY3RCYXNlQXBrKGFwcFBhdGgpO1xuICB9XG5cbiAgbGV0IG1hbmlmZXN0O1xuICB0cnkge1xuICAgIGNvbnN0IGFwa1JlYWRlciA9IGF3YWl0IEFwa1JlYWRlci5vcGVuKGFwcFBhdGgpO1xuICAgIG1hbmlmZXN0ID0gYXdhaXQgYXBrUmVhZGVyLnJlYWRNYW5pZmVzdCgpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nLmRlYnVnKGUpO1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGV4dHJhY3QgYSBtYW5pZmVzdCBmcm9tICcke2FwcFBhdGh9Jy4gYCArXG4gICAgICBgSXMgaXQgYSB2YWxpZCBBbmRyb2lkIGFwcGxpY2F0aW9uP2ApO1xuICB9XG4gIGNvbnN0IHtwa2csIGFjdGl2aXR5fSA9IHBhcnNlTWFuaWZlc3QobWFuaWZlc3QpO1xuICBsb2cuaW5mbyhgUGFja2FnZSBuYW1lOiAnJHtwa2d9J2ApO1xuICBsb2cuaW5mbyhgTWFpbiBhY3Rpdml0eSBuYW1lOiAnJHthY3Rpdml0eX0nYCk7XG4gIHJldHVybiB7XG4gICAgYXBrUGFja2FnZTogcGtnLFxuICAgIGFwa0FjdGl2aXR5OiBhY3Rpdml0eSxcbiAgfTtcbn07XG5cbi8qKlxuICogRXh0cmFjdCB0YXJnZXQgU0RLIHZlcnNpb24gZnJvbSBhcHBsaWNhdGlvbiBtYW5pZmVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBwUGF0aCAtIFRoZSBmdWxsIHBhdGggdG8gLmFwayhzKSBwYWNrYWdlLlxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgdmVyc2lvbiBvZiB0aGUgdGFyZ2V0IFNESy5cbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgZ2V0dGluZyB0aGUgZGF0YSBmcm9tIHRoZSBnaXZlblxuICogICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHBhY2thZ2UuXG4gKi9cbm1hbmlmZXN0TWV0aG9kcy50YXJnZXRTZGtWZXJzaW9uRnJvbU1hbmlmZXN0ID0gYXN5bmMgZnVuY3Rpb24gdGFyZ2V0U2RrVmVyc2lvbkZyb21NYW5pZmVzdCAoYXBwUGF0aCkge1xuICBsb2cuZGVidWcoYEV4dHJhY3RpbmcgdGFyZ2V0IFNESyB2ZXJzaW9uIG9mICcke2FwcFBhdGh9J2ApO1xuICBjb25zdCBvcmlnaW5hbEFwcFBhdGggPSBhcHBQYXRoO1xuICBpZiAoYXBwUGF0aC5lbmRzV2l0aChBUEtTX0VYVEVOU0lPTikpIHtcbiAgICBhcHBQYXRoID0gYXdhaXQgdGhpcy5leHRyYWN0QmFzZUFwayhhcHBQYXRoKTtcbiAgfVxuXG4gIGNvbnN0IGdldFRhcmdldFNka1ZpYUFwa1JlYWRlciA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhcGtSZWFkZXIgPSBhd2FpdCBBcGtSZWFkZXIub3BlbihhcHBQYXRoKTtcbiAgICBjb25zdCBtYW5pZmVzdCA9IGF3YWl0IGFwa1JlYWRlci5yZWFkTWFuaWZlc3QoKTtcbiAgICBpZiAobWFuaWZlc3QudXNlc1NkayAmJiBfLmlzSW50ZWdlcihtYW5pZmVzdC51c2VzU2RrLnRhcmdldFNka1ZlcnNpb24pKSB7XG4gICAgICByZXR1cm4gbWFuaWZlc3QudXNlc1Nkay50YXJnZXRTZGtWZXJzaW9uO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBmaW5kIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0YXJnZXRTZGtWZXJzaW9uIGluIHRoZSBtYW5pZmVzdCcpO1xuICB9O1xuICBjb25zdCBnZXRUYXJnZXRTZGtWaWFBYXB0ID0gYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHRoaXMuaW5pdEFhcHQoKTtcbiAgICBjb25zdCBhcmdzID0gWydkdW1wJywgJ2JhZGdpbmcnLCBhcHBQYXRoXTtcbiAgICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IGV4ZWModGhpcy5iaW5hcmllcy5hYXB0LCBhcmdzKTtcbiAgICBjb25zdCB0YXJnZXRTZGtWZXJzaW9uID0gL3RhcmdldFNka1ZlcnNpb246JyhbXiddKyknL2cuZXhlYyhzdGRvdXQpO1xuICAgIGlmICghdGFyZ2V0U2RrVmVyc2lvbikge1xuICAgICAgbG9nLmRlYnVnKHN0ZG91dCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBwYXJzZSB0aGUgY29tbWFuZCBvdXRwdXQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlSW50KHRhcmdldFNka1ZlcnNpb25bMV0sIDEwKTtcbiAgfTtcbiAgY29uc3QgdmVyc2lvbkdldHRlcnMgPSBbXG4gICAgWydBcGtSZWFkZXInLCBnZXRUYXJnZXRTZGtWaWFBcGtSZWFkZXJdLFxuICAgIFsnYWFwdCcsIGdldFRhcmdldFNka1ZpYUFhcHRdLFxuICBdO1xuICBmb3IgKGNvbnN0IFt0b29sTmFtZSwgdmVyc2lvbkdldHRlcl0gb2YgdmVyc2lvbkdldHRlcnMpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHZlcnNpb25HZXR0ZXIoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2cuaW5mbyhgQ2Fubm90IGV4dHJhY3QgdGFyZ2V0U2RrVmVyc2lvbiBvZiAnJHtvcmlnaW5hbEFwcFBhdGh9JyB1c2luZyAke3Rvb2xOYW1lfS4gYCArXG4gICAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGV4dHJhY3QgdGhlIHRhcmdldCBTREsgdmVyc2lvbiBudW1iZXIgb2YgJyR7b3JpZ2luYWxBcHBQYXRofScgdXNpbmcgZWl0aGVyIG9mIGAgK1xuICAgIGAke0pTT04uc3RyaW5naWZ5KHZlcnNpb25HZXR0ZXJzLm1hcCgocGFpcikgPT4gcGFpclswXSkpfSB0b29scy4gYCArXG4gICAgYENoZWNrIHRoZSBzZXJ2ZXIgbG9nIGZvciBtb3JlIGRldGFpbHNgKTtcbn07XG5cbi8qKlxuICogRXh0cmFjdCB0YXJnZXQgU0RLIHZlcnNpb24gZnJvbSBwYWNrYWdlIGluZm9ybWF0aW9uLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgY2xhc3MgbmFtZSBvZiB0aGUgcGFja2FnZSBpbnN0YWxsZWQgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICogQHBhcmFtIHs/c3RyaW5nfSBjbWRPdXRwdXQgLSBPcHRpb25hbCBwYXJhbWV0ZXIgY29udGFpbmluZyB0aGUgb3V0cHV0IG9mXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kdW1wc3lzIHBhY2thZ2VfIGNvbW1hbmQuIEl0IG1heSBzcGVlZCB1cCB0aGUgbWV0aG9kIGV4ZWN1dGlvbi5cbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHZlcnNpb24gb2YgdGhlIHRhcmdldCBTREsuXG4gKi9cbm1hbmlmZXN0TWV0aG9kcy50YXJnZXRTZGtWZXJzaW9uVXNpbmdQS0cgPSBhc3luYyBmdW5jdGlvbiB0YXJnZXRTZGtWZXJzaW9uVXNpbmdQS0cgKHBrZywgY21kT3V0cHV0ID0gbnVsbCkge1xuICBsZXQgc3Rkb3V0ID0gY21kT3V0cHV0IHx8IGF3YWl0IHRoaXMuc2hlbGwoWydkdW1wc3lzJywgJ3BhY2thZ2UnLCBwa2ddKTtcbiAgbGV0IHRhcmdldFNka1ZlcnNpb24gPSBuZXcgUmVnRXhwKC90YXJnZXRTZGs9KFteXFxzXFxzXSspL2cpLmV4ZWMoc3Rkb3V0KTtcbiAgaWYgKHRhcmdldFNka1ZlcnNpb24gJiYgdGFyZ2V0U2RrVmVyc2lvbi5sZW5ndGggPj0gMikge1xuICAgIHRhcmdldFNka1ZlcnNpb24gPSB0YXJnZXRTZGtWZXJzaW9uWzFdO1xuICB9IGVsc2Uge1xuICAgIC8vIHRhcmdldFNkayBub3QgZm91bmQgaW4gdGhlIGR1bXAsIGFzc2lnbmluZyAwIHRvIHRhcmdldFNka1ZlcnNpb25cbiAgICB0YXJnZXRTZGtWZXJzaW9uID0gMDtcbiAgfVxuICByZXR1cm4gcGFyc2VJbnQodGFyZ2V0U2RrVmVyc2lvbiwgMTApO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIHBhY2thZ2UgbWFuaWZlc3QgKHVzdWFsbHkgQW5kcm9pZE1hbmlmZXN0LnhtbCkuXG4gKiBgJHttYW5pZmVzdH0uYXBrYCBmaWxlIHdpbGwgYmUgY3JlYXRlZCBhcyB0aGUgcmVzdWx0IG9mIHRoaXMgbWV0aG9kXG4gKiBjb250YWluaW5nIHRoZSBjb21waWxlZCBtYW5pZmVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbWFuaWZlc3QgLSBGdWxsIHBhdGggdG8gdGhlIGluaXRpYWwgbWFuaWZlc3QgdGVtcGxhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBtYW5pZmVzdFBhY2thZ2UgLSBUaGUgbmFtZSBvZiB0aGUgbWFuaWZlc3QgcGFja2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IHRhcmdldFBhY2thZ2UgLSBUaGUgbmFtZSBvZiB0aGUgZGVzdGluYXRpb24gcGFja2FnZVxuICovXG5tYW5pZmVzdE1ldGhvZHMuY29tcGlsZU1hbmlmZXN0ID0gYXN5bmMgZnVuY3Rpb24gY29tcGlsZU1hbmlmZXN0IChtYW5pZmVzdCwgbWFuaWZlc3RQYWNrYWdlLCB0YXJnZXRQYWNrYWdlKSB7XG4gIGNvbnN0IHtwbGF0Zm9ybSwgcGxhdGZvcm1QYXRofSA9IGF3YWl0IGdldEFuZHJvaWRQbGF0Zm9ybUFuZFBhdGgodGhpcy5zZGtSb290KTtcbiAgaWYgKCFwbGF0Zm9ybSkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNvbXBpbGUgdGhlIG1hbmlmZXN0LiBUaGUgcmVxdWlyZWQgcGxhdGZvcm0gZG9lcyBub3QgZXhpc3QgKEFQSSBsZXZlbCA+PSAxNyknKTtcbiAgfVxuICBjb25zdCByZXN1bHRQYXRoID0gYCR7bWFuaWZlc3R9LmFwa2A7XG4gIGNvbnN0IGFuZHJvaWRKYXJQYXRoID0gcGF0aC5yZXNvbHZlKHBsYXRmb3JtUGF0aCwgJ2FuZHJvaWQuamFyJyk7XG4gIGlmIChhd2FpdCBmcy5leGlzdHMocmVzdWx0UGF0aCkpIHtcbiAgICBhd2FpdCBmcy5yaW1yYWYocmVzdWx0UGF0aCk7XG4gIH1cbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLmluaXRBYXB0MigpO1xuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3N0dWRpby9jb21tYW5kLWxpbmUvYWFwdDJcbiAgICBjb25zdCBhcmdzID0gW1xuICAgICAgJ2xpbmsnLFxuICAgICAgJy1vJywgcmVzdWx0UGF0aCxcbiAgICAgICctLW1hbmlmZXN0JywgbWFuaWZlc3QsXG4gICAgICAnLS1yZW5hbWUtbWFuaWZlc3QtcGFja2FnZScsIG1hbmlmZXN0UGFja2FnZSxcbiAgICAgICctLXJlbmFtZS1pbnN0cnVtZW50YXRpb24tdGFyZ2V0LXBhY2thZ2UnLCB0YXJnZXRQYWNrYWdlLFxuICAgICAgJy1JJywgYW5kcm9pZEphclBhdGgsXG4gICAgICAnLXYnLFxuICAgIF07XG4gICAgbG9nLmRlYnVnKGBDb21waWxpbmcgdGhlIG1hbmlmZXN0IHVzaW5nICcke3V0aWwucXVvdGUoW3RoaXMuYmluYXJpZXMuYWFwdDIsIC4uLmFyZ3NdKX0nYCk7XG4gICAgYXdhaXQgZXhlYyh0aGlzLmJpbmFyaWVzLmFhcHQyLCBhcmdzKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZy5kZWJ1ZygnQ2Fubm90IGNvbXBpbGUgdGhlIG1hbmlmZXN0IHVzaW5nIGFhcHQyLiBEZWZhdWx0aW5nIHRvIGFhcHQuICcgK1xuICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2Uuc3RkZXJyIHx8IGUubWVzc2FnZX1gKTtcbiAgICBhd2FpdCB0aGlzLmluaXRBYXB0KCk7XG4gICAgY29uc3QgYXJncyA9IFtcbiAgICAgICdwYWNrYWdlJyxcbiAgICAgICctTScsIG1hbmlmZXN0LFxuICAgICAgJy0tcmVuYW1lLW1hbmlmZXN0LXBhY2thZ2UnLCBtYW5pZmVzdFBhY2thZ2UsXG4gICAgICAnLS1yZW5hbWUtaW5zdHJ1bWVudGF0aW9uLXRhcmdldC1wYWNrYWdlJywgdGFyZ2V0UGFja2FnZSxcbiAgICAgICctSScsIGFuZHJvaWRKYXJQYXRoLFxuICAgICAgJy1GJywgcmVzdWx0UGF0aCxcbiAgICAgICctZicsXG4gICAgXTtcbiAgICBsb2cuZGVidWcoYENvbXBpbGluZyB0aGUgbWFuaWZlc3QgdXNpbmcgJyR7dXRpbC5xdW90ZShbdGhpcy5iaW5hcmllcy5hYXB0LCAuLi5hcmdzXSl9J2ApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGVjKHRoaXMuYmluYXJpZXMuYWFwdCwgYXJncyk7XG4gICAgfSBjYXRjaCAoZTEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvbXBpbGUgdGhlIG1hbmlmZXN0LiBPcmlnaW5hbCBlcnJvcjogJHtlMS5zdGRlcnIgfHwgZTEubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cbiAgbG9nLmRlYnVnKGBDb21waWxlZCB0aGUgbWFuaWZlc3QgYXQgJyR7cmVzdWx0UGF0aH0nYCk7XG59O1xuXG4vKipcbiAqIFJlcGxhY2UvaW5zZXJ0IHRoZSBzcGVjaWFsbHkgcHJlY29tcGlsZWQgbWFuaWZlc3QgZmlsZSBpbnRvIHRoZVxuICogcGFydGljdWxhciBwYWNrYWdlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtYW5pZmVzdCAtIEZ1bGwgcGF0aCB0byB0aGUgcHJlY29tcGlsZWQgbWFuaWZlc3RcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWQgYnkgYGNvbXBpbGVNYW5pZmVzdGAgbWV0aG9kIGNhbGxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhvdXQgLmFwayBleHRlbnNpb25cbiAqIEBwYXJhbSB7c3RyaW5nfSBzcmNBcGsgLSBGdWxsIHBhdGggdG8gdGhlIGV4aXN0aW5nIHZhbGlkIGFwcGxpY2F0aW9uIHBhY2thZ2UsIHdoZXJlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBtYW5pZmVzdCBoYXMgdG8gYmUgaW5zZXRyZWQgdG8uIFRoaXMgcGFja2FnZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgTk9UIGJlIG1vZGlmaWVkLlxuICogQHBhcmFtIHtzdHJpbmd9IGRzdEFwayAtIEZ1bGwgcGF0aCB0byB0aGUgcmVzdWx0aW5nIHBhY2thZ2UuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGZpbGUgd2lsbCBiZSBvdmVycmlkZGVuIGlmIGl0IGFscmVhZHkgZXhpc3RzLlxuICovXG5tYW5pZmVzdE1ldGhvZHMuaW5zZXJ0TWFuaWZlc3QgPSBhc3luYyBmdW5jdGlvbiBpbnNlcnRNYW5pZmVzdCAobWFuaWZlc3QsIHNyY0FwaywgZHN0QXBrKSB7XG4gIGxvZy5kZWJ1ZyhgSW5zZXJ0aW5nIG1hbmlmZXN0ICcke21hbmlmZXN0fScsIHNyYzogJyR7c3JjQXBrfScsIGRzdDogJyR7ZHN0QXBrfSdgKTtcbiAgYXdhaXQgemlwLmFzc2VydFZhbGlkWmlwKHNyY0Fwayk7XG4gIGF3YWl0IHVuemlwRmlsZShgJHttYW5pZmVzdH0uYXBrYCk7XG4gIGNvbnN0IG1hbmlmZXN0TmFtZSA9IHBhdGguYmFzZW5hbWUobWFuaWZlc3QpO1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuaW5pdEFhcHQoKTtcbiAgICBhd2FpdCBmcy5jb3B5RmlsZShzcmNBcGssIGRzdEFwayk7XG4gICAgbG9nLmRlYnVnKCdNb3ZpbmcgbWFuaWZlc3QnKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZXhlYyh0aGlzLmJpbmFyaWVzLmFhcHQsIFtcbiAgICAgICAgJ3JlbW92ZScsIGRzdEFwaywgbWFuaWZlc3ROYW1lXG4gICAgICBdKTtcbiAgICB9IGNhdGNoIChpZ24pIHt9XG4gICAgYXdhaXQgZXhlYyh0aGlzLmJpbmFyaWVzLmFhcHQsIFtcbiAgICAgICdhZGQnLCBkc3RBcGssIG1hbmlmZXN0TmFtZVxuICAgIF0sIHtjd2Q6IHBhdGguZGlybmFtZShtYW5pZmVzdCl9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZy5kZWJ1ZygnQ2Fubm90IGluc2VydCBtYW5pZmVzdCB1c2luZyBhYXB0LiBEZWZhdWx0aW5nIHRvIHppcC4gJyArXG4gICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5zdGRlcnIgfHwgZS5tZXNzYWdlfWApO1xuICAgIGNvbnN0IHRtcFJvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgICB0cnkge1xuICAgICAgLy8gVW5mb3J0dW5hdGVseSBOb2RlSlMgZG9lcyBub3QgcHJvdmlkZSBhbnkgcmVsaWFibGUgbWV0aG9kc1xuICAgICAgLy8gdG8gcmVwbGFjZSBmaWxlcyBpbnNpZGUgemlwIGFyY2hpdmVzIHdpdGhvdXQgbG9hZGluZyB0aGVcbiAgICAgIC8vIHdob2xlIGFyY2hpdmUgY29udGVudCBpbnRvIFJBTVxuICAgICAgbG9nLmRlYnVnKGBFeHRyYWN0aW5nIHRoZSBzb3VyY2UgYXBrIGF0ICcke3NyY0Fwa30nYCk7XG4gICAgICBhd2FpdCB6aXAuZXh0cmFjdEFsbFRvKHNyY0FwaywgdG1wUm9vdCk7XG4gICAgICBsb2cuZGVidWcoJ01vdmluZyBtYW5pZmVzdCcpO1xuICAgICAgYXdhaXQgZnMubXYobWFuaWZlc3QsIHBhdGgucmVzb2x2ZSh0bXBSb290LCBtYW5pZmVzdE5hbWUpKTtcbiAgICAgIGxvZy5kZWJ1ZyhgQ29sbGVjdGluZyB0aGUgZGVzdGluYXRpb24gYXBrIGF0ICcke2RzdEFwa30nYCk7XG4gICAgICBhd2FpdCB6aXAudG9BcmNoaXZlKGRzdEFwaywge1xuICAgICAgICBjd2Q6IHRtcFJvb3QsXG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgZnMucmltcmFmKHRtcFJvb3QpO1xuICAgIH1cbiAgfVxuICBsb2cuZGVidWcoYE1hbmlmZXN0IGluc2VydGlvbiBpbnRvICcke2RzdEFwa30nIGlzIGNvbXBsZXRlZGApO1xufTtcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHBhY2thZ2UgbWFuaWZlc3QgY29udGFpbnMgSW50ZXJuZXQgcGVybWlzc2lvbnMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwcFBhdGggLSBUaGUgZnVsbCBwYXRoIHRvIC5hcGsocykgcGFja2FnZS5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIG1hbmlmZXN0IHJlcXVpcmVzIEludGVybmV0IGFjY2VzcyBwZXJtaXNzaW9uLlxuICovXG5tYW5pZmVzdE1ldGhvZHMuaGFzSW50ZXJuZXRQZXJtaXNzaW9uRnJvbU1hbmlmZXN0ID0gYXN5bmMgZnVuY3Rpb24gaGFzSW50ZXJuZXRQZXJtaXNzaW9uRnJvbU1hbmlmZXN0IChhcHBQYXRoKSB7XG4gIGxvZy5kZWJ1ZyhgQ2hlY2tpbmcgaWYgJyR7YXBwUGF0aH0nIHJlcXVpcmVzIGludGVybmV0IGFjY2VzcyBwZXJtaXNzaW9uIGluIHRoZSBtYW5pZmVzdGApO1xuICBpZiAoYXBwUGF0aC5lbmRzV2l0aChBUEtTX0VYVEVOU0lPTikpIHtcbiAgICBhcHBQYXRoID0gYXdhaXQgdGhpcy5leHRyYWN0QmFzZUFwayhhcHBQYXRoKTtcbiAgfVxuXG4gIGNvbnN0IGFwa1JlYWRlciA9IGF3YWl0IEFwa1JlYWRlci5vcGVuKGFwcFBhdGgpO1xuICBjb25zdCBtYW5pZmVzdCA9IGF3YWl0IGFwa1JlYWRlci5yZWFkTWFuaWZlc3QoKTtcbiAgcmV0dXJuIChtYW5pZmVzdC51c2VzUGVybWlzc2lvbnMgfHwgW10pLnNvbWUoKHtuYW1lfSkgPT4gbmFtZSA9PT0gJ2FuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCcpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgbWFuaWZlc3RNZXRob2RzO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUEsSUFBSUEsZUFBZSxHQUFHLENBQUMsQ0FBQzs7QUFnQnhCQSxlQUFlLENBQUNDLG9DQUFvQyxHQUFHLGVBQWVBLG9DQUFvQyxDQUFFQyxPQUFPLEVBQUU7RUFDbkgsSUFBSUEsT0FBTyxDQUFDQyxRQUFRLENBQUNDLHVCQUFjLENBQUMsRUFBRTtJQUNwQ0YsT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDRyxjQUFjLENBQUNILE9BQU8sQ0FBQztFQUM5QztFQUVBLElBQUlJLFFBQVE7RUFDWixJQUFJO0lBQ0YsTUFBTUMsU0FBUyxHQUFHLE1BQU1DLHdCQUFTLENBQUNDLElBQUksQ0FBQ1AsT0FBTyxDQUFDO0lBQy9DSSxRQUFRLEdBQUcsTUFBTUMsU0FBUyxDQUFDRyxZQUFZLEVBQUU7RUFDM0MsQ0FBQyxDQUFDLE9BQU9DLENBQUMsRUFBRTtJQUNWQyxlQUFHLENBQUNDLEtBQUssQ0FBQ0YsQ0FBQyxDQUFDO0lBQ1osTUFBTSxJQUFJRyxLQUFLLENBQUUsbUNBQWtDWixPQUFRLEtBQUksR0FDNUQsb0NBQW1DLENBQUM7RUFDekM7RUFDQSxNQUFNO0lBQUNhLEdBQUc7SUFBRUM7RUFBUSxDQUFDLEdBQUcsSUFBQUMsc0JBQWEsRUFBQ1gsUUFBUSxDQUFDO0VBQy9DTSxlQUFHLENBQUNNLElBQUksQ0FBRSxrQkFBaUJILEdBQUksR0FBRSxDQUFDO0VBQ2xDSCxlQUFHLENBQUNNLElBQUksQ0FBRSx3QkFBdUJGLFFBQVMsR0FBRSxDQUFD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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"android-manifest.js","names":["manifestMethods","packageAndLaunchActivityFromManifest","appPath","endsWith","APKS_EXTENSION","extractBaseApk","manifest","apkReader","ApkReader","open","readManifest","e","log","debug","Error","pkg","activity","parseManifest","info","apkPackage","apkActivity","targetSdkVersionFromManifest","originalAppPath","getTargetSdkViaApkReader","usesSdk","_","isInteger","targetSdkVersion","getTargetSdkViaAapt","initAapt","args","stdout","exec","binaries","aapt","parseInt","versionGetters","toolName","versionGetter","message","JSON","stringify","map","pair","targetSdkVersionUsingPKG","cmdOutput","shell","RegExp","length","compileManifest","manifestPackage","targetPackage","platform","platformPath","getAndroidPlatformAndPath","sdkRoot","resultPath","androidJarPath","path","resolve","fs","exists","rimraf","initAapt2","util","quote","aapt2","stderr","e1","insertManifest","srcApk","dstApk","zip","assertValidZip","unzipFile","manifestName","basename","copyFile","ign","cwd","dirname","tmpRoot","tempDir","openDir","extractAllTo","mv","toArchive","hasInternetPermissionFromManifest","usesPermissions","some","name"],"sources":["../../../lib/tools/android-manifest.js"],"sourcesContent":["import { exec } from 'teen_process';\nimport log from '../logger.js';\nimport {\n getAndroidPlatformAndPath, unzipFile,\n APKS_EXTENSION, parseManifest } from '../helpers.js';\nimport { fs, zip, tempDir, util } from '@appium/support';\nimport _ from 'lodash';\nimport path from 'path';\nimport ApkReader from 'adbkit-apkreader';\n\nlet manifestMethods = {};\n\n/**\n * @typedef {Object} APKInfo\n * @property {string} apkPackage - The name of application package, for example 'com.acme.app'.\n * @property {string} apkActivity - The name of main application activity.\n */\n\n/**\n * Extract package and main activity name from application manifest.\n *\n * @param {string} appPath - The full path to application .apk(s) package\n * @return {APKInfo} The parsed application info.\n * @throws {error} If there was an error while getting the data from the given\n * application package.\n */\nmanifestMethods.packageAndLaunchActivityFromManifest = async function packageAndLaunchActivityFromManifest (appPath) {\n if (appPath.endsWith(APKS_EXTENSION)) {\n appPath = await this.extractBaseApk(appPath);\n }\n\n let manifest;\n try {\n const apkReader = await ApkReader.open(appPath);\n manifest = await apkReader.readManifest();\n } catch (e) {\n log.debug(e);\n throw new Error(`Cannot extract a manifest from '${appPath}'. ` +\n `Is it a valid Android application?`);\n }\n const {pkg, activity} = parseManifest(manifest);\n log.info(`Package name: '${pkg}'`);\n log.info(`Main activity name: '${activity}'`);\n return {\n apkPackage: pkg,\n apkActivity: activity,\n };\n};\n\n/**\n * Extract target SDK version from application manifest.\n *\n * @param {string} appPath - The full path to .apk(s) package.\n * @return {number} The version of the target SDK.\n * @throws {error} If there was an error while getting the data from the given\n * application package.\n */\nmanifestMethods.targetSdkVersionFromManifest = async function targetSdkVersionFromManifest (appPath) {\n log.debug(`Extracting target SDK version of '${appPath}'`);\n const originalAppPath = appPath;\n if (appPath.endsWith(APKS_EXTENSION)) {\n appPath = await this.extractBaseApk(appPath);\n }\n\n const getTargetSdkViaApkReader = async () => {\n const apkReader = await ApkReader.open(appPath);\n const manifest = await apkReader.readManifest();\n if (manifest.usesSdk && _.isInteger(manifest.usesSdk.targetSdkVersion)) {\n return manifest.usesSdk.targetSdkVersion;\n }\n throw new Error('Cannot find the information about targetSdkVersion in the manifest');\n };\n const getTargetSdkViaAapt = async () => {\n await this.initAapt();\n const args = ['dump', 'badging', appPath];\n const {stdout} = await exec(this.binaries.aapt, args);\n const targetSdkVersion = /targetSdkVersion:'([^']+)'/g.exec(stdout);\n if (!targetSdkVersion) {\n log.debug(stdout);\n throw new Error('Cannot parse the command output');\n }\n return parseInt(targetSdkVersion[1], 10);\n };\n const versionGetters = [\n ['ApkReader', getTargetSdkViaApkReader],\n ['aapt', getTargetSdkViaAapt],\n ];\n for (const [toolName, versionGetter] of versionGetters) {\n try {\n return await versionGetter();\n } catch (e) {\n log.info(`Cannot extract targetSdkVersion of '${originalAppPath}' using ${toolName}. ` +\n `Original error: ${e.message}`);\n }\n }\n throw new Error(`Cannot extract the target SDK version number of '${originalAppPath}' using either of ` +\n `${JSON.stringify(versionGetters.map((pair) => pair[0]))} tools. ` +\n `Check the server log for more details`);\n};\n\n/**\n * Extract target SDK version from package information.\n *\n * @param {string} pkg - The class name of the package installed on the device under test.\n * @param {?string} cmdOutput - Optional parameter containing the output of\n * _dumpsys package_ command. It may speed up the method execution.\n * @return {number} The version of the target SDK.\n */\nmanifestMethods.targetSdkVersionUsingPKG = async function targetSdkVersionUsingPKG (pkg, cmdOutput = null) {\n let stdout = cmdOutput || await this.shell(['dumpsys', 'package', pkg]);\n let targetSdkVersion = new RegExp(/targetSdk=([^\\s\\s]+)/g).exec(stdout);\n if (targetSdkVersion && targetSdkVersion.length >= 2) {\n targetSdkVersion = targetSdkVersion[1];\n } else {\n // targetSdk not found in the dump, assigning 0 to targetSdkVersion\n targetSdkVersion = 0;\n }\n return parseInt(targetSdkVersion, 10);\n};\n\n/**\n * Create binary representation of package manifest (usually AndroidManifest.xml).\n * `${manifest}.apk` file will be created as the result of this method\n * containing the compiled manifest.\n *\n * @param {string} manifest - Full path to the initial manifest template\n * @param {string} manifestPackage - The name of the manifest package\n * @param {string} targetPackage - The name of the destination package\n */\nmanifestMethods.compileManifest = async function compileManifest (manifest, manifestPackage, targetPackage) {\n const {platform, platformPath} = await getAndroidPlatformAndPath(this.sdkRoot);\n if (!platform) {\n throw new Error('Cannot compile the manifest. The required platform does not exist (API level >= 17)');\n }\n const resultPath = `${manifest}.apk`;\n const androidJarPath = path.resolve(platformPath, 'android.jar');\n if (await fs.exists(resultPath)) {\n await fs.rimraf(resultPath);\n }\n try {\n await this.initAapt2();\n // https://developer.android.com/studio/command-line/aapt2\n const args = [\n 'link',\n '-o', resultPath,\n '--manifest', manifest,\n '--rename-manifest-package', manifestPackage,\n '--rename-instrumentation-target-package', targetPackage,\n '-I', androidJarPath,\n '-v',\n ];\n log.debug(`Compiling the manifest using '${util.quote([this.binaries.aapt2, ...args])}'`);\n await exec(this.binaries.aapt2, args);\n } catch (e) {\n log.debug('Cannot compile the manifest using aapt2. Defaulting to aapt. ' +\n `Original error: ${e.stderr || e.message}`);\n await this.initAapt();\n const args = [\n 'package',\n '-M', manifest,\n '--rename-manifest-package', manifestPackage,\n '--rename-instrumentation-target-package', targetPackage,\n '-I', androidJarPath,\n '-F', resultPath,\n '-f',\n ];\n log.debug(`Compiling the manifest using '${util.quote([this.binaries.aapt, ...args])}'`);\n try {\n await exec(this.binaries.aapt, args);\n } catch (e1) {\n throw new Error(`Cannot compile the manifest. Original error: ${e1.stderr || e1.message}`);\n }\n }\n log.debug(`Compiled the manifest at '${resultPath}'`);\n};\n\n/**\n * Replace/insert the specially precompiled manifest file into the\n * particular package.\n *\n * @param {string} manifest - Full path to the precompiled manifest\n * created by `compileManifest` method call\n * without .apk extension\n * @param {string} srcApk - Full path to the existing valid application package, where\n * this manifest has to be insetred to. This package\n * will NOT be modified.\n * @param {string} dstApk - Full path to the resulting package.\n * The file will be overridden if it already exists.\n */\nmanifestMethods.insertManifest = async function insertManifest (manifest, srcApk, dstApk) {\n log.debug(`Inserting manifest '${manifest}', src: '${srcApk}', dst: '${dstApk}'`);\n await zip.assertValidZip(srcApk);\n await unzipFile(`${manifest}.apk`);\n const manifestName = path.basename(manifest);\n try {\n await this.initAapt();\n await fs.copyFile(srcApk, dstApk);\n log.debug('Moving manifest');\n try {\n await exec(this.binaries.aapt, [\n 'remove', dstApk, manifestName\n ]);\n } catch (ign) {}\n await exec(this.binaries.aapt, [\n 'add', dstApk, manifestName\n ], {cwd: path.dirname(manifest)});\n } catch (e) {\n log.debug('Cannot insert manifest using aapt. Defaulting to zip. ' +\n `Original error: ${e.stderr || e.message}`);\n const tmpRoot = await tempDir.openDir();\n try {\n // Unfortunately NodeJS does not provide any reliable methods\n // to replace files inside zip archives without loading the\n // whole archive content into RAM\n log.debug(`Extracting the source apk at '${srcApk}'`);\n await zip.extractAllTo(srcApk, tmpRoot);\n log.debug('Moving manifest');\n await fs.mv(manifest, path.resolve(tmpRoot, manifestName));\n log.debug(`Collecting the destination apk at '${dstApk}'`);\n await zip.toArchive(dstApk, {\n cwd: tmpRoot,\n });\n } finally {\n await fs.rimraf(tmpRoot);\n }\n }\n log.debug(`Manifest insertion into '${dstApk}' is completed`);\n};\n\n/**\n * Check whether package manifest contains Internet permissions.\n *\n * @param {string} appPath - The full path to .apk(s) package.\n * @return {boolean} True if the manifest requires Internet access permission.\n */\nmanifestMethods.hasInternetPermissionFromManifest = async function hasInternetPermissionFromManifest (appPath) {\n log.debug(`Checking if '${appPath}' requires internet access permission in the manifest`);\n if (appPath.endsWith(APKS_EXTENSION)) {\n appPath = await this.extractBaseApk(appPath);\n }\n\n const apkReader = await ApkReader.open(appPath);\n const manifest = await apkReader.readManifest();\n return (manifest.usesPermissions || []).some(({name}) => name === 'android.permission.INTERNET');\n};\n\nexport default manifestMethods;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"android-manifest.js","names":["manifestMethods","packageAndLaunchActivityFromManifest","appPath","endsWith","APKS_EXTENSION","extractBaseApk","manifest","apkReader","ApkReader","open","readManifest","e","log","debug","Error","pkg","activity","parseManifest","info","apkPackage","apkActivity","targetSdkVersionFromManifest","originalAppPath","getTargetSdkViaApkReader","usesSdk","_","isInteger","targetSdkVersion","getTargetSdkViaAapt","initAapt","args","stdout","exec","binaries","aapt","parseInt","versionGetters","toolName","versionGetter","message","JSON","stringify","map","pair","targetSdkVersionUsingPKG","cmdOutput","shell","RegExp","length","compileManifest","manifestPackage","targetPackage","platform","platformPath","getAndroidPlatformAndPath","sdkRoot","resultPath","androidJarPath","path","resolve","fs","exists","rimraf","initAapt2","util","quote","aapt2","stderr","e1","insertManifest","srcApk","dstApk","zip","assertValidZip","unzipFile","manifestName","basename","copyFile","ign","cwd","dirname","tmpRoot","tempDir","openDir","extractAllTo","mv","toArchive","hasInternetPermissionFromManifest","usesPermissions","some","name"],"sources":["../../../lib/tools/android-manifest.js"],"sourcesContent":["import { exec } from 'teen_process';\nimport log from '../logger.js';\nimport {\n getAndroidPlatformAndPath, unzipFile,\n APKS_EXTENSION, parseManifest } from '../helpers.js';\nimport { fs, zip, tempDir, util } from '@appium/support';\nimport _ from 'lodash';\nimport path from 'path';\nimport ApkReader from 'adbkit-apkreader';\n\nlet manifestMethods = {};\n\n/**\n * @typedef {Object} APKInfo\n * @property {string} apkPackage - The name of application package, for example 'com.acme.app'.\n * @property {string} apkActivity - The name of main application activity.\n */\n\n/**\n * Extract package and main activity name from application manifest.\n *\n * @param {string} appPath - The full path to application .apk(s) package\n * @return {APKInfo} The parsed application info.\n * @throws {error} If there was an error while getting the data from the given\n * application package.\n */\nmanifestMethods.packageAndLaunchActivityFromManifest = async function packageAndLaunchActivityFromManifest (appPath) {\n if (appPath.endsWith(APKS_EXTENSION)) {\n appPath = await this.extractBaseApk(appPath);\n }\n\n let manifest;\n try {\n const apkReader = await ApkReader.open(appPath);\n manifest = await apkReader.readManifest();\n } catch (e) {\n log.debug(e);\n throw new Error(`Cannot extract a manifest from '${appPath}'. ` +\n `Is it a valid Android application?`);\n }\n const {pkg, activity} = parseManifest(manifest);\n log.info(`Package name: '${pkg}'`);\n log.info(`Main activity name: '${activity}'`);\n return {\n apkPackage: pkg,\n apkActivity: activity,\n };\n};\n\n/**\n * Extract target SDK version from application manifest.\n *\n * @param {string} appPath - The full path to .apk(s) package.\n * @return {number} The version of the target SDK.\n * @throws {error} If there was an error while getting the data from the given\n * application package.\n */\nmanifestMethods.targetSdkVersionFromManifest = async function targetSdkVersionFromManifest (appPath) {\n log.debug(`Extracting target SDK version of '${appPath}'`);\n const originalAppPath = appPath;\n if (appPath.endsWith(APKS_EXTENSION)) {\n appPath = await this.extractBaseApk(appPath);\n }\n\n const getTargetSdkViaApkReader = async () => {\n const apkReader = await ApkReader.open(appPath);\n const manifest = await apkReader.readManifest();\n if (manifest.usesSdk && _.isInteger(manifest.usesSdk.targetSdkVersion)) {\n return manifest.usesSdk.targetSdkVersion;\n }\n throw new Error('Cannot find the information about targetSdkVersion in the manifest');\n };\n const getTargetSdkViaAapt = async () => {\n await this.initAapt();\n const args = ['dump', 'badging', appPath];\n const {stdout} = await exec(this.binaries.aapt, args);\n const targetSdkVersion = /targetSdkVersion:'([^']+)'/g.exec(stdout);\n if (!targetSdkVersion) {\n log.debug(stdout);\n throw new Error('Cannot parse the command output');\n }\n return parseInt(targetSdkVersion[1], 10);\n };\n const versionGetters = [\n ['ApkReader', getTargetSdkViaApkReader],\n ['aapt', getTargetSdkViaAapt],\n ];\n for (const [toolName, versionGetter] of versionGetters) {\n try {\n return await versionGetter();\n } catch (e) {\n log.info(`Cannot extract targetSdkVersion of '${originalAppPath}' using ${toolName}. ` +\n `Original error: ${e.message}`);\n }\n }\n throw new Error(`Cannot extract the target SDK version number of '${originalAppPath}' using either of ` +\n `${JSON.stringify(versionGetters.map((pair) => pair[0]))} tools. ` +\n `Check the server log for more details`);\n};\n\n/**\n * Extract target SDK version from package information.\n *\n * @param {string} pkg - The class name of the package installed on the device under test.\n * @param {?string} cmdOutput - Optional parameter containing the output of\n * _dumpsys package_ command. It may speed up the method execution.\n * @return {number} The version of the target SDK.\n */\nmanifestMethods.targetSdkVersionUsingPKG = async function targetSdkVersionUsingPKG (pkg, cmdOutput = null) {\n let stdout = cmdOutput || await this.shell(['dumpsys', 'package', pkg]);\n let targetSdkVersion = new RegExp(/targetSdk=([^\\s\\s]+)/g).exec(stdout);\n if (targetSdkVersion && targetSdkVersion.length >= 2) {\n targetSdkVersion = targetSdkVersion[1];\n } else {\n // targetSdk not found in the dump, assigning 0 to targetSdkVersion\n targetSdkVersion = 0;\n }\n return parseInt(targetSdkVersion, 10);\n};\n\n/**\n * Create binary representation of package manifest (usually AndroidManifest.xml).\n * `${manifest}.apk` file will be created as the result of this method\n * containing the compiled manifest.\n *\n * @param {string} manifest - Full path to the initial manifest template\n * @param {string} manifestPackage - The name of the manifest package\n * @param {string} targetPackage - The name of the destination package\n */\nmanifestMethods.compileManifest = async function compileManifest (manifest, manifestPackage, targetPackage) {\n const {platform, platformPath} = await getAndroidPlatformAndPath(this.sdkRoot);\n if (!platform) {\n throw new Error('Cannot compile the manifest. The required platform does not exist (API level >= 17)');\n }\n const resultPath = `${manifest}.apk`;\n const androidJarPath = path.resolve(platformPath, 'android.jar');\n if (await fs.exists(resultPath)) {\n await fs.rimraf(resultPath);\n }\n try {\n await this.initAapt2();\n // https://developer.android.com/studio/command-line/aapt2\n const args = [\n 'link',\n '-o', resultPath,\n '--manifest', manifest,\n '--rename-manifest-package', manifestPackage,\n '--rename-instrumentation-target-package', targetPackage,\n '-I', androidJarPath,\n '-v',\n ];\n log.debug(`Compiling the manifest using '${util.quote([this.binaries.aapt2, ...args])}'`);\n await exec(this.binaries.aapt2, args);\n } catch (e) {\n log.debug('Cannot compile the manifest using aapt2. Defaulting to aapt. ' +\n `Original error: ${e.stderr || e.message}`);\n await this.initAapt();\n const args = [\n 'package',\n '-M', manifest,\n '--rename-manifest-package', manifestPackage,\n '--rename-instrumentation-target-package', targetPackage,\n '-I', androidJarPath,\n '-F', resultPath,\n '-f',\n ];\n log.debug(`Compiling the manifest using '${util.quote([this.binaries.aapt, ...args])}'`);\n try {\n await exec(this.binaries.aapt, args);\n } catch (e1) {\n throw new Error(`Cannot compile the manifest. Original error: ${e1.stderr || e1.message}`);\n }\n }\n log.debug(`Compiled the manifest at '${resultPath}'`);\n};\n\n/**\n * Replace/insert the specially precompiled manifest file into the\n * particular package.\n *\n * @param {string} manifest - Full path to the precompiled manifest\n * created by `compileManifest` method call\n * without .apk extension\n * @param {string} srcApk - Full path to the existing valid application package, where\n * this manifest has to be insetred to. This package\n * will NOT be modified.\n * @param {string} dstApk - Full path to the resulting package.\n * The file will be overridden if it already exists.\n */\nmanifestMethods.insertManifest = async function insertManifest (manifest, srcApk, dstApk) {\n log.debug(`Inserting manifest '${manifest}', src: '${srcApk}', dst: '${dstApk}'`);\n await zip.assertValidZip(srcApk);\n await unzipFile(`${manifest}.apk`);\n const manifestName = path.basename(manifest);\n try {\n await this.initAapt();\n await fs.copyFile(srcApk, dstApk);\n log.debug('Moving manifest');\n try {\n await exec(this.binaries.aapt, [\n 'remove', dstApk, manifestName\n ]);\n } catch (ign) {}\n await exec(this.binaries.aapt, [\n 'add', dstApk, manifestName\n ], {cwd: path.dirname(manifest)});\n } catch (e) {\n log.debug('Cannot insert manifest using aapt. Defaulting to zip. ' +\n `Original error: ${e.stderr || e.message}`);\n const tmpRoot = await tempDir.openDir();\n try {\n // Unfortunately NodeJS does not provide any reliable methods\n // to replace files inside zip archives without loading the\n // whole archive content into RAM\n log.debug(`Extracting the source apk at '${srcApk}'`);\n await zip.extractAllTo(srcApk, tmpRoot);\n log.debug('Moving manifest');\n await fs.mv(manifest, path.resolve(tmpRoot, manifestName));\n log.debug(`Collecting the destination apk at '${dstApk}'`);\n await zip.toArchive(dstApk, {\n cwd: tmpRoot,\n });\n } finally {\n await fs.rimraf(tmpRoot);\n }\n }\n log.debug(`Manifest insertion into '${dstApk}' is completed`);\n};\n\n/**\n * Check whether package manifest contains Internet permissions.\n *\n * @param {string} appPath - The full path to .apk(s) package.\n * @return {boolean} True if the manifest requires Internet access permission.\n */\nmanifestMethods.hasInternetPermissionFromManifest = async function hasInternetPermissionFromManifest (appPath) {\n log.debug(`Checking if '${appPath}' requires internet access permission in the manifest`);\n if (appPath.endsWith(APKS_EXTENSION)) {\n appPath = await this.extractBaseApk(appPath);\n }\n\n const apkReader = await ApkReader.open(appPath);\n const manifest = await apkReader.readManifest();\n return (manifest.usesPermissions || []).some(({name}) => name === 'android.permission.INTERNET');\n};\n\nexport default manifestMethods;\n"],"mappings":"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"}
|