如何看待阿里開源的dexposed框架?

該框架與xposed有什麼區別,看介紹,可以簡單的hook指定的函數,包自己的代碼以及framework層。對於開發者有什麼意義,另外hook自己的代碼不需要root,framework的需要?


從AOP的角度來看,這是效率的大幅度提升。首先它不需要任何編譯器的插樁或者代碼改寫,對正常運行不引入任何性能開銷。這是AspectJ之類的框架沒法比擬的優勢。其次,對所改寫方法的性能開銷也極低(微秒級),基本可以忽略不計。這就決定了它是一個不可多得的AOP解決方案,雖然僅限Android下,而且有些限制和兼容性制約。

從工程的角度來看,熱補丁僅僅是牛刀小試,它真正的威力在於『線上調試』。做App開發的同學一般會羨慕服務端開發的同學,遇到問題之後有充足的日誌和各種監控數據方便排查問題,最不濟也可以臨時加調試代碼;而App出點啥問題只要沒有『先見之明』的埋點,基本上就是兩眼一抹黑。這邊PM和老大在背後咆哮,你坐在電腦前面都不知道從哪下手。但是基於Dexposed實現的線上調試可以實現真正意義上的遠程調試,點對面甚至是點對點的。根本不用擔心沒有事先埋點,需要加調試、加日誌什麼的,隨時部署,分分鐘後就可以看到需要的調試信息,無論是方法參數值、返回值,拋出的異常,還是調用路徑,十萬八千里外的兇案現場全部了如指掌,直如身臨其境。找到問題之後,馬上打個補丁,再遠程調試看一下是不是圓滿解決。這個用途在工程上的意義是真正跨越性的。

從技術的角度來看,基於Xposed原理實現的AOP不僅可以hook自己的代碼,還可以hook同進程的Android SDK代碼,這也就可以讓我們有能力在App中填上Google自己挖的坑,避免用一些非常痛苦的workaround,對於一些複雜的安全漏洞尤其有效。

最後,從開源的角度來看,Dexposed本身從名字而言就是對Xposed的致敬,我們也通過開源Dexposed反哺社區,與整個社區共同分享和推進我們的成果。(即便Apache協議本身並沒有連帶開源的約束)

BTW,搞不懂Dexposed與Xposed關鍵性差別,也不懂開源社區文化和遊戲規則就說抄襲的同學,可以去洗洗睡了,我都懶得反駁了。

利益相關:Dexposed開源項目曾經的主導者。


手淘的熱部署就是依賴xposed_bridge

這沒有什麼抄襲一說,輪子拿來用就好。

xposed框架之所以需要root,

是因為它要劫持zygote進程來hook系統方法;

手淘的熱部署只需要劫持自己程序(classLoader)內的方法,即xposed在程序內的去root化實現,通過hook來改寫某個方法。不過這個不支持art,有新的解決方案,暫時不細說。


dexposed框架的aop原理來自Xposed,不同的是,Xposed通過劫持 zygote(須root),而dexposed通過劫持 java method ( 而非樓上說的劫持class loader方法),將java method改變為native,並且將這個方法的實現鏈接到一個通用的Native Dispatch方法上.(下圖為原理,援引自qcon大會 手淘hotpatch技術介紹ppt)

用處,最大的自然是hotpatch,用這種東西來熱替換某個導致崩潰的方法。

手淘還有做的一件事,就是用它作性能監控。


手淘的線上bug熱修復就是基於這個的,不過像樓上說的,不支持art,所以5.0以上不能用了。採用了另外一套方案,叫andfix,也開源了,github可搜到,csdn老羅的博客也有介紹原理


參加官方文檔的解釋,只是在你的程序內部處理,相當攔截你程序的一些方法和類,然後在執行過程中調用新的,所以不需要root. AOP!


推薦閱讀:

Python有哪些高大上的項目?
如何運營一個開源項目並取得較大影響力?
C/C++ 編程有哪些值得推薦的工具?
你有用了Gentoo就不想用Arch的感覺嗎?
如果代碼都開源甚至所有技術都開源,那麼人類社會是否能迎來一次質的飛躍?

TAG:開源 | Android | XposedFramework |