
Security News
The Hidden Blast Radius of the Axios Compromise
The Axios compromise shows how time-dependent dependency resolution makes exposure harder to detect and contain.
@wtto00/android-tools
Advanced tools
Node module for managing and controlling the Android Devices.
English | 简体中文
npm i @wtto00/android-tools
import Android from '@wtto00/android-tools';
const options = {
// adb: "platform-tools/adb",
// avdmanager: "cmdline-tools/bin/avdmanager",
// sdkmanager: "cmdline-tools/bin/sdkmanager",
// emulator: "emulator/emulator",
};
const android = new Android(options);
Andorid Options
| field | type | required | default | note |
|---|---|---|---|---|
| adb | string | false | ${process.env.ANDROID_HOME}/platform-tools/adb or adb in PATH | The location of the adb executable file relative to ANDROID_HOME |
| avdmanager | string | false | ${process.env.ANDROID_HOME}/cmdline-tools/bin/avdmanager or avdmanager in PATH | The location of the avdmanager executable file relative to ANDROID_HOME |
| sdkmanager | string | false | ${process.env.ANDROID_HOME}/cmdline-tools/bin/sdkmanager or sdkmanager in PATH | The location of the sdkmanager executable file relative to ANDROID_HOME |
| emulator | string | false | ${process.env.ANDROID_HOME}/emulator/emulator or emulator in PATH | The location of the emulator executable file relative to ANDROID_HOME |
Start the emulator using the AVD supplied through with avdName.
android
.start({
avd: 'android-avd-name',
verbose: true
// ...
})
.then((res) => {
console.log(`emulatorId: ${res.id}`);
})
.catch((err) => {
console.log(err);
});
| field | type | required | default | note |
|---|---|---|---|---|
| avd | string | true | - | use a specific android virtual device |
| verbose | boolean | true | - | enable specific debug messages |
| noWindow | boolean | false | - | disable graphical window display |
| noSnapshot | boolean | false | - | perform a full boot and do not auto-save, but qemu vmload and vmsave operate on snapstorage |
| noSnapstorage | boolean | false | - | do not mount a snapshot storage file (this disables all snapshot functionality) |
| noSnapshotUpdateTime | boolean | false | - | do not try to correct snapshot time on restore |
| noSnapshotSave | boolean | false | - | do not auto-save to snapshot on exit: abandon changed state |
| noSnapshotLoad | boolean | false | - | do not auto-start from snapshot: perform a full boot |
| cameraBack | "emulated" "virtualscene" "videoplayback" "none" "webcam" | false | - | set emulation mode for a camera facing back |
| cameraFront | 'emulated' 'webcam' 'none' | false | - | set emulation mode for a camera facing front |
| gpu | 'auto' 'auto-no-window' 'host' 'swiftshader_indirect' 'angle_indirect' 'guest' | false | 'auto' | set hardware OpenGLES emulation mode |
| nocache | boolean | false | - | disable the cache partition |
| noaudio | boolean | false | - | disable audio support |
| noBootAnim | boolean | false | - | disable animation for faster boot |
| lowram | boolean | false | - | device is a low ram device |
| restartWhenStalled | boolean | false | - | Allows restarting guest when it is stalled. |
| waitForDebugger | boolean | false | - | Pause on launch and wait for a debugger process to attach before resuming |
| httpProxy | string | false | - | make TCP connections through a HTTP/HTTPS proxy |
| cores | number | false | - | Set number of CPU cores to emulator |
| wipeData | boolean | false | - | reset the user data image (copy it from initdata) |
| noPassiveGps | boolean | false | - | disable passive gps updates |
Waiting for the simulator device to become available.
android
.waitForDevice('emulator-id')
.then(() => {
console.log('available');
})
.catch((err) => {
console.log(err);
});
| field | type | required | default | note |
|---|---|---|---|---|
| emulatorId | string | true | - | ID of emulator device |
Ensure device has been started and ready.
android
.ensureReady('emulator-id')
.then(() => {
console.log('ready');
})
.catch((err) => {
console.log(err);
});
| field | type | required | default | note |
|---|---|---|---|---|
| emulatorId | string | true | - | ID of emulator device |
Create a AVD based upon image.
android
.createAVD({
name: avdName,
package: 'android-image-name',
force: false
})
.then(() => {
console.log('has been created');
})
.catch((err) => {
console.log(err);
});
| field | type | required | default | note |
|---|---|---|---|---|
| apiLevel | number | false | - | API level of the platform system image - e.g. 23 for Android Marshmallow, 29 for Android 10. |
| target | 'default' 'google_apis' 'playstore' 'android-wear' 'android-wear-cn' 'android-tv' 'google-tv' 'aosp_atd ' 'google_atd' | false | 'default' | Target of the system image . |
| arch | 'x86_64' 'x86' 'arm64-v8a' 'armeabi-v7a' | false | Current system CPU architecture | CPU architecture of the system image |
| package | string | false | - | Package path of the system image for this AVD (e.g. 'system-images;android-19;google_apis;x86'). |
| name | string | false | - | Name of the new AVD. |
| force | boolean | false | - | Forces creation (overwrites an existing AVD) |
package, the parameters apiLevel, target, and arch will be ignored. If you don't pass a package, the apiLevel parameter is required.Check if a specific AVD has been created on this machine.
android
.hasAVD('android-avd-name')
.then((res) => {
console.log(res ? 'has been created' : 'not exist');
})
.catch((err) => {
console.log(err);
});
| field | type | required | default | note |
|---|---|---|---|---|
| emulatorId | string | true | - | Name of AVD |
Stop a certain emulator.
android
.stop('emulator-id')
.then(() => {
console.log('has sent stop command');
})
.catch((err) => {
console.log(err);
});
| field | type | required | default | note |
|---|---|---|---|---|
| emulatorId | string | true | - | ID of emulator device |
Wait until the device is stopped.
android
.waitForStop('emulator-id')
.then(() => {
console.log('has been stopped');
})
.catch((err) => {
console.log(err);
});
| field | type | required | default | note |
|---|---|---|---|---|
| emulatorId | string | true | - | ID of emulator device |
Check the package specified with packageName is installed or not.
android
.isInstalled('emulator-id', 'com.android.webview')
.then((res) => {
console.log(res ? 'installed' : 'not installed');
})
.catch((err) => {
console.log(err);
});
| field | type | required | default | note |
|---|---|---|---|---|
| emulatorId | string | true | - | ID of emulator device |
| packageName | string | true | - | Package name of App |
Install an APK located by absolute URI apkPath onto device with emulatorId.
android
.install('emulator-id', '/path/to/apk', { r: true })
.then(() => {
console.log('installed');
})
.catch((err) => {
console.log(err);
});
| field | type | required | default | note |
|---|---|---|---|---|
| emulatorId | string | true | - | ID of emulator device |
| apkPath | string | true | - | Absolute path of apk file |
| options | object | false | - | The parameters for "adb install": -lrtsdg |
adb shell input keyevent.
android
.inputKeyEvent('emulator-id', 82)
.then(() => {
console.log('has send key');
})
.catch((err) => {
console.log(err);
});
| field | type | required | default | note |
|---|---|---|---|---|
| emulatorId | string | true | - | ID of emulator device |
| key | number | true | - | key number,seeAndroid Document |
List connected devices
android
.devices()
.then((res) => {
res.forEach((item) => {
console.log(`name: ${item.name}, status: ${item.status}`);
});
})
.catch((err) => {
console.log(err);
});
List packages installed on the emulator with emulatorId.
android
.listPackages('emulator-id')
.then((res) => {
res.forEach((item) => {
console.log(item);
});
})
.catch((err) => {
console.log(err);
});
| field | type | required | default | note |
|---|---|---|---|---|
| emulatorId | string | true | - | ID of emulator device |
List the available device list for creating emulators in the current system.
android
.listDevices()
.then((res) => {
res.forEach((item) => {
console.log(`id: ${item.id}, Name: ${item.Name}, OEM: ${item.OEM}, Tag: ${item.Tag}`);
});
})
.catch((err) => {
console.log(err);
});
List all AVDs created on this machine.
android
.listAVDs()
.then((res) => {
res.forEach((item) => {
console.log(`Name: ${item.Name}, Path: ${item.Path}, Target: ${item.Target}, Sdcard: ${item.Sdcard}`);
});
})
.catch((err) => {
console.log(err);
});
List available Android targets.
android
.listTargets()
.then((res) => {
res.forEach((item) => {
console.log(`id: ${item.id}, Name: ${item.Name}, Type: ${item.Type}, API level: ${item['API level']}`);
});
})
.catch((err) => {
console.log(err);
});
List available android images on this machine.
android
.listImages()
.then((res) => {
res.forEach((item) => {
console.log(
`name: ${item.name}, type: ${item.type}, sdk: ${item.sdk}, target: ${item.target}, arch: ${item.arch}`
);
});
})
.catch((err) => {
console.log(err);
});
List installed android images on this machine.
android
.listInstalledImages()
.then((res) => {
res.forEach((item) => {
console.log(
`name: ${item.name}, type: ${item.type}, sdk: ${item.sdk}, target: ${item.target}, arch: ${item.arch}`
);
});
})
.catch((err) => {
console.log(err);
});
Use adb to execute commands.
android
.adb('emulator-id', 'shell pm list packages')
.then((res) => {
console.log(res.output);
})
.catch((err) => {
console.log(err);
});
| field | type | required | default | note |
|---|---|---|---|---|
| cmd | string | true | - | The command to be executed. |
Use avdmanager to execute commands.
android
.avdmanager('list avd')
.then((res) => {
console.log(res.output);
})
.catch((err) => {
console.log(err);
});
| field | type | required | default | note |
|---|---|---|---|---|
| cmd | string | true | - | The command to be executed. |
Use sdkmanager to execute commands.
android
.sdkmanager('--list')
.then((res) => {
console.log(res.output);
})
.catch((err) => {
console.log(err);
});
| field | type | required | default | note |
|---|---|---|---|---|
| cmd | string | true | - | The command to be executed. |
Use emulator to execute commands.
android
.emulator('--help')
.then((res) => {
console.log(res.output);
})
.catch((err) => {
console.log(err);
});
| field | type | required | default | note |
|---|---|---|---|---|
| cmd | string | true | - | The command to be executed. |
FAQs
Node module for managing and controlling the Android Devices.
The npm package @wtto00/android-tools receives a total of 10 weekly downloads. As such, @wtto00/android-tools popularity was classified as not popular.
We found that @wtto00/android-tools demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
The Axios compromise shows how time-dependent dependency resolution makes exposure harder to detect and contain.

Research
A supply chain attack on Axios introduced a malicious dependency, plain-crypto-js@4.2.1, published minutes earlier and absent from the project’s GitHub releases.

Research
Malicious versions of the Telnyx Python SDK on PyPI delivered credential-stealing malware via a multi-stage supply chain attack.