就像大多数软件工程领域,debugging在安卓开发中扮演重要的角色。正确的设置你的应用debugging能够减少大量时间和困惑。不幸的事,在我的经验看来,没有很多初学者学着正确的用安卓SDK自带的工具类。除非你是以为有经验的开发者,这是我个人的看法,安卓debugging应该按照一套模式。因为以下几点原因会带来一些好处:
- 它能帮你在代码间预见bugs。为你的开发工作区设立debugging将会给你带来领先当将来可能遇到bug时。
- 在debugging的过程中,它给你中央化的控制力。混乱稀少的安排log消息会让你的logcat输出很难推测debuggings结果。打开或关闭一些log消息组,能让你的生活简单多了,特别是当你的应用很复杂时。
Log 类
你们可能不知到,安卓SDK自带了一个有用的logging工具类叫做android.util.Log. 这个类允许打出的log消息根据严重度分类;每种LOG方法有自己的消息,按照如下从低到高的优先级:
- Log.v() 方法输出 log verbose messages (啰唆的log消息).
- Log.d() 方法输出log debug messages.
- Log.i() 方法输出log informational messages (log 情报消息).
- Log.w() 方法输出log warnings(警告).
- Log.e() 方法输出log errors(错误).
- Log.wtf() 用来log应该永远不会发生的事件。("wtf" 是多么可怕的失败的缩写),就像java的assert方法。
大家应该总是去考虑用适当的这六种方法来过滤你的logcat输出。去理解什么时候应该往你的应用里加log也很重要:
- Verbose logs除了开发阶段,其他时候都不应该加进程序里。当你的程序准备发布到世界上时,你要么把这些log注释掉,要么用ProGuard去掉你JAR执行包里的verbose log(Chrstopher 在StackOverflow帖子里给了答案http://stackoverflow.com/q/2018263/844882)。
- Debug logs 被编译进去但是在运行时被忽略。
- Error,warning和informational logs 应该一直保留。
一个简单的模式
下面是一个简单的debugging实现方法。一个全局static string变量来表示特定的类(比如一个Actiity、service、adapter等等),一个boolean变量表示log信息该不该被logcat打出。
public class SampleActivity extends Activity {
/**
* A string constant to use in calls to the "log" methods. Its
* value is often given by the name of the class, as this will
* allow you to easily determine where log methods are coming
* from when you analyze your logcat output.
*/
private static final String TAG = "SampleActivity";
/**
* Toggle this boolean constant's value to turn on/off logging
* within the class.
*/
private static final boolean VERBOSE = true;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (VERBOSE) Log.v(TAG, "+++ ON CREATE +++");
}
@Override
public void onStart() {
super.onStart();
if (VERBOSE) Log.v(TAG, "++ ON START ++");
}
@Override
public void onResume() {
super.onResume();
if (VERBOSE) Log.v(TAG, "+ ON RESUME +");
}
}
别担心你的log信息在logcat中很有创意。比如上边这个例子运行后logcat会输出的很有格式、很适合人类阅读:
V SampleActivity +++ ON CREATE +++
V SampleActivity ++ ON START++
V SampleActivity + ON RESUME +
总结
这篇帖子简单的介绍了安卓debugging可以(应该)遵循的基本思路。将来会介绍的更深入一些。
Refference:
Alex Lockwood, May 30, 2012, http://www.androiddesignpatterns.com/2012/05/intro-to-android-debug-logging.html