零、前言
开发Android程序时,不仅要注意程序代码的准确性和合理性,还要处理程序中可能出现的异常。Android SDK为我们提供了Log类来获取程序的日志信息,也提供了LogCat管理器,用来查看程序运行的日志信息及错误日志。本文将详细的讲解如何在android studio中,对Android程序进行调试以及DDMS工具的使用。
一、 使用 Log 类来输出日志信息
Android SDK中提供了Log类来获取程序运行时的日志信息,该类在android.util包中,它继承了java.lang.Object类。Log类提供了一些方法,用来输出日志信息,常用的是以下几个:
方法 | 解析 |
Log.i() | 输出INFO程序日志信息 |
Log.e() | 输出ERROR错误日志信息 |
Log.d() | 输出DEBUG调试日志信息 |
Log.v() | 输出VERBOSE冗余日志信息 |
Log.w() | 输出WARN警告日志信息 |
上表中列出的Log类的这些方法都有多种重载形式,下面将介绍经常用到的重载形式:
1.1 Log.i()
Log.i()主要用来输出INFO程序日志信息。程序员经常用到的重载形式语法:
public static int i (String key,String value)
key:String字符串,用来为日志信息指定标签,程序员经常将他命名为该类的名称,加以区分。
value:String字符串,用来表示要输出的字符串信息。
INFO程序日志在DDMS的LogCat面板中,一般使用绿色的文字来表示。
1.2 Log.e()
Log.e()方法主要用来输出ERROR错误日志信息。程序员经常用到的重载形式:
public static int e (String key,String value)
key:String字符串,用来为日志信息指定标签,程序员经常将他命名为出现错误的类名称,加以区分。
value:String字符串,用来表示要输出的字符串信息。
ERROR错误日志在DDMS的LogCat面板中,一般使用红色的文字来表示。
1.3 Log.d()
Log.d()方法主要用来输出DEBUG调试日志信息。程序员经常用到的重载形式:
public static int d (String key,String value)
key:String字符串,用来为日志信息指定标签,程序员经常将他命名为可能出现DEBUG的类名称,加以区分。
value:String字符串,用来表示要输出的字符串信息。
DEBUG调试日志在DDMS的LogCat面板中,一般使用蓝色的文字来表示。
1.4 Log.v()
Log.v()方法主要用来输出VERBOSE冗余日志信息。程序员经常用到的重载形式:
public static int v (String key,String value)
key:String字符串,用来为日志信息指定标签,程序员经常将他命名为可能出现冗余的类名称,加以区分。
value:String字符串,用来表示要输出的字符串信息。
VERBOSE冗余日志在DDMS的LogCat面板中,一般使用黑色的文字来表示。
1.5 Log.w()
Log.w()方法主要用来输出WARN警告日志信息。程序员经常用到的重载形式:
public static int w (String key,String value)
key:String字符串,用来为日志信息指定标签,程序员经常将他命名为可能出现警告的类名称。
value:String字符串,用来表示要输出的字符串信息。
WARN警告日志在DDMS的LogCat面板中,一般使用橘黄色的文字来表示。
我们可以在MainActivity.java中输入以下代码
1. public class MainActivity extends AppCompatActivity { 2. 3. @Override 4. protected void onCreate(Bundle savedInstanceState) { 5. super.onCreate(savedInstanceState); 6. setContentView(R.layout.activity_main); 7. 8. Log.e("zwz01","错误信息"); 9. Log.w("zwz02","警告信息"); 10. Log.i("zwz03","普通信息"); 11. Log.d("zwz04","调试信息"); 12. Log.v("zwz05","冗余信息"); 13. 14. } 15. }
打开DDMS工具,单机LogCat日志面板,可以在面板内看到如下信息。
二、 Android程序调试
在程序开发过程中,程序员会不断体会到程序调试的重要性。为了验证Android的运行状况是否和自己想的一样,程序员一般都会在某个方法调用开始和结束的位置,依次使用Log.i()方法输出一定的信息,并根据这些输出信息来判断程序的执行状况。当然这是一种非常过时的程序调试方法,而且会经常造成程序代码混乱,下面来介绍使用Android studio自带的调试工具来调试Android应用程序的方法。
2.1 加断点
下面将详细讲解使用 Android Studio 内置的Android调试器调试Android程序的方法,使用该调试器可以设置程序的断点、实现程序的但不执行、在调试过程中查看变量和表达式的值等调试操作,这样可以避免上述所说的使用Log.i()方法输出调试信息。
使用 Android Studio 的Android调试器需要先设置程序断点,然后使用单步调试分别执行程序代码的每一行。
设置断点是程序调试中必不可少的有效手段,和java代码在eclipse中调试一样,Android调试器在每次遇到程序断点的时候,都会将当前线程挂起,也就是说暂停当前程序的运行。在 Android Studio中,可以在Android编辑器中单击显示代码行号的位置,就可以添加或者删除当前行的断点,如下图所示:
2.2 简单调试
为程序设置断点后,单击工具栏的Debug按钮,或者右击代码区域,选择Debug MainActivity.java,将在Android Studio 的底部显示调试面板,查看到当前相关变量的值,如下图所示:
在调试面板中,可以通过工具栏上的按钮执行相应的调试操作,比如单步跳过、单步跳入等等。常用的调试操作如下:
2.3 单步跳过
在工具栏中单击 单步跳过,或者按下F8,将执行单步跳过操作,即运行单独的一行程序代码,但是不进入调用方法的内部,然后跳到下一个可执行点。
如果运行a + b程序,代码如下:
1. public class MainActivity extends AppCompatActivity { 2. 3. public static int add (int x,int y){ 4. return x + y; 5. } 6. 7. @Override 8. protected void onCreate(Bundle savedInstanceState) { 9. super.onCreate(savedInstanceState); 10. setContentView(R.layout.activity_main); 11. 12. int a = add(1,2); 13. 14. int b = add(-1,-2); 15. } 16. }
在int a = add(1,2);处加上断点
然后按下F8,我们可以看到,程序直接运行到第20行,而没有进入add()方法。
如果不断地执行单步跳过操作,会每次执行一行的程序代码,直到程序结束或者等待用户操作(如输入)。
2.4 单步跳入
在工具栏点击 单步跳入 , 或者按下F7键,就会跳入到调用方法或对象内部单步执行程序
还是刚刚的 a + b 的例子,在第18行断点处,按下F7,则会进入到add()方法的内部。
2.5 跳到下一断点
在工具栏中单击 跳到下一断点 按钮,或者按下F9,会继续向下执行,直到下一个断点的位置。如果程序中没有断点或者抛出了异常,将直接运行到程序结束。
2.6 停止调试
在工具栏中单击停止按钮,即红色的正方形:,会停止程序的调试。需要注意的是,该操作不回停止程序的运行,而是会跳过所有的调试。