adb常见异常处理

adb devices 没有显示连接设备

当你在命令行中运行 adb devices 而没有看到任何已连接的设备时,可能是由于多种原因造成的。这里有一些排查步骤可以帮助你解决这个问题:

  1. 检查USB连接:

    • 确保你的Android设备已经正确地连接到了电脑上。
    • 尝试更换USB线缆或电脑上的USB端口。
    • 确保设备处于解锁状态,并且没有进入恢复模式或者飞行模式等特殊状态。
  2. 启用开发者选项:

    • 在你的Android设备上,前往“设置” > “关于手机” > “软件信息”,找到“版本号”或“内部版本号”,连续点击7次以启用“开发者选项”。
    • 返回“设置”菜单,找到“开发者选项”并打开它。
  3. 启用USB调试:

    • 在“开发者选项”中找到“USB调试”选项,并勾选以启用它。
  4. 确认ADB是否安装正确:

    • 确认你的电脑上是否已经安装了最新版本的ADB工具。
    • 如果你使用的是Android SDK Platform-Tools包中的ADB,确保环境变量设置正确,即PATH变量包含了ADB所在的文件夹路径。
  5. 重启ADB服务:

    • 在命令行中输入 adb kill-server 来关闭ADB服务,然后输入 adb start-server 重新启动服务。
  6. 检查USB驱动程序:

    • 确保你的电脑上已经安装了针对你设备型号的USB驱动程序。
    • 对于Windows系统,可以在设备管理器中查看USB设备是否有黄色感叹号等错误标志。
    • 对于Linux系统,可能需要在/etc/udev/rules.d/51-android.rules文件中添加适当的规则,以便正确识别设备。
  7. 检查ADB权限:

    • 如果你在Linux或macOS上运行ADB,可能需要使用sudo或者将ADB加入到系统的sudoers列表中。
    • 在某些Linux发行版中,你可能还需要将用户添加到plugdev组以获得USB访问权限。
  8. 查看ADB输出:

    • 运行 adb logcatadb logcat -v time 可以帮助你获取更多关于ADB的诊断信息。
  9. 尝试使用不同的设备:

    • 如果可能的话,尝试连接另一个Android设备看看是否能够被识别。
  10. 检查Android设备设置:

    • 在设备的“开发者选项”中,检查是否启用了“USB调试”选项。
    • 确认设备是否允许电脑通过USB进行调试。
  11. 安全权限问题
    有的公司出于安全考虑,由于adb可以推送文件到手机,adb被视为敏感权限,需要走审批流程,审批完之后再检查看看。

adb.exe: device unauthorized

当你遇到 “device unauthorized” 的错误时,这意味着你的设备拒绝了来自电脑的连接请求。这通常是由于设备的安全设置,特别是当设备从未与电脑配对过或者设备的安全设置比较严格时会发生这种情况。

要解决这个问题,你可以尝试以下步骤:

  1. 重新启动设备:有时候简单地重启设备就可以解决问题。

  2. 检查 USB 调试设置

    • 在设备上打开“设置”应用。
    • 寻找“关于手机”或“关于设备”选项。
    • 找到“版本号”或“构建号”,连续点击 7 次以启用“开发者选项”。
    • 返回到主设置菜单,寻找“开发者选项”。
    • 在“开发者选项”中找到并启用“USB 调试”。
  3. 重新授权电脑

    • 断开设备与电脑的连接。
    • 再次连接设备。
    • 当设备提示是否允许 USB 调试时,选择“允许”。
  4. 检查 USB 驱动

    • 确保安装了正确的 USB 驱动。如果你使用的是 Windows,可以在设备管理器中查看是否有未知设备或带有黄色感叹号的设备。
    • 你可以从设备制造商的官方网站下载最新的 USB 驱动。
  5. 使用不同的 USB 线或端口

    • 尝试更换 USB 数据线或使用电脑的不同 USB 端口。
  6. 禁用安全软件

    • 有时安全软件可能会阻止设备与电脑的连接。暂时禁用安全软件看是否能够解决问题。
  7. 检查 ADB 版本

    • 确保你使用的 ADB 工具是最新的版本。你可以从 Android 开发者网站下载最新版本的 ADB。
  8. 重置 ADB 键

    • 在命令提示符或终端中运行以下命令来重置 ADB 键:
      adb kill-server
      adb start-server
      
    • 这将关闭并重新启动 ADB 服务。
  9. 使用 fastboot 模式

    • 如果以上方法都无法解决问题,你可以尝试进入 fastboot 模式,然后再次尝试连接。
      • 关闭设备。
      • 连接设备到电脑。
      • 按住电源键和音量减小键进入 fastboot 模式。
      • 在命令提示符或终端中运行 fastboot devices 确认设备是否被识别。
      • 一旦确认设备被识别,可以尝试退出 fastboot 模式,再次尝试连接。

adb shell dumpsys activity | findstr "mFocusedActivity"获取不到手机运行APP上的activity但是可以获取模拟器上运行的相同APP的activity

当你能够在模拟器上成功获取 Activity 信息,但在实际手机设备上却不能获取时,这可能是由几个原因造成的:

  1. 设备权限问题

    • 实际设备可能没有完全授权你的电脑进行调试。请确保 USB 调试已启用,并且你已经接受过授权对话框。
    • 某些设备可能对系统服务的访问有限制,即使 USB 调试已启用也可能无法访问所有系统服务。
  2. 安全设置差异

    • 模拟器通常默认允许更多访问权限,而实际设备可能有更严格的限制。
    • 有些设备可能有额外的安全层,例如 SELinux,它可能会限制 dumpsys 命令的输出。
  3. 设备驱动问题

    • 确保你已经为实际设备安装了正确的 USB 驱动。
  4. ADB 版本差异

    • 模拟器和实际设备可能使用的 ADB 版本不同,某些版本可能有兼容性问题。
  5. OEM 自定义

    • 不同厂商的设备可能对系统进行了定制,这可能影响 dumpsys 命令的行为。
  6. 系统服务差异

    • 模拟器和实际设备上的系统服务可能有所不同,导致某些命令的结果不一致。

解决方案

  1. 确认授权

    • 确保 USB 调试已在实际设备上启用。
    • 断开并重新连接设备,确认是否出现了授权对话框,并接受授权。
  2. 检查 SELinux 状态

    • 运行 adb shell getenforce 查看 SELinux 的状态。如果它处于 “Enforcing” 状态,某些系统服务可能受限。
    • 如果 SELinux 限制了访问,你可能需要查找相关的 SELinux 策略文件并调整策略以允许访问。
  3. 检查 ADB 版本

    • 确保你使用的 ADB 版本与设备兼容。你可以通过 adb version 命令查看 ADB 版本。
  4. 更新驱动

    • 确保你安装了正确的 USB 驱动。你可以从设备制造商的官方网站下载最新的 USB 驱动。
  5. 使用不同的命令

    • 试试使用 adb shell dumpsys activity top 命令来获取当前 Activity 的信息。这通常会提供更简洁的输出,更容易解析。
  6. 查看日志

    • 使用 adb logcat 命令查看日志,看看是否有与 dumpsys 命令相关的问题或错误信息。

示例命令

使用 adb shell dumpsys activity top 来获取当前 Activity 的信息:

adb shell dumpsys activity top

提取当前 Activity 的名称:

@echo off
setlocal enabledelayedexpansion

for /f "tokens=2 delims=:" %%a in ('adb shell dumpsys activity top') do (
    set "activity_name=%%a"
    set "activity_name=!activity_name:~2!"
    echo Current Activity: !activity_name!
)

endlocal

7.使用 adb shell dumpsys window windows | findstr mCurrentFocus 命令获取当前聚焦的窗口信息。这个命令通常可以用来获取当前最前端 Activity 的信息。

示例命令

你可以使用以下命令来获取当前聚焦的 Activity:

adb shell dumpsys window windows | findstr "mCurrentFocus"

解析输出

命令的输出通常会包含当前聚焦窗口的信息,格式类似于:

mCurrentFocus=Window{... com.example.app/.MainActivity}

这里的 com.example.app/.MainActivity 是当前 Activity 的完整名称,其中 com.example.app 是应用的包名,.MainActivity 是 Activity 的名称。

提取 Activity 名称

为了提取 Activity 的名称,你可以使用以下批处理脚本:

@echo off
setlocal enabledelayedexpansion

for /f "tokens=2 delims=:" %%a in ('adb shell dumpsys window windows') do (
    set "window_info=%%a"
    if "!window_info:~0,13!" == "mCurrentFocus=" (
        set "activity_name=!window_info:~14!"
        echo Current Activity: !activity_name!
    )
)

endlocal

这个脚本会查找 mCurrentFocus= 的行,并从中提取 Activity 的名称。

注意事项

  • 确保你的设备已经连接到电脑,并且开启了 USB 调试。
  • 如果你在运行命令时遇到权限问题,尝试使用 sudo 或者将脚本放在具有适当权限的目录下。
  • 如果你发现输出中有多个 Activity,这可能是因为应用正在后台运行,而另一个 Activity 正在前台运行。在这种情况下,你需要检查输出中的 mCurrentFocus 一行。

这个命令应该可以在未 root 的设备上工作,因为它不需要特殊权限来获取当前 Activity 的信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知识的宝藏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值