Android-获取当前Activity脚本(支持8.0+)

起始

身为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 数据!!!
    
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值