使用树莓派3b+作为黑阈激活器

article/2025/7/11 10:23:11

黑阈(yù)不需要 root 就能待机(App Standby,Android 6.0
引入,部分设备不支持)或强行停止应用,防止应用持续运行。

黑阈不处理非“黑阈清单”内应用。当您启动应用,使用完退出(如按“返回”)以后,黑阈会待机它;待机超时,或者从概览屏幕(recents
screen)划掉,黑阈会强行停止它。无论何时应用被运行,只要没有打开界面,黑阈都将强行停止它。

本篇文章只做技术性讨论,不接受实用性评价。

上一部手机不幸挂了,因为贫穷,我选择了比较便宜的SONY XPERIA Z5 SO-01H(DOCOMO日版)
拿到手后发现自己还是年少太轻狂了,这手机不能解锁/不能ROOT
火龙810在裤兜里烫大腿呀!这谁顶得住呀…

这种情况使用黑阈去镇压毒瘤效果还是很好,但因为黑阈使用了ADB来激活
ADB Shell权限很高,每次手机重启后都要连接到电脑上使用ADB激活(Android 8以下)
不过每次只要手机重启了,就要连接到电脑上去激活,比较麻烦

黑阈还提供了黑阈激活器的方案,手机进入设置-开发者选项(设置里没有百度),打开USB调试,将一个U盘大小的设备插在USB电源上,另一端插上数据线,数据线连接手机。
如果你是第一次连接激活器,手机会提示ADB授权,点击确定后,稍等片刻即可激活黑阈。

个人很好奇激活器的内部原理,昨日突发奇想,也想整一个

说干就干,拿出我的rasyberry 3b+

首先我们要先安装ADB tools

sudo apt-get install adb

安装完成后输入

adb

若屏幕上输出了帮助信息,则说明ADB安装成功

接下来我们要编写一套udev rules
首先查看我的手机的一些特征

pi@raspberrypi:~ $ udevadm monitormonitor will print the received events for:
UDEV - the event which udev sends out after rule processing
KERNEL - the kernel uevent

在 udevadm monitor 命令运行时,插入手机
屏幕上会滚动一些ADD信息,这就是你刚刚插入的设备的信息

KERNEL[160.873180] add      /devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2 (usb)
KERNEL[160.873457] add      /devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2/1-1.2:1.0 (usb)
KERNEL[160.873710] add      /devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2/1-1.2:1.1 (usb)

复制第一个设备的路径地址
输入pi@raspberrypi:~ $ udevadm info -ap /devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2
来列出设备的详细属性

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.looking at device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2':KERNEL=="1-1.2"SUBSYSTEM=="usb"DRIVER=="usb"ATTR{authorized}=="1"ATTR{avoid_reset_quirk}=="0"ATTR{bConfigurationValue}=="1"ATTR{bDeviceClass}=="00"ATTR{bDeviceProtocol}=="00"ATTR{bDeviceSubClass}=="00"ATTR{bMaxPacketSize0}=="64"ATTR{bMaxPower}=="500mA"ATTR{bNumConfigurations}=="1"ATTR{bNumInterfaces}==" 2"ATTR{bcdDevice}=="0310"ATTR{bmAttributes}=="80"ATTR{busnum}=="1"ATTR{configuration}==""ATTR{devnum}=="7"ATTR{devpath}=="1.2"ATTR{devspec}=="  (null)"ATTR{idProduct}=="51d9"  //产品IDATTR{idVendor}=="0fce"   //供应商IDATTR{ltm_capable}=="no"ATTR{manufacturer}=="Sony"ATTR{maxchild}=="0"ATTR{product}=="SO-01H"ATTR{quirks}=="0x0"ATTR{removable}=="removable"ATTR{serial}=="BH905DDM4S" //唯一序号ATTR{speed}=="480"ATTR{urbnum}=="126"ATTR{version}==" 2.00"
ATTR{idProduct}=="51d9"  //产品ID
ATTR{idVendor}=="0fce"   //供应商ID

现在我已经知道我的设备的供应商ID和产品ID,下面要编辑udev rules文件了

pi@raspberrypi:/etc/udev/rules.d $ ls
99-com.rules
pi@raspberrypi:/etc/udev/rules.d $ 

可以列出当前目录下的所有rules文件
下面我们要创建一个rules文件

udev 规则是定义在一个以 .rules
为扩展名的文件中。那些文件主要放在两个位置:/usr/lib/udev/rules.d,这个目录用于存放系统安装的规则;/etc/udev/rules.d/
这个目录是保留给自定义规则的。

定义那些规则的文件的命名惯例是使用一个数字作为前缀(比如,50-udev-default.rules),并且以它们在目录中的词汇顺序进行处理的。在
/etc/udev/rules.d 中安装的文件,会覆盖安装在系统默认路径中的同名文件。
引用:https://zhuanlan.zhihu.com/p/33932734

sudo vi 100-echo-usb-event.rules

输入

SUBSYSTEM=="usb",ACTION=="add",ATTRS{idVendor}=="0fce",ATTR{idProduct}=="51d9",,RUN+="/usr/local/bin/echo_usb_add.sh"

特别说明,不要无脑照抄,你如果直接复制我的这个,累死你也激活不了的…除非把我手机买了…
udev reuls使用键 == 值对的规则来填写,非数字值应用""引号扩上

操作符的说明

操作符说明
== 和 !=== 是相等操作符,而 != 是不等于操作符。通过使用它们,我们可以确认规则上应用的键是否匹配各自的值。
= 和 :== 是赋值操作符,是用于为一个键赋值。当我们想要赋值,并且想确保它不会被其它规则所覆盖,我们就需要使用 := 操作符来代替,使用这个操作符分配的值,它就不能被改变。
+= 和 -=+= 和 -= 操作符各自用于从一个指定的键定义的值列表中增加或者移除一个值。

键值对的说明

KEYVALUE
SUBSYSTEM - 匹配设备的子系统例:usb、ide
ACTION - 何时触发规则例:add(连接)、remove(断开)
ATTR{} - 大括号中填写要匹配的sysfs规则例:ATTR{idProduct}==“51d9” //产品ID
RUN - 填写你触发规则时运行的脚本例:/home/pi/xxx.sh

另外

想了解更多花活,参考跟我一起写udev规则

接下来该在脚本里填写的路径下创建一个激活黑阈的脚本了
我填写的是/usr/local/bin/echo_usb_add.sh
所以 sudo vi /usr/local/bin/echo_usb_add.sh 新建一个shell脚本

#!/bin/bashechoLog(){logger -s $*
}echoLog "检测到插入了手机,开始激活黑阈服务"
echoLog "激活中..."
sleep 3
result=$(adb -d shell sh /data/data/me.piebridge.brevent/brevent.sh)
echoLog $result
echoLog "激活黑阈-事件结束"

等等,为什么用到了sleep?
因为手机插上后,马上就进行adb命令激活,会失败的
为保证成功,我保守起见加了一个3秒的sleep,3秒钟后才会开始激活的操作
你可以结合自身情况,缩短这个延时

之后保存吧!给这个脚本设置好文件权限sudo chmod 777 /usr/local/bin/echo_usb_add.sh

好,大功告成,现在该设置你的手机了

现在我手机上的黑阈没有被激活
在这里插入图片描述
打开开发者选项 - 打开USB调试,插入吧,如果你是第一次的话,手机会提醒你。
在这里插入图片描述
好,输入

pi@raspberrypi:/usr/local/bin $ adb devices
List of devices attached
BH905DDM4S	device

看到这个 BH905DDM4S 没有?这是我的手机序号,不是你的,你要是没有,说明adb没有识别到你的手机
下面,手动测试脚本能否激活黑阈了

pi@raspberrypi:~ $ cd /usr/local/bin/
pi@raspberrypi:/usr/local/bin $ ./echo_usb_add.sh 
<13>May 19 21:32:28 pi: 检测到插入了手机,开始激活黑阈服务
<13>May 19 21:32:28 pi: 激活中...
<13>May 19 21:32:31 pi: 激活黑阈-事件结束
pi@raspberrypi:/usr/local/bin $ 

激活成功激活失败都这么显示的,你可以根据手机的反馈来判断黑阈是否激活成功
如果找不出原因可以查查日志呢vi /var/log/syslog
或者tail -f /var/log/syslog然后插上手机,实时看一下日志
在这里插入图片描述
提示窗口没了,并且显示应用列表了,就说明黑阈激活成功了,或者你可以疯狂的按手机的HOME键,手机会有悬浮通知的
在这里插入图片描述
稳妥,现在可以重启你的树莓派或输入udevadm control —reload
开机后无需登录,插上数据线就行!
Enjoy you 全自动黑阈激活器

相关链接/教程

  • udev 入门:管理设备事件的 Linux 子系统 https://zhuanlan.zhihu.com/p/33932734
  • 【转】跟我一起写udev规则(译) http://www.cnitblog.com/luofuchong/archive/2007/12/18/37831.html
  • Arch wiki - udev https://wiki.archlinux.org/index.php/Udev_(简体中文)

http://chatgpt.dhexx.cn/article/yD6DexGD.shtml

相关文章

枚举类型是什么

C语言详解 - 枚举类型 注&#xff1a;以下全部代码的执行环境为VC 6.0 在程序中&#xff0c;可能需要为某些整数定义一个别名&#xff0c;我们可以利用预处理指令#define来完成这项工作&#xff0c;您的代码可能是&#xff1a; #define MON 1 #define TUE 2 #define WED 3 …

ts枚举类

参考官方文档:https://www.tslang.cn/docs/handbook/enums.html 理解:枚举是列举固定几个值,直接定义变量的话的话可以随意定义&#xff0c;枚举只能使用你定义好的几个值,枚举是个类&#xff0c;定义的值是基本类型,类能有更多操作 例如你定义一个方法接收一个参数&#xff0…

Java 枚举类型原理分析为什么枚举比用静态变量多消耗两倍的内存

一 起源&#xff1a;枚举是一种特殊的数据类型&#xff0c;一般用来列举有限个、同类型的常量。它能保证参数的安全性&#xff0c;如方法声明传入的参数&#xff0c;必须是指定枚举中的常量。但是Android开发文档指出&#xff0c;使用枚举会比使用静态变量多消耗2倍内存。为什么…

java枚举转json

1、背景 java后端的枚举类型&#xff0c;要展示到前端&#xff0c;提供给用户进行下拉选择&#xff0c;java后端需要封装enum为json字符串提供给前端&#xff0c;需要首先将枚举类型转为list&#xff0c;然后再转为json字符串。 2、方案 方案也很简单&#xff0c;使用EnumSe…

枚举类的使用

文章目录 前言一、自定义枚举类二、使用enum定义枚举类1.Enum类的主要方法2.实现接口的枚举类 前言 1&#xff09; 类的对象只有有限个&#xff0c;确定的。举例如下&#xff1a; 星期&#xff1a;Monday(星期一)、…、Sunday(星期天) 性别&#xff1a;Man(男)、Woman(女) 季节…

用户名枚举

一. 漏洞描述 常存在于系统登录界面&#xff0c;由于错误配置或设计缺陷&#xff0c;当向系统提交有效账户和无效账户时&#xff0c;服务器会有不同的响应&#xff0c;利用服务器响应的不同&#xff0c;攻击者可以获取到系统已经存在的账户&#xff0c;可用于暴力破解&#xff…

c++枚举

一、枚举类型的定义 枚举类型的定义&#xff1a;枚举类型(enumeration)是 C 中的一种派生数据类型&#xff0c;它是由用户定义的若干枚举常量的集合。 定义格式&#xff1a;枚举类型的定义格式为&#xff1a;enum <类型名> {<枚举常量表>}; 例如&#xff1a; en…

java枚举类及面试题为什么枚举实现单例模式是安全的?

目录 枚举类为什么会有枚举类&#xff1f;枚举类的使用枚举类的常用方法枚举的构造 枚举类型能被反射吗&#xff1f;为什么枚举实现单例模式是安全的&#xff1f; 枚举类的优缺点 枚举类 为什么会有枚举类&#xff1f; 假如说程序中有一些颜色的状态&#xff0c;或者说消息的类…

什么是枚举?

枚举有两种存在形式&#xff1a; 第一种是计算机编程语言的一种数据类型&#xff0c;enum&#xff0c;即枚举类型。在实际问题中&#xff0c;一些变量的取值被限制在一个有限的范围内&#xff0c;例如&#xff1a;一个星期内只有七天&#xff0c;一年只有十二个月…C语言为此提…

什么是枚举【详解】

本期介绍&#x1f356; 主要介绍&#xff1a;什么是枚举&#xff0c;枚举是如何定义、初始化的&#xff0c;以及枚举到底如何使用&#xff0c;还有枚举这种语法存在的优点有那些&#x1f440;。 文章目录 一、什么是枚举&#x1f356;二、枚举类型的定义&#x1f356;三、枚举…

输入文字后不会自动变长的下划线如何制作

问题&#xff1a;设置下划线时&#xff0c;随着文字增多&#xff0c;下划线延长&#xff0c;出现不对齐的情况 &#xff0c;如下图 解决&#xff1a;制作表格&#xff0c;把不需要的边框删除&#xff0c;就我现在需要的效果&#xff0c;实现步骤如下 制作表格 设置单元格的边距…

CSDN中用Markdown如何给文本加下划线(可延长下划线)

解决 使用<u></u>把文字包起来即可。 演示 <u>下划线</u>&#xff0c;效果&#xff1a; 下划线 如何延长下划线 如果想延长下划线&#xff0c;我们会发现直接打空格是没用的&#xff0c;<u>  下划线   </u>&#xff0c;效果&…

css鼠标划过文字出现往两边延伸的下划线

HTML&#xff1a; <div class"nav"><ul><li><a href"#">Gravit Designer</a></li><li><a href"#">Gravit Klex</a></li></ul></div> CSS&#xff1a; /*导航*/.nav{…

【深入理解JS核心技术】12. 什么是一阶函数

一阶函数是一个不接受另一个函数作为参数并且不返回函数作为其返回值的函数。 const firstOrder () > console.log("I am a first order function!"); 复制代码 函数名 函数名就是指向函数的指针&#xff0c;一个函数可以有多个名称。 function sum(num1, num2) …

一个正经的前端学习 开源 仓库(阶段十九)

低调务实优秀中国好青年 (简介) && 附加答案 中文 | English github.com/webVueBlog/… 一个 ☝️ 正经的前端学习 开源 仓库&#xff0c;启发来自 淘宝大佬 冴羽 &#xff0c;初心做一个真正能帮助到大家的仓库。&#xff08;非常口语化的&#xff0c;手写总结&#x…

【深入理解JS核心技术】1.在 JavaScript 中创建对象的可能方式有哪些?

创建对象的方式&#xff1a; 创建空对象&#xff0c;可以使用Object构造函数。&#xff08;对象构造函数&#xff09; var object new Object(); 复制代码 可以使用Object的create方法通过将原型对象作为参数来创建一个新对象 var object Object.create(null); 复制代码 可以…

一个正经的前端学习 开源 仓库(阶段十七-440)

低调务实优秀中国好青年 (简介) && 附加答案 中文 | English github.com/webVueBlog/… 一个 ☝️ 正经的前端学习 开源 仓库&#xff0c;启发来自 淘宝大佬 冴羽 &#xff0c;初心做一个真正能帮助到大家的仓库。&#xff08;非常口语化的&#xff0c;手写总结&#x…

【深入理解JS核心技术】11. 什么是一级函数

在 Javascript 中&#xff0c;函数是第一类对象。一等函数意味着当该语言中的函数被视为任何其他变量时。 例如&#xff0c;在这种语言中&#xff0c;一个函数可以作为参数传递给其他函数&#xff0c;可以由另一个函数返回&#xff0c;也可以作为一个值分配给变量。例如&#x…

一个正经的前端学习 开源 仓库(每日更新)-698道知识点

低调务实优秀中国好青年 (简介) && 附加答案 中文 | English 一个 ☝️ 正经的前端学习 开源 仓库&#xff0c;养成一个好习惯&#xff0c;遇见更好的 自己。一个人可能走得更快&#xff0c;但一群人会走得更远。&#xff08;非常口语化的&#xff0c;手写总结&#xf…

坚持每一天,不忘初心,正经的前端学习(705)

正经的前端学习 中文 | English 一个 ☝️ 正经的前端学习 开源 仓库&#xff0c;每天进步一点&#xff01;欢迎大家前来讨论&#xff0c;如果觉得对你的学习有一定的帮助&#xff0c;欢迎点个Star &#xff08;此仓库每天都会手动更新&#xff09; &#x1f339; &#x1f339…