WebUI API
带有 webroot/index.html 的插件会获得一个 WebUI:AxManager 在独立窗口中打开的网页,页面中的 JavaScript 对象可以通过 AxManager 的服务运行 shell 命令。ksu 对象遵循 KernelSU 的 WebUI API,因此大多数 KernelSU 的 WebUI 无需修改即可使用;AxManager 还额外提供了自己的 Axeron 对象。
页面
webroot/作为站点根目录,地址为ax://plugin.local/;WebUI 打开的是ax://plugin.local/index.html。与 KernelSU 一样,同样的文件也在https://mui.kernelsu.org/下提供。/internal/insets.css以 CSS 变量定义窗口边距(--safe-area-inset-top、--window-inset-bottom等),/internal/colors.css定义应用当前的配色。- 应用图标:
ax://package.icon/<包名>或ksu://icon/<包名>以 PNG 返回已安装应用的图标。 - 无法加载
webroot/之外的本地文件。
可以在插件的 WebUI配置中把 WebUI 固定到桌面(参见应用导览)。
调试
在设置 → 开发者中打开开发者模式和 WebView 调试功能:插件 WebUI 即可使用 Chrome 远程调试(chrome://inspect),并带有页面内控制台(Eruda)。
命令以插件身份运行
WebUI 运行的每条命令都由 AxManager 的服务启动,拥有服务的权限(shell,或 root 模式下的 root)及其环境变量,并带有 AXERON_PLUGIN=<id>。因此页面启动的任何进程(包括守护进程)都会在插件被禁用或移除时一并停止(参见插件进程)。
引号
命令字符串会由一个 shell 以 sh -c "…" 的形式传递,即放在双引号内。需要原样传给命令的 "、$ 和反引号请转义;较长的逻辑可以放进插件内的脚本中再运行(sh ./script.sh,并把 cwd 选项设为 moduleInfo() 中的插件文件夹)。
保持页面响应
调用 ksu 或 Axeron 时,页面的 JavaScript 会一直阻塞到调用返回:页面不会重绘,定时器停止,加载动画也会卡住。回调形式(ksu.exec(command, options, callback)、ksu.spawn、Axeron.exec(command, options, callback))会立即返回并在后台运行命令,因此耗时的操作请优先使用它们,或基于它们的 kernelsu.js / axeron.js 辅助模块。同步形式适合很快就能完成的调用。
ksu 对象
ksu.exec(command)
运行 command 并等待其结束,期间页面会被阻塞。返回 stdout 字符串;如果 stderr 不为空,后面会附加换行和 stderr。
ksu.exec(command, options, callbackName)
立即返回并在后台运行 command,结束后调用 window[callbackName](errno, stdout, stderr)。options 是一个 JSON 字符串:
| 选项 | 含义 |
|---|---|
cwd | 工作目录(在命令前执行 cd) |
env | 额外环境变量组成的对象 |
插件的 system/bin 会被放在 PATH 的最前面。ksu.exec(command, callbackName) 与之相同,只是没有选项。
ksu.spawn(command, args, options, callbackName)
以 args(JSON 数组字符串,追加在命令之后)启动 command,并以流的方式输出。window[callbackName] 必须是一个带有 stdout、stderr 事件发射器和 emit 方法的对象;AxManager 会调用:
- 输出到达时调用
stdout.emit('data', chunk)和stderr.emit('data', chunk), - 退出码不为 0 时调用
emit('error', err)(err.exitCode,err.message为 stderr), - 最后在结束时调用
emit('exit', code)。它在error之后,因此可以在exit时丢弃该对象。
options 和 PATH 的处理与 exec 相同。kernelsu 辅助模块会为您构建这个对象。
其他方法
| 方法 | 返回 |
|---|---|
ksu.toast(message) | 显示一条 Toast。 |
ksu.fullScreen(enable) | 隐藏或显示系统栏。 |
ksu.moduleInfo() | JSON 字符串:插件的 module.prop 字段和状态,以及 moduleDir(插件文件夹)。 |
ksu.listPackages(type) | 包名组成的 JSON 数组:"user"、"system",其他值则为全部。 |
ksu.listUserPackages()、ksu.listSystemPackages()、ksu.listAllPackages() | 同上,作为单独的方法。 |
ksu.getPackagesInfo(packages) | packages 为 JSON 数组字符串。返回 {packageName, versionName, versionCode, appLabel, isSystem, uid} 组成的 JSON 数组;找不到的包返回 {packageName, error}。 |
ksu.getPackagesIcons(packages, size) | {packageName, icon} 组成的 JSON 数组,icon 为 data:image/png;base64,… URL(无法获取时为空)。 |
ksu.cacheAllPackageIcons(size) | 预先加载所有应用图标,供 getPackagesIcons 使用。 |
包列表只包含设备的主用户(用户 0)。
Axeron 对象
| 方法 | 返回 |
|---|---|
Axeron.exec(command, options) | 运行 command 并等待其结束,期间页面会被阻塞。options 是与 ksu.exec 相同的 JSON 字符串。返回 JSON 字符串 {"errno": …, "stdout": "…", "stderr": "…"}。 |
Axeron.exec(command, options, callbackName) | 立即返回并在后台运行 command,结束后调用 window[callbackName](errno, stdout, stderr)。 |
Axeron.toast(message) | 显示一条 Toast。 |
辅助模块
AxManager 提供两个小型 ES 模块,用 Promise 封装上述对象。
kernelsu.js(地址 ax://kernelsu.js/),与 KernelSU 的 kernelsu npm 包提供相同的函数:
import { exec, spawn, toast, fullScreen } from "kernelsu";
const { errno, stdout, stderr } = await exec("ls -l", { cwd: "/sdcard" });
const child = spawn("logcat -d");
child.stdout.on("data", (line) => console.log(line));
child.on("exit", (code) => toast(`exit ${code}`));axeron.js(地址 ax://axeron.js/):
import { exec } from "ax://axeron.js/";
const { errno, stdout, stderr } = await exec("id", { cwd: "/" }); // 不会阻塞页面spawn(command, args)、spawn(command, options) 和 spawn(command, args, options) 都可以使用:数组总是 args,对象则是 options。