You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
hmz007 36ed224bac
Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a)
1 year ago
..
apex Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
client Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
coverage Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
crypto Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
daemon Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
docs/user Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
fastdeploy Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
fdevent Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
libs Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
pairing_auth Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
pairing_connection Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
proto Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
sysdeps Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
test_utils Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
tls Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
tools Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
.clang-format Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
Android.bp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
MODULE_LICENSE_APACHE2 Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
NOTICE Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
OVERVIEW.TXT Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
OWNERS Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
PREUPLOAD.cfg Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
README.md Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
SERVICES.TXT Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
SOCKET-ACTIVATION.txt Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
SYNC.TXT Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
TEST_MAPPING Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
adb.bash Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
adb.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
adb.h Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
adb_auth.h Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
adb_integration_test_adb.xml Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
adb_integration_test_device.xml Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
adb_io.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
adb_io.h Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
adb_io_test.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
adb_listeners.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
adb_listeners.h Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
adb_listeners_test.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
adb_mdns.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
adb_mdns.h Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
adb_trace.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
adb_trace.h Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
adb_unique_fd.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
adb_unique_fd.h Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
adb_utils.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
adb_utils.h Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
adb_utils_test.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
adb_wifi.h Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
adbd_test.xml Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
benchmark_device.py Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
bugreport_test.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
compression_utils.h Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
file_sync_protocol.h Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
mdns_test.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
protocol.txt Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
security_log_tags.h Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
services.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
services.h Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
shell_protocol.h Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
shell_service_protocol.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
shell_service_protocol_test.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
socket.h Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
socket_spec.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
socket_spec.h Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
socket_spec_test.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
socket_test.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
sockets.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
sockets.dia Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
sysdeps.h Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
sysdeps_test.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
sysdeps_unix.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
sysdeps_win32.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
sysdeps_win32_test.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
test_adb.py Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
test_device.py Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
trace.sh Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
transfer_id.h Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
transport.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
transport.h Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
transport_benchmark.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
transport_fd.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
transport_test.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
types.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
types.h Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago
types_test.cpp Rockchip Anroid14_SDK 20240628-rkr5 (2556df1a) 1 year ago

README.md

ADB Internals

If you are new to adb source code, you should start by reading OVERVIEW.TXT which describes the three components of adb pipeline.

This document is here to boost what can be achieved within a "window of naive interest". You will not find function or class documentation here but rather the "big picture" which should allow you to build a mental map to help navigate the code.

Three components of adb pipeline

As outlined in the overview, this codebase generates three components (Client, Server (a.k.a Host), and Daemon (a.k.a adbd)). The central part is the Server which runs on the Host computer. On one side the Server exposes a "Smart Socket" to Clients such as adb or DDMLIB. On the other side, the Server continuously monitors for connecting Daemons (as USB devices or TCP emulator). Communication with a device is done with a Transport.

+----------+              +------------------------+
|   ADB    +----------+   |      ADB SERVER        |                   +----------+
|  CLIENT  |          |   |                        |              (USB)|   ADBD   |
+----------+          |   |                     Transport+-------------+ (DEVICE) |
                      |   |                        |                   +----------+
+-----------          |   |                        |
|   ADB    |          v   +                        |                   +----------+
|  CLIENT  +--------->SmartSocket                  |              (USB)|   ADBD   |
+----------+          ^   | (TCP/IP)            Transport+-------------+ (DEVICE) |
                      |   |                        |                   +----------+
+----------+          |   |                        |
|  DDMLIB  |          |   |                     Transport+--+          +----------+
|  CLIENT  +----------+   |                        |        |  (TCP/IP)|   ADBD   |
+----------+              +------------------------+        +----------|(EMULATOR)|
                                                                       +----------+

The Client and the Server are contained in the same executable and both run on the Host machine. Code sections specific to the Host is enclosed within ADB_HOST guard. adbd runs on the Android Device. Daemon specific code is enclosed in !ADB_HOST but also sometimes with-in __ANDROID__ guard.

"SMART SOCKET" and TRANSPORT

A smart socket is a simple TCP socket with a smart protocol built on top of it. This is what Clients connect onto from the Host side. The Client must always initiate communication via a human readable request but the response format varies. The smart protocol is documented in SERVICES.TXT.

On the other side, the Server communicates with a device via a Transport. adb initially targeted devices connecting over USB, which is restricted to a fixed number of data streams. Therefore, adb multiplexes multiple byte streams over a single pipe via Transport. When devices connecting over other mechanisms (e.g. emulators over TCP) were introduced, the existing transport protocol was maintained.

THREADING MODEL and FDEVENT system

At the heart of both the Server and Daemon is a main thread running an fdevent loop, which is a platform-independent abstraction over poll/epoll/WSAPoll monitoring file descriptors events. Requests and services are usually served from the main thread but some service requests result in new threads being spawned.

To allow for operations to run on the Main thread, fdevent features a RunQueue combined with an interrupt fd to force polling to return.

+------------+    +-------------------------^
|  RUNQUEUE  |    |                         |
+------------+    |  POLLING (Main thread)  |
| Function<> |    |                         |
+------------+    |                         |
| Function<> |    ^-^-------^-------^------^^
+------------+      |       |       |       |
|    ...     |      |       |       |       |
+------------+      |       |       |       |
|            |      |       |       |       |
|============|      |       |       |       |
|Interrupt fd+------+  +----+  +----+  +----+
+------------+         fd      Socket  Pipe

ASOCKET, APACKET, and AMESSAGE

The asocket, apacket, and amessage constructs exist only to wrap data while it transits on a Transport. An asocket handles a stream of apackets. An apacket consists in a amessage header featuring a command (A_SYNC, A_OPEN, A_CLSE, A_WRTE, A_OKAY, ...) followed by a payload (find more documentation in protocol.txt. There is no A_READ command because an asocket is unidirectional. To model a bi-directional stream, asocket have a peer which go in the opposite direction.

An asocket features a buffer where the elemental unit is an apacket. If traffic is inbound, the buffer stores the apacket until it is consumed. If the traffic is oubound, the buffer stores apackets until they are sent down the wire (with A_WRTE commands).

+---------------------ASocket------------------------+
 |                                                   |
 | +----------------APacket Queue------------------+ |
 | |                                               | |
 | |            APacket     APacket     APacket    | |
 | |          +--------+  +--------+  +--------+   | |
 | |          |AMessage|  |AMessage|  |AMessage|   | |
 | |          +--------+  +--------+  +--------+   | |
 | |          |        |  |        |  |        |   | |
 | |  .....   |        |  |        |  |        |   | |
 | |          |  Data  |  |  Data  |  |  Data  |   | |
 | |          |        |  |        |  |        |   | |
 | |          |        |  |        |  |        |   | |
 | |          +--------+  +--------+  +--------+   | |
 | |                                               | |
 | +-----------------------------------------------+ |
 +---------------------------------------------------+

This system allows to multiplex data streams on an unique byte stream. Without entering too much into details, the amessage fields arg1 and arg2 are used alike in the TCP protocol where local and remote ports identify an unique stream. Note that unlike TCP which feature an "unacknowledged-send window", an apacket is sent only after the previous one has been confirmed to be received.

The two types of asocket (Remote and Local) differentiate between outbound and inbound traffic.

adbd <-> APPPLICATION communication

This pipeline is detailed in daemon/jdwp_service.cpp with ASCII drawings! The JDWP extension implemented by Dalvik/ART are documented in:

  • platform/dalvik/+/master/docs/debugmon.html
  • platform/dalvik/+/master/docs/debugger.html