扭起屁股得意洋洋

最近,我负责的项目因为临近量产,把之前的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上面,链接如下

Android ADB源码​github.com

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,分别是adbadbdadb 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 offfprintf(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;}std::string query = android::base::StringPrintf("host:%s%s", argv[0], listopt);
-        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) {}property_set("service.adb.root", "1");
-        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_HOSTchar 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编译请看链接

嵌入式Linux:Android7.1 howto_build_SDK​zhuanlan.zhihu.com

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=1setprop service.adb.tcp.port 5555restart adbd# for Internet adb
on property:persist.internet.adb.enable=0setprop service.adb.tcp.port 0restart adbd# for telephony function
on property:ro.boot.noril=truesetprop ro.radio.noril truestop ril-daemon

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

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

Android Adb 源码分析相关推荐

  1. Android ADB 源码分析(三)

    前言 之前分析的两篇文章 Android Adb 源码分析(一) 嵌入式Linux:Android root破解原理(二) 写完之后,都没有写到相关的实现代码,这篇文章写下ADB的通信流程的一些细节 ...

  2. android adb源码分析(1)

    ADB是Android debug bridge的缩写,它使用PC机可以通过USB或网络与android设备通讯. adb的源码位于system/core/adb目录下,先来看下编译脚本Android ...

  3. Android HandlerThread 源码分析

    HandlerThread 简介: 我们知道Thread线程是一次性消费品,当Thread线程执行完一个耗时的任务之后,线程就会被自动销毁了.如果此时我们又有一 个耗时任务需要执行,我们不得不重新创建 ...

  4. 【Android SDM660源码分析】- 02 - UEFI XBL QcomChargerApp充电流程代码分析

    [Android SDM660源码分析]- 02 - UEFI XBL QcomChargerApp充电流程代码分析 一.加载 UEFI 默认应用程序 1.1 LaunchDefaultBDSApps ...

  5. 【Android SDM660源码分析】- 03 - UEFI XBL GraphicsOutput BMP图片显示流程

    [Android SDM660源码分析]- 03 - UEFI XBL GraphicsOutput BMP图片显示流程 1. GraphicsOutput.h 2. 显示驱动初化 DisplayDx ...

  6. 【Android SDM660源码分析】- 01 - 如何创建 UEFI XBL Protocol DXE_DRIVER 驱动及UEFI_APPLICATION 应用程序

    [Android SDM660源码分析]- 01 - 如何创建 UEFI XBL Protocol DXE_DRIVER 驱动及UEFI_APPLICATION 应用程序 一.创建DXE_DRIVER ...

  7. 【Android SDM660源码分析】- 04 - UEFI ABL LinuxLoader 代码分析

    [Android SDM660源码分析]- 04 - UEFI ABL LinuxLoader 代码分析 1. LinuxLoader.c 系列文章: <[Android SDM660开机流程] ...

  8. Android 音频源码分析——AndroidRecord录音(一)

    Android 音频源码分析--AndroidRecord录音(一) Android 音频源码分析--AndroidRecord录音(二) Android 音频源码分析--AndroidRecord音 ...

  9. Android框架源码分析——从设计模式角度看 Retrofit 核心源码

    Android框架源码分析--从设计模式角度看 Retrofit 核心源码 Retrofit中用到了许多常见的设计模式:代理模式.外观模式.构建者模式等.我们将从这三种设计模式入手,分析 Retrof ...

最新文章

  1. 越过网络层看威胁:为什么全攻击界面才是最重要的
  2. python编程定义圆_Python语言编程系列014——PyQt中自定义圆形指示灯
  3. 50种优化数据库的方法
  4. 什么是iu组装服务器,超频三全新款 IU服务器散热器全新登场
  5. TensorFlow(六)with语句
  6. Nginx 极简入门教程
  7. 钱大妈关闭所有北京门店:低估了北京市场的难度
  8. 详解Java动态代理机制
  9. 华为ac控制器web配置手册_AC+AP组建无线网络,解决路由器没地方放,不美观
  10. dell m610刀片查看日志及更换内存
  11. 数据库查询的table结果转成对应实体类
  12. [转]MFC中ON_COMMAND, ON_MESSAGE, ON_NOTIFY它们的区别
  13. redis smembersmap_Redis五种数据类型
  14. 计算机中心机房设计规范,GB50174-2017 数据中心机房设计规范
  15. turtle绘制八卦镜
  16. 清卡时提示“增值税未申报或未比对”
  17. 如何出一幅具有三维立体显示的地形示意图
  18. 机器学习笔记之狄利克雷过程(五)——基于狄利克雷过程的预测任务
  19. 关于财务业务模型的思考
  20. ​创新不是公司的救命良药

热门文章

  1. linux文件的时间格式
  2. 同步本地远程分支 git remote prune origin
  3. treelistview 所有节点失去焦点_垃圾询盘过滤,焦点科技的 Milvus 实践
  4. Flask学习记录之Flask-SQLAlchemy
  5. 申请评分卡(A卡)的开发过程(1)
  6. 如何防止头文件被重复包含或引用?
  7. mysql和web文件夹_Linux使用记录---自动备份MySQL和web文件夹到windows共享路径
  8. 驱动开发中常用的操作和小知识
  9. 五分钟读懂UML类图
  10. springboot启动太慢优化