Android 如何切换到 Transform API?

摘要: 如果你的 Android 构建中涉及到字节码插装(bytecode instrumentation),或者应用中提供了进行插装的插件,并希望它能支持 Instant Run,那么你必须切换到 Transform API。

目前,字节码插装虽然可以添加到构造过程中,但还没有对应的 API。通用的方法是找到 dx 任务,抓取其输入,并替换成自己的输出。随后,任务依赖就不得不重新连接,以便将新的中间任务纳入。

该方法存在一定的问题,原因如下:

-无法区分某些输入(如子模块与外部库)

-主要 dex 类列表的计算也必须包含插装输出,因此增加了处理多个遗留dex的难度。

-将一个以上第三方插装合并时会非常不稳定,而且容易被破坏。

除此之外,该方法不支持 Instant Run。尽管原始构造的APK的确能通过常规的构建步骤,热调换(hotswap)模式却可运行不同的任务。

在常规构造中,Instant Run添加了以下步骤:

-用项目类插装为代码替换添加间接法。

-复制类,以便在随后进行比较并生成覆盖类

然而,必须在任何第三方插装之后,才能执行此步骤,而以前的插装机制(在最后dx之前添加)不可能出现这种情况。

在hotswap构造时, Instant Run 会运行 java 编译程序,并将输出与先前构造的输出进行比较,以生成覆盖类。随后, Instant Run 会运行不同的dx任务,该任务仅对覆盖类进行远距离交换。这一流程和常规的构造有很大差别,而且之前的连接插装方法也完全没有使用该流程。

为了解决这个问题,我们创建了 Transform API 。目的在于提供将第一方和第三方插装连通并整合至构造流程的 API 。该 API 不处理Gradle任务,但处理需要插装的其他东西,用插件进行任务实体化和布线处理。

访问http://tools.android.com/tech-docs/new-build-system/transform-api可了解更多关于transform API的信息

目前, Transform API 还在测试阶段,我们希望能尽快进入平稳运行阶段,因此希望能得到你的建议。请加入我们的开发谷歌组,并提出建议:https://groups.google.com/forum/#!forum/adt-dev

OneAPM Mobile Insight 以真实用户体验为度量标准进行 Crash 分析,监控网络请求及网络错误,提升用户留存。访问 OneAPM 官方网站感受更多应用性能优化体验,想阅读更多技术文章,请访问 OneAPM 官方技术博客

本文转自 OneAPM 官方博客

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,699评论 25 708
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,780评论 18 399
  • 原文地址 Instant Run: How Does it Work?! Instant Run是Android ...
    sheepm阅读 1,435评论 0 16
  • 我表白那日,约在学校少有人路过的一片草地,毕竟人少好说话。到时,景安已经在那个地方,灰色卫衣搭配小脚黑色运动裤,运...
    独孤饮水阅读 196评论 0 0
  • 有些特质经常被误读成缺点,比如敏感。 觉得男朋友最近好像不关心自己,你直说,对方告诉你,是你敏感。跟朋友聊天,觉得...
    尚科教育阅读 763评论 0 3