2

我正在使用应用程序 AIDE 直接在我的设备上进行开发,而不使用 eclipse 或外部机器。

我的两台设备上出现了冲突的 logcat 输出,一台是 Galaxy Nexus,另一台是 Nexus 7。两者都在 Jellybean 上,都运行相同版本的 IDE 应用程序,并且都使用我正在编写的相同源代码。

在我的手机上,我看到了来自我的应用程序的所有日志命令,而在平板电脑上,一个也没有。

我还尝试构建 IDE 应用程序附带的测试 hello world 应用程序,然后向其中添加日志记录。同样,手机可以工作,平板电脑不能。

我有一个;所以检查了开发人员下设备上的设置,两者都具有相同的功能,包括 USB 调试。

最后,在应用程序本身中,我尝试在清单中同时使用 android:debuggable="true" 和没有它。它始终适用于他们的手机,而不是平板电脑。

更新

在对 jellybean 日志进行搜索后,不仅仅是 android 日志,看来 android/google 已经关闭了在 3rd 方应用程序上查看日志的功能。您现在只能查看系统日志或您正在使用的应用程序的日志,即您不能使用一个应用程序查看另一个应用程序的日志。

我仍然有点困惑,因为我的两个设备都在 jellybean 上,正如我所提到的,一个可以看到所有日志,另一个不能。然而....内核是不同的。平板是3.1,手机是3.0.31。

我相信日志更改必须发生在这些版本之间。

所以现在我想我将不得不root才能看到日志,或者只有在我手头有笔记本电脑时才进行调试,这并不常见。

现在,如果有人知道如何在不擦除数据的情况下扎根 Galaxy nexus 或 nexus 7……

4

4 回答 4

2

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

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

于 2012-09-19T10:43:14.363 回答
0

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

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

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

于 2013-06-28T22:21:56.917 回答
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 控制台中使用的内容。

于 2014-07-07T15:00:40.377 回答
0

转到菜单->更多->项目->构建变体->选择调试助手

于 2019-04-30T03:12:21.080 回答