CSDN移動將持續為您優選移動開發的精華內容,共同探討移動開發的技術熱點話題,涵蓋移動應用、開發工具、移動遊戲及引擎、智能硬體、物聯網等方方面面。如果您想投稿、參與內容翻譯工作,或尋求近匠報導,請發送郵件至tangxy#csdn.net(請把#改成@)。
作者簡介:周聖韜,百度高級Android開發工程師,博客地址:http://blog.csdn.net/yzzst
之前我們介紹過rovo89在GitHub上的Xposed框架,也介紹了如何使用Xposed框架進行登錄劫持和廣告注入。但是,之後很多朋友都在問我,這個Xposed框架使用起來很確實很好用。可是就是有一個巨大的缺點,就是需要Root權限。很多設備都沒有Root權限,有沒有一個不需要Root權限的Hook框架。
答案是,肯定的。那就是目前的Alibaba的開源框架,Dexposed框架。
Github地址 : https://github.com/alibaba/dexposed
Dexposed它的官方介紹如下:
它基於ROOT社區著名開源項目Xposed改造剝離了ROOT部分,演化為服務於所在應用自身的AOP框架,並在Apache 2.0協議下開源。Xposed是XDA社區用戶rovo89開發並管理的一個項目,它通過修改Android Dalvik運行時的Zygote進程,使用Xposed Bridge將第三方代碼注入到Android應用的方法調用中,實現非侵入式的在運行期動態修改系統和應用行為的能力。
Dexposed的原理也是很簡單,如它介紹中所說的。它是Xposed框架剝離掉了Root部分的功能。不熟悉Xposed原理的,可以看這裡。
沒有Root權限,那麼Xposed框架式無法替換app_process的,當然也就無法進行整個系統級應用程式的注入了。當然,對自我程序本身還是沒有問題的。
目前Dexposed的主要應用場景有以下幾種:
AOP編程 插樁 (如測試、性能監控等) 在線熱補丁 SDK hooking以提供更好的開發體驗 AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程,是通過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。看到這裡,很多小夥伴估計都會產生疑問,我靠,不能進行登錄劫持了,不能注入廣告了,我用你來幹什麼。/(ㄒoㄒ)/~
沒錯,Dexposed框架主要的功能,還是提供作為AOP框架使用。這麼一來的話,我們之前也介紹過Android的插件實現方式。這裡我們所用Dexposed框架來實現的話,插件模型將會更加簡單。
首先先介紹一下,Dexposed框架也提供了一個與Xposed框架類似的方法。
/** * 該系統是否支持hook */public static synchronized boolean canDexposed(Context context)/** * 尋找並hook一個指定的方法 * @param clazz 類的class * @param methodName hook的方法名稱 * @param parameterTypesAndCallback 參數和返回callback * @return */public static Unhook findAndHookMethod(Class<?> clazz, String methodName, Object... parameterTypesAndCallback)
在線熱補丁實例如何進行在線的熱補丁呢?我們這裡以Alibaba的Demo為例。如在主線版本中,我們有一個showDialog方法。已經發布出去了。但是,突然發現有一點Bug或者突發性需求,我們不能夠理解的發版更新。
這裡就能夠通過之前我們所說的DexClassLoader的方式,載入線上的插件Path.apk。 通過Dexposed框架,動態的Hook並替換主線版本中的showDialog函數方法。具體的邏輯如下圖所示:
看到上面的效果說明圖之後,相信大家對Dexposed的在線熱補丁已經有一定的了解了,這裡我們也不用做過多的贅述。
當然,你可能想到很多使用熱補丁的應用方向,比如Bug補丁修復、插件功能等等。Dexposed框架原理很簡單,功能也算不上強大。但是,確實特別實用。我也是推薦各大Android開發者,特別是創業公司使用。
下面是主工程中與補丁工程中的邏輯實現。這裡,童鞋們可以對比著效果圖看一下。如果大家對動態的使用DexClassLoader載入一個apk代碼還存在疑問,可以clone一下dexposed的源碼學習學習。
主工程中,MainActivity showDialog方法的定義:
public class MainActivity extends Activity { //..........一些忽略掉的代碼 private void showDialog() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Dexposed sample") .setMessage("Please clone patchsample project to generate apk, and copy it to \"/Android/data/com.taobao.dexposed/cache/patch.apk\"") .setPositiveButton("ok", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { } }).create().show(); }}
在線熱補丁,Path.apk中的代碼:
/** * 插件的補丁類 */public class DialogPatch implements IPatch { @Override public void handlePatch(final PatchParam arg0) throws Throwable { // 獲取主程序的ClassLoader Class<?> cls = null; try { // 獲取主程序的MainActivity類 cls= arg0.context.getClassLoader().loadClass("com.taobao.dexposed.MainActivity"); } catch (ClassNotFoundException e) { e.printStackTrace(); return; } // hook並替換MainActivity中的showDialog方法 DexposedBridge.findAndHookMethod(cls, "showDialog", new XC_MethodReplacement() { @Override protected Object replaceHookedMethod(MethodHookParam param) throws Throwable { // 彈出一個插件中的Dialog Activity mainActivity = (Activity) param.thisObject; AlertDialog.Builder builder = new AlertDialog.Builder(mainActivity); builder.setTitle("Dexposed sample") .setMessage("The dialog is shown from patch apk!") .setPositiveButton("ok", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { } }).create().show(); return null; } }); }}
預告: 2015中國移動開發者大會(MDCC 2015)將於10月15-16日在北京新雲南皇冠假日酒店召開。大會特設五大技術專場:平臺與技術iOS、平臺與技術Android、產品與設計、遊戲開發、企業移動化。此外,大會更是首次舉辦國內極具權威影響力的IoT技術峰會,特設硬體開發技術與虛擬實境兩大專場。大會將聚集國內最具實力的產品技術團隊,與開發者一道進行最前沿的探討與交流。
第一時間掌握最新移動開發相關信息和技術,請關注mobilehub公眾微信號(ID: mobilehub)。