ZeroTurnaround发布了 JRebel for Android的第一个稳定版本 。它是流行插件JRebel的Android版本,允许修改正在运行中的应用程序,而且不必重新部署或重启。JRebel for Android适用于Android Studio,可以从 JetBrains插件库 下载,支持所有运行Android 4.0及以上版本的手机和平板。ZeroTurnaround提供了为期21天的免费试用,起步价为每年49美元。
Android开发人员经常抱怨底层技术如何导致了缓慢的反馈回路。开发人员每次想要查看代码修改的效果时,都需要将Android应用重新编译、打包和安装到Android设备上并重启。除了需要耽误时间外,如果修改的特性是特定工作流中下游的一些步骤,开发人员还将不得不在每次变更部署后重新检查整个工作流。为此, 开发者社区呼吁创建一种热交换功能 至少已经有两年了。
为了满足这个需求,ZeroTurnaround在2014年开始了与JRebel for Android相关的工作,并在2015年4月提供了一个 测试版本 。基于来自测试计划的反馈,ZeroTurnaround在2015年9月推出了 早期试用版 。JRebel for Android插件会向Android Studio的Run菜单添加新的操作选项,并修改Gradle构建文件,将允许同正在运行的应用程序进行代码热交换的工具包含进来。在 Vimeo 上, ZeroTurnaround官方账号 提供了一个演示视频—— JRebel for Android实战 。
JRebel for Android in Action from Official ZeroTurnaround Account on Vimeo .
虽然提供了类似的功能,但底层技术的差别意味着传统的JRebel与JRebel for Android有着截然不同的工作方式。对于JRebel,Java代码的变化会被编译,而生成的字节码会通过类的重新加载插入到正在运行的Web应用程序。但是,Android甚至都不使用Java虚拟机:直到Android 4.0,Java代码都是被编译成DEX文件,然后由 Dalvik虚拟机 解释执行(在必要的打包和安装之后);从Android 5.0往后,DEX文件接下来会被设备本身编译成原生机器代码;因此需要一种不同的方法。
按照ZeroTurnaround的说明,JRebel for Android修改项目的Gradle构建文件,创建一个只包含JRebel for Android代理的shell APK;这是唯一一个需要安装到开发用Android设备上的APK。然后,实际的应用程序(DEX文件和资源)会通过ADB发送给代理,后者会将它们作为一个正在运行的应用加载。一旦有修改,相关的DEX文件就会重新构建并同修改过的资源一起发送给代理,而不需要重新创建或安装一个新的APK。
为了动态加载变化了的代码,代理会针对栈里最上面的活动调用Activity.recreate,就是说会调用onCreate、onStart、onResume。因此,为了使应用能够准确地在原处重新加载,开发人员需要恰当地处理onSaveInstanceState。
JRebel for Android代理只存在于开发过程中,当准备正式发布时,APK中会只包含相关的DEX文件和资源。
由于社区对于这类应用程序存在很大的需求,过去几年来已经出现了若干类似JRebel for Android的工具。虽然在InfoQ调查过的工具里面,没有一款同JRebel一样功能完善,但它们可能适合某些特定的需求,因此也值得一提。
Buck (Exopackage):由Facebook创建,使用它需要修改应用。免费使用。
Mirror :仅用于布局的快速编辑,不能向设备推送代码。一次性支付79美元即可获得使用许可,也可以免费试用30天。
Intel XDK 中的“在线开发任务(Live Development Tasks)”:Intel XDK是一个基于 Cordova 开发HTML5混合应用的IDE,不支持原生Android应用开发。免费使用。
Android设计预览 :该工具仅简单地将部分桌面镜像到Android设备上;它不支持设备内交互,但可以提供一种快速测试布局的方法。免费使用。
LayoutCast :尚处于早期开发阶段,因此功能有限且存在稳定性问题。只能用于Android 5及更高版本。免费使用。
感谢谢丽对本文的审校。
给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ,@丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入InfoQ读者交流群 (已满),InfoQ读者交流群(#2) )。