jshook 中文文档 下载 App

view 视图操作——模拟点击、坐标定位、控件查找

核心用法

view 模块需要在目标应用的 UI 线程上运行,通常配合 Java.perform 使用。

查找视图

// 通过 ID 查找
var btn = view.findById('com.example.app:id/btn_buy');

// 通过文字查找
var okBtn = view.findByText('确定');

// 遍历所有视图
view.traverse(function (view) {
    console.log('[+] 找到视图: ' + view.className + ', id=' + view.id + ', text=' + view.text);
});

模拟点击

// 点一下找到的按钮
view.click(btn);

// 按坐标点(屏幕绝对坐标)
view.click(500, 800);

// 长按
view.longClick(500, 800);

读取视图信息

var info = view.getInfo(btn);
console.log('[+] 控件类型: ' + info.className);
console.log('[+] 控件文字: ' + info.text);
console.log('[+] 位置: (' + info.left + ',' + info.top + ') - (' + info.right + ',' + info.bottom + ')');
console.log('[+] 是否可见: ' + info.visible);
console.log('[+] 是否启用: ' + info.enabled);

模拟滑动

// 从 (100, 500) 滑到 (900, 500)
view.swipe(100, 500, 900, 500);

输入文字

var inputField = view.findById('com.example.app:id/et_username');
view.input(inputField, 'test_user');

典型场景

自动点确认

目标应用弹窗问"确定购买吗?",自动帮你点确定:

Java.perform(function () {
    var okBtn = view.findByText('确定');
    if (okBtn) {
        console.log('[+] 找到确定按钮,自动点击');
        view.click(okBtn);
    }
});

跳过广告弹窗

有些应用启动时弹广告,几秒后出现「跳过」按钮,可以 Hook Activity.onCreate 后自动查找并点击:

Java.perform(function () {
    var Activity = Java.use('com.example.app.MainActivity');
    Activity.onCreate.implementation = function (bundle) {
        this.onCreate(bundle);
        // 延迟 3 秒找跳过按钮
        setTimeout(function () {
            var skipBtn = view.findByText('跳过');
            if (skipBtn) view.click(skipBtn);
        }, 3000);
    };
});

坐标获取

不知道按钮坐标?可以用 view 模块遍历所有可见视图,打印它们的坐标范围:

Java.perform(function () {
    view.traverse(function (v) {
        var info = view.getInfo(v);
        if (info.visible) {
            console.log(info.text + ' → (' + info.left + ',' + info.top + ')');
        }
    });
});

注意事项

UI 线程限制

view 模块的所有操作必须在目标应用的 UI 线程上执行。如果你用 setTimeout 延迟执行,记得切到 UI 线程:

setTimeout(function () {
    Java.perform(function () {
        // 在这里调 view 模块
    });
}, 3000);

内核模式不可用

如果 JsHook 运行在内核驱动模式,view 模块不可用——观察者进程没有目标应用的 UI 上下文。详见 内核模式可用/不可用 API。