adb logcat通过包名过滤(dos命令find后跟变量)

ADB日志过滤实践
本文介绍了一种利用ADB命令过滤特定应用程序日志的方法。通过获取应用程序的PID并使用find命令来筛选日志,实现了对指定APP日志的有效过滤。文中提供了具体的bat文件示例和步骤说明。

 adb命令中似乎没有直接通过报名来过滤的功能,但是可以通过过滤进程的pid来过滤该应用的日志

过滤条件:该app在运行

实现原理:

1、获取该app运行时的pid

2、通过find命令,过滤pid的日志,就是该包的运行日志

实现:

1、在同一目录建立一文件:getpid.bat

@echo off
adb shell "ps | grep com.example.testprogram"
复制以上代码,保存

2、在同一目录建立另外一个问文件:getpid1.bat

@echo off
for /f  "tokens=2 delims= " %%i in ('getpid.bat') do set pid=%%i
echo %pid%
adb logcat | find  "%pid%"
pause

复制以上代码,并保存

链接手机,启动com.example.testprogram这个app

双击getpid1.bat即可获取该程序的日志:

D/dalvikvm( 9017): Late-enabling CheckJNI
I/ActivityManager( 2272): Start proc com.example.testprogram for activity com.example.testprogram/.MainActivity: pid=9017 uid=10070 gids={50070, 1028}
D/libEGL  ( 9017): loaded /system/lib/egl/libEGL_mali.so
D/libEGL  ( 9017): loaded /system/lib/egl/libGLESv1_CM_mali.so
D/libEGL  ( 9017): loaded /system/lib/egl/libGLESv2_mali.so
E/        ( 9017): Device driver API match
E/        ( 9017): Device driver API version: 17
E/        ( 9017): User space API version: 17 
E/        ( 9017): mali: REVISION=Linux-r3p1-01rel1 BUILD_DATE=Tue Jul  2 15:06:24 KST 2013 
D/OpenGLRenderer( 9017): Enabling debug mode 0
D/tag     ( 9017): it's a log !
D/AndroidRuntime( 9017): Shutting down VM
W/dalvikvm( 9017): threadid=1: thread exiting with uncaught exception (group=0x418dc700)
E/AndroidRuntime( 9017): FATAL EXCEPTION: main
E/AndroidRuntime( 9017): java.lang.ArithmeticException: divide by zero
E/AndroidRuntime( 9017): 	at com.example.testprogram.MainActivity$2.onClick(MainActivity.java:33)
E/AndroidRuntime( 9017): 	at android.view.View.performClick(View.java:4247)
E/AndroidRuntime( 9017): 	at android.view.View$PerformClick.run(View.java:17728)
E/AndroidRuntime( 9017): 	at android.os.Handler.handleCallback(Handler.java:730)
E/AndroidRuntime( 9017): 	at android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime( 9017): 	at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime( 9017): 	at android.app.ActivityThread.main(ActivityThread.java:5289)
E/AndroidRuntime( 9017): 	at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 9017): 	at java.lang.reflect.Method.invoke(Method.java:525)
E/AndroidRuntime( 9017): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
E/AndroidRuntime( 9017): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555)
E/AndroidRuntime( 9017): 	at dalvik.system.NativeStart.main(Native Method)
I/Process ( 9017): Sending signal. PID: 9017 SIG: 9
I/ActivityManager( 2272): Process com.example.testprogram (pid 9017) has died.
W/InputMethodManagerService( 2272): Got RemoteException sending setActive(false) notification to pid 9017 uid 10070


<think>首先,用户的问题是:“我想在使用adb logcat时,希望通过包名过滤特定apk的日志输出 请问adb logcat filter by package name”。这是一个关于Android开发中adb logcat命令的使用问题。 根据系统级指令: - 所有行内数学表达式必须使用$...$格式,但在这个上下文中,可能没有数学表达式,所以我不需要添加。 - 独立公式必须使用$$...$$格式并单独成段,同样,这里可能不需要。 - LaTeX语法正确:确保如果使用数学表达式,语法正确。 - 使用中文回答:整个回答必须用中文。 - 生成相关问题:在回答结束后,添加“相关问题”部分。 - 回答中引用的段落末尾自然地添加引用标识:例如[^1]。参考提供的引用,引用[1]、[2]、[3]是关于adb logcat的,包括过滤log的技巧。 用户提供的引用: - 引用[1]:ADB logcat 总结,提到使用grep过滤log,以及logcat本身的过滤功能。 - 引用[2]:adb logcat 最详细说明,展示使用grep过滤特定PID的log。 - 引用[3]:Android logcat PID packageName 筛选,提供一个Python脚本通过包名获取PID并过滤log。 用户的需求是:通过包名(package name)过滤特定APK的日志输出。adb logcat本身不直接支持通过包名过滤,但可以通过进程ID(PID)来间接实现,因为每个运行的应用都有一个唯一的PID。 标准方法是: 1. 获取应用的PID:使用adb shell ps | grep <package_name> 来找到该应用的PID。 2. 然后使用adb logcat --pid=<PID> 来过滤该PID的日志。 或者,结合grep命令adb logcat | grep <PID>。 引用[3]提供了一个Python脚本来自动化这个过程:通过包名获取所有相关PID,然后用grep过滤log。 在回答中,我需要: - 结构清晰,逐步解决问题。 - 保证回答真实可靠:基于Android官方文档和常见实践。 - 参考提供的引用:自然地融入引用。 回答结构: 1. **理解问题**:解释用户需求。 2. **核心方法**:adb logcat本身不支持直接包名过滤,但可以通过PID间接实现。 3. **步骤详解**: - 步骤1:获取应用的PID。 - 命令adb shell ps | grep <package_name> - 步骤2:使用PID过滤log。 - 命令adb logcat --pid=<PID> - 或使用grep:adb logcat | grep <PID> 4. **自动化脚本**:提到引用[3]的Python脚本,简化过程。 5. **其他方法**:参考引用[1],logcat有内置过滤功能,但基于tag和priority,而不是包名。DDMS图形界面可能更易用。 6. **完整示例**:给一个具体例子。 最后,添加相关问题。 生成相关问题: - 基于主题:adb logcat过滤、性能优化、常见问题等。 - 例如: 1. 如何过滤特定tag的日志? 2. adb logcat的其他过滤选项有哪些? 3. 如何保存logcat输出到文件? 4. 处理多个PID的情况? 确保回答用中文。 完整回答: - 开头:直接回答用户问题。 - 主体:分步骤解释。 - 结尾:相关问题。</think>### 通过包名过滤 adb logcat 日志的方法 在使用 adb logcat 时,系统本身不直接支持通过包名(package name)过滤特定 APK 的日志输出。但您可以通过间接方式实现:先获取应用的进程 ID(PID),然后基于 PID 过滤日志。以下是清晰、可靠的步骤指南,基于 Android 官方文档和常见实践(参考提供的引用内容)。 #### 步骤 1: 获取应用的 PID adb logcat过滤功能主要基于 PID 或 tag,而不是包名。因此,您需要先找到目标 APK 的进程 ID(PID)。 - **命令**:使用 `adb shell ps` 结合 `grep` 搜索包名。 示例:假设包名为 `com.example.app`,运行: ```bash adb shell ps | grep com.example.app ``` - **输出示例**: ``` u0_a123 4567 1234 com.example.app ``` 其中,`4567` 是 PID(第二列)。如果应用有多个进程,您可能获取多个 PID。 注意:如果 grep 不可用(某些设备),请使用 `adb shell ps | findstr com.example.app`(Windows)或确保设备已安装 grep 工具[^1]。 #### 步骤 2: 使用 PID 过滤日志 获取 PID 后,您可以通过以下方法过滤日志: - **方法 1: 使用 logcat 的 `--pid` 参数(推荐,高效)** 命令: ```bash adb logcat --pid=<PID> ``` 示例:如果 PID 是 `4567`,则运行: ```bash adb logcat --pid=4567 ``` 这将只输出该 PID 相关的日志,减少不必要的数据传输[^1]。 - **方法 2: 结合 grep 命令(灵活,但可能影响性能)** 如果设备或环境支持,直接通过管道过滤: ```bash adb logcat | grep <PID> ``` 示例: ```bash adb logcat | grep 4567 ``` 但注意:grep 会增加 CPU 开销,尤其在高日志量时可能延迟输出[^2]。 #### 步骤 3: 处理多个 PID 或自动化脚本 如果应用有多个进程(如后台服务),您需要捕获所有 PID 并组合过滤: - **手动组合 PID**: 使用正则表达式通过 grep 匹配多个 PID: ```bash adb logcat | grep -E "PID1|PID2|PID3" ``` - **自动化脚本(推荐)**: 参考引用[3]的 Python 脚本,自动获取包名对应的所有 PID 并过滤日志: 1. 保存以下脚本为 `filter_logcat.py`: ```python import os import sys package_name = sys.argv[1] # 从命令行获取包名 # 获取所有相关 PID command = f"adb shell ps | grep {package_name}" pids = [] with os.popen(command) as process: for line in process: if line.strip(): pid = line.split()[1] # 提取 PID pids.append(pid) if pids: pid_filter = "|".join(pids) # 组合 PID 为正则表达式 os.system(f'adb logcat | grep -E "{pid_filter}"') else: print(f"No PID found for package: {package_name}") ``` 2. 运行脚本: ```bash python filter_logcat.py com.example.app ``` 此脚本简化了过程,并支持多进程应用[^3]。 #### 注意事项 - **性能建议**:优先使用 `--pid` 参数,因为它由 adb 直接处理,效率高于 grep。对于高频率日志,避免管道过滤以防卡顿[^1][^2]。 - **备选方案**: - **logcat 内置过滤**:虽然 logcat 支持基于 tag 和优先级过滤(例如 `adb logcat MyTag:I *:S`),但无法直接按包名过滤。详情见 [Android 官方文档](https://developer.android.com/studio/command-line/logcat)[^1]。 - **图形工具**:使用 DDMS 或 Android Studio 的 Logcat 工具,它们提供包名过滤的 GUI 界面,更直观[^1]。 - **确保设备连接**:运行命令前,确认 adb 设备已连接(`adb devices`)。 通过以上步骤,您可以高效地通过包名过滤特定 APK 的日志。如果遇到问题,请检查包名是否正确或应用是否在运行。 ### 相关问题 1. 如何过滤 adb logcat 中的特定 tag(标签)日志? 2. adb logcat 有哪些内置过滤选项,如何优化日志输出性能? 3. 如何将 adb logcat 输出保存到文件以便后续分析? 4. 当应用有多个进程时,如何处理日志过滤以避免遗漏?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值