日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Alibaba-Dexposed框架在线热补丁修复的使用

發(fā)布時(shí)間:2025/3/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Alibaba-Dexposed框架在线热补丁修复的使用 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


目錄(?)
[+]


前兩篇已經(jīng)介紹了alibaba的AndFix熱修復(fù):?
Alibaba-AndFix Bug熱修復(fù)框架的使用?
Alibaba-AndFix Bug熱修復(fù)框架原理及源碼解析

DexPosed是Alibaba的另一個(gè)框架,都可以在線熱修復(fù)bug,只不過(guò)DexPosed也可以實(shí)現(xiàn)其他的功能。

  • DexPosed
    • 介紹
    • 應(yīng)用場(chǎng)景
    • 在Android上的使用
      • 在自定義Application初始化
    • patch文件的生成
    • 支持的系統(tǒng)

DexPosed

介紹

DexPosed是強(qiáng)大而無(wú)侵入的AOP(面向切面編程)運(yùn)行Android應(yīng)用程序開(kāi)發(fā)框架,基于開(kāi)源的Xposed框架項(xiàng)目的工作(Xposed是修改系統(tǒng)框架服務(wù)的框架)。?
Github :?https://github.com/alibaba/dexposed

應(yīng)用場(chǎng)景

AOP編程?
儀表(用于測(cè)試,性能監(jiān)測(cè)等)?
在線熱補(bǔ)丁修復(fù)?
SDK hooking(鉤)以提供更好的開(kāi)發(fā)體驗(yàn)

在Android上的使用

Android Studio中使用:?
在Gradle中添加:

<code class="hljs nginx has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"> <span class="hljs-title" style="color:#0088;box-sizing: border-box;">dependencies</span> {<span class="hljs-title" style="color:#0088;box-sizing: border-box;">compile</span> <span class="hljs-string" style="color:#0880;box-sizing: border-box;">'com.taobao.android:dexposed:0.1.1<span class="hljs-variable" style="color:#66066;box-sizing: border-box;">@aar</span>'</span>}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

在libs中加入:dexposedbridge.jar、patchloader.jar包。?
需要添加的so文件有:libdexposed.so、libdexposed_1.so。

在自定義Application初始化

<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> (DexposedBridge<span class="hljs-built_in" style="color:#66066;box-sizing: border-box;">.</span>canDexposed(this)) {<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">//判斷系統(tǒng)是否支持DexPosed</span><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">Log</span><span class="hljs-built_in" style="color:#66066;box-sizing: border-box;">.</span>e(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"APP"</span>, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"true application"</span>); } <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">else</span> {<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">Log</span><span class="hljs-built_in" style="color:#66066;box-sizing: border-box;">.</span>e(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"APP"</span>, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"false application"</span>); }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul>

當(dāng)收到服務(wù)器推送消息,需要下載patch文件,下載完成后即時(shí)加載來(lái)修復(fù)bug。?
PatchResult result = PatchMain.load(this, “patch apk文件的路徑”, null);

<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"> <span class="hljs-comment" style="color:#8800;box-sizing: border-box;">//加載patch apk文件</span>PatchResult result <span class="hljs-subst" style="color:#000000;box-sizing: border-box;">=</span> PatchMain<span class="hljs-built_in" style="color:#66066;box-sizing: border-box;">.</span>load(this, fullpath, <span class="hljs-built_in" style="color:#66066;box-sizing: border-box;">null</span>);<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> (result<span class="hljs-built_in" style="color:#66066;box-sizing: border-box;">.</span>isSuccess()) {<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">Log</span><span class="hljs-built_in" style="color:#66066;box-sizing: border-box;">.</span>e(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"Hotpatch"</span>, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"patch success!"</span>);} <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">else</span> {<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">Log</span><span class="hljs-built_in" style="color:#66066;box-sizing: border-box;">.</span>e(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"Hotpatch"</span>, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"patch error is "</span> <span class="hljs-subst" style="color:#000000;box-sizing: border-box;">+</span> result<span class="hljs-built_in" style="color:#66066;box-sizing: border-box;">.</span>getErrorInfo());}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul>

//注:patch apk 文件不能放在共享目錄中,建議放在cache文件中。?
在應(yīng)用升級(jí)之前需每次load加載patch apk,當(dāng)應(yīng)用升級(jí)后把patch apk進(jìn)行清空。?
PatchMain.load加載patch apk,會(huì)遍歷apk中實(shí)現(xiàn)IPatch接口的所有,并hook對(duì)應(yīng)的方法對(duì)象。

patch文件的生成

新創(chuàng)建一個(gè)項(xiàng)目MyPatch,并在libs中加入dexposedbridge.jar、patchloader.jar包。?
在build.gradle設(shè)置jar為provided,如下:

<code class="hljs livecodeserver has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">dependencies {provided <span class="hljs-built_in" style="color:#66066;box-sizing: border-box;">files</span>(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">'libs/dexposedbridge.jar'</span>)provided <span class="hljs-built_in" style="color:#66066;box-sizing: border-box;">files</span>(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">'libs/patchloader.jar'</span>) }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>

如果想修復(fù)一個(gè)bug,需在MyPatch中創(chuàng)建一個(gè)類(lèi),并實(shí)現(xiàn)IPatch接口,實(shí)現(xiàn)handlePatch方法。

接下的Demo是想在bug方法的前后做一些處理,也可以終止bug方法的調(diào)用及修改bug方法的參數(shù):

<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">package</span> com.open.cool.patch;<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">import</span> android.util.Log; <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">import</span> android.view.View; <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">import</span> android.widget.Toast;<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">import</span> com.taobao.android.dexposed.DexposedBridge; <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">import</span> com.taobao.android.dexposed.XC_MethodHook; <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">import</span> com.taobao.patch.IPatch; <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">import</span> com.taobao.patch.PatchParam;<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">//必須實(shí)現(xiàn)IPatch接口</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">public</span> <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">class</span> <span class="hljs-title" style="color:#66066;box-sizing: border-box;">MyPatch</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">implements</span> <span class="hljs-title" style="color:#66066;box-sizing: border-box;">IPatch</span> {</span><span class="hljs-annotation" style="color:#9b859d;box-sizing: border-box;">@Override</span><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">handlePatch</span>(<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">final</span> PatchParam arg0) <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">throws</span> Throwable {Class<?> cls = <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">null</span>;<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">try</span> {<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">//使用類(lèi)加載器獲取需要修復(fù)的方法所在的類(lèi)Class</span>cls = arg0.context.getClassLoader().loadClass(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"com.open.cool.mydex1.MainActivity"</span>);} <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">catch</span> (ClassNotFoundException e) {e.printStackTrace();<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">return</span>;}<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">//hook想要操作的方法,在方法前后做一些處理,XC_MethodHook</span><span class="hljs-comment" style="color:#8800;box-sizing: border-box;">//cls上邊獲取到的,這里的test1是有bug的方法名稱(chēng),View.class是test1的參數(shù)類(lèi)型,如果有多個(gè)參數(shù)就依次在后邊添加View.class,Object.class,Object.class等。</span>DexposedBridge.findAndHookMethod(cls, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"test1"</span>, View.class,<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">new</span> XC_MethodHook() {<span class="hljs-annotation" style="color:#9b859d;box-sizing: border-box;">@Override</span><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">protected</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">beforeHookedMethod</span>(MethodHookParam param) <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">throws</span> Throwable {<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">super</span>.beforeHookedMethod(param);Log.e(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"IPatch"</span>, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"beforeHookedMethod"</span>);<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">//TODO 調(diào)用hook方法前的操作</span>Toast.makeText(arg0.context, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"before"</span>, Toast.LENGTH_SHORT).show();<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// param.setResult(null);//禁止調(diào)用原方法</span>}<span class="hljs-annotation" style="color:#9b859d;box-sizing: border-box;">@Override</span><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">protected</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">afterHookedMethod</span>(MethodHookParam param) <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">throws</span> Throwable {<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">super</span>.afterHookedMethod(param);<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">//TODO 調(diào)用hook方法后的操作</span>Log.e(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"IPatch"</span>, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"afterHookedMethod"</span>);}});} }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li></ul>

下面的Demo是直接替換掉bug方法:

<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">package</span> com.open.cool.patch;<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">import</span> android.util.Log; <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">import</span> android.view.View; <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">import</span> android.widget.Toast;<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">import</span> com.taobao.android.dexposed.DexposedBridge; <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">import</span> com.taobao.android.dexposed.XC_MethodHook; <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">import</span> com.taobao.android.dexposed.XC_MethodReplacement; <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">import</span> com.taobao.patch.IPatch; <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">import</span> com.taobao.patch.PatchParam;<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">//必須實(shí)現(xiàn)IPatch接口</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">public</span> <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">class</span> <span class="hljs-title" style="color:#66066;box-sizing: border-box;">MyPatch</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">implements</span> <span class="hljs-title" style="color:#66066;box-sizing: border-box;">IPatch</span> {</span><span class="hljs-annotation" style="color:#9b859d;box-sizing: border-box;">@Override</span><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">handlePatch</span>(<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">final</span> PatchParam arg0) <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">throws</span> Throwable {Class<?> cls = <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">null</span>;<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">try</span> {<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">//使用類(lèi)加載器獲取指定的類(lèi)Class</span>cls = arg0.context.getClassLoader().loadClass(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"com.open.cool.mydex1.MainActivity"</span>);} <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">catch</span> (ClassNotFoundException e) {e.printStackTrace();<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">return</span>;} <span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// //替換hook方法中的方法實(shí)現(xiàn),XC_MethodReplacement</span>DexposedBridge.findAndHookMethod(cls, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"test1"</span>, View.class, <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">new</span> XC_MethodReplacement() {<span class="hljs-annotation" style="color:#9b859d;box-sizing: border-box;">@Override</span><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">protected</span> Object <span class="hljs-title" style="box-sizing: border-box;">replaceHookedMethod</span>(XC_MethodHook.MethodHookParam methodHookParam) <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">throws</span> Throwable {<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">//TODO 替換后的方法實(shí)現(xiàn)</span><span class="hljs-comment" style="color:#8800;box-sizing: border-box;">//.....</span><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">null</span>;}});} }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li></ul>

上面2個(gè)Demo兩者的區(qū)別是:回調(diào)接口的類(lèi)不同(XC_MethodHook和XC_MethodReplacement);?
//XC_MethodHook是XC_MethodReplacement的基類(lèi)。

把MyPatch項(xiàng)目打包生成補(bǔ)丁apk文件,服務(wù)器通知客戶端下載補(bǔ)丁文件apk,并使用

<code class="hljs sql has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">PatchResult result = PatchMain.<span class="hljs-operator" style="box-sizing: border-box;"><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">load</span>(this, “patch apk文件的路徑”, <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">null</span>);</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

加載補(bǔ)丁apk,即時(shí)修復(fù)bug方法。

如果項(xiàng)目有代碼混淆:?
需注意的部分

<code class="hljs avrasm has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">cls</span> = arg0<span class="hljs-preprocessor" style="color:#444444;box-sizing: border-box;">.context</span><span class="hljs-preprocessor" style="color:#444444;box-sizing: border-box;">.getClassLoader</span>()<span class="hljs-preprocessor" style="color:#444444;box-sizing: border-box;">.loadClass</span>(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"packageName+className"</span>)<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">;</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

packageName+className必須是混淆后的類(lèi)名和方法名稱(chēng)。

在打release包時(shí),在build/outputs/mapping/release/下面有mapping.txt,這個(gè)里面記錄了混淆以前的類(lèi)和混淆以后的類(lèi)的一一對(duì)應(yīng)關(guān)系(所以叫mapping.txt),所以每次發(fā)版以后要保留好mapping.txt文件,以便以后編寫(xiě)Patch。

原文地址: http://blog.csdn.net/qxs965266509/article/details/49821413

支持的系統(tǒng)

Runtime Android Version Support
Dalvik 2.2 Not Test
Dalvik 2.3 Yes
Dalvik 3.0 No
Dalvik 4.0-4.4 Yes
ART 5.0 Testing
ART 5.1 No
ART M No

注意:android4.4之后的版本都用Art取代了Dalvik,所以要hook Android4.4以后的版本就必須去適配Art虛擬機(jī)的機(jī)制。目前官方表示,為了適配Art的dexposed_l只是beta版,所以最好不要在正式的線上產(chǎn)品中使用它。


總結(jié)

以上是生活随笔為你收集整理的Alibaba-Dexposed框架在线热补丁修复的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。