zoukankan      html  css  js  c++  java
  • 【Python】[技术博客] 一些使用Python编写获取手机App日志的操作

    一些使用Python编写获取手机App日志的操作

    1. 如何获取手机当前打开的App的包名
    2. 如何获取当前App进程的PID
    3. 如何查看当前App的日志
    4. 如何将日志保存到文件
    5. 如何关闭进程
    6. 如何不显示命令行窗口

    1.如何获取手机当前打开的App的包名

    可以直接在命令行中输入adb shell dumpsys window | findstr mCurrentFocus

    以手机QQ为例,读取到的mCurrentFocus的信息为

    mCurrentFocus=Window{cb7270e u0 com.tencent.mobileqq/com.tencent.mobileqq.activity.AddAccountActivity}

    然后通过字符串分割,提取出包名 "com.tencent.mobileqq", 如果有需要的话同样可以获取到当前活动名。

    如果在Python中使用的话,可以用如下方法

    import os
    data = os.popen("adb shell dumpsys window | findstr mCurrentFocus")
    mCurrentFocus = data.read()
    list1 = mCurrentFocus.split(' ')
    list2 = list1[4].split('/')
    packageName = list2[0]
    print(packageName)
    

    2.如何获取当前App进程的PID

    在命令行中直接输入命令adb shell "ps | grep com.tencent.mobileqq" 可以得到这个应用所有的进程信息,有的App只有一个进程,有些App会有多个进程。这里注意 grep命令是在Linux 下使用的,如果想在Windows环境下使用,前后需要加上双引号,否则会报错。

    u0_a98         991   744 2202676 125564 0                   0 S com.tencent.mobileqq:tool
    u0_a98       31810   744 1938984  68956 0                   0 S com.tencent.mobileqq:MSF
    u0_a98       32714   744 2218736 226968 0                   0 S com.tencent.mobileqq
    

    其中第二列为进程的PID,然后我们可以通过Python中的分割字符串等操作来获取PID。

    3.如何查看当前App的日志

    网上一些帖子都使用了find方法或者grep方法,这些在查找的时候都会附加一些其他的日志,通过查看adb logcat的帮助文档,发现其中有一条

    --pid=<pid> Only prints logs from the given pid

    这样我们可以通过如下命令来获取制定的PID的日志

    adb shell logcat --pid=32714

    或者更简便的

    adb shell logcat --pid=$(pidof -s com.tencent.mobileqq)

    同时我们还可以加以约束,比如只要Warning以上的日志

    adb shell logcat *:W --pid=$(pidof -s com.tencent.mobileqq)

    得到的日志如下

    --------- beginning of main
    06-04 20:39:56.804 32714   710 E DingdongPluginBizHandler: 0x51d_1 respond msf error: retCode[1002].
    06-04 20:40:52.953 32714 32714 W InputMethodManager: startInputReason = 1
    06-04 20:40:52.971 32714 32747 W libEGL  : EGLNativeWindowType 0xe0e6d808 disconnect failed
    

    4.如何将日志保存到文件

    有两种方法

    1.一种是在命令中直接添加> filepath,命令如下

    adb shell logcat *:W > E:/log.txt

    2.更改subprocess.Popen的属性

    logfile = open("E:/log.txt", 'w')
    command = "adb shell logcat *:W"
    subprocess.Popen(command, stdout = logfile, shell=True)
    

    5.如何关闭进程

    运行代码后,一共会打开两个进程, 一个是 cmd.exe,第二个是adb.exe,都要关闭

    log = subprocess.Popen(command)
    
    ##关闭
    try:
        log.terminate() #关闭 cmd.exe
        os.popen("adb kill-server") #关闭 adb.exe
    except:
        pass
    

    6.如何不显示命令行窗口

    通过更改subprocess 中的startupinfo

    st = subprocess.STARTUPINFO
    st.dwFlags = subprocess.STARTF_USESHOWWINDOW
    st.wShowWindow = subprocess.SW_HIDE
    cmd = subprocess.Popen(command, startupinfo=st)
    
  • 相关阅读:
    .net 面试题 没事多看看。。。。
    分享一下我记忆23种设计模式的方法 <转。。>
    再次写给我们这些浮躁的程序员 《搜集的。。。》
    C#验证邮箱,电话,手机,数字,英文,日期,身份证,邮编,网址,IP类.. (转后整理)
    javascript和jquery使用技巧集
    jQuery 增加 删除 修改select option .
    设计模式(二)
    JavaScript string 字符串类型的扩展方法
    26个jQuery使用技巧
    jBPM开发入门指南(1)
  • 原文地址:https://www.cnblogs.com/bhlt1998/p/10980826.html
Copyright © 2011-2022 走看看