Android-獲取當前Activity指令碼(支援8.0+)
阿新 • • 發佈:2019-02-10
起始
身為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 資料!!!