Android ADB 源码分析总结

Android之ADB总结


本文内容如下:

1. makefile分析及总结

2. adb框架介绍 

3. adbd源码分析

       3.1 adbd初始化流程分析

        3.2 adb shell流程分析

        3.3 adb root流程分析

4. adb常用命令


一、makefile分析及总结


   
   
  1. // 以下内容摘录自android/ system/core/adb/Android.mk
  2. # Copyright 2005 The Android Open Source Project
  3. #
  4. # Android.mk for adb
  5. #
  6. LOCAL_PATH:= $(call my-dir)
  7. // 使用HOST_OS这个宏兼容不同的PC操作系统,比如windows,linux,mac等。
  8. ife q ($(HOST_OS),windows)
  9. adb_host_clang := false # libc++ for mingw not ready yet.
  10. else
  11. adb_host_clang := true
  12. endif
  13. adb_version := $(shell git -C $(LOCAL_PATH) rev-parse --short= 12 HEAD 2> /dev/null)-android
  14. ADB_COMMON_CFLAGS := \
  15. -Wall -Werror \
  16. -Wno-unused-parameter \
  17. -DADB_REVISION= '"$(adb_version)"' \
  18. # libadb
  19. # =========================================================
  20. # Much of adb is duplicated in bootable/recovery/minadb and fastboot. Changes
  21. # made to adb rarely get ported to the other two, so the trees have diverged a
  22. # bit. We'd like to stop this because it is a maintenance nightmare, but the
  23. # divergence makes this difficult to do all at once. For now, we will start
  24. # small by moving common files into a static library. Hopefully some day we can
  25. # get enough of adb in here that we no longer need minadb. https://b/17626262
  26. LIBADB_SRC_FILES := \
  27. adb.cpp \
  28. adb_auth.cpp \
  29. adb_io.cpp \
  30. adb_listeners.cpp \
  31. adb_utils.cpp \
  32. sockets.cpp \
  33. transport.cpp \
  34. transport_local.cpp \
  35. transport_usb.cpp \
  36. LIBADB_TEST_SRCS := \
  37. adb_io_test.cpp \
  38. adb_utils_test.cpp \
  39. transport_test.cpp \
  40. LIBADB_CFLAGS := \
  41. $(ADB_COMMON_CFLAGS) \
  42. -Wno-missing-field-initializers \
  43. -fvisibility=hidden \
  44. LIBADB_darwin_SRC_FILES := \
  45. fdevent.cpp \
  46. get_my_path_darwin.cpp \
  47. usb_osx.cpp \
  48. LIBADB_linux_SRC_FILES := \
  49. fdevent.cpp \
  50. get_my_path_linux.cpp \
  51. usb_linux.cpp \
  52. LIBADB_windows_SRC_FILES := \
  53. get_my_path_windows.cpp \
  54. sysdeps_win32.cpp \
  55. usb_windows.cpp \
  56. include $(CLEAR_VARS)
  57. LOCAL_CLANG := true
  58. // 编译生成libadbd静态库,供adbd deamon进程使用
  59. LOCAL_MODULE := libadbd
  60. LOCAL_CFLAGS := $(LIBADB_CFLAGS) -DADB_HOST= 0
  61. LOCAL_SRC_FILES := \
  62. $(LIBADB_SRC_FILES) \
  63. adb_auth_client.cpp \
  64. fdevent.cpp \
  65. jdwp_service.cpp \
  66. qemu_tracing.cpp \
  67. usb_linux_client.cpp \
  68. LOCAL_SHARED_LIBRARIES := libbase
  69. include $(BUILD_STATIC_LIBRARY)
  70. include $(CLEAR_VARS)
  71. LOCAL_CLANG := $(adb_host_clang)
  72. // 编译生成libadb动态库,供pc端adb可执行文件使用
  73. LOCAL_MODULE := libadb
  74. LOCAL_CFLAGS := $(LIBADB_CFLAGS) -DADB_HOST= 1
  75. LOCAL_SRC_FILES := \
  76. $(LIBADB_SRC_FILES) \
  77. $(LIBADB _$(HOST_OS)_SRC_FILES) \
  78. adb_auth_host.cpp \
  79. LOCAL_SHARED_LIBRARIES := libbase
  80. # Even though we're building a static library (and thus there's no link step for
  81. # this to take effect), this adds the SSL includes to our path.
  82. LOCAL_STATIC_LIBRARIES := libcrypto_static
  83. ife q ($(HOST_OS),windows)
  84. LOCAL_C_INCLUDES += development/host/windows/usb/api/
  85. endif
  86. include $(BUILD_HOST_STATIC_LIBRARY)
  87. include $(CLEAR_VARS)
  88. LOCAL_CLANG := true
  89. // 编译生成adbd的测试程序
  90. LOCAL_MODULE := adbd_test
  91. LOCAL_CFLAGS := -DADB_HOST= 0 $(LIBADB_CFLAGS)
  92. LOCAL_SRC_FILES := $(LIBADB_TEST_SRCS)
  93. LOCAL_STATIC_LIBRARIES := libadbd
  94. LOCAL_SHARED_LIBRARIES := liblog libbase libcutils
  95. include $(BUILD_NATIVE_TEST)
  96. include $(CLEAR_VARS)
  97. LOCAL_CLANG := $(adb_host_clang)
  98. // 编译生成adb的测试程序
  99. LOCAL_MODULE := adb_test
  100. LOCAL_CFLAGS := -DADB_HOST= 1 $(LIBADB_CFLAGS)
  101. LOCAL_SRC_FILES := $(LIBADB_TEST_SRCS) services.cpp
  102. LOCAL_SHARED_LIBRARIES := liblog libbase
  103. LOCAL_STATIC_LIBRARIES := \
  104. libadb \
  105. libcrypto_static \
  106. libcutils \
  107. ife q ($(HOST_OS),linux)
  108. LOCAL_LDLIBS += -lrt -ldl -lpthread
  109. endif
  110. ife q ($(HOST_OS),darwin)
  111. LOCAL_LDLIBS += -framework CoreFoundation -framework IOKit
  112. endif
  113. include $(BUILD_HOST_NATIVE_TEST)
  114. # adb device tracker (used by ddms) test tool
  115. # =========================================================
  116. ife q ($(HOST_OS),linux)
  117. include $(CLEAR_VARS)
  118. LOCAL_CLANG := $(adb_host_clang)
  119. // 编译生成adb_device_tracker服务的测试程序
  120. LOCAL_MODULE := adb_device_tracker_test
  121. LOCAL_CFLAGS := -DADB_HOST= 1 $(LIBADB_CFLAGS)
  122. LOCAL_SRC_FILES := test_track_devices.cpp
  123. LOCAL_SHARED_LIBRARIES := liblog libbase
  124. LOCAL_STATIC_LIBRARIES := libadb libcrypto_static libcutils
  125. LOCAL_LDLIBS += -lrt -ldl -lpthread
  126. include $(BUILD_HOST_EXECUTABLE)
  127. endif
  128. # adb host tool
  129. # =========================================================
  130. include $(CLEAR_VARS)
  131. ife q ($(HOST_OS),linux)
  132. LOCAL_LDLIBS += -lrt -ldl -lpthread
  133. LOCAL_CFLAGS += -DWORKAROUND_BUG6558362
  134. endif
  135. ife q ($(HOST_OS),darwin)
  136. LOCAL_LDLIBS += -lpthread -framework CoreFoundation -framework IOKit -framework Carbon
  137. LOCAL_CFLAGS += -Wno-sizeof-pointer-memaccess -Wno-unused-parameter
  138. endif
  139. ife q ($(HOST_OS),windows)
  140. LOCAL_LDLIBS += -lws2_32 -lgdi32
  141. EXTRA_STATIC_LIBS := AdbWinApi
  142. endif
  143. LOCAL_CLANG := $(adb_host_clang)
  144. LOCAL_SRC_FILES := \
  145. adb_main.cpp \
  146. console.cpp \
  147. commandline.cpp \
  148. adb_client.cpp \
  149. services.cpp \
  150. file_sync_client.cpp \
  151. LOCAL_CFLAGS += \
  152. $(ADB_COMMON_CFLAGS) \
  153. -D_GNU_SOURCE \
  154. -DADB_HOST= 1 \
  155. // 编译生成PC端的adb可执行文件,位于sdk/platform-tools/adb目录下
  156. LOCAL_MODULE := adb
  157. LOCAL_MODULE_TAGS := debug
  158. LOCAL_STATIC_LIBRARIES := \
  159. libadb \
  160. libbase \
  161. libcrypto_static \
  162. libcutils \
  163. liblog \
  164. $(EXTRA_STATIC_LIBS) \
  165. # libc++ not available on windows yet
  166. ifne q ($(HOST_OS),windows)
  167. LOCAL_CXX_STL := libc++_static
  168. endif
  169. # Don't add anything here, we don't want additional shared dependencies
  170. # on the host adb tool, and shared libraries that link against libc++
  171. # will violate ODR
  172. LOCAL_SHARED_LIBRARIES :=
  173. include $(BUILD_HOST_EXECUTABLE)
  174. $(call dist- for-goals,dist_files sdk,$(LOCAL_BUILT_MODULE))
  175. ife q ($(HOST_OS),windows)
  176. $(LOCAL_INSTALLED_MODULE): \
  177. $(HOST_OUT_EXECUTABLES)/AdbWinApi.dll \
  178. $(HOST_OUT_EXECUTABLES)/AdbWinUsbApi.dll
  179. endif
  180. # adbd device daemon
  181. # =========================================================
  182. include $(CLEAR_VARS)
  183. LOCAL_CLANG := true
  184. LOCAL_SRC_FILES := \
  185. adb_main.cpp \
  186. services.cpp \
  187. file_sync_service.cpp \
  188. framebuffer_service.cpp \
  189. remount_service.cpp \
  190. set_verity_enable_state_service.cpp \
  191. LOCAL_CFLAGS := \
  192. $(ADB_COMMON_CFLAGS) \
  193. -DADB_HOST= 0 \
  194. -D_GNU_SOURCE \
  195. -Wno-deprecated-declarations \
  196. // engineer模式下无需AUTH认证
  197. LOCAL_CFLAGS += -DALLOW_ADBD_NO_AUTH=$( if $(filter userdebug eng,$(TARGET_BUILD_VARIANT)), 1, 0)
  198. ifne q (,$(filter userdebug eng,$(TARGET_BUILD_VARIANT)))
  199. LOCAL_CFLAGS += -DALLOW_ADBD_DISABLE_VERITY= 1
  200. LOCAL_CFLAGS += -DALLOW_ADBD_ROOT= 1
  201. endif
  202. // 编译生成设备端或模拟器端的adbd deamon进程
  203. LOCAL_MODULE := adbd
  204. LOCAL_FORCE_STATIC_EXECUTABLE := true
  205. LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT_SBIN)
  206. LOCAL_UNSTRIPPED_PATH := $(TARGET_ROOT_OUT_SBIN_UNSTRIPPED)
  207. LOCAL_C_INCLUDES += system/extras/ext4_utils
  208. LOCAL_STATIC_LIBRARIES := \
  209. libadbd \
  210. libbase \
  211. libfs_mgr \
  212. liblog \
  213. libcutils \
  214. libc \
  215. libmincrypt \
  216. libselinux \
  217. libext4_utils_static \
  218. include $(BUILD_EXECUTABLE)

关键点总结:


   
   
  1. 所有的adb程序(PC端和设备端)共用一套代码,只是借助于HOST_OS这个宏进行隔离,编译时会生成两个可执行文件:
  2. 1.adb/adb.exe:运行于PC端(包括Windows、Linux、MacOS等操作系统之上),位于platform/tools/adb目录下,透过adb命令可以唤起。
  3. 2.adbd:运行于Android设备上,开机时自动启动。
  4. 相应的,源码中也会由ADB_HOST宏用来区分本地主机(adb)和目标机(adbd)。
  5. Engineer模式下会定义ALLOW_ADBD_NO_AUTH,源码中会使用到。

二、adb框架介绍

ADB为 Android Debug Bridge(调试桥)的缩写,本质上是一个 C/S 架构的命令行工具。整个ADB模块由如下几部分组成(详细参见system/core/adb/OVERVIEW.txttransports.txt):

  1. The ADB server(adb):运行在PC端的一个后台应用程序,用来检测Android Devices的连接或去除,进而维护设备状态列表。另外,ADB Server也会负责协调Client、Services和Android devices之间传输数据。
  2. The ADB daemon (adbd) : 运行在Android Devices或Emulator上的后台守护进程。该进程主要是用来连接ADB Server,并通过USB(或者TCP)为adb clients提供一些services服务。
  3. The ADB command-line client: 执行adb 命令的终端。具体来说,会连接adb server并向adb server发送请求命令。若是发现adb server没有启动,则会自动唤起adb server.
  4. Services: adb具备的一些能力可以抽象成服务(services),供The ADB command-line client访问。可以分为 Host Services和Local Services两种,简述如下:

   
   
  1. a) Host Services: 运行于ADB  Server,不需要和devices进行数据交换。典型的就是执行adb devices命令时,只需要adb  server端返回当前的adb devices的状态即可。
  2. b)Local Services: 运行于adbd守护进程,ADB  Server负责建立adb clients和Local Services之间的连接,并透传数据。

注:本篇文章只分析ADBD的实现。

三、adbd源码分析

  1. adbd初始化流程分析  

    ADB分为usb adb和wifi adb两种方式,两者互斥存在,默认使用的是usb adb. 如果想默认启动wifi adb,需设置属性service.adb.tcp.port值为55555,然后重启adbd即可。ADB daemon(usb adb.)程序开机启动主要步骤如下图所示。

 

说明如下:

  • DEFAULT_ADB_PORT为adb server的端口号,定义如下,一般取值为5037。有时PC上adb无法使用,可能就是由于该端口已经腾讯等手机助手等占用。

   
   
  1. #if ADB_HOST_ON_TARGET
  2. /* adb and adbd are coexisting on the target, so use 5038 for adb
  3. * to avoid conflicting with adbd's usage of 5037
  4. */
  5. # define DEFAULT_ADB_PORT 5038
  6. #else
  7. # define DEFAULT_ADB_PORT 5037
  8. #endif
  • 1.1.1-init_transport_registration()分析如下:

   
   
  1. void init_transport_registration( void)
  2. {
  3. int s[ 2];
  4. // 创建双向通信的管道,全双工
  5. if( adb_socketpair(s)){
  6. fatal_errno( "cannot open transport registration socketpair");
  7. }
  8. D( "socketpair: (%d,%d)", s[ 0], s[ 1]);
  9. transport_registration_send = s[ 0]; // 发送数据
  10. transport_registration_recv = s[ 1]; // 接收数据
  11. // transport_registration_recv有数据接收到后,会触发transport_registration_func执行
  12. fdevent_install(&transport_registration_fde,
  13. transport_registration_recv,
  14. transport_registration_func, // 这个函数很重!!
  15. 0);
  16. fdevent_set(&transport_registration_fde, FDE_READ);
  17. }

因此,接下来需要分析transport_registration_recv会接收数据,即transport_registration_send何时会发送数据。

  • 1.1.2-adbd_cloexec_auth_socket()分析如下:

   
   
  1. void adbd_cloexec_auth_socket() {
  2. int fd = android_get_control_socket( "adbd");
  3. if (fd == -1) {
  4. D( "Failed to get adbd socket\n");
  5. return;
  6. }
  7. fcntl(fd, F_SETFD, FD_CLOEXEC);
  8. }
  • 1.1.3-should_drop_privileges()分析如下:

   
   
  1. // adbd 默认是root权限,即最高权限。此处是为了安全需要,考虑是否要降级,即降低权限。
  2. static bool should_drop_privileges() {
  3. #if defined(ALLOW_ADBD_ROOT)
  4. char value[PROPERTY_VALUE_MAX];
  5. // 模拟器没有降级
  6. // The emulator is never secure, so don't drop privileges there.
  7. // TODO: this seems like a bug --- shouldn't the emulator behave like a device?
  8. property_get( "ro.kernel.qemu", value, "");
  9. if ( strcmp(value, "1") == 0) {
  10. return false;
  11. }
  12. // The properties that affect `adb root` and `adb unroot` are ro.secure and
  13. // ro.debuggable. In this context the names don't make the expected behavior
  14. // particularly obvious.
  15. //
  16. // ro.debuggable:
  17. // Allowed to become root, but not necessarily the default. Set to 1 on
  18. // eng and userdebug builds.
  19. //
  20. // ro.secure:
  21. // Drop privileges by default. Set to 1 on userdebug and user builds.
  22. property_get( "ro.secure", value, "1");
  23. bool ro_secure = ( strcmp(value, "1") == 0);
  24. property_get( "ro.debuggable", value, "");
  25. bool ro_debuggable = ( strcmp(value, "1") == 0);
  26. // Drop privileges if ro.secure is set...
  27. bool drop = ro_secure;
  28. property_get( "service.adb.root", value, "");
  29. bool adb_root = ( strcmp(value, "1") == 0);
  30. bool adb_unroot = ( strcmp(value, "0") == 0);
  31. // 默认debug模式不会降级,即adb有root权限
  32. // ...except "adb root" lets you keep privileges in a debuggable build.
  33. if (ro_debuggable && adb_root) {
  34. drop = false;
  35. }
  36. // ...and "adb unroot" lets you explicitly drop privileges.
  37. if (adb_unroot) {
  38. drop = true;
  39. }
  40. return drop;
  41. #else
  42. return true; // "adb root" not allowed, always drop privileges.
  43. #endif /* ALLOW_ADBD_ROOT */
  44. }
  • 1.1.4-usb_init()分析如下:

   
   
  1. void usb_init()
  2. {
  3. if (access(USB_FFS_ADB_EP0, F_OK) == 0)
  4. usb_ffs_init();
  5. else
  6. usb_adb_init(); //走此case,接下来分析此函数
  7. }
  8. 继续usb_adb_init()分析...
  9. static void usb_adb_init()
  10. {
  11. usb_handle* h = reinterpret_cast<usb_handle*>(calloc( 1, sizeof(usb_handle)));
  12. if (h == nullptr) fatal( "couldn't allocate usb_handle");
  13. h->write = usb_adb_write;
  14. h->read = usb_adb_read;
  15. h->kick = usb_adb_kick;
  16. h->fd = -1;
  17. adb_cond_init(&h->notify, 0);
  18. adb_mutex_init(&h-> lock, 0);
  19. // Open the file /dev/android_adb_enable to trigger
  20. // the enabling of the adb USB function in the kernel.
  21. // We never touch this file again - just leave it open
  22. // indefinitely so the kernel will know when we are running
  23. // and when we are not.
  24. // 打开android_adb_enable节点,即enable adb usb
  25. int fd = unix_open( "/dev/android_adb_enable", O_RDWR);
  26. if (fd < 0) {
  27. D( "failed to open /dev/android_adb_enable\n");
  28. } else {
  29. close_on_exec(fd);
  30. }
  31. D( "[ usb_init - starting thread ]\n");
  32. adb_thread_t tid;
  33. if(adb_thread_create(&tid, usb_adb_open_thread, h)){ //接下来分析此函数
  34. fatal_errno( "cannot create usb thread");
  35. }
  36. }
  37. 继续usb_adb_open_thread()分析...
  38. static void *usb_adb_open_thread( void *x)
  39. {
  40. struct usb_handle *usb = ( struct usb_handle *)x;
  41. int fd;
  42. while ( true) {
  43. // wait until the USB device needs opening
  44. adb_mutex_lock(&usb-> lock);
  45. while (usb->fd != -1)
  46. adb_cond_wait(&usb->notify, &usb-> lock);
  47. adb_mutex_unlock(&usb-> lock);
  48. D( "[ usb_thread - opening device ]\n");
  49. do {
  50. /* XXX use inotify? */
  51. fd = unix_open( "/dev/android_adb", O_RDWR); //打开adb节点
  52. if (fd < 0) {
  53. // to support older kernels
  54. fd = unix_open( "/dev/android", O_RDWR);
  55. }
  56. if (fd < 0) {
  57. adb_sleep_ms( 1000);
  58. }
  59. } while (fd < 0);
  60. D( "[ opening device succeeded ]\n");
  61. close_on_exec(fd);
  62. usb->fd = fd; //将adb节点赋值给usb->fd,重要!
  63. D( "[ usb_thread - registering device ]\n");
  64. register_usb_transport(usb, 0, 0, 1); //接下来分析此函数
  65. }
  66. // never gets here
  67. return 0;
  68. }
  69. 继续register_usb_transport()分析...
  70. //transport.cpp
  71. void register_usb_transport(usb_handle *usb, const char *serial, const char *devpath, unsigned writeable)
  72. {
  73. atransport *t = reinterpret_cast<atransport*>(calloc( 1, sizeof(atransport)));
  74. if (t == nullptr) fatal( "cannot allocate USB atransport");
  75. D( "transport: %p init'ing for usb_handle %p (sn='%s')\n", t, usb, serial ? serial : "");
  76. // 初始化atransport
  77. init_usb_transport(t, usb, (writeable ? CS_OFFLINE : CS_NOPERM));
  78. if(serial) {
  79. t->serial = strdup(serial);
  80. }
  81. if(devpath) {
  82. t->devpath = strdup(devpath);
  83. }
  84. adb_mutex_lock(&transport_lock);
  85. t->next = &pending_list;
  86. t->prev = pending_list.prev;
  87. t->next->prev = t;
  88. t->prev->next = t;
  89. adb_mutex_unlock(&transport_lock);
  90. register_transport(t); //接下来分析此函数
  91. }
  92. 继续register_transport(t)分析...
  93. /* the fdevent select pump is single threaded */
  94. static void register_transport(atransport *transport)
  95. {
  96. tmsg m;
  97. m.transport = transport;
  98. m.action = 1;
  99. D( "transport: %s registered\n", transport->serial);
  100. //看到这个socket fd: transport_registration_send, 我们想到了1.1.1- init_transport_registration()中遗留的问题。让我们继续。。。
  101. if(transport_write_action(transport_registration_send, &m)) {
  102. fatal_errno( "cannot write transport registration socket\n");
  103. }
  104. }
  105. 继续transport_write_action(transport_registration_send, &m)分析...
  106. static int
  107. transport_write_action( int fd, struct tmsg* m)
  108. {
  109. char *p = ( char*)m;
  110. int len = sizeof(*m);
  111. int r;
  112. while(len > 0) {
  113. r = adb_write(fd, p, len); // 此处即为向transport_registration_send写数据!!!!
  114. if(r > 0) {
  115. len -= r;
  116. p += r;
  117. } else {
  118. if((r < 0) && (errno == EINTR)) continue;
  119. D( "transport_write_action: on fd %d, error %d: %s\n",
  120. fd, errno, strerror(errno));
  121. return -1;
  122. }
  123. }
  124. return 0;
  125. }
  • 紧接着会调用transport_registration_func(int _fd, unsigned ev, void *data)

   
   
  1. static void transport_registration_func( int _fd, unsigned ev, void *data)
  2. {
  3. int s[ 2];
  4. ......
  5. if(adb_socketpair(s)) {
  6. fatal_errno( "cannot open transport socketpair");
  7. }
  8. D( "transport: %s socketpair: (%d,%d) starting", t->serial, s[ 0], s[ 1]);
  9. t->transport_socket = s[ 0];
  10. t->fd = s[ 1];
  11. fdevent_install(&(t->transport_fde), t->transport_socket,transport_socket_events,t); //重要
  12. fdevent_set(&(t->transport_fde), FDE_READ);
  13. // 从adb驱动的角度来看,创建adb输入通道
  14. if(adb_thread_create(&input_thread_ptr, input_thread, t)){
  15. fatal_errno( "cannot create input thread");
  16. }
  17. // 从adb驱动的角度来看,创建adb输出通道
  18. if(adb_thread_create(&output_thread_ptr, output_thread, t)){
  19. fatal_errno( "cannot create output thread");
  20. }
  21. ......
  22. }

后续大概流程为:

至此,adbd的主要初始化过程已分析完毕。其中最为关键的是初始化了adb驱动节点,然后创建output_thread不断的读取节点内容变化

2. adb shell流程分析

由3.1节知,output_thread从adb驱动节点读取数据后,调用write_packet(t->fd, t->serial, &p))会触发调用transport_socket_events()函数进行数据处理。

3. adb root流程分析

 

 

四、adb常用命令

adb 命令一般格式为:adb [-e | -d | -s <设备序列号>] <子命令>

  • adb version,查看adb版本
  • adb tcpip 5555,设置属性ersist.adb.tcp.port=5555,重启adbd进入adb wifi模式。
  • adb devices , 获取设备列表及设备状态

   
   
  1. a.device:设备正常连接
  2. b.offline:连接出现异常,设备无响应
  3. c.unknown:没有连接设备
  • adb get-state , 获取设备的状态,设备的状态有 3 钟,device , offline , unknown
  • adb kill-server , adb start-server 

   
   
  1. 结束 adb 服务, 启动 adb 服务,通常两个命令一起用。
  2. 一般在连接出现异常,使用 adb devices 未正常列出设备, 设备状态异常时使用 kill- server,然后运行 start- server 进行重启服务
  • adb logcat , 打印 Android 的系统日志
  • adb bugreport 

   
   
  1. 打印dumpsys、dumpstate、logcat的输出,也是用于分析错误
  2. 输出比较多,建议重定向到一个文件中
  3. adb bugreport > d:\bugreport. log
  • adb install 
安装应用,覆盖安装是使用 -r 选项
   
   
  • adb uninstall

   
   
  1. 卸载应用,后面跟的参数是应用的包名,请区别于 apk 文件名
  2. '-k' means keep the data and cache directories , -k 选项,卸载时保存数据和缓存目录
  • adb pull , 将 Android 设备上的文件或者文件夹复制到本地
  • adb push , 推送本地文件至 Android 设备
  • adb root , adb remount, 获取 root 权限,并挂载系统文件系统为可读写状态
  • adb reboot , 重启 Android 设备
  • adb reboot loader , 重启设备,进入 fastboot 模式,同 adb reboot-bootloader 命令
  • adb reboot recovery , 重启设备,进入 recovery 模式
  • adb connect <device-ip-address>/adb disconnect <device-ip-address>

上述为adb程序自带的命令,与android无关,而Android系统自身的命令,实现位于system/bin(pm,am,screenrecord,getprop,input,ime,wm,settings,monkey,dumpsys,logcat,log,uiautomator等)。除此之外,就是linux自带的命令,自行查阅。

后记:因adb实际开发需要,研究了下adb源码,上述算是一个总结。本着开源的精神,大家共同进步!

参考文章:

https://blog.csdn.net/wlwl0071986/article/details/50935496

https://blog.csdn.net/qq_35970872/article/details/78912611

https://www.cnblogs.com/zzb-Dream-90Time/p/8166223.html

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Android 12的ADB源代码是指Android开发者桥接(Android Debug Bridge,简称ADB)的源代码。ADB是一个多功能命令行工具,用于与Android设备进行通信和调试。在Android开发过程中,ADB源代码对于理解和调试设备与计算机之间的交互非常有用。 ADB源代码在Android开源项目(AOSP)的代码库中可用,并且可以通过下载AOSP来获取该源代码。通过查看源代码,我们可以了解ADB是如何实现与Android设备之间的通信和数据传输的。 ADB源代码包含了ADB客户端和ADB服务端的实现。ADB客户端在计算机上运行,而ADB服务端则在Android设备上运行。源代码中涵盖了各种命令和功能,包括连接设备、获取设备信息、安装和卸载应用程序、传输文件等。 了解ADB源代码可以帮助开发者理解ADB工具的工作原理和内部机制。这对于开发者在调试和优化应用程序时非常有帮助,可以更好地利用ADB的各种功能来帮助开发过程。 总而言之,Android 12的ADB源代码是开发者可以获取和查看的ADB工具的源代码,通过了解该源代码,开发者可以更好地了解ADB的工作原理和内部机制,并在开发中更好地应用ADB的各种功能。 ### 回答2: Android 12是谷歌推出的最新操作系统版本,它带来了许多新功能和改进。ADB(安卓调试桥)则是开发者工具包中的一个重要组件,它允许开发者在计算机和Android设备之间进行通信和调试。ADB的源代码在Android源代码中可以找到。 ADB源码位于Android源码的“platform/system/core/adb”目录下。这个目录包含ADB的所有关键组件。ADB源码以C/C++编写,开发者可以查看和修改这些代码以满足自己的需求。 在Android 12中,ADB源码可能会有一些变化和更新。这些变化可能包括新的功能、性能改进和bug修复。开发者可以通过查看和分析源码,了解这些变化并将其应用于自己的项目中。 为了使用ADB源码,开发者需要首先通过下载和编译整个Android源代码来获取它。一旦获取到ADB源码,开发者可以使用适当的编译工具将其编译为可执行文件。然后,通过在计算机上执行编译后的二进制文件,开发者就可以与连接的Android设备进行通信和调试。 总之,Android 12中ADB的源代码可以在Android源代码的特定目录中找到。开发者可以通过查看和修改这些源码来了解和应用ADB的最新功能和改进。同时,获取和编译Android源代码也是使用ADB源码的前提条件。 ### 回答3: Android 12的ADB源码指的是Android操作系统12版本中的ADBAndroid Debug Bridge)相关代码。 ADBAndroid开发平台中的一个调试工具,它能够通过USB电缆或Wi-Fi连接设备和计算机,实现设备和计算机之间的通信和数据传输。ADB源码包含了ADB守护进程(adbd)以及与其相关的各种组件和功能的实现代码。 在Android 12中,ADB源码经过了诸多改进和更新。其中包括对ADB连接的性能和稳定性的优化,以提高调试和数据传输的效率。此外,还增加了一些新的功能和命令,便于开发者进行更多的调试和测试工作。 ADB源码主要由C++语言编写,涉及到与底层系统中的设备驱动程序和底层服务的交互。开发者可以通过查看并分析ADB源码,深入了解ADB的工作原理和实现细节,以及针对特定需求进行二次开发和定制。 要查看Android 12中的ADB源码,需要访问Android开源项目(AOSP)的代码库。通过AOSP,开发者可以获取Android操作系统的全部源代码,包括ADB源码。但需要注意的是,访问和使用AOSP的源码需要先了解相关的法律政策和使用条款,并按照规定进行操作。 总之,Android 12的ADB源码是指Android 12版本中ADB相关的代码实现,通过查看和分析源码,开发者可以深入了解ADB的工作原理和实现细节,并进行二次开发和定制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值