Java代碼變動怎麼解決?熱修復及調試如何實現?對於Java語言來講,若是涉及代碼變動,通常狀況下會選擇從新啓動JVM來修復問題。然而從新啓動意味着須要一些時間才能將異常修復,熱修復的出現爲實現秒級恢復故障創造了可能,接下來就給你們講解一下。正則表達式
Java熱修復編程
目前較火的熱修復方案大體分爲兩派:阿里系:DeXposed、andfix:從底層二進制入手(C語言);騰訊系:tinker:從Java加載機制入手。今天主要講解基於Java加載機制,來研究熱修復的實現方法。數組
安卓的類加載器在加載一個類時會先從自身DexPathList對象中的Element數組中獲取(Element[] dexElements)到對應的類,以後再加載。在for循環中,首先遍歷出來的是dex文件,而後再是從dex文件中獲取class,因此,咱們只要讓修復好的class打包成一個dex文件,放於Element數組的第一個元素,這樣就能保證獲取到的class是最新修復好的class。學習
熱修復的實現步驟:debug
一、獲得dex格式補丁。修復好有問題的Java文件(根據bug的實際狀況修改代碼便可);將Java文件編譯成class文件;將class文件打包成dex文件(dx指令程序)。3d
二、加載dex格式補丁。調試
三、加載jar、apk、zip格式補丁。注意這類壓縮包中必須放着一個dex文件,並且對名字有要求,必須是classes.dex。對象
Java-debugblog
Java-debug-tool提供了多個trouble-shot命令,但殺手級的命令就兩個,methodTrace和redefineClass。ip
methodTrace命令,用於快速問題發現,能夠作到不暫停JVM而獲取到方法調試信息。基本格式:
mt -c -m
可選參數:-d -t -i -n -time -u等。
redefineClass命令,能夠作到不重啓JVM而進行類字節碼替換,實現方法熱修復。當使用mt命令定位到問題以後,修復了的代碼若是須要快速上線,那麼就可使用該命令。命令的使用格式爲:
rdf -p [className1:class1Path className1:class2Path]
findClass命令,它能夠在目標JVM找到你須要的類,而且告訴你類的具體信息,好比類是否已經加載?若是加載,那麼加載類的classLoader是哪個等。這個命令能夠容許你不輸入類的全限定名,並能夠容許你輸入正則表達式去匹配類。
想成爲高薪Java工程師,你須要理論與實戰兼備,而良好的知識基礎是你高效率學習、付諸實戰的前提。若是你想更好的學習Java編程,能夠選擇專業的學習方式。