Android Studio代码导入与调试

///2018032101

1.准备工作

话不多说,假设有如下目录结构的代码,想要导入Android Studio中,应该怎样操作呢?


代码结构

先说明以一下:

  • 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{

    /* 监控 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

(多图预警)

  1. 打开Android Studio,现在有两种状况


    情况一 没有项目打开

    情况二 有项目且已经打开

    这里只介绍情况二的操作,情况一后面的步骤与情况二相同

  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相关的,所以只选择JDK1.8就行了。

10.最后点击Finish

完成

由于不是Android App,所以没有检测到frameworks,第一阶段总算完成

阶段2

现在开始调试我们的应用

  1. 单击红点的位置(12行)


    单击红点的位置(12行)
  2. 点击第10行的绿色三角形,选择第10行的Debug 'Main.main'

    点击第10行的绿色三角形,选择第10行的Debug 'Main.main'

  3. 点击之后就进入了调试界面


    调试界面

    调试器工具栏


1---- 2----3----4----5----6----7---- 8
  • 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

假如代码执行到下图所式的位置:

此时 i = 1

点击Step Into
进入Log.i(String msg)方法

此时

String msg  = "1";

现在有这样一个想法,我想让方法再执行一次,且

String msg  = "1";

现在有两种方法可以解决这个问题:

  1. 结束程序运行,重新开始调试(不推荐)
  2. 点击Drop Frame,与Step Out相似,都会退出当前方法体,唯一不同的是Step Out会在方法体内留下脚印,Step Out,因为你是用脚走出方法体,肯定会留下脚印啊(强行解释 ^@^ ),Drop Frame就是直接丢掉方法体,肯定不留痕迹(干净利落),当再次进入方法时,如果方法体已经被调用过了(留下脚印),就不会再调用,而 Drop Frame 不会留下脚印,所以方法体相当于没有被调用。

再讲一个小故事


从前有一个叫线程的人,一天晚上,线程和方法相遇了,线程说:“我能进入你的世界吗?”,方法没有回答,只是轻轻点了下头。短暂的欢愉之后,线程便埋头马不停蹄的工作,方法心里明白,她留不住,方法无奈的望着天空深深的吸气,能重来就好了,忽然天空飘来一串字,Drop Frame Drop Frame~ ~ ~ 方法真的回到了和线程第一次相遇的那一晚,编不下去了。。。


说了这个多,来实际操作一下,实践是检验真理的唯一标准

在此状态下点击 Drop Frame

在上图中点击 Drap Frame ,界面就变成了下图所示的状态
Drop Frame

这个时候,我们代码又停在Log.i(String msg)这里了,我们又可以再进入方法Log.i(String msg),就相当于我们还没有执行过该方法,相比于 Step IntoStep Out,我们可以重复执行已经执行过的方法,或者仅仅是因为点击Step Over 手速太快错过了重要的方法。

PS: 在调试的过程中,发现 Android APP没法使用 Drop Frame ,不知道是不是Android 的ART没有实现这个功能,平时使用的JVM有这个功能。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343