Android调试要经过模仿器运转,或许直接USB长途连接到一部手机调试。即便在不封闭模仿进行调试时分,也要经过编译、apk打包、上传apk、运转apk的进程,时刻也不短,所以应该在程序固定一次运转中,发生更多咱们需求重视的信息,来更清楚的了解程序的运转和逻辑,以便削减上述较长的进程(曾经开发用过最土的做法,为了check某个变量的值,运用Toast.makeText()然后show出来,很费事)。
做过互联网后台体系服务或大型程序的人们都知道,假如后台服务反常了,榜首反响便是去查日志,看看究竟哪里出了问题(提示一下,许多人以为打日志是磁盘操作很影响功用,其实不然,Linux的文件体系会对read/write等体系调用做page cache缓存,只需不是Direct I/O方法根本都能够以为是内存操作),Android体系亦是如此(不过是在调试时分,发布时分则不会带日志)。
今日要说到的便是Android为咱们供给的android.util.log类,能够边运转边打日志,打出的日志能够经过Eclipse的View的LogCat来查询。
* Android日志完成原理(不关心细节完成能够越过) :
首要用户态的App经过Java VM(Android是dalvikvm)发生LOG信息,并与ADB Device Daemon(手机端的adb进程,翻开”手机调试“功用时发动的,这便是为什么装置豌豆荚时分手机要敞开手机调试功用)交互输出这些信息,而ADB Device Daemon又经过相应的协议经过USB(Device)或本地连接(Emulator),与PC上运转的ADB Host Daemon交互,经过PC上的调试东西传递给Eclipse中的ADK插件进行显现。
详细流程 :
App经过util.log.
logger是android体系级的驱动程序,会把注册在体系里的读log的请求者(例如链接过来的eclipse和adb进程、或许linux命令行东西logcat),经过IO复用函数select()来推送数据。
打印日志句子实例 :
源码打印?
Log.v(MyTag, This is Verbose.); // 输出verbose等级的字符串
java.util.log里界说了不同等级的输出,分别在LogCat里显现不同的色彩,以便更精准的查找:

Log.v 的调试色彩为黑色的,任何音讯都会输出,这儿的v代表verbose嗦的意思,平常运用便是Log.v(,);
Log.d的输出色彩是蓝色的,仅输出debug调试的意思,但他会输出上层的信息,过滤起来能够经过DDMS的Logcat标签来挑选.
Log.i的输出为绿色,一般提示性的音讯information,它不会输出Log.v和Log.d的信息,但会显现i、w和e的信息
Log.w的意思为橙色,能够看作为warning正告,一般需求咱们留意优化Android代码,一起挑选它后还会输出Log.e的信息。
Log.e为赤色,能够想到error过错,这儿仅显现赤色的过错信息,这些过错就需求咱们仔细的剖析,检查栈的信息了。
写程序的时分能够经过调用不同的Log.

打印日志的时分,或许咱们不只需求过错的msg,还期望得到调用者的仓库(比方打log的函数名是什么,类名是什么)。所以,自己编写了一个能够封装这些信息的build函数来封装一些详细信息,用户只需求传入msg即可。而且经过debug开关,在程序发布时分封闭无用的日志调用:
源码打印?
public static class LogMsgBuidler
{
private static boolean DEBUG = true; /* 默许敞开 */
public static void reverse()
{
DEBUG = !DEBUG; /* 回转DEBUG设置 */
}
public static String build(String msg)
{
if (!DEBUG)
return msg;
// 获取仓库信息
StackTraceElement caller = new Throwable().fillInStackTrace().getStackTrace()[2];
return new StringBuilder().append(caller.getClassName())
.append(.).
append(caller.getMethodName())
.append((): )
.append(msg).toString();
}
}