关于android的Logcat问题

问题描述 投票:2回答:4

我正在使用应用程序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 ......

android mobile logging
4个回答
2
投票

Jelly Bean不再允许新安装的应用程序在LogCat中查看任意消息。更具体地说,新安装的应用程序无法再持有READ_LOGS权限。如果您在升级到Jelly Bean之前已在手机上安装了AIDE,那么这可以解释您所看到的症状。

但是,您无需使用手机来查看日志记录数据。记录到LogCat是一种便利机制。您可以使用标准Java日志记录(例如,java.util.logging)在其他地方(例如,外部存储)进行日志记录,以便您可以查看日志。


0
投票

有时,上述答案都不起作用。这就是我在笔记本电脑上使用Nexus 7和Eclipse时调试应用程序时发生的事情。特别是当我开始调试与之前调试的应用程序不同的应用程序时,就会发生这种情况。我做了两件事,最终在eclipse的logcat窗口中出现了logcat消息。

首先,在Nexus 7平板电脑的“开发者选项”下有一个名为“选择调试应用”的设置。我不得不选择正在调试的特定应用程序(从它显示的应用程序列表中 - 之前调试过一段时间)。

其次,我不得不杀死adb服务器并重启服务器。完成这两个步骤后,logcat消息开始出现在正在调试的新应用程序中。


0
投票

您可以像这样包装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控制台中习惯使用的内容。


0
投票

转到menu-> more-> project - > Build variants - > select debug-aide

© www.soinside.com 2019 - 2024. All rights reserved.