///2018032101
1.準備工作
話不多說,假設(shè)有如下目錄結(jié)構(gòu)的代碼,想要導(dǎo)入Android Studio中,應(yīng)該怎樣操作呢?

先說明以一下:
-
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{
/* 監(jiān)控 i 值的變化,i == 25 ,此值變?yōu)?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 目錄下執(zhí)行
javac -d out com/studio/Main.java

2. 在
out 目錄下執(zhí)行
java com.studio.Main

2.環(huán)境說明
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.導(dǎo)入代碼
階段1
(多圖預(yù)警)
-
打開Android Studio,現(xiàn)在有兩種狀況
情況一 沒有項目打開
情況二 有項目且已經(jīng)打開
這里只介紹情況二的操作,情況一后面的步驟與情況二相同
-
選擇菜單中的
File
選擇菜單中的 File -
依次選擇菜單中的
New --> Import Project...
依次選擇菜單中的 New --> Import Project... -
選擇代碼根目錄
SRC的上一級目錄點擊OK
選擇代碼根目錄 SRC 的上一級目錄
5.選擇 Create project from existing sources ,再點擊右下角的Next

-
選擇項目名字,點擊
Next
選擇項目名字 -
選擇代碼根目錄,直接
Next
選擇代碼根目錄 -
選擇依賴的Library,直接
Next
選擇依賴的Library -
選擇默認模塊,直接
Next
選擇默認模塊 -
選擇
JDK和SDK,直接Next
選擇 JDK 和 SDK
由于代碼中沒有Android相關(guān)的,所以只選擇JDK1.8就行了。
10.最后點擊Finish

由于不是
Android App,所以沒有檢測到frameworks,第一階段總算完成
階段2
現(xiàn)在開始調(diào)試我們的應(yīng)用
-
單擊紅點的位置(12行)
單擊紅點的位置(12行) -
點擊第10行的綠色三角形,選擇第10行的
Debug 'Main.main'
點擊第10行的綠色三角形,選擇第10行的Debug 'Main.main' -
點擊之后就進入了調(diào)試界面
調(diào)試界面
調(diào)試器工具欄

- 1.
Show Execution Point跳到代碼執(zhí)行位置(當(dāng)前位置在12行) - 2.
Step Over執(zhí)行一行代碼(點擊按鈕代碼會執(zhí)行到15行處停住) - 3.
Step Into進入方法體(不會進入庫函數(shù)的方法體) - 4.
Force Step Into進入方法體 (會進入庫函數(shù)的方法體,比如類的加載,loadClass方法等) - 5.
Step Out跳到上一層方法體 - 6.
Drop Frame丟掉棧頂?shù)姆椒w,因為此時線程的方法棧里面只有一個方法體(main),把這個方法體丟掉程序就退出了,所以這個按鈕在工具欄中是灰色的,這個工具在調(diào)試的時候非常好用,稍后會詳細介紹。 - 7.
Run to Cursor運行到光標的位置停住代碼,如果在光標前面有斷點,代碼會停在斷點處,而不是光標處 - 8.
Evaluate Expression表達式計算器,可以把它想像成一個Shell命令行,程序在斷點停住時,類的成員,局部變量等就是Shell的環(huán)境變量,在這可以很方便的調(diào)試網(wǎng)絡(luò)連接,數(shù)據(jù)庫查詢等需要復(fù)雜參數(shù)傳遞的場景。
重點介紹 Drop Frame
假如代碼執(zhí)行到下圖所式的位置:

點擊
Step Into
此時
String msg = "1";
現(xiàn)在有這樣一個想法,我想讓方法再執(zhí)行一次,且
String msg = "1";
現(xiàn)在有兩種方法可以解決這個問題:
- 結(jié)束程序運行,重新開始調(diào)試(不推薦)
- 點擊
Drop Frame,與Step Out相似,都會退出當(dāng)前方法體,唯一不同的是Step Out會在方法體內(nèi)留下腳印,Step Out,因為你是用腳走出方法體,肯定會留下腳印?。◤娦薪忉?^@^ ),Drop Frame就是直接丟掉方法體,肯定不留痕跡(干凈利落),當(dāng)再次進入方法時,如果方法體已經(jīng)被調(diào)用過了(留下腳?。?,就不會再調(diào)用,而Drop Frame不會留下腳印,所以方法體相當(dāng)于沒有被調(diào)用。
再講一個小故事
從前有一個叫線程的人,一天晚上,線程和方法相遇了,線程說:“我能進入你的世界嗎?”,方法沒有回答,只是輕輕點了下頭。短暫的歡愉之后,線程便埋頭馬不停蹄的工作,方法心里明白,她留不住,方法無奈的望著天空深深的吸氣,能重來就好了,忽然天空飄來一串字,Drop Frame Drop Frame~ ~ ~ 方法真的回到了和線程第一次相遇的那一晚,編不下去了。。。
說了這個多,來實際操作一下,實踐是檢驗真理的唯一標準

在上圖中點擊
Drap Frame ,界面就變成了下圖所示的狀態(tài)
這個時候,我們代碼又停在
Log.i(String msg)這里了,我們又可以再進入方法Log.i(String msg),就相當(dāng)于我們還沒有執(zhí)行過該方法,相比于 Step Into 和 Step Out,我們可以重復(fù)執(zhí)行已經(jīng)執(zhí)行過的方法,或者僅僅是因為點擊Step Over 手速太快錯過了重要的方法。
PS: 在調(diào)試的過程中,發(fā)現(xiàn) Android APP沒法使用 Drop Frame ,不知道是不是Android 的ART沒有實現(xiàn)這個功能,平時使用的JVM有這個功能。












