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及更高版本。免费使用。