Android Studio代碼導(dǎo)入與調(diào)試

///2018032101

1.準備工作

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


代碼結(jié)構(gòu)

先說明以一下:

  • SRC 為根目錄
  • /com/out 處于同一級目錄
  • 有兩個Java文件:com.studio.Main.javacom.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

編譯之后的代碼結(jié)構(gòu)

2. 在 out 目錄下執(zhí)行

java com.studio.Main
執(zhí)行結(jié)果

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ù)警)

  1. 打開Android Studio,現(xiàn)在有兩種狀況


    情況一 沒有項目打開

    情況二 有項目且已經(jīng)打開

    這里只介紹情況二的操作,情況一后面的步驟與情況二相同

  2. 選擇菜單中的 File

    選擇菜單中的 File

  3. 依次選擇菜單中的 New --> Import Project...

    依次選擇菜單中的 New --> Import Project...

  4. 選擇代碼根目錄 SRC 的上一級目錄點擊 OK

    選擇代碼根目錄 SRC 的上一級目錄

5.選擇 Create project from existing sources ,再點擊右下角的Next

選擇 Create project from existing sources

  1. 選擇項目名字,點擊Next

    選擇項目名字

  2. 選擇代碼根目錄,直接Next

    選擇代碼根目錄

  3. 選擇依賴的Library,直接Next

    選擇依賴的Library

  4. 選擇默認模塊,直接Next

    選擇默認模塊

  5. 選擇 JDKSDK ,直接Next

    選擇 JDK 和 SDK

    由于代碼中沒有Android相關(guān)的,所以只選擇JDK1.8就行了。

10.最后點擊Finish

完成

由于不是Android App,所以沒有檢測到frameworks,第一階段總算完成

階段2

現(xiàn)在開始調(diào)試我們的應(yīng)用

  1. 單擊紅點的位置(12行)


    單擊紅點的位置(12行)
  2. 點擊第10行的綠色三角形,選擇第10行的Debug 'Main.main'

    點擊第10行的綠色三角形,選擇第10行的Debug 'Main.main'

  3. 點擊之后就進入了調(diào)試界面


    調(diào)試界面

    調(diào)試器工具欄


1---- 2----3----4----5----6----7---- 8
  • 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í)行到下圖所式的位置:

此時 i = 1

點擊Step Into
進入Log.i(String msg)方法

此時

String msg  = "1";

現(xiàn)在有這樣一個想法,我想讓方法再執(zhí)行一次,且

String msg  = "1";

現(xiàn)在有兩種方法可以解決這個問題:

  1. 結(jié)束程序運行,重新開始調(diào)試(不推薦)
  2. 點擊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~ ~ ~ 方法真的回到了和線程第一次相遇的那一晚,編不下去了。。。


說了這個多,來實際操作一下,實踐是檢驗真理的唯一標準

在此狀態(tài)下點擊 Drop Frame

在上圖中點擊 Drap Frame ,界面就變成了下圖所示的狀態(tài)
Drop Frame

這個時候,我們代碼又停在Log.i(String msg)這里了,我們又可以再進入方法Log.i(String msg),就相當(dāng)于我們還沒有執(zhí)行過該方法,相比于 Step IntoStep Out,我們可以重復(fù)執(zhí)行已經(jīng)執(zhí)行過的方法,或者僅僅是因為點擊Step Over 手速太快錯過了重要的方法。

PS: 在調(diào)試的過程中,發(fā)現(xiàn) Android APP沒法使用 Drop Frame ,不知道是不是Android 的ART沒有實現(xiàn)這個功能,平時使用的JVM有這個功能。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容