起始
身为Android开发,我想大家对在跟踪BUG、调试的时候有个很大的痛点:测试拿过来手机说,这个页面上有问题,你一看蒙了,这鬼知道是哪个页面,一想,adb命令来一发adb shell ...
步骤
时间长了,你会发现:
1. 打开Terminal
2. 输入adb shell dumpsys activity | grep mFoc
(PS: Android 8.0+版本的命令:adb shell dumpsys activity | grep mResumed
)
3. 拷贝结果
4. 打开Android studo
的搜索类
基本是这4个步骤,实际上痛点就在这一条长长的命令,而且不好记忆,不小心打错了还的仔细看看哪里写错了
分析
对于基本上固定的4个步骤,可以考虑使用脚本工具进行自动化获取并拷贝到剪切板,目前主流的脚本式工具语言python
在 Mac 、linux中都是标配,而Windows的安装也是超级简单;
下面的脚本文件主要是简化了输入的难度,使用草鸡简单,直接执行命令:python current_activity.py
,如果执行正常,当前页面的java类名直接赋值到了剪切板,可以直接粘贴使用;
使用
python current_activity.py
源码
# coding:utf-8
# !/usr/bin/python
__author__ = "Egan"
"""
本脚本是通过 adb 获取当前的 Activity
"""
import commands
import subprocess
# 将数据copy到剪切板
def set_clipboard_data(data):
p = subprocess.Popen(['pbcopy'], stdin=subprocess.PIPE)
p.stdin.write(data)
p.stdin.close()
p.communicate()
print('当前页面的名字已复制到剪切板')
# 获取连接的 device
def get_device():
devices = commands.getstatusoutput("adb devices")
device_list = []
if devices[0] == 0:
res = devices[1].split("\n")
# 执行成功
# if i in devices[1].split("\n"):
for i in res:
# print(i)
if i.endswith("\tdevice"):
device_list.append(i.split("\t")[0])
return device_list
# 展示可选择的 device
def show_device(all_device):
if len(all_devices) <= 1:
return
else:
for i in range(0, len(all_device)):
print("序号:" + str(i) + "\t>>>\t" + all_device[i])
# 获取选择的 device
def get_select_device(all_device):
if len(all_devices) <= 1:
return all_devices[0]
while 1:
input_str = raw_input("请输入你需要操作的 device 的序号 >>> ")
try:
input_index = int(input_str)
if len(all_device) > input_index >= 0:
break
else:
raise ValueError
except ValueError:
print "请输入有效的序号"
return all_device[input_index]
if __name__ == "__main__":
all_devices = get_device()
show_device(all_devices)
device = get_select_device(all_devices)
# print(device)
# 执行 adb 获取当前连接的虚拟机或者真机的 可见的页面.
result = commands.getstatusoutput("adb -s " + device + " shell dumpsys activity | grep 'mFocusedActivity'")
# print(result)
if result[0] != 0:
print("手机 Android 版本是 8.0 + ")
result = commands.getstatusoutput("adb -s " + device + " shell dumpsys activity | grep 'mResumedActivity'")
# print(result)
if result[0] == 0:
# 对命令执行结果进行解析
# print(result[1])
split_result = result[1].split("\n")[0].split("/")
# print(split_result)
packages = split_result[0].split(" ")
# print(packages)
# 获取包名以及当前页面的名字
current_activity_path = packages[len(packages) - 1] + split_result[1].split(" ")[0]
# print current_activity_path
current_activity_path_list = current_activity_path.split('.')
activity = current_activity_path_list[len(current_activity_path_list) - 1]
# print activity
# 对数据进行处理
activity = activity.strip().replace('\r\n', ' ').replace('\n', ' ')
print("当前页面名字 >>> " + str(activity))
# 复制到剪切板
set_clipboard_data(bytes(activity))
else:
print("错误信息:" + result[1])
print("根据错误信息,请检查:\n1、是否配置了 ADB 环境!!!\n2、是否有手机、模拟器连接!!!\n3、当前 device 没有 mFocusedActivity 或 没ReumnedActivity 数据!!!")
结果
正常情况
> python current_activity.py com.miui.home.launcher.Launcher 当前页面的名字已复制到剪切板
异常情况
> python current_activity.py 错误信息:error: no devices/emulators found 根据错误信息,请检查: 1、是否配置了 ADB 环境!!! 2、是否有手机、模拟器连接!!! 3、当前 device 没有 mFocusedActivity 或 ReumnedActivity 数据!!!