Dexposed:Android平臺免無侵入AOP框架
近日,阿里巴巴無線事業部推出首個重量級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 ,也歡迎大家提供更多想法。
國外在移動開發開源方面非常踴躍,一些大公司如非死book、GitHub、Square等都貢獻了很多項目,但在國內還很少有公司有這個 意識,甚至有些公司不遵守開源協議。希望阿里的行為能夠帶動更多的公司從公司層面進行移動開發開源方面的活動,讓移動開發領域能夠出現更多國人項目的身 影。