# karma-android-launcher
[](https://github.com/wtto00/karma-android-launcher/actions/workflows/test.yml)
[English](./README.md) | 简体中文
使用连接的安卓设备或者模拟器中的系统 webview 来加载 karma 测试。
## 安装
```shell
pnpm add @wtto00/karma-android-launcher -D
# yarn add @wtto00/karma-android-launcher -D
# npm i @wtto00/karma-android-launcher -D
```
## 使用
`karma.config.js`
```js
// 使用模拟器
module.exports = function (config) {
config.set({
// ...
hostname: "10.0.2.2", // 模拟器可使用固定ip:10.0.2.2
browsers: ["AndroidEmulator"],
captureTimeout: 1200000,
browserDisconnectTimeout: 60000,
browserNoActivityTimeout: 300000,
plugins: [
// ...
require("@wtto00/karma-android-launcher"),
],
});
};
```
```js
// 使用连接的设备
const ip = require("ip");
module.exports = function (config) {
config.set({
// ...
hostname: ip.address(), // 连接的设备真机需要使用局域网ip
browsers: ["AndroidDevice"],
captureTimeout: 1200000,
browserDisconnectTimeout: 60000,
browserNoActivityTimeout: 300000,
plugins: [
// ...
require("@wtto00/karma-android-launcher"),
],
});
};
```
也可以自定义安卓版本使用,但是最好提前安装好镜像,因为安装镜像是很耗费时间的过程,可能会导致测试超时失败。
```js
// 自定义安卓版本模拟器
const customLaunchers = {
// 最低支持安卓5.0
android_emulator_5: {
base: "AndroidEmulator", // 这里定义使用安卓模拟器
avdName: "android_emulator_21", // 这里是自定义的模拟器名称
apiLevel: 21, // 这里定义安卓版本
// ... 更多参数可见下方说明
},
};
module.exports = function (config) {
config.set({
// ...
hostname: "10.0.2.2", // 模拟器可使用固定ip:10.0.2.2
browsers: ["android_emulator_5"],
customLaunchers,
captureTimeout: 1200000,
browserDisconnectTimeout: 60000,
browserNoActivityTimeout: 300000,
plugins: [
// ...
require("@wtto00/karma-android-launcher"),
],
});
};
```
### 自定义模拟器参数
| 名称 | 类型 | 说明 |
| --------------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| avdName | string | 要创建的模拟器名称 |
| apiLevel | number | 所要使用的安卓 SDK 版本,最低支持 21,即安卓 5.0 |
| arch | string | 模拟器所使用系统镜像的 CPU 架构。默认是当前系统的 CPU 架构 |
| target | string | 系统镜像的目标,一般为'default'或者'google_apis'。默认为'default' |
| image | string | 要使用的安卓镜像。例如:`system-images;android-34;google_apis;x86_64`。如果有此参数 image,则参数 apiLevel、arch、target 将无效。否则,将根据 apiLevel、arch、target 三个参数来拼接此参数值。 |
| adb | string | adb 可执行文件,相对于`ANDROID_HOME`的路径。默认为:`platform-tools/adb` |
| avdmanager | string | avdmanager 可执行文件,相对于`ANDROID_HOME`的路径。默认为:`cmdline-tools/latest/bin/avdmanager` |
| sdkmanager | string | sdkmanager 可执行文件,相对于`ANDROID_HOME`的路径。默认为:`cmdline-tools/latest/bin/sdkmanager` |
| emulator | string | emulator 可执行文件,相对于`ANDROID_HOME`的路径。默认为:`emulator/emulator` |
| emulatorOptions | object | [启动模拟器的参数](#启动模拟器的参数) |
### 启动模拟器的参数
| 名称 | 类型 | 说明 |
| -------------------- | --------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------ |
| noWindow | boolean | 禁用图形窗口显示 |
| noSnapshot | boolean | 执行完全引导,不自动保存,但 qemu vmload 和 vmsave 在 snapstorage 上操作 |
| noSnapstorage | boolean | 不要装载快照存储文件(这将禁用所有快照功能) |
| noSnapshotUpdateTime | boolean | 在还原时不要尝试更正快照时间 |
| noSnapshotSave | boolean | 退出时不自动保存到快照:放弃已更改的状态 |
| noSnapshotLoad | boolean | 不要从快照自动启动:执行完全启动 |
| cameraBack | "emulated"
"virtualscene"
"videoplayback"
"none"
"webcam" | 为背面的相机设置模拟模式 |
| cameraFront | 'emulated'
'webcam'
'none' | 为前置摄像头设置模拟模式 |
| gpu | 'auto'
'auto-no-window'
'host'
'swiftshader_indirect'
'angle_indirect'
'guest' | 设置硬件 OpenGLES 仿真模式 |
| nocache | boolean | 禁用缓存分区 |
| noaudio | boolean | 禁用音频支持 |
| noBootAnim | boolean | 禁用动画以加快启动速度 |
| lowram | boolean | 该设备是一种低 ram 设备 |
| restartWhenStalled | boolean | 允许在来宾停止时重新启动。 |
| waitForDebugger | boolean | 启动时暂停,等待调试器进程附加后再继续 |
| httpProxy | string | 通过 HTTP/HTTPS 代理进行 TCP 连接 |
| cores | number | 将 CPU 核心数设置为模拟器 |
| wipeData | boolean | 重置用户数据映像(从 initdata 复制) |
| noPassiveGps | boolean | 禁用被动 gps 更新 |
| ... | ... | 更多可使用`emulator --help`查看 |
## 使用 Github Action
可参见本项目的配置[test.yml](./.github/workflows/test.yml)
其中 `matrix.config.targetBrowser` 中使用的浏览器名称,要提前在自己的 karma 中定义好,才可以使用。
然后在 karma 中使用 `process.env[TARGET_BROWSER]` 来获取当前所使用的浏览器。
## 备注
1. **安卓系统中的 webview 对应版本**
- Android 5.0 Lollipop (WebView version 44)
- Android 5.1 Lollipop (WebView version 45)
- Android 6.0 Marshmallow (WebView version 46)
- Android 7.0 Nougat (WebView version 51)
- Android 7.1 Nougat (WebView version 52)
- Android 8.0 Oreo (WebView version 60)
- Android 8.1 Oreo (WebView version 61)
- Android 9.0 Pie (WebView version 67)
- Android 10 (WebView version 69)
- Android 11 (WebView version 85)