相关基础信息:
adb | 5038 | ADB_HOST=1 ADB_HOST_ON_TARGET=1 |
adb_sysdeps_init适用于linux和windows的版本 adb_trace_init adb_commandline |
adb client | 提供HOST端运行的命令 | ||
adb service | HOST端上的一个后台进程 | ||
adb daemon | 5037 设备开机启动 |
ADB_HOST=0 ALLOW_ADBD_ROOT=1 |
adb_qemu_trace_init start_device_log adb_main |
Android中adb源码路径:system/core/adb,核心源码列表:
adb BUILD_EXECUTABLE | adbd BUILD_EXECUTABLE | |
adb.c \ | √ | √ |
adb_auth_client.c \ | √ | |
adb_auth_host.c \ | √ | |
adb_client.c \ | √ | |
backup_service.c \ | √ | |
commandline.c \ | √ | |
console.c \ | √ | |
fdevent.c \ | √ | √ |
file_sync_client.c \ | √ | √ |
framebuffer_service.c \ | √ | |
get_my_path_linux.c \ | √ | |
jdwp_service.c \ | √ | |
log_service.c \ | √ | |
remount_service.c \ | √ | |
services.c \ | √ | √ |
sockets.c \ | √ | √ |
transport.c \ | √ | √ |
transport_local.c \ | √ | √ |
transport_usb.c \ | √ | √ |
usb_linux.c \ | √ | |
usb_linux_client.c \ | √ | |
usb_vendors.c | √ | |
utils.c \ | √ | √ |
$(EXTRA_SRCS) \ | ||
$(USB_SRCS) \ |
Android启动过程adb相关服务及系统属性信息:
1 | # create basic filesystem structure |
公私钥认证机制,只允许授权主机使用USB调试接口。保存路径/data/misc/adb/adb_keys | |
mkdir /data/misc/adb 02750 system shell | |
2 | # Enable adb security for JB4.2.2 |
设置是否启用adb公私钥认证机制,0禁用1启用 | |
setprop ro.adb.secure 0 | |
3 | # adbd is controlled via property triggers in init.<platform>.usb.rc |
service adbd /sbin/adbd | |
class core | |
socket adbd stream 660 system system | |
disabled | |
seclabel u:r:adbd:s0 | |
4 | # adbd on at boot in emulator |
on property:ro.kernel.qemu=1 | |
start adbd |
以下为linux版adb工具执行过程分析(实用环境可能在机顶盒或车载机上):
1、命令行执行adb devices,主程序入口,main -> adb_commandline
system/core/ktadb/adb.c::main():Handling commandline() system/core/ktadb/commandline.c::adb_commandline():getenv ANDROID_SERIAL=(null) ANDROID_ADB_SERVER_PORT=(null) server_port=5038 system/core/ktadb/commandline.c::adb_commandline():adb_commandline() para[0]=devices system/core/ktadb/commandline.c::adb_commandline():is_server=0 no_daemon=0 is_daemon=0
2、执行函数adb_query()
system/core/ktadb/adb_client.c::adb_query():adb_query: host:devices
a. 验证版本
a.1 验证成功
system/core/ktadb/adb_client.c::_adb_connect():_adb_connect: host:version 30303063 000c 686f73743a76657273696f6e host:version system/core/ktadb/transport.c::writex():writex: fd=3 len=4: system/core/ktadb/transport.c::writex():writex: fd=3 len=12: system/core/ktadb/transport.c::readx():readx: fd=3 wanted=4 system/core/ktadb/transport.c::readx():readx: fd=3 wanted=4 got=4 4f4b4159 OKAY system/core/ktadb/adb_client.c::_adb_connect():_adb_connect: return fd 3 system/core/ktadb/transport.c::readx():readx: fd=3 wanted=4 system/core/ktadb/transport.c::readx():readx: fd=3 wanted=4 got=4 30303034 0004 system/core/ktadb/transport.c::readx():readx: fd=3 wanted=4 system/core/ktadb/transport.c::readx():readx: fd=3 wanted=4 got=4 30303166 001f 版本号31
发送4字节+host:version指令,读取OKAY返回结果,读取结果长度及结果内容。
a.2 验证失败
system/core/ktadb/adb_client.c::_adb_connect():_adb_connect: host:version adb_server_name=(null) system/core/ktadb/adb_client.c::_adb_connect():_adb_connect: socket_loopback_client system/core/ktadb/adb_client.c::_adb_connect():_adb_connect: return fd -2 system/core/ktadb/adb_client.c::_adb_connect():_adb_connect: error message cannot connect to daemon system/core/ktadb/adb_client.c::adb_connect():adb_connect: service host:devices, _adb_connect_ret=-2
a.2.launch_server fork()
* daemon not running. starting it now on port 5038 * system/core/ktadb/adb_client.c::adb_connect():fd == -2 adb_connect:launch_server() launch_server():fork() system/core/ktadb/adb.c::main():Handling commandline() system/core/ktadb/commandline.c::adb_commandline():getenv ANDROID_SERIAL=(null) ANDROID_ADB_SERVER_PORT=(null) server_port=5038 system/core/ktadb/commandline.c::adb_commandline():adb_commandline() para[0]=-P system/core/ktadb/commandline.c::adb_commandline():adb_commandline() para[1]=5038 system/core/ktadb/commandline.c::adb_commandline():is_server=1 no_daemon=0 is_daemon=1 system/core/ktadb/commandline.c::adb_commandline():adb_commandline::adb_main system/core/ktadb/adb.c::adb_main():adb.c::adb_main()
a.2.launch_server usb_vendors_init()
每个设备厂家都会定义一个VID(vender id)来标识自己的usb 设备,ADB service端只会连接已知的VID,这个函数的作用就是初始化一个VID的数组,初始化后这个数组中将包含adb代码中内建的一些厂家的ID以及HOST端的android配置文件中定义的ID。
a.2.launch_server usb_init()
创建一个线程,线程处理函数device_poll_thread,进入一个循环,每隔1s执行一次find_usb_device和kick_disconnected_devices,find_usb_device搜索所有的usb设备,判断VID是否在上面初始化的列表中,如果是,则将该usb设备注册到一个handle_list中。调用register_usb_transport基于这个fd构造一个atransport类型的对象,再基于这个atransport对象调用register_transport构造一个tmsg类型的对象。
最后,将这个tmsg对象写到transport_registration_send这个fd,将触发相应的socket监控。kick_disconnected_devices函数判断adb设备是否还正常,不正常的话从handle_list中去掉。
a.2.launch_server local_init(DEFAULT_ADB_LOCAL_TRANSPORT_PORT);
system/core/ktadb/usb_linux.c::device_poll_thread():Created device thread system/core/ktadb/transport_local.c::local_init():transport: local client init on port 5555
创建一个线程,尝试连接HOST端5555-5585端口,如果连接成功,则返回一个fd,register_socket_transport基于这个fd构造一个atransport类型的对象,再基于这个atransport对象调用register_transport构造一个tmsg类型的对象。最后,将这个tmsg对象写 transport_registration_send这个fd,将触发相应的socket监控。
a.2.launch_server adb_auth_init();
ystem/core/ktadb/adb_auth_host.c::adb_auth_init():adb_auth_init system/core/ktadb/adb_auth_host.c::get_user_keyfilepath():home '/data' system/core/ktadb/transport_local.c::client_socket_thread():transport: client_socket_thread() starting system/core/ktadb/adb_auth_host.c::get_user_key():user key '/data/.android/adbkey' system/core/ktadb/adb_auth_host.c::read_key():read_key '/data/.android/adbkey'
adbkey.pub文件内容
QAAAAOcgswwpDbwD9nP4IsrHRVTPBcHn3g6cIIoK9+OBBRoll6C7ASYw7+tRV3QisHhR+fWToXocEeSJeZrevInAI5wlqKBVIqa9RiHafVGcWEWXXZ0T7t2zmVT5Yrkvw1OegeHICaZpzZieI7ii5SDHFrXxMejZsU+vVkxEy6tnRldywTxcKSpQ11fLyeDqR8fmr/R06uK3Tjet/98zGStWdsvDcN95ZxpGjfkj9Sv83+NXBWYZWQzBqTTJiWRQWbe9mi3RpqgKpLXHQDzYTQbJRWvTOt4QR50rt0kQf1SUdilO0ap1eGf/KXQALx72ivk/9fhU5L+IDKUyP/EsspUqc01KD8GzkPvUMdUbXdStc4uEjzoHNERB+PD5EioRoeYwXzqIRJGycP1+Xvn1ek9CnoTU8Fqno8KkiMtbeB8T0I0cpQv0J52IoL/yN3tST+RZzAFspOv2CAhY7bvNAZ035+amfkI6O9sF7Mq+cLsHXKX3elcydpVnLAabBPAD/pnX46p44UZT4L9OY7+3JkMwu0yolKvO8ku0fqckitkE1p0DBLzZByjKqD6VqSTpzMQi63GSDBdV6d9MWt4BuuhwLuTO1UMolJv0h+lTKA40GzeNuNF9xw9AH2GJIESjxtJaKe8dUOcpxpbJ1Su74TnjdubBRgvkeYId1/VdUySrbviBnghOpwEAAQA= unknown@localhost
a.2.launch_server build_local_name(local_name, sizeof(local_name), server_port)
a.2.launch_server install_listener(local_name, "*smartsocket*", NULL, 0)
system/core/ktadb/usb_linux.c::register_device():[ usb located new device /dev/bus/usb/002/025 (131/3/1) ] system/core/ktadb/usb_linux.c::register_device():[ usb open /dev/bus/usb/002/025fd = 12]
监听"tcp:5037",adb client与adb service之间的通讯端口。
a.2.launch_server start_logging()
将stdin重写向到/dev/null,将stdout、stderr重定向/tmp/adb.log,然后输出"adb starting"到stderr。
a.2.launch_server fdevent_loop()
前面通过fdinstall()注册了几个fde,这里就通过一个无限循环epoll相应的fd,有相应的事件则调用fdinstall时注册的处理函数。
a.2.launch_server usb_cleanup()
usb相关的清理工作,对应linux平台的实现目前为空。
* daemon started successfully *
b.获取列表
b.1 设备正常
system/core/ktadb/adb_client.c::_adb_connect():_adb_connect: host:devices 30303063 000c 686f73743a64657669636573 host:devices system/core/ktadb/transport.c::writex():writex: fd=3 len=4: system/core/ktadb/transport.c::writex():writex: fd=3 len=12: system/core/ktadb/transport.c::readx():readx: fd=3 wanted=4 system/core/ktadb/transport.c::readx():readx: fd=3 wanted=4 got=4 4f4b4159 OKAY system/core/ktadb/adb_client.c::_adb_connect():_adb_connect: return fd 3 system/core/ktadb/adb_client.c::adb_connect():adb_connect: return fd 3 system/core/ktadb/transport.c::readx():readx: fd=3 wanted=4 system/core/ktadb/transport.c::readx():readx: fd=3 wanted=4 got=4 30303230 0020 结果长度32 system/core/ktadb/transport.c::readx():readx: fd=3 wanted=32 system/core/ktadb/transport.c::readx():readx: fd=3 wanted=32 got=32 31343833453130303531334644303130 1483E100513FD010 List of devices attached 1483E100513FD0100_MTPADB device
发送4字节+host:devices指令,读取OKAY返回结果,读取结果长度及结果内容。
b.2 设备未授权
system/core/ktadb/adb_client.c::_adb_connect():_adb_connect: host:devices (null) 30303063 000c 686f73743a64657669636573 host:devices system/core/ktadb/transport.c::writex():writex: fd=3 len=4: system/core/ktadb/transport.c::writex():writex: fd=3 len=12: system/core/ktadb/transport.c::readx():readx: fd=3 wanted=4 system/core/ktadb/transport.c::readx():readx: fd=3 wanted=4 got=4 4f4b4159 OKAY system/core/ktadb/adb_client.c::_adb_connect():_adb_connect: return fd 3 system/core/ktadb/adb_client.c::adb_connect():adb_connect: return fd 3 system/core/ktadb/transport.c::readx():readx: fd=3 wanted=4 system/core/ktadb/transport.c::readx():readx: fd=3 wanted=4 got=4 30303136 0016 system/core/ktadb/transport.c::readx():readx: fd=3 wanted=22 system/core/ktadb/transport.c::readx():readx: fd=3 wanted=22 got=22 373964373561656309756e617574686f 79d75aec.unautho List of devices attached 79d75aec unauthorized
b.3 无设备
system/core/ktadb/adb_client.c::_adb_connect():_adb_connect: host:devices adb_server_name=(null) system/core/ktadb/adb_client.c::_adb_connect():_adb_connect: socket_loopback_client 30303063 000c 686f73743a64657669636573 host:devices system/core/ktadb/transport.c::writex():writex: fd=3 len=4: system/core/ktadb/transport.c::writex():writex: fd=3 len=12: system/core/ktadb/transport.c::readx():readx: fd=3 wanted=4 system/core/ktadb/transport.c::readx():readx: fd=3 wanted=4 got=4 4f4b4159 OKAY system/core/ktadb/adb_client.c::_adb_connect():_adb_connect: return fd 3 system/core/ktadb/adb_client.c::adb_connect():adb_connect: return fd 3 system/core/ktadb/transport.c::readx():readx: fd=3 wanted=4 system/core/ktadb/transport.c::readx():readx: fd=3 wanted=4 got=4 30303030 0000 system/core/ktadb/transport.c::readx():readx: fd=3 wanted=0 system/core/ktadb/transport.c::readx():readx: fd=3 wanted=0 got=0 List of devices attached
主机端 | ||
平台 | Win 7 | Linux |
公钥 | %USERPROFILE%\.android\adbkey.pub | /data/.android/adbkey.pub |
私钥 | %USERPROFILE%\.android\adbkey | /data/.android/adbkey |
手机 | 手机弹出主机公钥的指纹(MD5),询问是否允许 | |
已验证通过的主机保存在 /data/misc/adb/adb_keys |
相关推荐
adb源码分析源码
Android 如何启用user版本的adb源码分析
adb源码官网:https://android.googlesource.com/platform/system/core/可在以上链接获取adb源码集成到项目中。若下载失败可以下载上面的附件。
可在Windows下编译的源代码,用VS2010编译
通过代码分析发现Android13 上对 网络adb 进行了限制! Android13原生代码要求:必现连接上某个wifi,才能进行adb ,并且切换wifi或者关闭wifi都是会停止adb。 并且Android13 上 wifi adb 端口号每次是变化的,这个...
ADB通讯协议分析,利用USB分析仪抓取ADB通讯过程中的数据并结合ADB源码进行分析ADB通讯协议,对于理解ADB底层协议有很好的帮助。
Adb.exe的源码 通过分析Adb,可以得知Adb如何和手机通讯。
本文实例讲述了Android实现获取SERIAL信息的方法。分享给大家供大家参考。具体如下: android.os.build.serial 在API 9 中引入,如果低于9的系统可以通过这个方法获取这个信息值 java代码如下: ...
此adb源码是Android8.1修改而来,主要包含了在分析新adb版本无法使用向上方向键翻看历史输入记录所加的log,并成功解决这个问题。可以搜索lvjiong找到我的修改记录,主要涉及commandline.cpp 和sysdeps.h和sysdeps_...
原生Settings源码,供学习研究使用
基本都是用取文本中间或正则来分析的。这样不但效率低下,对一些特征不明显的xml元素很难取到。如果直接用xml来匹配就不存在这个问题了。并且可以基于本框架进行快速脚本开发。本贴不需要你学习怎么查找对应xml元素,...
This project provides reverse tethering over adb for Android: it allows devices to use the internet connection of the computer they are plugged on. It does not require any root access (neither on the ...
该项目接受输入音频文件(最好是 48kHz 立体声 MP3)并根据频率幅度的实时音频分析显示音乐的 3D 可视化。 快速开始 连接 Android 设备后,从终端运行adb devices以验证您的设备是否已连接调试模式 运行adb install...
UnityDebugViewer是一个功能强大的Unity日志查看工具,它集成了Unity Console Window的所有功能,并在此基础上加入了搜索,查看堆栈源码和Log统计等功能。通过使用UnityDebugViewer , UnityDebugViewer安装Android...
为了解决这些问题,故而开发了此款软件,该软件不仅解决了上述问题,而且还支持对日志文件进行离线分析和导出备份,支持对日志内容的横向过滤和纵向过滤,且可通过ADB工具直连物理设备进行日志的监控和分析,无需...
4.4.1 adb install分析 4.4.2 pm分析 4.4.3 installPackageWithVerification函数分析 4.4.4 APK 安装流程总结 4.4.5 Verification介绍 4.5 queryIntentActivities分析 4.5.1 Intent及IntentFilter介绍 4.5.2...
原理分析下:使用adb命令,抓取手机视频播放的界面,然后通过python的截取和ocr,获得到题目和答案, 然后百度得到结果。这个环境怎么搭建,有需要的童鞋可以联系我,因为使用本地的ocr所以解析不花钱,也没有使用的...
Android studio、eclipse的ddms连接设备的原理,和截屏代码分析
1.3.4 Android Debug Bridge(ADB) 的用法 16 1.3.5 使用DX编译Android应用 18 1.3.6 使用Android Asset Packaging Tool(AAPT)打包资源 19 1.3.7 使用mksdcard管理虚拟SD卡 19 1.4 开始第一个...
2. java 源码和编译方法 3. 使用 ADB 运行测试 4. 重要说明第二部分:分析过程 1. dex 整个文件的布局 2. header 3. string_ids 4. type_ids 5. proto_ids 6. field_ids 7. method_ids 8. class_defs 8.1 class_def_...