Recommandations d'apprentissage associées : Tutoriel Python
Cet article présente principalement l'utilisation de Python pour appeler des commandes ADB à implémenter surveillance en temps réel des mots-clés logcat La fonction
adopte le multi-processus, qui peut surveiller plusieurs appareils et plusieurs mots-clés en même temps.
Vous devez configurer l'environnement ADB. Je ne présenterai pas la configuration spécifique. Il suffit de chercher beaucoup et d'accéder directement au code
Contrôler l'activation et la désactivation de la fonction de surveillance via une variable globale. . INSTRUCTION est utilisé pour suivre les instructions. Obtenez le nom de la méthode correspondante
import os, threading, datetime # 获取当前文件所在目录,拼接出LOG路径 LOG_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), "log") # 配置需要监控的关键字 KEYWORDS = ["ANR ", "NullPointerException", "CRASH", "Force Closed"] # 控制开启和关闭 STOP_LOGCAT = True # 指令对应具体操作 INSTRUCTION = { "1": "filter_keywords", "2": "stop_filter_keywords", "3": "exit" } def filter_keywords(): global STOP_LOGCAT STOP_LOGCAT = False devices = get_devices() # 先获取所有连接的设备 print("开始监控关键字") for device in devices: t = threading.Thread(target=filter_keyword, args=(device,)) t.start() def stop_filter_keywords(): global STOP_LOGCAT if STOP_LOGCAT: print("没有正在执行的任务\n") else: STOP_LOGCAT = True print("正在停止关键字监控\n")
pour surveiller la fonction principale du mot-clé,
def filter_keyword(device): print("设备%s关键字监控已开启" % str(device)) sub = logcat(device) with sub: for line in sub.stdout: # 子进程会持续输出日志,对子进程对象.stdout进行循环读取 for key in KEYWORDS: if line.decode("utf-8").find(key) != -1: # stdout输出为字节类型,需要转码 message = "设备:%s 检测到:%s\n" % (device, key)# 设备:192.168.56.104:5555 检测到:ANR path = get_log_path("bugreport") # 根据时间创建文件夹 bugreport(device, path)# 拉取完整日志压缩包到创建的文件夹内 send_message(message) # 这里可以换成自己要做的事情,比如发送邮件或钉钉通知 if STOP_LOGCAT: break print("设备%s关键字监控已停止" % str(device)) sub.kill()
pour créer un processus via subprocess.Popen pour exécuter la commande, et en continu. afficher les journaux sur stdout
# logcat持续输出日志 def logcat(device): command = "adb -s " + str(device) + " logcat -v time" sub = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) return sub
pour que tous soient connectés. La méthode du périphérique, après avoir exécuté "adb devices", le résultat est le suivant En coupant la chaîne obtenue en exécutant la commande, tous les numéros de périphérique sont obtenus et stockés dans. formulaire de liste
# 获取所有device def get_devices(): command = "adb devices" res = os.popen(command).read() devices = [] res = res.split("\n") for i in res: if i.endswith("device"): devices.append(i.split('\t')[0]) return devices
# 打包下载所有日志到当前目录 def bugreport(device, path): os.chdir(path)# bugreport会下载日志到当前文件夹,所以需要先切换到已经创建的目录 command = "adb -s " + str(device) + " bugreport" subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, bufsize=-1) print("设备:%s 日志路径:%s" % (str(device), path))
vers le fichier actuel Récupérer le chemin du journal au format répertoire/année/mois/jour S'il n'existe pas, il créera automatiquement le
# 获取日志存放路径,如果不存在则按日期创建 def get_log_path(tag): year = datetime.datetime.now().strftime('%Y') month = datetime.datetime.now().strftime('%m') day = datetime.datetime.now().strftime('%d') path = os.path.join(LOG_PATH, tag, year, month, day) if not os.path.exists(path): os.makedirs(path) return path
def main(): while True: print("-" * 100) print("1:开启关键字监控\n2:停止关键字监控\n3:退出") print("-" * 100) instruction = str(input("\n\n请输入要进行的操作号:\n")) print("-" * 100) while instruction not in INSTRUCTION.keys(): instruction = str(input("\n\n输入无效,请重新输入:")) if int(instruction) == 9: exit() # TODO 退出前需要判断是否有正在执行的monkey任务和关键字监控任务 eval(INSTRUCTION[str(instruction)] + "()") if __name__ == '__main__': main()
Si vous le souhaitez. Si vous voulez en savoir plus sur la programmation, faites attention à la colonneformation php !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!