1. 程式人生 > >Android-獲取當前Activity指令碼(支援8.0+)

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 資料!!!