Dexposed:Android平臺免Root無侵入AOP框架

mtt1111發表於2015-12-25

本文來自阿里巴巴技術協會(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等都貢獻了很多專案,但在國內還很少有公司有這個意識,甚至有些公司不遵守開源協議。希望阿里的行為能夠帶動更多的公司從公司層面進行移動開發開源方面的活動,讓移動開發領域能夠出現更多國人專案的身影。


相關文章