Android ADB 源码分析总结

2023-05-16

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android ADB 源码分析总结 的相关文章

  • 处理 Android 锁屏上的音量变化?

    我想做的是 能够在 android 4 4 上的锁屏上捕获音量增大 减小按钮操作 Google Cast 设计清单 https developers google com cast docs design checklist sender
  • 导航组件参数默认值

    在导航组件中 将参数从第一个片段发送到第二个片段时 默认值不会从导航图中获取哪个集合 这是我的代码 导航图 xml
  • 编译后从字节代码中删除注释

    我们正在使用一个包含使用 JAXB 注释进行注释的 bean 的库 我们使用这些类的方式完全不依赖于 JAXB 换句话说 我们不需要 JAXB 也不依赖注释 但是 由于注释存在 它们最终会被处理注释的其他类引用 这要求我将 JAXB 捆绑到
  • ListView:防止视图回收

    我有一个使用回收视图的 ListView 我试图阻止视图被回收 所以我使用 setHasTransientState android support v4 view ViewCompatJB setHasTransientState Vie
  • 如何在 Android 应用程序中单击按钮时打开 Gmail Compose?

    当我的 Android 应用程序中单击按钮时 我尝试打开 Gmail 撰写屏幕 我需要 Google 提供的 API 密钥吗 或者我需要在按钮 onClickListener 中做什么 任何形式的见解都非常值得赞赏 正如 JeffC 指出的
  • Android 8.1 中 Activity 自行旋转并恢复正常

    我的应用程序在所有 Android 版本上运行良好 但我注意到在 Android 8 1 0 Oreo 中 当我将屏幕从纵向活动转到横向活动时 以及当我按后退按钮时 它会显示异常行为 屏幕自动从横向旋转并恢复正常 看起来 Activity
  • Android 谷歌地图 V2 已停止

    我正在尝试构建地图应用程序并关注这个链接 https blog emildesign rhcloud com p 435一步步 我在这里找到了类似的主题 但对我没有帮助 我想显示地图 但是当我运行它时 它返回强制关闭和我的 Android
  • android:进程和进程名称

    我试图理解android process属性 Ref says http developer android com guide topics manifest application element html proc 如果分配给该属性的
  • 在 Android 中始终以横向模式打开相机

    在我的 Android 应用程序中 单击按钮后我希望相机以横向模式打开 即使我将手机旋转为纵向模式 相机也应始终处于横向模式或纵向模式 使用此代码在横向模式下打开相机 Intent cameraIntent new Intent Media
  • 使用 RxJava 限制吞吐量

    我现在遇到的情况很难解释 所以我会写一个更简单的版本来解释这个问题 我有一个Observable from 它发出一系列由ArrayList文件数量 所有这些文件都应上传到服务器 为此 我有一个函数可以完成这项工作并返回一个Observab
  • Android BLE 扫描在后台几分钟后停止

    当我为公司开发新冠肺炎接触者追踪应用程序时 我在后台遇到了 Android 扫描停止问题 这是我尝试过的 添加前台服务 禁用手机中所有与电池相关的优化选项 启用后台运行的应用程序 测试设备 搭载 Android 10 的 Galaxy S2
  • Android:BATTERY_STATUS_DISCHARGING 和 BATTERY_STATUS_NOT_CHARGING 之间的区别

    我想知道这两个标志之间的区别 BatteryManager BATTERY STATUS DISCHARGING And BatteryManager BATTERY STATUS NOT CHARGING 我开发了一个使用这两个标志的应用
  • 我应该选择的最低 SDK 版本是多少? (截至2018年11月)

    据我所知 android studio 中默认的最小 SDK 设置是 15 我读到我应该增加它 因为没有多少人 或者可能没有 仍在使用该 android 版本 另外 我计划使用 android studio 中的一些新功能 这些功能仅适用于
  • Android - 多次实例化一个片段?

    我正在创建一个在 ListView 中显示数据的应用程序 数据分为两种类型 热门 收藏夹 我有一个活动和两个片段 片段根据类别显示项目列表 我为此使用了 ListView 然后我有两个fragment layouts 它们在设计上完全相同
  • 按名称获取 ArrayList

    这是正确的获取方式吗ArrayList
  • 在 android 版本 7.0 上膨胀类 android.widget.DatePicker 时出错

    我想显示弹出日期选择器并且我使用此代码 Calendar mcurrentDate Calendar getInstance int mYear mcurrentDate get Calendar YEAR int mMonth mcurr
  • 无法登录 Google Play 游戏服务

    我在开发者控制台上使用包名称和正确的签名证书设置了我的游戏 并为其创建了排行榜 但没有创建任何成就 然后 我从以下位置下载了示例 Type A Number Challenge 和 BaseGameUtils https developer
  • SDK尚未初始化,请务必先调用FacebookSdk.sdkInitialize()

    我在实现 Facebook SDK 时遇到此错误 并且我tried https stackoverflow com questions 15490399 error inflating class com facebook widget l
  • 将 Crashlytics 集成到图书馆项目

    我有一个图书馆项目 自定义视图库项目 它没有任何活动 服务 我想将 Crashlytics SDK 集成到我的库中 当我尝试通过 Android Studio 的 Crashlytics 插件 工具栏中的图标 添加它时 它只是停留在 Che
  • 应用程序中空指针异常[重复]

    这个问题在这里已经有答案了 我正在尝试在我的应用程序中实施应用程序内计费 我写了这段代码 public class Settings extends PreferenceFragment ServiceConnection mService

随机推荐

  • Powershell 美化教程(2021版)

    win下原生的三款CMD Powershell和Windows Terminal xff0c 一个是上世纪的产物 xff0c 只能win环境内最基本的使用 xff1b 另一个是挺新 xff0c 但是明显UI设计师不在线 xff0c 在win
  • 高级设置/FTP IPv4地址和域限制(三)

    xff13 詳細設定 xff0f FTP IPv4 制限 xff13 高级设置 xff0f FTP IPv4地址和域限制 xff11 操作 項目 FTP 管理 詳細設定 xff12 高级设置 初期設定値如下 xff0a 物理路径 E act
  • Linux简易DDNS配置教程

    Linux简易DDNS配置教程 DDNS与其在Linux系统上的应用 1 1 DDNS是什么 xff0c 其作用是什么 DDNS xff08 Dynamic Domain Name System xff0c 动态域名系统 xff09 是一种
  • 机器学习毕业设计 大数据股票数据量化分析与预测系统 - python

    文章目录 0 前言1 课题背景2 实现效果UI界面设计web预测界面RSRS选股界面 3 软件架构4 工具介绍Flask框架MySQL数据库LSTM 0 前言 x1f525 这两年开始毕业设计和毕业答辩的要求和难度不断提升 xff0c 传统
  • HTML Parsing Error: Unable to modify the parent co

    HTML Parsing Error Unable to modify the parent container element before the child element is closed KB927917 主要是因为页面没有加载
  • 解决PowerShell无法使用conda的问题

    目录 1 问题描述2 解决办法2 1 将Anaconda添加至系统环境变量2 2 初始化PowerShell2 3 设置ExecutionPolicy的值 3 避免PowerShell默认激活base环境 1 问题描述 由于新版本的Anac
  • [RK3288][Android6.0] 调试笔记 --- 录音apk无权限录音问题

    Platform Rockchip OS Android 6 0 Kernel 3 10 92 现象 xff1a 写了个apk测试录音 xff0c 提示 xff1a 01 22 00 59 40 795 215 948 W ServiceM
  • 【Linux】Ubuntu 使用指南

    content 1 换清华源2 更新三步走3 1 换清华源 备份 Ubuntu 的软件源配置文件 etc apt sources list span class token function sudo span span class tok
  • ubuntu下解决不能识别外部设备的方法

    首先确认手机连接上电脑 xff0c lsusb查看下设备记录 matthew 64 matthew 1230 laptop lsusb Bus 007 Device 009 ID 18d1 4e12 Bus 007 Device 001 I
  • android json解析及简单例子

    JSON的定义 xff1a 一种轻量级的数据交换格式 xff0c 具有良好的可读和便于快速编写的特性 业内主流技术为其提供了完整的解决方案 xff08 有点类似于正则表达式 xff0c 获得了当今大部分语言的支持 xff09 xff0c 从
  • Ubuntu 16.04 如何安装 Python 3.6

    在Ubuntu 16 04版本中 xff0c 系统默认安装 了python 2 7和3 5版本 xff0c 此次安装的是新版本Python 3 6 13 由于系统已经默认安装了Python xff0c 所以相关的依赖文件已经安装妥善 xff
  • ubnutu桌面环境Gnome 配置tweak tool时看不到extension插件选项

    问题 xff1a tweak tool中没用extension选项 xff0c 这是因为没有开启gnome xff0c 解决方法是注销当前用户 然后在登录窗口的右上角 xff0c 选择gnome xff0c 如下图所示 然后在弹出的窗口中选
  • C# 内存与性能优化

    C 内存与性能优化 https www jianshu com p d56f79d83ebd 前两周分享了资源配置与资源管理 xff0c 今天分享一种特殊的资源脚本数据 在Unity项目中 xff0c 我们通常使用C 编写脚本 xff0c
  • 转发——从搭建小系统到架构分布式

    从搭建小系统到架构分布式 从搭建小系统到架构分布式 SpringBoot是目前Spring技术体系中炙手可热的框架之一 既可用于构建业务复杂的企业应用系统 xff0c 也可以开发高性能和高吞吐量的互联网应用 Spring Boot 框架降低
  • 2018-8-30华为机试第三题

    一个很明显的递归问题 package cn csu ksh import java util ArrayList import java util List import java util Scanner public class Mai
  • Android学习之Sensor

    转自http javatest blog 163 com blog static 20865106420126216118757 只需要五步 xff0c 你就能搞定Sensor 让你的程序变的更酷 java view plain copy
  • 虚拟现实技术vr可以用来干什么?虚拟现实技术vr有什么特征

    科技行业的不断蓬勃发展 xff0c 每天会出现一些新的科技产品 xff0c 例如现在很火的虚拟现实技术vr xff0c 虚拟现实技术用的领域很多 xff0c 就拿游戏行业来说 xff0c 玩家可以通过vr眼镜 vr手柄等体验vr游戏 xff
  • Ubuntu18.04安装Qt5.14.2

    1 去官网 xff08 https download qt io archive qt xff09 下载对应的 run版本 这里是5 14 2 2 进入下载后的路径 xff0c 先赋予权限 xff0c 再安装 span class toke
  • Python归并排序

    归并排序 数据科学家每天都在处理算法 然而 xff0c 数据科学学科作为一个整体已经发展成为一个不涉及复杂算法实现的角色 尽管如此 xff0c 从业者仍然可以从建立对算法的理解和知识库中受益 在本文中 xff0c 对排序算法归并排序进行了介
  • Android ADB 源码分析总结

    Android之ADB总结 本文内容如下 xff1a 1 makefile分析及总结 2 adb框架介绍 3 adbd源码分析 3 1 adbd初始化流程分析 3 2 adb shell流程分析 3 3 adb root流程分析 4 adb