Android Adb 源码分析(一)

扭起屁股得意洋洋

最近,我负责的项目因为临近量产,把之前的userdebug版本关闭,转成了user版本,增加selinux的权限,大家都洋溢在项目准备量产的兴奋和喜悦之中不能自拔

谁知,好景不长,user版本发布之后,各种bug接踵而来,但是因为user版本权限的原因,我们之前保留在/data/logs/下面的日志不能pull出来,定位问题非常困难


不得不想到的解决方案

第一个办法:我们想到的第一个办法就是更改data目录的权限,改成system用户,但是因为data下面的logs目录的文件是root权限,获取日志是需要root权限的,日志还是不能pullg出来。

第二个办法:我想到的第二个办法就是给我们的adb命令增加一个后门,正常我们是adb root获取root权限,我修改成adb aaa.bbb.ccc.root 这样不容易被别人窃取我们的后门,也不至于影响到我们的开发。

梳理Android ADB知识点

所以就加强了adb 的相关知识

google的adb 代码位置在(system/core/adb)目录下面

我上传了一份在github上面,链接如下

ADB是Android系统提供的调试工具,整个ADB工具由三部分组成:adb client、adb service、adb daemon。

1、ADB client

提供HOST端运行的命令

2、ADB service

HOST端上的一个后台进程

3、ADB daemom

DEVICE端(真实的机器或者模拟器)的守护进程

这三部分都是从(system/core/adb)里面编译出来的,我们很多时候去网上下载adb.exe来用,实际上我们的SDK代码下面就有adb,而且代码是可以修改的。

ADB代码位于/system/core/adb目录下,通过查看Android.mk,可以知道,该目录下的代码生成了两个MODULE,分别是adbadbd, adb client和adb service都是由adb这个可执行文件实现adb daemon由adbd实现。adb和adbd的一些源代码文件是用同一个的,编译时通过LOCAL_CFLAGS的参数ADB_HOST来区分,这种你中有我我中有你的关系,对于初次接触的朋友们,多少增加了些困扰。理清了ADB几部分的关系,以及源代码的结构,对ADB的认识已经有一个飞越了。


使用方案2来解决问题

代码修改如下

diff --git a/adb/commandline.cpp b/adb/commandline.cpp
old mode 100644
new mode 100755
index 51d828a..32b2c09
--- a/adb/commandline.cpp
+++ b/adb/commandline.cpp
@@ -83,6 +83,7 @@ static void help() {
     fprintf(stderr, "%s\n", adb_version().c_str());
     // clang-format off
     fprintf(stderr,
+    	"ADB use for weiqifa nan Product\n"
         " -a                            - directs adb to listen on all interfaces for a connection\n"
         " -d                            - directs command to the only connected USB device\n"
         "                                 returns an error if more than one USB device is present.\n"
@@ -1083,6 +1084,7 @@ static bool adb_root(const char* command) {
     std::string error;
     ScopedFd fd;

+ fprintf(stderr, “weiqifa adb root \n);
fd.Reset(adb_connect(android::base::StringPrintf("%s:", command), &error));
if (!fd.valid()) {
fprintf(stderr, “adb: unable to connect for %s: %s\n, command, error.c_str());
@@ -1625,12 +1627,12 @@ int adb_commandline(int argc, const char **argv) {
} else if (argc == 2 && !strcmp(argv[1], “-l”)) {
listopt = argv[1];
} else {
- fprintf(stderr, “Usage: adb devices [-l]\n);
+ fprintf(stderr, “weiqifa Usage: adb devices [-l]\n);
return 1;
}

     <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">query</span> <span class="o">=</span> <span class="n">android</span><span class="o">::</span><span class="n">base</span><span class="o">::</span><span class="n">StringPrintf</span><span class="p">(</span><span class="s">"host:%s%s"</span><span class="p">,</span> <span class="n">argv</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">listopt</span><span class="p">);</span>

- printf(“List of devices attached\n);
+ printf(“weiqifa List of devices attached\n);
return adb_query_command(query);
}
else if (!strcmp(argv[0], “connect”)) {
@@ -1732,7 +1734,7 @@ int adb_commandline(int argc, const char **argv) {
command = android::base::StringPrintf("%s:", argv[0]);
}
return adb_connect_command(command);
- } else if (!strcmp(argv[0], “root”) || !strcmp(argv[0], “unroot”)) {
+ } else if (!strcmp(argv[0], “weiqifa.nan.root”) || !strcmp(argv[0], “unroot”)) {
return adb_root(argv[0]) ? 0 : 1;
} else if (!strcmp(argv[0], “bugreport”)) {
Bugreport bugreport;
diff git a/adb/services.cpp b/adb/services.cpp
old mode 100644
new mode 100755
index 3b212e9..5a82246
a/adb/services.cpp
+++ b/adb/services.cpp
@@ -69,7 +69,7 @@ static void service_bootstrap_func(void* x) {

void restart_root_service(int fd, void cookie) {
if (getuid() == 0) {
- WriteFdExactly(fd, “adbd is already running as root\n);
+ WriteFdExactly(fd, “weiqifa.nan adbd is already running as root\n);
adb_close(fd);
} else {
char value[PROPERTY_VALUE_MAX];
@@ -81,7 +81,7 @@ void restart_root_service(int fd, void cookie) {
}

     <span class="n">property_set</span><span class="p">(</span><span class="s">"service.adb.root"</span><span class="p">,</span> <span class="s">"1"</span><span class="p">);</span>

- WriteFdExactly(fd, “restarting adbd as root\n);
+ WriteFdExactly(fd, “weiqifa.nan restarting adbd as root\n);
adb_close(fd);
}
}
@@ -327,7 +327,8 @@ int service_to_fd(const char name, const atransport transport) {
void arg = strdup(name + 7);
if (arg == NULL) return -1;
ret = create_service_thread(reboot_service, arg);
- } else if(!strncmp(name, “root:”, 5)) {
+ } else if(!strncmp(name, “weiqifa.nan.root:”, 17)) {
+ fprintf(stderr, “services adb root”);
ret = create_service_thread(restart_root_service, NULL);
} else if(!strncmp(name, “unroot:”, 7)) {
ret = create_service_thread(restart_unroot_service, NULL);
diff git a/adb/sockets.cpp b/adb/sockets.cpp
index 63b7df6..1cb0b5e 100644
a/adb/sockets.cpp
+++ b/adb/sockets.cpp
@@ -418,11 +418,11 @@ asocket create_local_service_socket(const char name, const atransport transpo

#if !ADB_HOST
char debug[PROPERTY_VALUE_MAX];
- if (!strncmp(name, “root:”, 5)) {
+ if (!strncmp(name, “weiqifa.nan.root:”, 17)) {
property_get(“ro.debuggable”, debug, “”);
}

- if ((!strncmp(name, “root:”, 5) && getuid() != 0 && strcmp(debug, “1”) 0) ||
+ if ((!strncmp(name, “weiqifa.nan.root:”, 17) && getuid() != 0 && strcmp(debug, “1”) 0) ||
(!strncmp(name, “unroot:”, 7) && getuid() == 0) ||
!strncmp(name, “usb:”, 4) ||
!strncmp(name, “tcpip:”, 6)) {


编译

Android sdk编译请看链接


1、一个是编译生成adb.exe,这个拷贝到windows下面使用

Android 7.1使用 编译指令使用" make host_cross_adb -j40 "

Android 7.0 之前使用 make USE_MINGW=y adb

但是之前要先

source build/envsetup.sh

lunch

建立Android 编译环境


2、编译adbd 服务,这个是烧录到机器里面去,直接编译整个固件就好了

source build/envsetup.sh; lunch rk3399_mid-userdebug; make -j128

adbd 在init.rc里面初始化,具体代码在devices/rockchip/下面找


# for Internet adb
on property:persist.internet.adb.enable=1
setprop service.adb.tcp.port 5555
restart adbd

# for Internet adb
on property:persist.internet.adb.enable=0
setprop service.adb.tcp.port 0
restart adbd

# for telephony function
on property:ro.boot.noril=true
setprop ro.radio.noril true
stop ril-daemon


这一章先大概说下代码,只有写下root的原理~~


如果觉得不错,帮忙关注微信公众号,嵌入式Linux

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答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的工作原理和实现细节,并进行二次开发和定制。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值