如何使用shizuku来实现自动化脚本?

在移动自动化领域,Shizuku 凭借其无需 ROOT 即可获取高级系统权限的特性,成为实现复杂自动化操作的核心工具。本文将从 Shizuku 的基础原理入手,结合冰狐平台的 JS API,全面讲解自动化脚本的开发流程、核心 API 使用方法,并提供可直接运行的 Demo 源码,帮助开发者快速掌握基于冰狐 + Shizuku 的自动化开发技术。

一、 Shizuku 能力核心价值

1.1 Shizuku 优势

Shizuku 的核心作用是让普通应用在不 ROOT 的情况下,通过 ADB 授权获得近似系统级的操作权限,而冰狐智能辅助平台将 Shizuku 的底层能力封装为标准化的 JS API,开发者无需关注底层通信细节,只需调用平台提供的 API 即可实现:

  • 无需 ROOT 执行系统级命令(如修改系统设置、管理应用、操作文件);
  • 跨应用自动化操作,突破普通辅助工具的权限限制;
  • 高效的进程 / 包管理、文件读写、系统服务调用;
  • 与冰狐平台原有自动化能力(如控件操作、屏幕识别)无缝融合。

1.2 前置准备工作

在开发脚本前,需完成以下环境配置(参考冰狐官方文档):

  1. Shizuku 服务激活
    • 在冰狐平台内进入 "设置 - 高级设置 - Shizuku",按照指引完成 ADB 授权或无线调试授权;
    • 确认 Shizuku 服务状态为 "已激活",可通过冰狐的shizuku.isRunning() API 验证。
  2. 开发环境配置
    • 冰狐平台内置脚本编辑器,支持语法高亮、代码补全,直接在平台内编写 / 运行 JS 脚本;
    • 确保冰狐客户端版本≥v3.0(支持完整的 Shizuku JS API)。
  3. 权限说明
    • 脚本运行前需授予冰狐平台 "悬浮窗""无障碍" 基础权限;
    • Shizuku 相关操作需完成 ADB 授权,授权后无需重复操作(除非设备重启)。

二、Shizuku 核心 API 详解

冰狐平台为 Shizuku 封装了一套简洁的 JS API,所有 API 均挂载在shizuku对象下,核心能力分为 "基础状态检测""命令执行""包管理""文件操作" 四大类,以下是高频 API 的详细说明:

2.1 基础状态检测

  • shizuku.isRunning():返回布尔值,检测 Shizuku 服务是否正常运行,是所有操作的前置校验;
  • shizuku.getVersion():返回 Shizuku 服务版本号,用于兼容不同版本的 API 差异。

2.2 系统命令执行

  • shizuku.exec(cmd, callback):执行任意 ADB 权限的系统命令,核心参数:
    • cmd:字符串类型,待执行的系统命令(如pm list packages);
    • callback:回调函数,接收执行结果,包含code(返回码,0 为成功)、stdout(标准输出)、stderr(错误信息)。
  • shizuku.execSync(cmd):同步执行命令,直接返回执行结果(注意:同步操作可能阻塞脚本,建议仅用于短耗时命令)。

2.3 应用包管理

  • shizuku.packageInstall(apkPath, callback):安装 APK 文件,apkPath为文件绝对路径;
  • shizuku.packageUninstall(packageName, callback):卸载应用,packageName为应用包名(如com.android.settings);
  • shizuku.getPackageInfo(packageName):获取应用详细信息,返回包含版本号、安装路径、权限等的对象。

2.4 文件操作(系统级)

  • shizuku.fileRead(path, encoding):读取系统级文件(如/data/data/com.android.systemui/shared_prefs下的文件),encoding默认为utf-8
  • shizuku.fileWrite(path, content, encoding):写入内容到系统文件,需确保路径有写入权限;
  • shizuku.fileExists(path):检测系统文件是否存在,返回布尔值。

三、实战开发

以下是一个完整的 Demo 脚本,基于冰狐 Shizuku API 实现 "应用批量管理" 功能,包含 Shizuku 状态检测、已安装应用列表导出、指定应用卸载、APK 自动安装四大核心功能。

3.1 Demo 功能说明

  1. 启动时检测 Shizuku 服务状态,未激活则提示用户授权;
  2. 导出设备中所有已安装应用的包名和名称到系统文件;
  3. 提供 "按包名卸载应用" 的功能,支持批量卸载;
  4. 自动安装指定路径下的 APK 文件,并返回安装结果。

3.2 完整 Demo 源码

javascript 复制代码
/**
 * 基于冰狐Shizuku的应用管理自动化脚本
 * 依赖:冰狐平台v3.0+、Shizuku服务已激活
 * 功能:检测Shizuku状态、导出应用列表、卸载应用、安装APK
 */

// 全局配置
const CONFIG = {
  // 应用列表导出路径(系统可读写目录)
  exportPath: "/sdcard/Android/data/com.aznfz.icefox/files/app_list.txt",
  // 待安装的APK路径(示例)
  apkPath: "/sdcard/Download/test.apk",
  // 待卸载的应用包名列表(示例)
  uninstallPackages: ["com.example.unusedapp1", "com.example.unusedapp2"]
};

/**
 * 第一步:检测Shizuku服务状态
 * @returns {boolean} 服务是否正常运行
 */
function checkShizukuStatus() {
  const isRunning = shizuku.isRunning();
  if (!isRunning) {
    // 冰狐平台弹窗提示API
    dialogs.alert("Shizuku服务未激活", "请先在冰狐设置中完成Shizuku的ADB授权,激活后重试");
    return false;
  }
  // 输出Shizuku版本信息(冰狐日志API)
  console.log(`Shizuku服务已激活,版本号:${shizuku.getVersion()}`);
  return true;
}

/**
 * 第二步:导出所有已安装应用列表
 * 执行pm list packages命令,并解析结果
 */
function exportAppList() {
  // 执行系统命令:获取所有已安装应用包名
  shizuku.exec("pm list packages -f", (result) => {
    if (result.code !== 0) {
      console.error("导出应用列表失败:", result.stderr);
      dialogs.toast("应用列表导出失败");
      return;
    }

    // 解析命令输出结果
    const appLines = result.stdout.split("\n");
    let appListStr = "应用路径 | 应用包名\n";
    appListStr += "-------------------------\n";
    
    appLines.forEach(line => {
      if (line.trim() === "") return;
      // 解析pm list packages -f的输出格式:package:/data/app/xxx=com.xxx.xxx
      const [pathPart, pkgPart] = line.split("=");
      const appPath = pathPart.replace("package:", "");
      const appPkg = pkgPart || "未知包名";
      appListStr += `${appPath} | ${appPkg}\n`;
    });

    // 将解析后的内容写入文件(冰狐Shizuku文件操作API)
    shizuku.fileWrite(CONFIG.exportPath, appListStr, "utf-8");
    console.log(`应用列表已导出至:${CONFIG.exportPath}`);
    dialogs.toast(`应用列表导出成功,共${appLines.length}个应用`);
  });
}

/**
 * 第三步:批量卸载指定应用
 * @param {Array} pkgList 待卸载的包名列表
 */
function batchUninstallApps(pkgList) {
  if (pkgList.length === 0) {
    dialogs.toast("无待卸载应用");
    return;
  }

  let successCount = 0;
  let failCount = 0;

  // 遍历包名列表,逐个卸载
  pkgList.forEach((pkg, index) => {
    // 执行卸载命令(pm uninstall需要Shizuku权限)
    shizuku.exec(`pm uninstall ${pkg}`, (result) => {
      if (result.code === 0) {
        console.log(`卸载成功:${pkg}`);
        successCount++;
      } else {
        console.error(`卸载失败:${pkg},原因:${result.stderr}`);
        failCount++;
      }

      // 所有应用处理完成后提示结果
      if (index === pkgList.length - 1) {
        dialogs.alert(
          "批量卸载完成",
          `成功卸载:${successCount}个\n失败卸载:${failCount}个`
        );
      }
    });
  });
}

/**
 * 第四步:自动安装指定APK
 * @param {string} apkPath APK文件绝对路径
 */
function installApk(apkPath) {
  // 先检测APK文件是否存在
  if (!shizuku.fileExists(apkPath)) {
    dialogs.alert("文件不存在", `未找到APK文件:${apkPath}`);
    return;
  }

  console.log(`开始安装APK:${apkPath}`);
  // 执行APK安装命令
  shizuku.exec(`pm install ${apkPath}`, (result) => {
    if (result.code === 0) {
      dialogs.toast("APK安装成功");
      console.log("安装日志:", result.stdout);
    } else {
      dialogs.alert("安装失败", `原因:${result.stderr}`);
      console.error("安装失败:", result.stderr);
    }
  });
}

/**
 * 脚本主入口
 */
function main() {
  // 前置校验:Shizuku状态
  if (!checkShizukuStatus()) return;

  // 步骤1:导出应用列表
  exportAppList();

  // 步骤2:批量卸载指定应用(延迟执行,避免与导出操作冲突)
  setTimeout(() => {
    batchUninstallApps(CONFIG.uninstallPackages);
  }, 3000);

  // 步骤3:安装指定APK(按需执行,注释掉则不执行)
  // installApk(CONFIG.apkPath);
}

// 启动脚本
main();

3.3 代码核心解析

  1. 状态校验checkShizukuStatus函数通过shizuku.isRunning()检测服务状态,未激活时通过冰狐dialogs.alert提示用户,这是所有 Shizuku 操作的基础;
  2. 命令执行exportAppList中调用shizuku.exec("pm list packages -f")执行系统命令,解析返回的应用列表并通过shizuku.fileWrite写入文件,体现了 "命令执行 + 文件操作" 的组合用法;
  3. 批量操作batchUninstallApps遍历包名列表,逐个调用shizuku.exec("pm uninstall")实现卸载,通过回调函数统计成功 / 失败数量,保证操作的可追溯性;
  4. 文件检测installApk中先通过shizuku.fileExists检测 APK 文件是否存在,避免执行无效命令,这是提升脚本健壮性的关键。

四、脚本运行与调试技巧

4.1 运行方式

在冰狐平台中,将上述代码复制到 "脚本编辑器",点击 "运行" 按钮即可执行,运行过程中可通过 "日志面板" 查看console.log/console.error输出的信息,定位问题。

4.2 常见问题排查

  1. Shizuku 服务未激活:检查 ADB 授权是否过期,设备重启后需重新授权;
  2. 命令执行失败(code≠0)
    • 确认命令语法正确(如pm install需指定 APK 绝对路径);
    • 检查权限是否足够(部分系统目录 / 操作需要更高权限);
  3. 文件写入失败 :优先选择/sdcard目录(外部存储),避免写入系统只读目录;
  4. 脚本阻塞 :避免频繁使用shizuku.execSync,长耗时操作(如安装大型 APK)建议使用异步回调。

4.3 优化建议

  1. 错误处理:为每个 Shizuku API 调用添加错误回调,避免单个操作失败导致整个脚本终止;
  2. 用户交互 :结合冰狐dialogs/toast API,在关键节点(如卸载前、安装完成后)给出提示,提升用户体验;
  3. 权限兼容:不同设备的 Shizuku 权限范围可能不同,建议在脚本中增加权限检测逻辑。

五、进阶应用场景拓展

基于冰狐 Shizuku API,除了应用管理,还可实现更多复杂的自动化场景:

  1. 系统设置自动化 :执行settings put命令修改系统设置(如屏幕亮度、休眠时间);
  2. 日志采集 :通过shizuku.exec("logcat")采集系统日志,用于故障排查;
  3. 跨应用数据同步:读取其他应用的沙盒文件(需 Shizuku 权限),实现数据备份 / 同步;
  4. 后台进程管理 :执行am force-stop强制停止后台进程,优化设备性能。

总结

本文从冰狐平台 Shizuku 的核心价值出发,详细讲解了 Shizuku 的前置配置、核心 API 用法,并通过完整的 Demo 脚本展示了 "状态检测 - 命令执行 - 文件操作 - 批量管理" 的全流程开发思路。核心要点总结如下:

  1. 基础前提 :使用 Shizuku API 前必须确保 Shizuku 服务已激活,通过shizuku.isRunning()校验状态是首要步骤;
  2. 核心用法shizuku.exec是执行系统命令的核心 API,结合回调函数可处理异步操作,shizuku.fileRead/fileWrite实现系统级文件操作;
  3. 开发原则:脚本需注重错误处理和用户交互,优先使用异步 API 避免阻塞,选择合适的文件路径保证操作成功率。
相关推荐
Mr -老鬼1 天前
EasyClick 大文件分割合并
自动化·autojs·easyclick·易点云测
ai_coder_ai2 天前
如何使用adb来实现自动化脚本
adb·autojs·自动化脚本·冰狐智能辅助·easyclick
PyHaVolask4 天前
SQL 注入实战:布尔盲注原理与自动化脚本解析
sql注入·二分查找算法·自动化脚本·布尔盲注·sqli-labs靶场
Mr -老鬼4 天前
EasyClick 热更新坑点处理方案
自动化·ec·easyclick·易点云测
ai_coder_ai6 天前
如何使用ocr来实现自动化脚本?
ocr·autojs·自动化脚本·冰狐智能辅助·easyclick
ai_coder_ai7 天前
在自动化脚本中如何在自定义ui中使用webview来无限扩展ui?
ui·autojs·自动化脚本·冰狐智能辅助·easyclick
ai_coder_ai11 天前
在冰狐中如何正确处理文件夹和文件?
autojs·自动化脚本·冰狐智能辅助·easyclick
ai_coder_ai12 天前
如何使用图色操作实现自动化脚本?
autojs·自动化脚本·冰狐智能辅助·easyclick
weixin_462446232 个月前
使用 Python 批量在 HTML 文件中插入自定义 div 元素
python·beautifulsoup·自动化脚本·html 批量处理