本文来自阿里巴巴技术协会(ata)
本文首发于 http://www.infoq.com/cn/news/2015/07/dexposed
近日,阿里巴巴无线事业部推出首个重量级android开源项目,名为dexposed,是一个android平台下的无侵入运行期aop框架。旨在解决像性能监控、在线热补丁等移动开发常见难题,典型使用场景为:
aop编程
插桩 (如测试、性能监控等)
在线热补丁
sdk hooking以提供更好的开发体验
它基于root社区著名开源项目xposed改造剥离了root部分,演化为服务于所在应用自身的aop框架,并在apache 2.0协议下开源。
xposed是xda社区用户rovo89开发并管理的一个项目,它通过修改android dalvik运行时的zygote进程,使用xposed bridge将第三方代码注入到android应用的方法调用中,实现非侵入式的在运行期动态修改系统和应用行为的能力。从推出到现在,它受到广大开发者和用户的欢迎,出现了数千个模块和适配不同android rom的安装器。
dexposed受到xposed的启发,但它关注于应用本身,仅仅提供改变应用自身运行时行为的能力,不提供注解处理器、织入(weaver)和改变字节码的能力。它的使用也很简单,只需在应用初始化阶段引入一个jni库即可。另外,dexposed还支持art运行时,不过还在早期阶段。
infoq记者联系到该框架的作者并进行了采访,以下是我们了解到的更多信息。
dexposed作者介绍:
胡文江,淘宝花名白衣(@rock白衣),10年加入手机淘宝,目前在阿里巴巴无线事业部android架构组,主要负责android客户端基础架构及性能优化工作。有8年的智能手机软件开发经验(从早期的symbian,windowsmobile到今天的androidios),包括将近3年多的移动多媒体软件开发经验,将近4年多的大型移动互联网软件开发架构经验。
infoq:请介绍一下dexposed项目,它的原理是什么样的,在淘宝内部是如何用的?
白衣:手机淘宝在12年下半年起就在寻找客户端动态改变的能力,投入了很多人力,做了很多各种各样有益的尝试。dexposed项目就是在这种大背景下产生的。 dexposed项目是手机淘宝独立研发,业界首创的无侵入式android客户端热补丁方案的核心底层支撑技术。 它主要功能特性或者说它最强大的地方,就是在android手机上能对一个客户端app内的任何java方法进行『热』动态aop替换,java方法的aop替换是立即生效的。 dexposed中的aop原理来自于xposed。在dalvik虚拟机下,主要是通过改变一个方法对象方法在dalvik虚拟机中的定义来实现,具体做法就是将该方法的类型改变为native并且将这个方法的实现链接到一个通用的native dispatch方法上。这个 dispatch方法通过jni回调到java端的一个统一处理方法,最后在统一处理方法中调用before, after函数来实现aop。在art虚拟机上目前也是是通过改变一个 artmethod的入口函数来实现。 它的典型应用场景可以用于解决线上严重问题时的紧急发版问题或者试验细微的体验优化,目前手机淘宝在这些场景下都有使用,也在拓展更多的使用场景。感兴趣的可以看下github主页上的sample例程。
infoq:当初是为何决定将这个项目开源出来,能介绍下你们部门对于开源的态度吗?
白衣:dexposed项目最开始就是受android开源项目xposed的启发,做了创新性的改造,使之适用于单个application的情况,从而使客户端app具备实时动态改变方法的能力,高效解决了客户端app发布后碰到严重线上问题时的紧急发版问题,让app开发没有后顾之忧。饮水思源,所以希望将该技术开源出去,回馈开源社区,取dexposed的项目名,既有向原始开源项目致敬之意,也有将android的dex方法暴露出来之意。至于开源的态度,我们认为开源是大的趋势,在某些方面开源软件已经主导创新,开源无处不在。我们相信,开源会走得越来越快,而且今天任何一家公司,你不可能绕过开源技术而闭门造车。所以我们决定开源,并得到了公司的肯定和大力支持,所以说这件事也体现了阿里积极拥抱开源社区的态度。
infoq:我看到这个项目在去年archsummit上已经预告要开源,但直到现在才开源出来,这期间有什么故事吗?
白衣:这里面主要有两点,第一是想将dexposed更加完善一些(支持art-android新的java runtime)再开源,但是在研究art上遇到了很多困难,这里耽搁了比较久的时间,到目前为止对art的支持也只是初步的beta阶段,所以希望大家能一起努力交流,攻克这个难关。第二是阿里对外开源的项目也比较多,对内部技术的对外纰漏、方案开源的审查和把关上也需要一些时间。
infoq:这个开源项目的阶段性目标是什么?
白衣:现阶段的目标就是实现对art的支持。不过后续还有很多有意思的feature在计划中。大家可以看我们的roadmap,也欢迎大家提供更多想法。
国外在移动开发开源方面非常踊跃,一些大公司如facebook、github、square等都贡献了很多项目,但在国内还很少有公司有这个意识,甚至有些公司不遵守开源协议。希望阿里的行为能够带动更多的公司从公司层面进行移动开发开源方面的活动,让移动开发领域能够出现更多国人项目的身影。