《关于甲方说需要"设置"内添加"ADB开关"这件事》

207 阅读5分钟

我正在参加「掘金·启航计划」”

打工人小记安卓内核调试——ADB开关:

秋风明媚,此次定制主板需求逐一完结

天有不测风云

客户发难,遂接一需求,在安卓的设置里面增加功能,开关ADB(默认关闭ADB)\

需求分析

什么是ADB?一种类似于SSH的通信应用层程序,主从架构,用户借助它能调试安卓系统——连接上安卓内核的终端\

图片

adb架构图

adb能帮助app应用开发者,调试(logcat指令,在内核输出应用的具体行为,比如调用了哪个安卓的Service)、安装Or卸载(把编写的应用程序写入到当前的设备)等

什么叫做开关?\

设置-开发者模式

\

就是设置内的选项卡,

解决

需求出现,自然有人解决

精通Linux内核的莫工首先想到的是编译配置

Linux内核是庞大的工程,\

有时候特定的功能,便进行单独配置(如:RT实时操作系统补丁需要开启配置再编译,本质为修改源码根目录的.config文件,里面存放控制编译的变量开关);

有时候特殊的芯片、需要激活原理图(简单的电路图)上对应的线路,需要修改设备树(Linux2.9之后支持)的配置来进行适配。

这里,想让这个电路导通\

去芯片手册查找GND_GPIO对应的芯片\

根据芯片,在设备树上进行配置,给对应的gpio口低电压\

线路就通了

\

内核编译前,通过配置,做你想做的everthing

这个安卓?可以吗

定位、修改makefile,很快莫工定位到控制底层驱动的makefile文件

把图内的adb单词删掉

\

persist.sys.usb.config此配置是用于控制adb,这样,系统默认关闭了adb(这些参数,是安卓自身用于控制服务的开启或关闭,可在安卓终端中使用setprop Or getprop 这对指令来curd这些参数)

(mtp是一种媒体传输协议,也从属于应用层)\

再搭配上系统默认提供的user debug选项卡,算是完成了需求

控制关闭adb调试\

\

但是?真的关闭了adb吗?\

通过串口debug信息来看

adb守护进程被杀死后

又被重新启动了\

\

得出结论,内核存在adb保护措施,并没有彻底关闭\

只是安卓层,控制了adb访问权限,营造出用户以为adb彻底被关闭的假象\

adb,是关不上的一扇窗

不想让光进入房间,只能摘了太阳

通过关闭硬件接口,断绝adb的想法就诞生了

操作硬件?\

在51单片机里面,操作硬件往往是向特定内存地址内写入1\0(汇编、C等能访问到内存地址的语言都可)

而Linux里面,早已经用上了"设备文件"这层抽象,设备文件由设备树所描述\

当Linux运行在嵌入式设备上,你便可以通过shell的管道来操作设备文件,写入1\0(最简单操作硬件的一种方式)

2模式是主机模式(支持adb)

1模式是读卡器模式(不支持adb)\

\

通过查看设备树,便可分析得出两条shell语句可以修改当前usb_otg外设的运转模式

echo 2 > /sys/bus/platform/drivers/usb20_otg/force_usb_mode

Or

echo 1 > /sys/bus/platform/drivers/usb20_otg/force_usb_mode

所以,只需魔改安卓的内置应用(设置本身就是一种安卓应用)便可以以另外一种形式完成需求\

安卓源码根目录结构

\

由此便可定位"设置"应用程序,在/packages/apps/Settings目录下面

需要替代指定的选项卡

\

想要hook掉按钮的事件函数,logcat指令是必不可少(Logcat 是一个命令行工具,用于转储系统消息日志,包括设备抛出错误时的堆栈轨迹,以及从您的应用使用 Log 类写入的消息。)

它能快速定位当用户点击按钮时,触发了哪些安卓层的服务与函数

抓到你了

\

DevelopmentSettingsActivity,应该是一个被触发的活动,触发它的应该是DevelopmentSettings类,我们就叫他小DS吧

DS里面重写了一个事件函数,叫做onSwitchChange,所有开关触发后会执行此回调函数

回调函数内控制范围,只有选项卡的开关又触发了resetDangerousOption函数->onPreferenceTreeClick函数

得出结论,所有的选项卡都会触发onPreferenceTreeClick函数,这里肯定是存在猫腻的\

谷歌你用点心,switch条件分支不可以?\

\

一股浓浓的switch分支写法,所以我判断这里是每一个选项卡内,开关触发的条件分支函数了\

onPreferenceTreeClick函数内关于目标选项卡的分支逻辑

\

随后马不停蹄的hook进去了——在特定的逻辑区域,执行shell操控硬件

hook完的状态

\

除了功能状态需要修改,页面也要保持一致性状态

在DS内,他所配套的页面资源文件是development_prefs.xml

图片

development_prefs.xml中

关于被替代的选项卡的信息

\

android:title属性为选项卡的标题字符串,android:summary属性为选项卡的详细描述字符串,@string/enable_adb 使用enable_adb变量做字符串(支持直接写一个字符串,不采用变量)\

写死字符串即可\

图片

嗯,看上去不错