从系统 类 收集日志
Collect logs from system classes
我正在开发一个使用 Android 的 MediaMuxer 来录制屏幕的应用程序。使用 Crashlytics,大量用户遇到 "Failed to stop the muxer" 崩溃,但我无法在我的任何设备上本地重现它。根据 another question,当 MediaMuxer 为 运行 时生成的 MPEG4Writer 日志应该表明问题的根源是什么,但由于我无法在本地重现它,我需要远程收集这些日志并通过他们交给 Crashlytics。
所以这是我的问题:MediaMuxer 和 MPEG4Writer 是系统 classes,所以显然我不能编辑它们来添加 Crashlytics.log() 行。我想过让应用程序读取 Logcat 输出并存储所有包含 MPEG4Writer 的条目,如果 muxer 崩溃,这些条目将被发送到 Crashlytics,使用 this implementation 作为基础。这是我的代码:
public class LogRetriever extends Thread {
private static final String TAG = LogRetriever.class.getCanonicalName();
public static ArrayList<String> logStorage = new ArrayList<>();
private AtomicBoolean mLoggingActive = new AtomicBoolean(true);
@Override
public void run() {
try {
String[] command = new String[] { "logcat" };
Process process = Runtime.getRuntime().exec(command);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while (mLoggingActive.get() && ((line = bufferedReader.readLine()) != null)){
if(line.contains("MPEG4Writer")) {
logStorage.add(line);
}
}
}
catch (IOException ex) {
Log.e(TAG, "start failed", ex);
}
}
public void stopLogging() {
mLoggingActive.set(false);
}
}
使用上述方法,我似乎只得到了MPEG4Writer生成的前四行日志。其余的通过 Android Studio 的 logcat 可见,但不是由我的代码收集的。我也试过 this library 似乎做同样的事情,但同样的问题,只收集了前 4 行。我怀疑 MediaMuxer 在这 4 行之后创建了自己的进程,此时我无法再读取其 logcat 输出,因为我的 LogRetriever class 现在处于不同的进程中。那么我应该如何收集这些日志呢?我在这里采取了错误的方法吗?
So how am I supposed to collect those logs?
通常,除非您为设备制造商工作,否则您不会收集这些日志。
首先,官方从未支持在运行时访问LogCat;因此,您必须采用笨拙的 "fork logcat
" 方法。
除此之外,您需要 READ_LOGS
许可才能获得更多。该权限对 protectionLevel
有 signature|privileged|development
,这意味着普通应用程序无法拥有该权限。
这是出于隐私原因。 READ_LOGS
允许您访问所有 LogCat,以及许多可能敏感的应用程序(和一些系统进程)日志信息。
我正在开发一个使用 Android 的 MediaMuxer 来录制屏幕的应用程序。使用 Crashlytics,大量用户遇到 "Failed to stop the muxer" 崩溃,但我无法在我的任何设备上本地重现它。根据 another question,当 MediaMuxer 为 运行 时生成的 MPEG4Writer 日志应该表明问题的根源是什么,但由于我无法在本地重现它,我需要远程收集这些日志并通过他们交给 Crashlytics。
所以这是我的问题:MediaMuxer 和 MPEG4Writer 是系统 classes,所以显然我不能编辑它们来添加 Crashlytics.log() 行。我想过让应用程序读取 Logcat 输出并存储所有包含 MPEG4Writer 的条目,如果 muxer 崩溃,这些条目将被发送到 Crashlytics,使用 this implementation 作为基础。这是我的代码:
public class LogRetriever extends Thread {
private static final String TAG = LogRetriever.class.getCanonicalName();
public static ArrayList<String> logStorage = new ArrayList<>();
private AtomicBoolean mLoggingActive = new AtomicBoolean(true);
@Override
public void run() {
try {
String[] command = new String[] { "logcat" };
Process process = Runtime.getRuntime().exec(command);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while (mLoggingActive.get() && ((line = bufferedReader.readLine()) != null)){
if(line.contains("MPEG4Writer")) {
logStorage.add(line);
}
}
}
catch (IOException ex) {
Log.e(TAG, "start failed", ex);
}
}
public void stopLogging() {
mLoggingActive.set(false);
}
}
使用上述方法,我似乎只得到了MPEG4Writer生成的前四行日志。其余的通过 Android Studio 的 logcat 可见,但不是由我的代码收集的。我也试过 this library 似乎做同样的事情,但同样的问题,只收集了前 4 行。我怀疑 MediaMuxer 在这 4 行之后创建了自己的进程,此时我无法再读取其 logcat 输出,因为我的 LogRetriever class 现在处于不同的进程中。那么我应该如何收集这些日志呢?我在这里采取了错误的方法吗?
So how am I supposed to collect those logs?
通常,除非您为设备制造商工作,否则您不会收集这些日志。
首先,官方从未支持在运行时访问LogCat;因此,您必须采用笨拙的 "fork logcat
" 方法。
除此之外,您需要 READ_LOGS
许可才能获得更多。该权限对 protectionLevel
有 signature|privileged|development
,这意味着普通应用程序无法拥有该权限。
这是出于隐私原因。 READ_LOGS
允许您访问所有 LogCat,以及许多可能敏感的应用程序(和一些系统进程)日志信息。