# android-tools
[](https://github.com/wtto00/android-tools/actions/workflows/test-publish.yml)
使用 Nodejs 控制管理 Andorid 设备。
[English](./README.md) | 简体中文
## 安装
```shell
npm i @wtto00/android-tools
```
## 用法
```js
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` 的相对路径|
### start
打开一个已存在的模拟器设备。
```js
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更新 |
### waitForDevice
等待给定的设备打开,可使用状态。
```js
android
.waitForDevice('emulator-id')
.then(() => {
console.log('available');
})
.catch((err) => {
console.log(err);
});
```
| field | type | required | default | note |
| ---------- | ------ | -------- | ------- | ------------- |
| emulatorId | string | true | - | 模拟器设备 ID |
### ensureReady
确保给定的设备已准备就绪。可以 adb 执行一系列命令。
```js
android
.ensureReady('emulator-id')
.then(() => {
console.log('ready');
})
.catch((err) => {
console.log(err);
});
```
| field | type | required | default | note |
| ---------- | ------ | -------- | ------- | ------------- |
| emulatorId | string | true | - | 模拟器设备 ID |
### createAVD
创建一个模拟器。
```js
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`参数是必须的。
### hasAVD
当前系统是否已存在给定的模拟器。
```js
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 | - | 模拟器名称 |
### stop
停止给定的模拟器。
```js
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 |
### waitForStop
等待给定的模拟器停止完毕。
```js
android
.waitForStop('emulator-id')
.then(() => {
console.log('has been stopped');
})
.catch((err) => {
console.log(err);
});
```
| field | type | required | default | note |
| ---------- | ------ | -------- | ------- | ------------- |
| emulatorId | string | true | - | 模拟器设备 ID |
### isInstalled
在给定的模拟器设备和,是否已安装给定的软件包。
```js
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 |
### install
为给定的模拟器设备安装给定的软件包。
```js
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 |
### inputKeyEvent
发送按键指令给给定的模拟器设备。
```js
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 值,见[安卓文档](https://developer.android.com/reference/android/view/KeyEvent) |
### devices
列出当前已连接的设备。相当于`adb devices`。
```js
android
.devices()
.then((res) => {
res.forEach((item) => {
console.log(`name: ${item.name}, status: ${item.status}`);
});
})
.catch((err) => {
console.log(err);
});
```
### listPackages
列出给定设备上,已安装的软件包
```js
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 |
### listDevices
列出当前系统可用的用于创建模拟器的设备列表。
```js
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);
});
```
### listAVDs
详细列出当前已创建的模拟器列表。
```js
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);
});
```
### listTargets
列出可用的安卓镜像设备。
```js
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);
});
```
### listImages
列出所有的安卓镜像。
```js
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);
});
```
### listInstalledImages
列出已安装的所有安卓镜像。
```js
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
使用`adb`执行自定义命令。
```js
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
使用`avdmanager`执行自定义命令。
```js
android
.avdmanager('list avd')
.then((res) => {
console.log(res.output);
})
.catch((err) => {
console.log(err);
});
```
| field | type | required | default | note |
| ----- | ------ | -------- | ------- | ------------ |
| cmd | string | true | - | 要执行的命令 |
### sdkmanager
使用`sdkmanager`执行自定义命令。
```js
android
.sdkmanager('--list')
.then((res) => {
console.log(res.output);
})
.catch((err) => {
console.log(err);
});
```
| field | type | required | default | note |
| ----- | ------ | -------- | ------- | ------------ |
| cmd | string | true | - | 要执行的命令 |
### emulator
使用`emulator`执行自定义命令。
```js
android
.emulator('--help')
.then((res) => {
console.log(res.output);
})
.catch((err) => {
console.log(err);
});
```
| field | type | required | default | note |
| ----- | ------ | -------- | ------- | ------------ |
| cmd | string | true | - | 要执行的命令 |