<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                原文出處——>[無需Root也能Hook?——Depoxsed框架演示](http://blog.csdn.net/yzzst/article/details/47954479) 之前我們介紹過rovo89在Githu上的Xposed框架,我們也介紹了如何使用Xposed框架進行登錄劫持,和廣告注入。 但是,之后很多朋友都在問我,這個**Xposed框架**使用起來很確實很好用。可是就是有一個巨大的缺點,就是**需要Root權限**。很多設備都沒有Root權限,有沒有**一個不需要Root權限的Hook框架**。 答案是,確定的。就是目前的Alibab的開源框架,**Dexposed框架**。 github地址 :[dexposed](https://github.com/alibaba/dexposed) #### **Dexposed** * 官方介紹如下: 它基于ROOT社區著名開源項目Xposed改造剝離了ROOT部分,演化為服務于所在應用自身的AOP框架,并在Apache 2.0協議下開源。Xposed是XDA社區用戶rovo89開發并管理的一個項目,它通過修改Android Dalvik運行時的Zygote進程,使用Xposed Bridge將第三方代碼注入到Android應用的方法調用中,實現非侵入式的在運行期動態修改系統和應用行為的能力。 * 缺點: 不支持ART,時間久,無人維護和更新,目前看到更新時間是2015,所以了解技術即可,實用性不高。 Dexposed的原理也是很簡單,如它介紹中所說的。它是Xposed框架剝離掉了Root部分的功能。 不熟悉Xposed原理的,可以看這里[Xposed源碼剖析——概述](http://blog.csdn.net/yzzst/article/details/47659987) 沒有Root權限,那么Xposed框架式無法替換app_process的,當然也就無法進行整個系統級應用程序的注入了。當然,對自我程序本身還是沒有問題的。 目前Dexposed的主要應用場景有以下幾種: * AOP編程 * 插樁 (如測試、性能監控等) * 在線熱補丁 * SDK hooking以提供更好的開發體驗 >[info] AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程,通過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。 看到這里,很多小伙伴估計都會產生疑問,我靠,不能進行登錄劫持了,不能注入廣告了。我用你來干什么。/(ㄒoㄒ)/~ #### **AOP編程,在線熱補丁** 沒錯,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或者突發性需求,我們不能夠理解的發版更新。 1. 這里就能夠通過之前我們所說的DexClassLoader的方式,載入線上的插件Path.apk。 2. 通過Dexposed框架,動態的Hook并替換主線版本中的showDialog函數方法。 具體的邏輯如下圖所示: ![](http://img.blog.csdn.net/20150825232235869) 看到上面的效果說明圖之后,相信大家對Dexposed的在線熱補丁已經有一定的了解了。這里我們也不用做過多的贅述。 當然,你可能想到很多使用熱補丁的應用方向,比如: * Bug補丁修復 * 插件功能 * 等等 Dexposed框架原理很簡單,功能也算不上強大。但是,確實特別實用。我也是推薦各大Android開發者,特別是創業公司使用。是強烈推薦!! 下面是主工程中與補丁工程中的邏輯實現。這里,童鞋們可以對比著效果圖看一下。 如果大家對動態的使用DexClassLoader載入一個apk代碼還存在疑問。 可以clone一下dexposed的源碼學習學習。當然,這里還是推薦大家去我的博客看看,Android的插件原理。[Android插件開發初探——基礎篇](http://blog.csdn.net/yzzst/article/details/45582315) **主工程中,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; } }); } } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看