0

调试网络应用程序

Android 的 WebKit 并未实现其他桌面浏览器中可用的所有控制台 API。但是,您可以使用基本的文本记录功能:

console.log(String)
console.info(String)
console.warn(String)
console.error(String)

其他控制台功能不会引发错误,但其行为可能与您对其他 Web 浏览器的预期不同。


android.webkit.ConsoleMessage.MessageLevel

ConsoleMessage.MessageLevel 调试
ConsoleMessage.MessageLevel 错误
ConsoleMessage.MessageLevel 日志
ConsoleMessage.MessageLevel 提示
ConsoleMessage.MessageLevel 警告


在为 Android 设备开发 webapp-native-hybrid 时,我很高兴能够将 JavaScript 控制台与普通的 LogCat 合并。但是很遗憾:有一个 console.debug 会导致 MessageLevel.INFO 并且根本没有 console.verbose() (抛出错误)。

4

1 回答 1

2

为了解决这个问题,我将使用一个简单(而且非常丑陋且不稳定)的适配器来扩展控制台的功能:

var c = window.console;
window.console = {
    debug:   function(message) { c.error("(DEBUG)#" + message); },
    verbose: function(message) { c.error("(VERBOSE)#" + message); },
    error:   function(message) { c.error(message); },
    warn:    function(message) { c.warn(message); },
    log:     function(message) { c.log(message); },
    info:    function(message) { c.info(message); }
};

for (i in c) {
    try {
        window.console[c[i]]();
    } catch(error) {
        if(verbose) console.verbose("Funktion nicht implementiert: " + c[i]);
        window.console[c[i]] = function(arguments) {
            if(debug) console.debug("Aufruf nicht implementierter Funktion: " + this);
            var funcDefArray = ("" + this).split(" ");
            c[funcDefArray[1]](arguments);
        };
    }
}

此适配器在添加前缀(DEBUG)#(VERBOSE)#作为参数给出的消息并error()从原始控制台对象调用时提供日志记录功能。希望这将是最少使用的级别,因此这是检查传入消息的前缀的地方。LogCat 的期望日志级别由提取的前缀选择:

public class CustomWebChromeClient extends WebChromeClient {
@Override
public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
    String tag = TAG_JS;
    StringBuffer message = new StringBuffer(consoleMessage.message());

    MessageLevel lvl = consoleMessage.messageLevel();
    if (lvl == MessageLevel.ERROR) {
        int i = message.indexOf(")#");
        if(i > 0 && i < 8) {
            String realLevel = message.substring(1, i);
            message.replace(0, i+2, "");
            if("DEBUG".equals(realLevel)) lvl = MessageLevel.DEBUG;
            else if("VERBOSE".equals(realLevel)) lvl = MessageLevel.TIP;
            else tag += " (" + realLevel + ")";
        } else {
            String source = consoleMessage.sourceId();
            source = source.substring(source.indexOf("/js/") + 1);
            message.append(source);  
            message.append('(').append(consoleMessage.lineNumber()).append(')');
            message.append(" –&gt; ");
        }
    }

    message.append(consoleMessage.message());
    switch (lvl) {
    case ERROR:
        Log.e(tag, message.toString());
        break;
    case WARNING:
        Log.w(tag, message.toString());
        break;
    case LOG:
        Log.i(tag, message.toString());
        break;
    case DEBUG:
        Log.d(tag, message.toString());
        break;
    case TIP:
        Log.v(tag, message.toString());
        break;
    default:
        Log.println(Log.ASSERT, tag, message.toString());
        break;
    }
    return true;
}
}

我尝试通过原型来操作控制台功能,但此时我对现在获得工作结果并不熟悉。就我的目的而言,这就足够了,最终其他人可以使用这个废话。

如果有人能给我提供几行原型,我会很高兴,我希望下次我需要这样的东西时,我能自己做;)

于 2012-11-04T19:24:25.390 回答