Debugging Web Apps


  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()(抛出了错误)。

最佳答案

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

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(" –> ");
        }
    }

    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;
}
}


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

如果有人能提供给我几行原型制作,我会很高兴,并且我希望下次我需要类似的东西时,我自己就能做到;)

10-05 20:45