乐趣区

关于android:Apply-Changes-在-Android-11-中的增强特性

简介

Apply Changes 是 Android Studio 中的一项性能,咱们在 Android Studio 3.5 中引入了这项性能,以帮忙开发者疾速迭代您对利用所做的更改。Apply Changes 通过 JVMTI API 来判断是否能够应用此形式进行变更。在 Android 11 上,ART (Android 运行时) 扩大了 JVMTI API,引入了一个名为 Structural Class Redefinition (类的结构性重定义) 的新性能。该性能使 Apply Changes 在 Android 11 设施上减少了一类新的利用场景。当初,能够应用 Apply Changes 将更简单的批改疾速部署到正在运行的利用上,这包含:

  • 减少办法 (Android Studio 4.1)
  • 减少资源文件 (Android Studio 4.2)
  • 减少动态字段 (Android Studio 4.2)

这能够使您缩小研发周期,最大化生产效率。本文咱们将探讨在 Android Studio 中该性能是如何实现的。

通过 Android Studio 实现更强的性能

Apply Changes 基于 Android Runtime 个性从头设计,所以能够利用其降级更新的性能一直倒退。

对于类的结构性重定义而言,将具备新增办法的类发送到 ART,这与之前的 Android 版本没有什么不同。现在新增了一个入口 API,为此您须要将 Android Studio 降级到 4.1 或更高版本,以利用动静在运行中增加新办法的劣势,包含静态方法和虚办法。

然而,减少变量须要在 Android Studio 中进行新的剖析。当减少一个新的变量时,ART 不会尝试为其调配具体的值。(请继续关注后续对于 ART 实现类的结构性重定义的文章)。取而代之的是,被减少的变量仅会被初始化为默认初始值或 null,并且如何初始化将由 Android Studio 决定。

此过程较为简单,思考这样一种状况: 将 long 类型动态变量 y 增加到类中 (y 的初始化产生在类加载期间)。例如:

public class example {public final static long x = System.currentTimeMillis();
   public final static long y = System.currentTimeMillis();}

如果该类被加载,x 和 y 的值将会十分靠近。在通过应用 Apply Code Changes 减少 y 的状况下,很难计算出正确的 y 值。事实上对 y 的赋值,即便采纳最靠近的模仿类加载和初始化 y 的程序,也是有争议的。因为两个 curentTimeMillis() 在动态初始化 (<clinit> 办法 ) 中调用,Apply Changes 将持续恪守不从新执行 <clinit> 办法任何局部的策略,所以新增的 y 值为 0。

侥幸的是,Apply Changes 曾经 应用了 D8 剖析 DEX 文件,并且作为该过程的一部分,在最新版本的 Android Studio 中,Apply Changes 可能利用 D8 新引入的 Inspector API。这种轻量级的查看 API 可能在 DEX 比拟过程中计算出一些额定的信息,而仅需减少大量开销 (仅查看产生批改的 Java 类)。一系列无关新增变量的元信息将被附加在发送到对应设施的 Apply Changes 申请的 ProtoBuf 音讯中。

在设施上,Android Studio 将咱们的更改传播给 VM 之前,Java Agent 将查看行将被替换的以后加载类。通过比拟以后加载类和新编译类的字段,即可计算出新增字段列表及每个字段的初始值。而后,代理程序将临时挂起所有其余线程,避免未初始化的新增字段在替换前被拜访。如果替换申请胜利执行,它将应用适合的变量初始化新增字段。

局限与行将推出的新性能

在 Android Studio 4.2 Canary 3 中,此性能仅反对新增动态原语的利用场景。作为衍生性能,这有助于在 R.class 中新增值,使 Apply Changes 反对新增资源。

对于所有应用 Apply Changes 的场景中,须要记住一点: 当您从新编译并从新运行一个程序,任何语义和之前都是不同的。试想这样的一个例子: 构造函数产生了变动,然而所有基于原来的构造函数初始化的对象并没有从新初始化。同样的,该规定也实用于动态变量,因为 <clinits> 不会被从新调用。

心愿 Android Studio 中这一新性能能够为开发者带来生产力的进步。咱们判若两人地欢送大家给咱们 反馈,并让咱们晓得您心愿看到哪些改良。

退出移动版