使用 Nodejs 控制管理 Andorid 设备。
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 或者系统环境已配置的adb 路径 |
adb 可执行文件与 ANDROID_HOME 的相对路径 |
avdmanager | string | false | ${process.env.ANDROID_HOME}/cmdline-tools/bin/avdmanager 或者系统环境已配置的avdmanager 路径 |
avdmanager 可执行文件与 ANDROID_HOME 的相对路径 |
sdkmanager | string | false | ${process.env.ANDROID_HOME}/cmdline-tools/bin/sdkmanager 或者系统环境已配置的sdkmanager 路径 |
sdkmanager 可执行文件与 ANDROID_HOME 的相对路径 |
emulator | string | false | ${process.env.ANDROID_HOME}/emulator/emulator 或者系统环境已配置的emulator 路径 |
emulator 可执行文件与 ANDROID_HOME 的相对路径 |
打开一个已存在的模拟器设备。
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 | - | 使用特定的android虚拟设备 |
verbose | boolean | true | - | 启用特定的调试消息 |
noWindow | boolean | false | - | 禁用图形窗口显示 |
noSnapshot | boolean | false | - | 执行完全引导,不自动保存,但qemu vmload和vmsave在snapstorage上操作 |
noSnapstorage | boolean | false | - | 不要装载快照存储文件(这将禁用所有快照功能) |
noSnapshotUpdateTime | boolean | false | - | 在还原时不要尝试更正快照时间 |
noSnapshotSave | boolean | false | - | 退出时不自动保存到快照:放弃已更改的状态 |
noSnapshotLoad | boolean | false | - | 不要从快照自动启动:执行完全启动 |
cameraBack | "emulated" "virtualscene" "videoplayback" "none" "webcam" |
false | - | 为背面的相机设置模拟模式 |
cameraFront | 'emulated' 'webcam' 'none' |
false | - | 为前置摄像头设置模拟模式 |
gpu | 'auto' 'auto-no-window' 'host' 'swiftshader_indirect' 'angle_indirect' 'guest' |
false | 'auto' | 设置硬件OpenGLES仿真模式 |
nocache | boolean | false | - | 禁用缓存分区 |
noaudio | boolean | false | - | 禁用音频支持 |
noBootAnim | boolean | false | - | 禁用动画以加快启动速度 |
lowram | boolean | false | - | 该设备是一种低ram设备 |
restartWhenStalled | boolean | false | - | 允许在来宾停止时重新启动。 |
waitForDebugger | boolean | false | - | 启动时暂停,等待调试器进程附加后再继续 |
httpProxy | string | false | - | 通过HTTP/HTTPS代理进行TCP连接 |
cores | number | false | - | 将CPU核心数设置为模拟器 |
wipeData | boolean | false | - | 重置用户数据映像(从initdata复制) |
noPassiveGps | boolean | false | - | 禁用被动gps更新 |
等待给定的设备打开,可使用状态。
android
.waitForDevice('emulator-id')
.then(() => {
console.log('available');
})
.catch((err) => {
console.log(err);
});
field | type | required | default | note |
---|---|---|---|---|
emulatorId | string | true | - | 模拟器设备 ID |
确保给定的设备已准备就绪。可以 adb 执行一系列命令。
android
.ensureReady('emulator-id')
.then(() => {
console.log('ready');
})
.catch((err) => {
console.log(err);
});
field | type | required | default | note |
---|---|---|---|---|
emulatorId | string | true | - | 模拟器设备 ID |
创建一个模拟器。
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级别 - 例如,Android Marshmallow的级别为23,Android 10的级别为29。 |
target | 'default' 'google_apis' 'playstore' 'android-wear' 'android-wear-cn' 'android-tv' 'google-tv' 'aosp_atd ' 'google_atd' |
false | 'default' | 系统镜像的目标。 |
arch | 'x86_64' 'x86' 'arm64-v8a' 'armeabi-v7a' |
false | 当前系统CPU架构 | 系统镜像的CPU架构 |
package | string | true | - | 此模拟器的系统镜像的路径(例如 'system-images;android-19;google_apis;x86')。 |
name | string | false | - | 新模拟器的名称。 |
force | boolean | false | - | 创建虚拟设备(覆盖现有的模拟器)。 |
- 如果你传了
package
,则参数apiLevel
,target
,arch
将被会略。如果你没有传参package
,则apiLevel
参数是必须的。
当前系统是否已存在给定的模拟器。
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 | - | 模拟器名称 |
停止给定的模拟器。
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 |
等待给定的模拟器停止完毕。
android
.waitForStop('emulator-id')
.then(() => {
console.log('has been stopped');
})
.catch((err) => {
console.log(err);
});
field | type | required | default | note |
---|---|---|---|---|
emulatorId | string | true | - | 模拟器设备 ID |
在给定的模拟器设备和,是否已安装给定的软件包。
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 |
packageName | string | true | - | 软件包 id |
为给定的模拟器设备安装给定的软件包。
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 |
apkPath | string | true | - | apk 安装包所在路径位置 |
options | object | false | - | "adb install"的参数:-lrtsdg |
发送按键指令给给定的模拟器设备。
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 |
key | number | true | - | 所要发送的按键 key 值,见安卓文档 |
列出当前已连接的设备。相当于adb devices
。
android
.devices()
.then((res) => {
res.forEach((item) => {
console.log(`name: ${item.name}, status: ${item.status}`);
});
})
.catch((err) => {
console.log(err);
});
列出给定设备上,已安装的软件包
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 |
列出当前系统可用的用于创建模拟器的设备列表。
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);
});
详细列出当前已创建的模拟器列表。
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);
});
列出可用的安卓镜像设备。
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);
});
列出所有的安卓镜像。
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);
});
列出已安装的所有安卓镜像。
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);
});
使用adb
执行自定义命令。
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 | - | 要执行的命令 |
使用avdmanager
执行自定义命令。
android
.avdmanager('list avd')
.then((res) => {
console.log(res.output);
})
.catch((err) => {
console.log(err);
});
field | type | required | default | note |
---|---|---|---|---|
cmd | string | true | - | 要执行的命令 |
使用sdkmanager
执行自定义命令。
android
.sdkmanager('--list')
.then((res) => {
console.log(res.output);
})
.catch((err) => {
console.log(err);
});
field | type | required | default | note |
---|---|---|---|---|
cmd | string | true | - | 要执行的命令 |
使用emulator
执行自定义命令。
android
.emulator('--help')
.then((res) => {
console.log(res.output);
})
.catch((err) => {
console.log(err);
});
field | type | required | default | note |
---|---|---|---|---|
cmd | string | true | - | 要执行的命令 |