我们开发中经常使用IDE的Debug功能,使用最频繁的就是断点查看变量内容,这篇文章主要是介绍在Debug时很常用的一些功能,如Debug变量更新、动态代码植入等。

背景

看下面一段代码

@Data

@ToString

@AllArgsConstructor

public class User {

private String name;

private String sex;

}

public class Client {

private static final String[] NAMES = {"美队", "浩克", "黑寡妇"};

private static final List USERS = Arrays.stream(NAMES)

.map(name -> new User(name, "男"))

.collect(Collectors.toList());

public static void main(String[] args) {

for (User user : USERS) {

System.out.println(user);

}

}

}

我们直接运行这段代码,得到的输出如下

Client.User(name=美队, sex=男)

Client.User(name=浩克, sex=男)

Client.User(name=黑寡妇, sex=男)

接下来都会围绕这段代码进行说明

普通断点

开发过程中普通断点在Debug过程中使用的算是最频繁的,只要在代码处添加该类型的断点,在Debug模式下,一旦代码执行到改行,程序将进入挂起状态,此时我们能查看到当前的运行状态,如图

条件断点

当添加断点的方法会被多次执行到,而我们只希望程序在特定的一些特定的地方(如只有在当前的user是 黑寡妇 时)断下来,此时我们可以借助条件断点,如下

注意看一下 Condition 部分,此处需要返回一个 boolean 类型的值,该值就是为了告诉程序当执行到该行代码时是否进行断点,true表示进行断点,false反之。上面只需要对 黑寡妇 进行断点,所以添加的 Condition 是 "黑寡妇".equals(user.getName()) 。

改变变量状态

有时需要对断点时的变量赋值操作,已更改此时变量的值,这时可以使用 Set Value 方式,如下

除了 Set Value ,还可以通过估值器进行改变值状态,如下

条件断点 + 代码植入

改变变量状态能够动态地设置变量值,条件断点可以控制断点是能在此处挂起,那将两者结合就能达到在程序不挂起的情况下进行动态代码植入的效果。

Condition 里插入的代码如下

if ("黑寡妇".equals(user.getName())) {

user.setSex("女");

}

// 此处返回false为了告诉IDE在该断点出不对程序执行挂起操作

return false;

这就相当于提供了运行期代码的动态植入功能,而且可以通过 Enable/Disable 断点的状态来进行开启/关闭该部分动态代码是否执行。我们可以通过这种方式添加任何希望添加的代码,比如在每个user对象print之前添加自定一段print

应用场景

Debug期间动态植入的应用场景其实有很多的,对应Android端,有时候只需要改变一个变量,添加一行代码就需要重新run整个Project,需要花费整个compile和install的时间才能看出改动之后的效果,如果当前这次更改无效的话,甚至需要再次修改再次运行,而通过debug方式,可以直接对其进行操作。对于后端每次改动之后的重新部署也一样(不考虑动态部署的情况)。

以Android场景为例,如下的代码,接收一个 imageUrl 参数并加载出来

public class ImageActivity extends Activity {

private static final String KEY_CONTENT = "imageUrl";

public static void open(Context context, String content) {

Intent intent = new Intent(context, ImageActivity.class);

intent.putExtra(KEY_CONTENT, content);

context.startActivity(intent);

}

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

ImageView imageView = findViewById(R.id.image);

// 取出参数内容

String imageUrl = getIntent().getStringExtra(KEY_CONTENT);

Glide.with(this).load(imageUrl).into(imageView);

}

}

未植入代码之前,跳转到当前页面是这样的

此时如果需要动态改变当前的 imageUrl 参数,可以进行Debug模式,并通过动态代码植入方式进行 imageUrl 变量的重赋值,如下

添加植入的复制代码之后,进入Debug模式,然后重新进入该页面,显示的图片便替换为修改后的了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

android 代码植入,Android Studio之Debug运行期代码植入的方法相关推荐

  1. android 代码植入,Android Studio之Debug(一):运行期代码植入

    我们开发中经常使用IDE的Debug功能,使用最频繁的就是断点查看变量内容,这篇文章主要是介绍在Debug时很常用的一些功能,如Debug变量更新.动态代码植入等. 背景 看下面一段代码 @Data ...

  2. Delphi常见的运行期Access Violation错误分析

    Delphi常见的运行期Access Violation错误有哪些?如何防止? 任何软件开发都会遇到这样的情况:你写好程序并测试,然后到处发送,结果用户告诉你它失败了. 你可能考虑用编译指令{$D}编 ...

  3. Android Studio Library 模块中 Native 代码进行 debug 的一些坑

    前言 如果项目中存在多个module,那么在application模块中依赖library模块,并且library模块中有native代码的时候,假设你需要debug library模块中的这些nat ...

  4. Android Studio 单刷《第一行代码》系列 02 —— 日志工具 LogCat

    前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...

  5. Android Studio(2)---如何从不同IDE 工具开发的代码导入 Android Studio

    如何从不同IDE 工具开发的代码导入 Android Studio 将项目迁移至 Android Studio 需要适应新的项目结构.构建系统和 IDE 功能. 如果您要从 Eclipse 迁移至 A ...

  6. [安卓开发笔记二]android Studio通过jni调用C++代码

    [安卓开发笔记二]android Studio通过jni调用C++代码 16/12/11 更新 此博客基于安卓android studio 1.5所写,现在已经有了android studio2.2的 ...

  7. Android Studio编写运行测试纯java代码可带main()函数

    问题 小伙伴们在做安卓项目的时候,是不是有时候会忘记某些api的使用方法,不太确定他们的结果是怎样的,需要写一些测试代码,验证看看我们的写法是否正确.刚开始的时候我是在页面上写一个Button,添加点 ...

  8. Android Studio 单刷《第一行代码》系列 07 —— Broadcast 广播

    前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...

  9. Android Studio 单刷《第一行代码》系列 06 —— Fragment 生命周期

    前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...

最新文章

  1. 检查数据库的CPU和PSU补丁信息
  2. 福州大学计算机组成原理试题,2016年福州大学计算机专业基础C复试之计算机组成原理复试笔试最后押题五套卷...
  3. 使用coding.net上传项目
  4. MRP例外消息处理方法
  5. java弹窗点击事件_[Java教程]jQuery的click事件在当前页弹出层窗口(不打开新页面)...
  6. Android手绘效果实现
  7. 兼容IE和FF:获取Referer的JS和PHP方法 及 PHP利用curl伪造IP和来路
  8. rtsp 报文转发_rtsp_proxy_server
  9. 今天的C位,必须是这位浙大卜教授!
  10. Android安全之Https中间人攻击漏洞
  11. vscode如何配置java环境_VSCode 配置Java环境
  12. 龙芯 LS2K 16G 内存支持
  13. 【Social listening实操】从社交媒体传播和文本挖掘角度解读《欢乐颂2》
  14. HNOI2014 世界树 基于虚树的树形动态规划
  15. Docker搭建数据库监控工具Lepus
  16. 在小程序内嵌的webview中唤醒手机地图app
  17. 【每日一题】039 手机尾数
  18. ubuntu系统shell 中source: not found错误
  19. 全球与中国蘑菇市场深度研究分析报告
  20. 请问怎么用quickbms解压VIV文件

热门文章

  1. Atitit.实现反向代理(1)----url rewrite 配置and内容改写 and -绝对路径链接改写 java php...
  2. 使用xorm工具,根据数据库自动生成 go 代码
  3. 宝岛探险1(BFS)
  4. kali安装步骤失败 选择并安装软件_PhotoShop CS5中文版软件下载+安装详细步骤
  5. uniapp image图片切换动效_谷歌设计团队发布了一款动效神器,让 UI 和动效无缝打通...
  6. java反编译工具_移动app安全测试 - 客户端 - 反编译保护
  7. 计算机科学已发展成为一门,计算机前沿技术论文
  8. header php下载文件很小,php中Accept-Length获取不到下载文件的大小
  9. mysql 查询表的key_MySQL学习笔记-查看表,修改表,删除表
  10. 中国计算机应用大会2021,第二届机器学习与计算机应用国际学术会议(ICMLCA 2021)...