安卓同学进来帮忙看看呢 无障碍服务模拟点击问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
yangyuhan12138
V2EX    程序员

安卓同学进来帮忙看看呢 无障碍服务模拟点击问题

  •  
  •   yangyuhan12138 2023-07-24 09:39:46 +08:00 2699 次点击
    这是一个创建于 825 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我使用

     Path path = new Path(); path.moveTo(595, 1847); GestureDescription.Builder gestureBuilder = new GestureDescription.Builder(); gestureBuilder.addStroke(new GestureDescription.StrokeDescription(path, 0, 100)); dispatchGesture(gestureBuilder.build(), null, null); 

    这段代码来在无障碍服务中制造模拟点击事件,但是我的目标 app 好像可以分别这种虚拟的点击事件,然后不做响应.

    具体是:

    我使用手点击可以触发对应按钮的点击事件,而模拟点击不行;

    模拟点击的代码我放到别的 app 上执行就可以;

    我还试了 adb shell input tap 也不行;

    但是 airtest 可以;

    请问有啥方法可以解决这个问题吗(不 root)?或者说 airtest 底层是怎么做的,我能在无障碍服务中直接调他吗?

    20 条回复    2023-07-30 11:22:50 +08:00
    Anarchy
        1
    Anarchy  
       2023-07-24 10:06:03 +08:00
    可以试下 adb shell input touchscreen tap
    yangyuhan12138
        2
    yangyuhan12138  
    OP
       2023-07-24 10:09:03 +08:00
    @Anarchy 也不行
    pokon548
        3
    pokon548  
       2023-07-24 10:10:20 +08:00 via Android
    看上去是 Untrusted touch event: https://developer.android.com/about/versions/12/behavior-changes-all#untrusted-touch-events

    这是系统层面的安全机制,没有很好的绕过办法
    yangyuhan12138
        4
    yangyuhan12138  
    OP
       2023-07-24 10:17:49 +08:00
    @pokon548 但是这个好像说的是 android12 才有的吧,而且我看无障碍服务是可信窗口呀
    AutumnVerse
        5
    AutumnVerse  
       2023-07-24 16:31:48 +08:00
    adb shell input 不响应的话,你试试 adb shell sendevent /dev/input/eventxx xxx xxx xxx 这种方式响应吗,sendevent 更加底层。具体咋用你网上搜下
    yangyuhan12138
        6
    yangyuhan12138  
    OP
       2023-07-24 17:58:47 +08:00
    @jiangwei2222 我试了也不行,我把点击时候的 getevnt 都保存下来,然后全部 send 了一遍没有反应 ....是不是我的操作有啥问题,他的一个点击会有很多个 event ,我全部保存到了一个 sh 文件中 然后使用 adb shell sendevent 挨着发出去的
    AutumnVerse
        7
    AutumnVerse  
       2023-07-24 20:55:28 +08:00
    @yangyuhan12138 #6
    你确定不是权限问题,写命令是成功的?

    你写一起发送试试呢,sendevent 原理是直接写设备文件,这个是 linux 系统处理的,理论上安卓都不负责这部分。应用程序一般不可能有权限检测这个。

    或者你更加简单粗暴一点,把 sendevent 命令内容直接写到设备文件中内,就这样 echo 'xxxxx' >> /dev/input/event[x]
    AutumnVerse
        8
    AutumnVerse  
       2023-07-24 21:05:16 +08:00
    echo '0x03, 0x39, 0x000021e7' >> /dev/input/event[x]
    echo '0x01, 0x14a, 0x01' >> /dev/input/event[x]
    echo '0x03, 0x32, 0x00000009' >> /dev/input/event[x]
    echo '0x03, 0x35, 1' >> /dev/input/event[x]
    echo '0x03, 0x36, 1' >> /dev/input/event[x]
    echo '0x00, 0, 0x00000000' >> /dev/input/event[x]
    // 这里暂停几百毫秒
    echo '0x03, 0x39, 0xffffffff' >> /dev/input/event[x]
    echo '0x01, 0x14a, 0x00' >> /dev/input/event[x]
    echo '0x00, 0, 0x00000000' >> /dev/input/event[x]

    把[x]改成你的设备序号,没记错的话应该是这个格式,你试试呢。这个是模拟点击(1,1) 这个位置的
    yangyuhan12138
        9
    yangyuhan12138  
    OP
       2023-07-24 23:15:35 +08:00
    @jiangwei2222 这个直接输出是没有权限的 我手机没有 root,但是 sendevent 可以调
    yangyuhan12138
        10
    yangyuhan12138  
    OP
       2023-07-24 23:19:25 +08:00
    我执行的是这堆
    adb shell sendevent /dev/input/event1 0003 0039 0000106c
    adb shell sendevent /dev/input/event1 0001 014a 00000001
    adb shell sendevent /dev/input/event1 0001 0145 00000001
    adb shell sendevent /dev/input/event1 0003 0035 000001de
    adb shell sendevent /dev/input/event1 0003 0036 00000717
    adb shell sendevent /dev/input/event1 0003 0030 00000005
    adb shell sendevent /dev/input/event1 0003 0031 00000003
    adb shell sendevent /dev/input/event1 0000 0000 00000000
    adb shell sendevent /dev/input/event1 0003 0030 00000006
    adb shell sendevent /dev/input/event1 0000 0000 00000000
    adb shell sendevent /dev/input/event1 0003 0039 ffffffff
    adb shell sendevent /dev/input/event1 0001 014a 00000000
    adb shell sendevent /dev/input/event1 0001 0145 00000000
    adb shell sendevent /dev/input/event1 0000 0000 00000000


    把他们放到 test.sh 里 然后./test.sh
    yangyuhan12138
        11
    yangyuhan12138  
    OP
       2023-07-24 23:19:44 +08:00
    yangyuhan12138
        12
    yangyuhan12138  
    OP
       2023-07-24 23:22:04 +08:00
    adb shell sendevent /dev/input/event1 0003 0039 0000106c
    adb shell sendevent /dev/input/event1 0001 014a 00000001
    adb shell sendevent /dev/input/event1 0001 0145 00000001
    adb shell sendevent /dev/input/event1 0003 0035 000001de
    adb shell sendevent /dev/input/event1 0003 0036 00000717
    adb shell sendevent /dev/input/event1 0003 0030 00000005
    adb shell sendevent /dev/input/event1 0003 0031 00000003
    adb shell sendevent /dev/input/event1 0000 0000 00000000
    adb shell sendevent /dev/input/event1 0003 0030 00000006
    adb shell sendevent /dev/input/event1 0000 0000 00000000
    sleep 0.5
    adb shell sendevent /dev/input/event1 0003 0039 ffffffff
    adb shell sendevent /dev/input/event1 0001 014a 00000000
    adb shell sendevent /dev/input/event1 0001 0145 00000000
    adb shell sendevent /dev/input/event1 0000 0000 00000000

    这样也不行
    yangyuhan12138
        13
    yangyuhan12138  
    OP
       2023-07-24 23:47:15 +08:00
    @jiangwei2222 我看了你的项目,写的非常不错,但是都不是我需要的...2 种执行方式都需要 root,1 是直接写文件,2 是 InstrumentationInput 需要 Xposed 提权, 第三个是无障碍服务,就是我现在写这种,点击不生效.所以即便是用你的项目也不行,主要是我不能 root,root 了只会有更多事...我不知道他是怎么检测 root 的,反正 root 了就不能用,又需要去研究一大堆东西才能让他继续用,这并不是我想要的.

    我现在盯上了 airtest 的点击方式,因为我试过他可以点,我在看他是怎么实现的,目前发现了一个叫 minitouch 的东西,要是这个可以就太好了,我明天先研究研究看,有消息我再来告诉你
    AutumnVerse
        14
    AutumnVerse  
       2023-07-25 10:16:57 +08:00
    @yangyuhan12138 #13 如果是程序检测 root 的话,可以试试面具的防检测,如果面具的防检测也不行的话。可以尝试自己编译一个安卓系统,然后刷进去,编译的时候把点击权限判断的那个方法改成直接 return true 。如果是小米、一加这类手机,随手就能找到开源的 rom 代码,自己修改编译一个是最方便的。自己改源码能够搞的东西非常多,而且对方应用完全没办法检测

    不在系统层处理的话,你反编译需要控制的应用也行,找到他检测 root 的地方,用 xposed hook 屏蔽他的检测
    AutumnVerse
        15
    AutumnVerse  
       2023-07-25 10:19:43 +08:00
    @yangyuhan12138 #13 https://github.com/Jinnrry/RobotHelper/blob/master/Android/app/src/main/java/cn/xjiangwei/RobotHelper/Xposed/Hook4Env.java

    这个地方就是我用来 hook 部分系统变量防检测的。但是每个手机,每个应用检测的东西不一样,我没提交上去。
    yangyuhan12138
        16
    yangyuhan12138  
    OP
       2023-07-25 10:54:32 +08:00
    @jiangwei2222 关键就是不知道他检测了些什么东西,反正面具的防检测是不行的,编译安卓系统应该肯定可以,只是需要花更多时间了
    yangyuhan12138
        17
    yangyuhan12138  
    OP
       2023-07-27 09:43:19 +08:00
    @jiangwei2222 我看别人做的一个外挂,有个物理设备,连接到手机上,直接就可以实现屏幕点击,adb 都没开,这是咋实现的?插入了一个可以用代码控制的虚拟鼠标?
    AutumnVerse
        18
    AutumnVerse  
       2023-07-27 14:37:02 +08:00
    @yangyuhan12138 #17 android 支持鼠标、键盘这类输入设备。硬件级模拟鼠标、或者模拟触摸板呗
    yangyuhan12138
        19
    yangyuhan12138  
    OP
       2023-07-28 15:05:18 +08:00
    @jiangwei2222 我猜也是,但是不知道可以在那里定做
    AutumnVerse
        20
    AutumnVerse  
       2023-07-30 11:22:50 +08:00
    #19 @yangyuhan12138 我以前尝试过,淘宝有卖的,你搜“飞易来”,这个是 pc 的,我不确定是否支持 andriod ,你可以直接转成 type-c 接口试试。他提供鼠标键盘相关操作 api ,你根据他的 api 就能开发。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2548 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 15:09 PVG 23:09 LAX 08:09 JFK 11:09
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86