V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cache
V2EX  ›  Android

另一种思路实现类似冰箱/黑阈的功能

  •  
  •   cache · 2021-07-11 23:40:41 +08:00 · 11847 次点击
    这是一个创建于 1235 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Android 上实现不 root 管理其他 App,基本上有几种方案:

    1. 利用设备管理员模式。代表应用 App Ops/小黑屋。
    2. 利用 Adb 调试权限。代表应用 冰箱 /黑阈。
    3. 另有一派非主流,利用无障碍服务,模拟点击杀进程。如KillApps

    对我个人来说,设备管理员模式的操作过于复杂,而且有相当一部分设备不支持。主要研究了一下 Adb 模式。

    冰箱 /黑阈在非 root 情况下,需要用户在每次设备重启后用 adb 运行一个脚本,这个脚本在后台起一个有 adb 权限的进程。后面需要 adb 权限时,通过 socket 和这个进程通信,利用它的 adb 权限代替执行相关操作。

    但其实原生 Android 上已经有一个进程在做一模一样的事,那就是 adbd 。

    熟悉 Adb 调试的人都知道,adb 调试是通过 PC 端的 adb 命令程序和 Android 设备端的 adbd 服务进程通信实现的。不管底层是走 usb 还是 tcpip,他们之间交互的协议是固定的。

    那么能不能在设备端实现一个 adb 命令程序,实现在设备上对其他 App 的管理呢。

    答案是肯定的,Adb 协议相当简单明了,实现并没有太大难度。 https://android.googlesource.com/platform/packages/modules/adb/+/HEAD/protocol.txt

    这样一来,App 获取 ADB 权限流程变成:

    1.开启 adb 调试,连上设备,执行: adb tcpip 5555
    
    2.App 中连接 localhost 的 5555 端口,发送 adb 调试证书授权,用户点确认,获取 adb 权限。
    

    相比于冰箱 /黑阈,这个方案的好处是,利用的是 Android 官方的 adbd,后台没有任何第三方进程,不使用 App 时系统零开销。 安全性,稳定性更有保障。

    利用这个原理,我写一个 App,有兴趣的 tx 可以试用一下

    Ran: Rule your Apps with Adb on devices

    https://play.google.com/store/apps/details?id=com.cloudmonad.ran

    目前功能比较简陋,主要利用 adb 权限实现了 获取 App 运行状态,杀死 App,frozen/unfrozen(利用 pm disable/enable )

    17 条回复    2021-07-13 18:02:53 +08:00
    44670
        1
    44670  
       2021-07-11 23:43:03 +08:00
    wifi adb 重启后会保留吗?
    Jirajine
        2
    Jirajine  
       2021-07-11 23:47:27 +08:00 via Android
    你说的这些主流应用,现在就是这样做的啊。Android 11 以上可以直接开启 WiFi adb,之前的需要你先通过有线连接然后开启,重启后仍然会重置。
    另外 shizuku 这种服务的目的是为了能够直接使用 Java api,而不是只能用 shell 命令。
    cache
        3
    cache  
    OP
       2021-07-11 23:48:24 +08:00
    @44670 不能,每次重启要重新执行一下 adb tcpip 命令
    cache
        4
    cache  
    OP
       2021-07-11 23:52:16 +08:00
    @Jirajine 具体哪个是这么做的,至少我测试的时候他们都是起了后台进程。
    shizuku 是 root 方案,不在讨论里
    AoEiuV020
        5
    AoEiuV020  
       2021-07-12 00:38:14 +08:00 via Android
    我记得黑域就有支持这种方案,记得是 root, wifi adb, 电脑 adb 都支持的,
    Jirajine
        6
    Jirajine  
       2021-07-12 00:45:12 +08:00 via Android
    @cache 这么做的是指,它们都能在开启了 WiFi adb 的情况下,直接在本地和 adbd 通讯激活。
    shizuku 可以用 root 启动也可以用 adb 启动,其他的也一样。这类后台服务最主要的目的是通过 binder 导出 Java API,从而可以直接调用。直接用 adbd 的话,一来只能用 shell 指令非常麻烦,并且在用户 WiFi 断开的情况下就不能操作了。
    x2009again
        7
    x2009again  
       2021-07-12 00:51:38 +08:00
    不知道是不是安卓备份出来的原因,安卓 7 打开闪退,我从一个手机的 google play 下载安装后备份下来然后安装到安卓 7
    cache
        8
    cache  
    OP
       2021-07-12 00:54:04 +08:00
    @AoEiuV020
    我最早就是从黑域的 adb 激活入坑的

    你从 https://brevent.sh/安装后,ps 看一下,有两个 shell 权限后台进程。

    另外还有小黑屋的麦克斯韦妖,原理都一样。
    Cielsky
        9
    Cielsky  
       2021-07-12 00:56:09 +08:00 via Android
    安卓 10 才需要运行 ADB tcpip 吧,11 设置里可以直接开启无线调试了
    cache
        10
    cache  
    OP
       2021-07-12 00:59:44 +08:00
    @Jirajine
    我只测试了官方提供的激活方式

    @x2009again 有 adb 日志么
    cache
        11
    cache  
    OP
       2021-07-12 01:03:11 +08:00
    @Cielsky adb tcpip 所有版本都支持,通用性好。

    Andoid 11 以后 adb 协议增加了 A_STLS 命令,理论上不需要电脑就可以完成 adb 授权了。目前还不支持
    vk42
        12
    vk42  
       2021-07-12 03:45:17 +08:00
    @cache 后台是用来执行黑名单的啊,你这个就相当于是手动黑名单了,每次把需要冻的 app 手动执行一遍
    cache
        13
    cache  
    OP
       2021-07-12 09:06:16 +08:00
    @vk42 没错,现在只是提供了手动功能

    后面也可以起个 Service 做自动清理,不需要自动功能的用户可以关闭,不影响激活
    ikas
        14
    ikas  
       2021-07-13 00:18:08 +08:00
    这种很早就用过了...主要问题还是 adb 的权限远远不够..
    cache
        15
    cache  
    OP
       2021-07-13 09:54:32 +08:00
    @ikas 够用就行

    adb 权限的好处是可以稳定获取
    而能 root 的手机并不是主流
    pipilu
        16
    pipilu  
       2021-07-13 17:43:39 +08:00
    每次得开启 wifiadb,这里有安全隐患,相对于 冰箱 /黑阈,实际还是每次都得执行 adb

    如果都是在本机运行,是不是可以虚拟 usb 驱动来连接 adbd ?
    cache
        17
    cache  
    OP
       2021-07-13 18:02:53 +08:00
    @pipilu 安全隐患是指什么? 第一次连接 adb 是有认证弹窗的

    都有内核驱动级权限也看不上 adbd 这点权限了吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3374 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 11:39 · PVG 19:39 · LAX 03:39 · JFK 06:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.