j2me有哪些记录解决方案?
我特别感兴趣的是轻松排除“发布”版本的日志记录,以便拥有更小的软件包和版本。内存占用。
答案 0 :(得分:19)
MicroLog肯定会打赌。它是一个像Log4j这样的Java ME(J2ME)的小型日志库。它支持记录到控制台,文件,RecordStore,Canvas,Form,蓝牙,串行端口(蓝牙,IR,USB),套接字(包括SSL),UDP,Syslog,MMS,SMS,电子邮件或Amazon S3
答案 1 :(得分:12)
如果您正在使用Proguard进行预处理和混淆,那么您可以拥有一个简单的日志记录类。
public class Log {
public static void debug(final String message) {
//#if !release.build
System.out.println(message);
//#endif
}
}
或者根据需要进行日志记录。现在,如果将release.build属性设置为true,则将注释掉此代码,这将导致一个空方法。 Proguard将删除所有空方法的用法 - 实际上,版本构建将删除所有调试消息。
编辑:
在库级别上思考它(我正在研究J2ME库的映射)我可能找到了更好的解决方案。
public class Log {
private static boolean showDebug;
public static void debug(final String message) {
if (showDebug) {
System.out.println(message);
}
}
public static void setShowDebug(final boolean show) {
showDebug = show;
}
}
这样终端开发人员可以在他/她感兴趣的库中启用日志级别。如果不启用任何内容,将在最终产品混淆中删除所有日志记录代码。甜蜜:))
/ JaanusSiim
答案 2 :(得分:7)
您可以在proguard中使用-assumenosideeffects来完全删除您的日志记录类:
-assumenosideeffects public class logger.Logger {*;}
而不是必须预处理。
答案 3 :(得分:3)
具有由Symbian修改的Sun虚拟机的Series60和UIQ手机具有标准输出重定向。
您不仅可以捕获System.out,还可以使用Throwable.printStackTrace()。
在早期的手机上,您需要编写一个挂钩到标准库服务器进程的C ++应用程序。 Symbian生成了Redirector应用程序,可以将VM标准输出捕获到控制台或文件中。
在较新的手机上,引入了“redirect://”GCF协议,可以将VM标准输出读入Java byte []或String对象(您希望在单独的MIDlet中执行此操作)和Redirector应用程序用Java重写。
在Series60 3rd Edition Feature Pack 2手机(及更高版本)中使用的最新J9 VM上,您可能需要尝试“redirect:// test”。
答案 4 :(得分:1)
我已经将MIDPLogger用于生产应用程序中的某个可接受级别,尽管我发现它在集成到应用程序之后有更多用途,而不是套件中的另一个Midlet等等。我还发现了MicroLog,但没有将其用于任何细节。
答案 5 :(得分:0)
我编写了一个字节码优化器,由于类文件的格式,你可以指向classname&的UTF编码。允许您使用MyClass.someFunc()输出日志的函数(如果您想获取类型,可以处理签名),这允许您使用 LINE &amp ;;进行C样式调试。 文件宏。
答案 6 :(得分:0)
使用logger类的条件编译并不能解决完全删除日志记录语句的问题,因为您经常会记录多个简单字符串。您将查找变量值,然后将它们组合成字符串,例如:WhateverLog.log(“Loaded”+ someclass.size()+“foos”)。
现在,如果你只遗漏WhateverLog.log的主体(如接受的解决方案中所示),你仍然会留下许多不必要的代码,包括字符串连接(以及StringBuffer创建)。这就是为什么你最好使用像proguard这样的字节码后处理工具(已经提到过)。 Proguard的-assumenosideeffects将允许其优化器不仅删除日志记录语句,而且还删除其结果仅由日志记录调用使用的所有代码。
答案 7 :(得分:0)
J2ME的LWUIT框架提供了Logging表单,它可以在其中记录语句。您可以在您认为可能产生异常的每个地方添加日志。
示例:Log.getInstance()。showLog(); 通过添加上述行,您可以跟踪J2ME设备中的日志记录。