美文网首页
Android Studio代码导入与调试

Android Studio代码导入与调试

作者: 欢金子 | 来源:发表于2018-03-24 10:20 被阅读638次

    ///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有这个功能。

    相关文章

      网友评论

          本文标题:Android Studio代码导入与调试

          本文链接:https://www.haomeiwen.com/subject/hmrmqftx.html