///2018032101
1.准备工作
话不多说,假设有如下目录结构的代码,想要导入Android Studio中,应该怎样操作呢?
先说明以一下:
-
SRC
为根目录 -
/com
和/out
处于同一级目录 - 有两个Java文件:
com.studio.Main.java
和com.utils.Log.java
com.studio.Main.java
package com.studio;
import com.utils.Log;
public class Main{
/* 监控 i 值的变化,i == 25 ,此值变为 1 */
private static int signal = 0;// (0)
public static void main(String[] argv){
for(int i = 0; i < 50;i ++){// (1)
//打印 i 值
Log.i(i+"");// (2)
//检查 i 是否为 25
if(i == 25){// (3)
signal = 1;
}
//每次睡眠 1s
try{
Thread.sleep(1000);
}
catch( InterruptedException e){
//打印错误信息
Log.i(e.toString());
}
}
}
}
com.utils.Log.java
package com.utils;
import java.util.logging.Logger;
import java.util.logging.Level;
/* Log 工具类 */
public class Log{
private static final String LOGGER_NAME = "YH";
private static Logger mLogger = Logger.getLogger(LOGGER_NAME);
public static void i(String msg){
mLogger.log(Level.INFO,msg);
}
}
1. 在 SRC
目录下执行
javac -d out com/studio/Main.java
2. 在
out
目录下执行
java com.studio.Main
2.环境说明
Ubuntu 17.10
Android Studio 3.0.1
openjdk version "1.8.0_151"
OpenJDK Runtime Environment (build 1.8.0_151-8u151-b12-0ubuntu0.17.10.2-b12)
OpenJDK 64-Bit Server VM (build 25.151-b12, mixed mode)
3.导入代码
阶段1
(多图预警)
-
打开Android Studio,现在有两种状况
这里只介绍情况二的操作,情况一后面的步骤与情况二相同
-
选择菜单中的
File
-
依次选择菜单中的
New --> Import Project...
-
选择代码根目录
SRC
的上一级目录点击OK
5.选择 Create project from existing sources
,再点击右下角的Next
-
选择项目名字,点击
Next
-
选择代码根目录,直接
Next
-
选择依赖的Library,直接
Next
-
选择默认模块,直接
Next
-
选择
JDK
和SDK
,直接Next
由于代码中没有Android
相关的,所以只选择JDK1.8
就行了。
10.最后点击Finish
由于不是
Android App
,所以没有检测到frameworks
,第一阶段总算完成
阶段2
现在开始调试我们的应用
-
单击红点的位置(12行)
-
点击第10行的绿色三角形,选择第10行的
Debug 'Main.main'
-
点击之后就进入了调试界面
调试器工具栏
- 1.
Show Execution Point
跳到代码执行位置(当前位置在12行) - 2.
Step Over
执行一行代码(点击按钮代码会执行到15行处停住) - 3.
Step Into
进入方法体(不会进入库函数的方法体) - 4.
Force Step Into
进入方法体 (会进入库函数的方法体,比如类的加载,loadClass方法等) - 5.
Step Out
跳到上一层方法体 - 6.
Drop Frame
丢掉栈顶的方法体,因为此时线程的方法栈里面只有一个方法体(main
),把这个方法体丢掉程序就退出了,所以这个按钮在工具栏中是灰色的,这个工具在调试的时候非常好用,稍后会详细介绍。 - 7.
Run to Cursor
运行到光标的位置停住代码,如果在光标前面有断点,代码会停在断点处,而不是光标处 - 8.
Evaluate Expression
表达式计算器,可以把它想像成一个Shell
命令行,程序在断点停住时,类的成员,局部变量等就是Shell
的环境变量,在这可以很方便的调试网络连接,数据库查询等需要复杂参数传递的场景。
重点介绍 Drop Frame
假如代码执行到下图所式的位置:
点击
Step Into
此时
String msg = "1";
现在有这样一个想法,我想让方法再执行一次,且
String msg = "1";
现在有两种方法可以解决这个问题:
- 结束程序运行,重新开始调试(不推荐)
- 点击
Drop Frame
,与Step Out
相似,都会退出当前方法体,唯一不同的是Step Out
会在方法体内留下脚印,Step Out
,因为你是用脚走出方法体,肯定会留下脚印啊(强行解释 ^@^ ),Drop Frame
就是直接丢掉方法体,肯定不留痕迹(干净利落),当再次进入方法时,如果方法体已经被调用过了(留下脚印),就不会再调用,而Drop Frame
不会留下脚印,所以方法体相当于没有被调用。
再讲一个小故事
从前有一个叫线程的人,一天晚上,线程和方法相遇了,线程说:“我能进入你的世界吗?”,方法没有回答,只是轻轻点了下头。短暂的欢愉之后,线程便埋头马不停蹄的工作,方法心里明白,她留不住,方法无奈的望着天空深深的吸气,能重来就好了,忽然天空飘来一串字,Drop Frame
Drop Frame
~ ~ ~ 方法真的回到了和线程第一次相遇的那一晚,编不下去了。。。
说了这个多,来实际操作一下,实践是检验真理的唯一标准
在上图中点击
Drap Frame
,界面就变成了下图所示的状态这个时候,我们代码又停在
Log.i(String msg)
这里了,我们又可以再进入方法Log.i(String msg)
,就相当于我们还没有执行过该方法,相比于 Step Into
和 Step Out
,我们可以重复执行已经执行过的方法,或者仅仅是因为点击Step Over
手速太快错过了重要的方法。
PS: 在调试的过程中,发现 Android APP没法使用 Drop Frame
,不知道是不是Android 的ART没有实现这个功能,平时使用的JVM有这个功能。