我正在使用应用程序AIDE直接在我的设备上开发,而不使用eclipse或外部机器。
我在我的两个设备上遇到了冲突的logcat输出,一个是Galaxy Nexus,另一个是Nexus 7.两者都在Jellybean上,两者都运行相同版本的IDE应用程序,两者都使用我正在编写的相同源代码。
在我的手机上,我看到了我的应用程序和平板电脑上的所有日志命令,没有一个。
我还尝试构建IDE应用程序附带的测试hello world应用程序,然后添加日志记录。再次,手机工作,平板电脑没有。
我有一个;所以检查开发人员下的设备上的设置,两者都有相同的包括USB调试。
最后,在应用程序本身,我已经尝试在清单中都有android:debuggable =“true”,而没有它。它总是适用于电话,而不是平板电脑。
UPDATE
在对豆荚日志进行搜索之后,不仅仅是安卓软件,看起来android / google已经关闭了第三方应用程序上的日志。您现在只能从您正在使用的应用程序中查看系统日志或日志。你不能使用一个应用程序来查看其他应用程序日志。
我仍然有点困惑,因为我的设备都在软糖上,正如我所提到的,人们可以看到所有日志,另一个则不能。然而....内核是不同的。平板电脑是3.1,手机3.0.31。
我相信日志更改必须介于这些版本之间。
所以现在我不得不考虑我必须能够查看日志,或者只有在我有笔记本电脑时才进行调试。
现在,如果有人知道如何在不擦除数据的情况下根据星系nexus或nexus 7 ......
Jelly Bean不再允许新安装的应用程序在LogCat中查看任意消息。更具体地说,新安装的应用程序无法再持有READ_LOGS
权限。如果您在升级到Jelly Bean之前已在手机上安装了AIDE,那么这可以解释您所看到的症状。
但是,您无需使用手机来查看日志记录数据。记录到LogCat是一种便利机制。您可以使用标准Java日志记录(例如,java.util.logging
)在其他地方(例如,外部存储)进行日志记录,以便您可以查看日志。
有时,上述答案都不起作用。这就是我在笔记本电脑上使用Nexus 7和Eclipse时调试应用程序时发生的事情。特别是当我开始调试与之前调试的应用程序不同的应用程序时,就会发生这种情况。我做了两件事,最终在eclipse的logcat窗口中出现了logcat消息。
首先,在Nexus 7平板电脑的“开发者选项”下有一个名为“选择调试应用”的设置。我不得不选择正在调试的特定应用程序(从它显示的应用程序列表中 - 之前调试过一段时间)。
其次,我不得不杀死adb服务器并重启服务器。完成这两个步骤后,logcat消息开始出现在正在调试的新应用程序中。
您可以像这样包装android.utils.Log以获得可扩展性:
public class Log {
// Constants
//--------------------------------------------------------------------------
private static final String TAG = Log.class.getName();
public static final int VERBOSE = android.util.Log.VERBOSE;
public static final int DEBUG = android.util.Log.DEBUG;
public static final int INFO = android.util.Log.INFO;
public static final int WARN = android.util.Log.WARN;
public static final int ERROR = android.util.Log.ERROR;
public static final int ASSERT = android.util.Log.ASSERT;
// Extension interface
//--------------------------------------------------------------------------
public interface LogExtension {
void onLog(int priority, String tag, String msg, Throwable tr);
}
private static ConcurrentHashMap<String, LogExtension> logExtensions = new ConcurrentHashMap<String, LogExtension>();
public static void addExtension(String tag, LogExtension extension) {
if (tag != null && extension != null) {
Log.logExtensions.put(tag, extension);
}
}
public static void removeExtension(String tag) {
Log.logExtensions.remove(tag);
}
// android.util.Log wrapper
//--------------------------------------------------------------------------
public static int d(String tag, String msg) {
for (LogExtension extension : Log.logExtensions.values()) {
extension.onLog(DEBUG, tag, msg, null);
}
return android.util.Log.d(tag, msg);
}
public static int d(String tag, String msg, Throwable tr){
for (LogExtension extension : Log.logExtensions.values()) {
extension.onLog(DEBUG, tag, msg, tr);
}
return android.util.Log.d(tag, msg, tr);
}
public static int e(String tag, String msg){
for (LogExtension extension : Log.logExtensions.values()) {
extension.onLog(ERROR, tag, msg, null);
}
return android.util.Log.e(tag, msg);
}
public static int e(String tag, String msg, Throwable tr) {
for (LogExtension extension : Log.logExtensions.values()) {
extension.onLog(ERROR, tag, msg, tr);
}
return android.util.Log.e(tag, msg, tr);
}
public static String getStackTraceString(Throwable tr) {
return android.util.Log.getStackTraceString(tr);
}
public static int i(String tag, String msg) {
for (LogExtension extension : Log.logExtensions.values()) {
extension.onLog(INFO, tag, msg, null);
}
return android.util.Log.i(tag, msg);
}
public static int i(String tag, String msg, Throwable tr) {
for (LogExtension extension : Log.logExtensions.values()) {
extension.onLog(INFO, tag, msg, tr);
}
return android.util.Log.i(tag, msg, tr);
}
public static boolean isLoggable(String tag, int level) {
return android.util.Log.isLoggable(tag, level);
}
public static int println(int priority, String tag, String msg) {
for (LogExtension extension : Log.logExtensions.values()) {
extension.onLog(priority, tag, msg, null);
}
return android.util.Log.println(priority, tag, msg);
}
public static int v(String tag, String msg) {
for (LogExtension extension : Log.logExtensions.values()) {
extension.onLog(VERBOSE, tag, msg, null);
}
return android.util.Log.v(tag, msg);
}
public static int v(String tag, String msg, Throwable tr) {
for (LogExtension extension : Log.logExtensions.values()) {
extension.onLog(VERBOSE, tag, msg, tr);
}
return android.util.Log.v(tag, msg, tr);
}
public static int w(String tag, Throwable tr) {
for (LogExtension extension : Log.logExtensions.values()) {
extension.onLog(WARN, tag, null, tr);
}
return android.util.Log.w(tag, tr);
}
public static int w(String tag, String msg, Throwable tr) {
for (LogExtension extension : Log.logExtensions.values()) {
extension.onLog(WARN, tag, msg, tr);
}
return android.util.Log.w(tag, msg, tr);
}
public static int w(String tag, String msg) {
for (LogExtension extension : Log.logExtensions.values()) {
extension.onLog(WARN, tag, msg, null);
}
return android.util.Log.w(tag, msg);
}
public static int wtf(String tag, Throwable tr) {
for (LogExtension extension : Log.logExtensions.values()) {
extension.onLog(ASSERT, tag, null, tr);
}
return android.util.Log.wtf(tag, tr);
}
public static int wtf(String tag, String msg) {
for (LogExtension extension : Log.logExtensions.values()) {
extension.onLog(ASSERT, tag, msg, null);
}
return android.util.Log.wtf(tag, msg);
}
public static int wtf(String tag, String msg, Throwable tr) {
for (LogExtension extension : Log.logExtensions.values()) {
extension.onLog(ASSERT, tag, msg, tr);
}
return android.util.Log.wtf(tag, msg, tr);
}
// Convenience
//--------------------------------------------------------------------------
public static String acronymForPriority(int priority) {
switch (priority) {
case VERBOSE: {
return "V";
}
case DEBUG: {
return "D";
}
case INFO: {
return "I";
}
case WARN: {
return "W";
}
case ERROR: {
return "E";
}
case ASSERT: {
return "WTF";
}
default: {
return "?";
}
}
}
}
然后使用此Wrapper的完全限定名称查找/替换android.util.Log。您可以通过实现LogExtension
接口来扩展Logger:
public class LogCatBuffer implements Log.LogExtension{
// Attributes
//--------------------------------------------------------------------------
private int linesOfLog;
private Queue<String> logCatContents;
private DateFormat dateFormatter = new SimpleDateFormat("MM-dd HH:mm:ss.SSS");
// Construction
//--------------------------------------------------------------------------
private LogCatBuffer(int linesOfLog) {
this.linesOfLog = linesOfLog;
this.logCatContents = new ConcurrentLinkedQueue<String>();
}
// LogExtension implementation
//--------------------------------------------------------------------------
@Override
public void onLog(int priority, String tag, String msg, Throwable tr) {
Date now = new Date();
String loggingMessage = this.dateFormatter.format(now) +
" " +
android.os.Process.myPid() +
" " +
Log.acronymForPriority(priority) +
"/" +
tag +
": " +
(msg != null ? msg : "") +
(msg != null && tr != null ? "\n" : "") +
(tr != null ? Log.getStackTraceString(tr) : "");
this.logCatContents.add(loggingMessage);
if (this.logCatContents.size() > this.linesOfLog) {
this.logCatContents.poll();
}
}
// Export
//--------------------------------------------------------------------------
@Override
public String toString() {
StringBuilder builder = new StringBuilder(256 * this.linesOfLog);
for (String line : this.logCatContents) {
builder.append(line).append("\n");
}
return builder.toString();
}
}
然后,您可以将LogCatBuffer.toString()
输出转储到文本文件中,该文件看起来非常类似于您在LogCat控制台中习惯使用的内容。
转到menu-> more-> project - > Build variants - > select debug-aide