在移动自动化领域,Shizuku 凭借其无需 ROOT 即可获取高级系统权限的特性,成为实现复杂自动化操作的核心工具。本文将从 Shizuku 的基础原理入手,结合冰狐平台的 JS API,全面讲解自动化脚本的开发流程、核心 API 使用方法,并提供可直接运行的 Demo 源码,帮助开发者快速掌握基于冰狐 + Shizuku 的自动化开发技术。
一、 Shizuku 能力核心价值
1.1 Shizuku 优势
Shizuku 的核心作用是让普通应用在不 ROOT 的情况下,通过 ADB 授权获得近似系统级的操作权限,而冰狐智能辅助平台将 Shizuku 的底层能力封装为标准化的 JS API,开发者无需关注底层通信细节,只需调用平台提供的 API 即可实现:
- 无需 ROOT 执行系统级命令(如修改系统设置、管理应用、操作文件);
- 跨应用自动化操作,突破普通辅助工具的权限限制;
- 高效的进程 / 包管理、文件读写、系统服务调用;
- 与冰狐平台原有自动化能力(如控件操作、屏幕识别)无缝融合。
1.2 前置准备工作
在开发脚本前,需完成以下环境配置(参考冰狐官方文档):
- Shizuku 服务激活 :
- 在冰狐平台内进入 "设置 - 高级设置 - Shizuku",按照指引完成 ADB 授权或无线调试授权;
- 确认 Shizuku 服务状态为 "已激活",可通过冰狐的
shizuku.isRunning()API 验证。
- 开发环境配置 :
- 冰狐平台内置脚本编辑器,支持语法高亮、代码补全,直接在平台内编写 / 运行 JS 脚本;
- 确保冰狐客户端版本≥v3.0(支持完整的 Shizuku JS API)。
- 权限说明 :
- 脚本运行前需授予冰狐平台 "悬浮窗""无障碍" 基础权限;
- 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 功能说明
- 启动时检测 Shizuku 服务状态,未激活则提示用户授权;
- 导出设备中所有已安装应用的包名和名称到系统文件;
- 提供 "按包名卸载应用" 的功能,支持批量卸载;
- 自动安装指定路径下的 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 代码核心解析
- 状态校验 :
checkShizukuStatus函数通过shizuku.isRunning()检测服务状态,未激活时通过冰狐dialogs.alert提示用户,这是所有 Shizuku 操作的基础; - 命令执行 :
exportAppList中调用shizuku.exec("pm list packages -f")执行系统命令,解析返回的应用列表并通过shizuku.fileWrite写入文件,体现了 "命令执行 + 文件操作" 的组合用法; - 批量操作 :
batchUninstallApps遍历包名列表,逐个调用shizuku.exec("pm uninstall")实现卸载,通过回调函数统计成功 / 失败数量,保证操作的可追溯性; - 文件检测 :
installApk中先通过shizuku.fileExists检测 APK 文件是否存在,避免执行无效命令,这是提升脚本健壮性的关键。
四、脚本运行与调试技巧
4.1 运行方式
在冰狐平台中,将上述代码复制到 "脚本编辑器",点击 "运行" 按钮即可执行,运行过程中可通过 "日志面板" 查看console.log/console.error输出的信息,定位问题。
4.2 常见问题排查
- Shizuku 服务未激活:检查 ADB 授权是否过期,设备重启后需重新授权;
- 命令执行失败(code≠0) :
- 确认命令语法正确(如
pm install需指定 APK 绝对路径); - 检查权限是否足够(部分系统目录 / 操作需要更高权限);
- 确认命令语法正确(如
- 文件写入失败 :优先选择
/sdcard目录(外部存储),避免写入系统只读目录; - 脚本阻塞 :避免频繁使用
shizuku.execSync,长耗时操作(如安装大型 APK)建议使用异步回调。
4.3 优化建议
- 错误处理:为每个 Shizuku API 调用添加错误回调,避免单个操作失败导致整个脚本终止;
- 用户交互 :结合冰狐
dialogs/toastAPI,在关键节点(如卸载前、安装完成后)给出提示,提升用户体验; - 权限兼容:不同设备的 Shizuku 权限范围可能不同,建议在脚本中增加权限检测逻辑。
五、进阶应用场景拓展
基于冰狐 Shizuku API,除了应用管理,还可实现更多复杂的自动化场景:
- 系统设置自动化 :执行
settings put命令修改系统设置(如屏幕亮度、休眠时间); - 日志采集 :通过
shizuku.exec("logcat")采集系统日志,用于故障排查; - 跨应用数据同步:读取其他应用的沙盒文件(需 Shizuku 权限),实现数据备份 / 同步;
- 后台进程管理 :执行
am force-stop强制停止后台进程,优化设备性能。
总结
本文从冰狐平台 Shizuku 的核心价值出发,详细讲解了 Shizuku 的前置配置、核心 API 用法,并通过完整的 Demo 脚本展示了 "状态检测 - 命令执行 - 文件操作 - 批量管理" 的全流程开发思路。核心要点总结如下:
- 基础前提 :使用 Shizuku API 前必须确保 Shizuku 服务已激活,通过
shizuku.isRunning()校验状态是首要步骤; - 核心用法 :
shizuku.exec是执行系统命令的核心 API,结合回调函数可处理异步操作,shizuku.fileRead/fileWrite实现系统级文件操作; - 开发原则:脚本需注重错误处理和用户交互,优先使用异步 API 避免阻塞,选择合适的文件路径保证操作成功率。