📜  android get last crash adb - Java (1)

📅  最后修改于: 2023-12-03 14:39:07.754000             🧑  作者: Mango

获取最近一次Android应用崩溃日志的方法 - ADB和Java

概述

应用崩溃是开发中的一个经常遇到的问题。在进行App调试的过程中,我们经常需要查看应用最近一次崩溃的日志来判断问题的根源。本文介绍了如何通过使用ADB命令和Java代码来获取最近一次Android应用崩溃的日志。

使用ADB获取崩溃日志

Android Debug Bridge (adb) 是Android开发中很有用的一个工具,它可以模拟与设备或模拟器交互时的真实情况。ADB可以通过命令行或Android Studio的ADB工具窗口进行使用。要获取应用的崩溃日志,我们需要执行以下命令:

  1. 首先,通过以下命令查看设备是否连接:

    adb devices

  2. 使用以下命令捕获设备上最近的崩溃日志:

    adb logcat -d -v time -s AndroidRuntime:E

命令参数含义:

  • -d:仅显示日志缓冲区当前内容,然后退出。
  • -v time:设置日志的详细程度,此处设置为显示日志时间戳。还有其他可选项,例如briefprocess等。
  • -s:进行过滤,过滤标签包含指定文本的日志。此处设置为仅显示Android应用运行时的崩溃日志。

执行该命令后,将会返回类似于下面的输出:

05-22 11:52:34.937 32469 32469 E AndroidRuntime: FATAL EXCEPTION: main
05-22 11:52:34.937 32469 32469 E AndroidRuntime: Process: com.example.myapplication, PID: 32469
05-22 11:52:34.937 32469 32469 E AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.myapplication/com.example.myapplication.MainActivity}: java.lang.NullPointerException
05-22 11:52:34.937 32469 32469 E AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2679)
05-22 11:52:34.937 32469 32469 E AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2740)
05-22 11:52:34.937 32469 32469 E AndroidRuntime: at android.app.ActivityThread.-wrap12(ActivityThread.java)
05-22 11:52:34.937 32469 32469 E AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1481)
05-22 11:52:34.937 32469 32469 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:102)
05-22 11:52:34.937 32469 32469 E AndroidRuntime: at android.os.Looper.loop(Looper.java:154)
05-22 11:52:34.937 32469 32469 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:6185)
05-22 11:52:34.937 32469 32469 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
05-22 11:52:34.937 32469 32469 E AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)
05-22 11:52:34.937 32469 32469 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)
05-22 11:52:34.937 32469 32469 E AndroidRuntime: Caused by: java.lang.NullPointerException
05-22 11:52:34.937 32469 32469 E AndroidRuntime: at com.example.myapplication.MainActivity.onCreate(MainActivity.java:11)
05-22 11:52:34.937 32469 32469 E AndroidRuntime: at android.app.Activity.performCreate(Activity.java:6682)
05-22 11:52:34.937 32469 32469 E AndroidRuntime: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
05-22 11:52:34.937 32469 32469 E AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2632)
使用Java代码获取崩溃日志

我们也可以通过Java代码来获取应用的崩溃日志。首先,我们需要在AndroidManifest.xml文件中添加以下权限:

<uses-permission android:name="android.permission.READ_LOGS"/>

然后,我们就可以使用以下代码来获取应用的最近一次崩溃日志:

StringBuffer log = new StringBuffer();
try {
    Process process = Runtime.getRuntime().exec("logcat -d -v time -s AndroidRuntime:E");
    BufferedReader bufferedReader = new BufferedReader(
            new InputStreamReader(process.getInputStream()));

    String line;
    while ((line = bufferedReader.readLine()) != null) {
        log.append(line);
    }
} catch (IOException e) {
    e.printStackTrace();
}

如上述Java代码所示,我们需要执行与上述ADB命令相同的命令,然后读取命令输出的内容。最终将输出的内容保存在StringBuffer类型的变量中。其中,参数logcat表示执行日志相关命令,-d表示仅打印当前日志缓冲区的内容,然后退出,-v参数与上述ADB命令中相同,表示设置日志详细程度,此处设置为显示日志时间戳,`-s则表示过滤日志,仅展示Android应用运行时的崩溃日志。

总结

以上介绍了如何通过ADB命令和Java代码来获取应用的最近一次崩溃日志。ADB命令适用于需要手动获取日志的场景,而Java代码适用于自动获取日志的场景。同时,我们也需要注意保密,一旦我们透露了敏感信息,可能会导致安全事故。