adb命令 简单总结

1、向android设备获取或存储文件(执行命令之前不需要adb shell)
adb pull:拉出来,即拷贝文件出来
eg:adb pull /mnt/sdcard/test.apk D:\
adb pull /mnt/sdcard/test.apk D:\a.apk

adb push:推进去,即拷贝文件进去

eg:adb push D:\a.apk /mnt/sdcard/
  adb push D:\a.apk /mnt/sdcard/b.apk
  
2、卸载和安装apk(执行命令之前需要先执行adb shell,因为命令需要shell来解析)
adb uninstall [-k] <pkg>   -k参数:keep the data and cache directories.即保存数据

eg:adb uninstall com.demo.pkg

pm uninstall [-k] <pkg>

adb install <path>

eg:adb install /mnt/sdcard/b.apk

注意:安装之前需要先卸载,不然install不会成功。

3、清除apk数据(执行命令之前需要先执行adb shell,因为命令需要shell来解析)
pm clear <pkg>
eg:pm clear com.demo.pkg

4、截屏(执行命令之前需要先执行adb shell,因为命令需要shell来解析)
screencap <path> 将截图保存至path目录下(设备的目录)
screencap /mnt/sdcard/img.png

5、通过包名和类名打开apk(执行命令之前需要先执行adb shell,因为命令需要shell来解析)
am start -a android.intent.action.MAIN -n pkgName/ActName ActName可以是决定包名也可以是相对于pkgName的相对包名
eg:am start -a android.intent.action.MAIN -n com.android.settings/.Settings
or:am start -a android.intent.action.MAIN -n com.android.settings/com.android.settings.Settings

6、网络adb
连接目标设备:adb connect IP:Port
eg:adb connect 192.168.196.39:5555
连接成功后,操作就跟设备通过usb接口连接电脑一样的操作

7、查看当前连接了多少个设备
adb devices

8、选择某个设备作为目标设备,如果当前连接了多个设备的情况下,单独执行命令的话,会出现more than one device and emulator的问题,
这个时候就要用-s参数选择一个设备作为目标设备.
adb -s [deviceName] 命令
eg:adb -s emulator-5554 uninstall com.demo.pkg

9、查看log打印
9.1 打印当前所有的log,没有过滤器
adb logcat 
9.2 通过TAG来过滤获取log
通过管道用grep过滤,指定正则表达式
adb logcat | grep "[-e] TAG" 
eg:adb logcat | grep "-e MainActivity"

<think> 我们之前讨论了使用Frida工具来监控函数调用,但现在用户明确要求使用ADB命令来实现。ADB本身并不直接提供监控函数调用的功能,但我们可以通过ADB结合其他工具或方法间接实现。以下将分为几种可行方案: ### 方案1:通过ADB logcat查看日志输出(最常用) **原理**:在目标函数中添加日志语句(如`Log.d()`),然后通过`adb logcat`过滤日志输出,从而确认函数是否被调用。 #### 操作步骤: 1. **修改源代码添加日志**: 在需要监控的函数内部添加日志输出(以Java为例): ```java import android.util.Log; // 确保导入Log类 public void targetFunction() { Log.d("MY_TAG", "targetFunction被调用"); // 添加日志标记 // ... 函数原有逻辑 } ``` 如果是系统函数或无法修改源码的情况,此方法不适用。 2. **编译并安装修改后的APK**: 重新编译APK并安装到设备(debug版本通常保留日志,release版本需配置build.gradle保留调试信息)。 3. **使用ADB logcat捕获日志**: ```bash adb logcat | grep "MY_TAG" ``` - Windows系统(无grep)可使用: ```bash adb logcat | findstr "MY_TAG" ``` - 更精确的过滤(按TAG和级别): ```bash adb logcat MY_TAG:D *:S # 仅显示TAG为MY_TAG且级别为DEBUG以上的日志 ``` #### 优点与局限: - **优点**:简单直接,无需额外工具。 - **局限**:需修改源码并重新安装APK,不适合第三方应用或系统函数。 --- ### 方案2:通过ADB+GDB调试(适用底层/C++函数) **原理**:使用GDB调试器附加到进程,在函数入口设置断点,触发时暂停执行并打印信息(需调试符号)。引用[2]提到Android源码编译时默认带调试信息,但最终会被strip,需使用未strip的二进制文件[^2]。 #### 操作步骤: 1. **准备带调试符号的可执行文件**: - 从Android源码`out`目录获取未strip的二进制文件(引用[2])[^2]。 - 推送到设备: ```bash adb push unstripped_binary /data/local/tmp/ ``` 2. **启动GDB服务器**: - 在设备上启动`gdbserver`(需预装): ```bash adb shell gdbserver :5039 --attach <PID> # 附加到目标进程 ``` 3. **本地连接GDB**: - 端口转发: ```bash adb forward tcp:5039 tcp:5039 ``` - 本地启动GDB并加载符号: ```bash gdb -ex "target remote :5039" -ex "file unstripped_binary" ``` 4. **设置断点并监控**: ```gdb (gdb) break target_function # 设置断点 (gdb) continue # 继续执行 ``` 当函数被调用时,进程会暂停,此时可查看堆栈、寄存器等。 #### 优点与局限: - **优点**:可调试底层(Native)代码。 - **局限**:操作复杂,需调试符号,影响进程执行。 --- ### 方案3:通过ADB+Strace监控系统调用(适用Linux层函数) **原理**:使用`strace`跟踪进程的系统调用(syscall),间接推断函数行为(如文件读写、网络操作)。 #### 操作步骤: 1. **获取目标进程PID**: ```bash adb shell ps -A | grep <应用包名> ``` 2. **附加Strace监控**: ```bash adb shell strace -p <PID> -f -s 1024 -o /sdcard/strace.log ``` - `-f`:跟踪子进程 - `-s 1024`:输出字符串长度限制 - `-o`:输出到文件 3. **触发功能并分析日志**: - 拉取日志到本地: ```bash adb pull /sdcard/strace.log ``` - 搜索相关系统调用(如`openat`、`read`)。 #### 优点与局限: - **优点**:无需修改目标程序。 - **局限**:仅能监控系统调用,无法直接捕获Java函数。 --- ### 总结对比 | 方案 | 适用场景 | 操作复杂度 | 是否需要源码 | |---------------|----------------------------|------------|--------------| | **ADB logcat** | 监控Java/Kotlin函数调用 | ★☆☆☆☆ | 需要修改源码 | | **ADB+GDB** | 监控Native层(C/C++)函数调用 | ★★★★☆ | 需要调试符号 | | **ADB+Strace** | 监控系统调用相关逻辑 | ★★★☆☆ | 不需要 | > ⚠️ 注意:后两种方案通常需要**Root权限**。 ### 相关问题 §§相关问题§§ 1. 如何在不修改源码的情况下监控第三方APK的Java方法调用? 2. Android设备获取Root权限有哪些安全风险? 3. 除了ADB命令,还有哪些工具可以动态分析Android应用行为? </think> ### 使用ADB命令监控Android函数调用的操作指南 我将为您提供三种基于ADB的实用方案,帮助您检测函数是否被调用和执行: #### 方案1:通过Logcat捕获函数日志(推荐) **原理**:在函数中添加日志代码,通过ADB实时捕获日志输出 **操作步骤**: 1. 在目标函数中添加日志标记(Java示例): ```java public void targetFunction() { Log.d("FUNC_TRACE", "targetFunction被调用"); // 添加调用标记 // 函数逻辑... Log.d("FUNC_TRACE", "targetFunction执行完成"); // 添加完成标记 } ``` 2. 使用ADB监控日志: ```bash # 连接设备 adb devices # 监控日志(按TAG过滤) adb logcat -v time | grep "FUNC_TRACE" ``` 3. 触发目标功能时,终端将显示: ``` 07-01 10:23:45.521 D/FUNC_TRACE: targetFunction被调用 07-01 10:23:46.128 D/FUNC_TRACE: targetFunction执行完成 ``` **优点**:无需root权限,精准定位函数执行状态[^1] --- #### 方案2:使用GDB调试Native函数(需root) **原理**:通过ADB+GDB在函数入口设置断点 **操作步骤**: 1. 准备调试环境: ```bash # 推送GDB server到设备 adb push gdbserver /data/local/tmp adb shell chmod +x /data/local/tmp/gdbserver # 查找目标进程PID adb shell ps -A | grep <应用包名> ``` 2. 附加到进程并设置断点: ```bash # 设备端启动gdbserver adb shell /data/local/tmp/gdbserver :5039 --attach <PID> # 本地端口转发 adb forward tcp:5039 tcp:5039 # 本地GDB连接 gdb -ex "target remote :5039" -ex "break target_function" -ex "continue" ``` 3. 当函数被调用时,GDB将暂停执行并显示: ``` Breakpoint 1 at 0x7f8a3d04: file native-lib.cpp, line 42. ``` **注意**:需使用带调试符号的二进制文件(参考引用[2])[^2] --- #### 方案3:通过进程跟踪监控(适用于系统函数) **原理**:使用strace追踪系统调用 **操作步骤**: ```bash # 查找目标进程PID adb shell ps -A | grep system_server # 跟踪特定系统服务 adb shell strace -p <PID> -e trace=openat,read,write # 示例输出(函数调用时): [pid 1537] openat(AT_FDCWD, "/sys/power/state", O_RDWR) = 23 [pid 1537] write(23, "mem", 3) = 3 # power_suspend_state_store()被调用 ``` **适用场景**:监控电源管理、传感器等系统级函数[^3] --- ### 方案对比表 | 方案 | 适用层级 | 需要root | 精度 | 实施难度 | |--------------|---------------|----------|----------|----------| | Logcat监控 | Java/Kotlin | 否 | ★★★★☆ | ★☆☆☆☆ | | GDB调试 | Native(C/C++) | 是 | ★★★★★ | ★★★★☆ | | Strace追踪 | 系统服务 | 是 | ★★★☆☆ | ★★★☆☆ | > ⚠️ 关键提示:对于release版本应用,需在build.gradle中启用调试信息: > ```gradle > android { > buildTypes { > debug { > debuggable true > jniDebuggable true // 启用Native调试 > } > } > } > ``` ### 相关问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值