欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android?手寫熱修復dex實例詳解

 更新時間:2023年03月05日 09:17:20   作者:one裴s  
這篇文章主要為大家介紹了Android?手寫熱修復dex實現(xiàn)示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

現(xiàn)有的熱修復框架很多,尤以AndFix 和Tinker比較多

具體的實現(xiàn)方式和項目引用可以參考網(wǎng)絡上的文章,今天就不談,也不是主要目的

今天就來探討,如何手寫一個熱修復的功能

對于簡單的項目,不想集成其他修復框架的SDK,也不想用第三方平臺,只是緊急修復一些bug 還是挺方便的

言歸正傳,如果一個或多個類出現(xiàn)bug,導致了崩潰或者數(shù)據(jù)顯示異常,如果修復呢,如果熟悉jvm dalvik 類的加載機制,就會清楚的了解 ClassLoader的 雙親委托機制 就可以通過這個

什么是雙親委托機制

  • 當前ClassLoader首先從自己已經(jīng)加載的類中查詢是否此類已經(jīng)加載,如果已經(jīng)加載則直接返回原來已經(jīng)加載的類。 每個類加載器都有自己的加載緩存,當一個類被加載了以后就會放入緩存,等下次加載的時候就可以直接返回了。
  •  當前classLoader的緩存中沒有找到被加載的類的時候,委托父類加載器去加載,父類加載器采用同樣的策略,首先查看自己的緩存,然后委托父類的父類去加載,一直到bootstrp ClassLoader.
  • 當所有的父類加載器都沒有加載的時候,再由當前的類加載器加載,并將其放入它自己的緩存中,以便下次有加載請求的時候直接返回。

突破口來了,看1(如果已經(jīng)加載則直接返回原來已經(jīng)加載的類) 對于同一個類,如果先加載修復的類,當后續(xù)在加載未修復的類的時候,直接返回修復的類,這樣bug不就解決了嗎?

Nice ,多看源碼和jvm 許多問題可以從framework和底層去解決

話不多說,提出了解決方法,下面著手去實現(xiàn)

public class InitActivity extends FragmentActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //這里默認在SD卡根目錄,實際開發(fā)過程中可以把dex文件放在服務器,在啟動頁下載后加載進來
        //第二次進入的時候可以根據(jù)目錄下是否已經(jīng)下載過,處理,避免重新下載
        //最后根據(jù)當前app版本下載不同的修復dex包 等等一系列處理
        String dexFilePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/fix.dex";
        DexFile dexFile = null;
        try {
            dexFile = DexFile.loadDex(dexFilePath, null, Context.MODE_PRIVATE);
        } catch (IOException e) {
            e.printStackTrace();
        }
        patchDex(dexFile);
        startActivity(new Intent(this, MainActivity.class));
    }
    /**
     * 修復過程,可以放在啟動頁,這樣在等待的過程中,網(wǎng)絡下載修復dex文件
     *
     * @param dexFile
     */
    public void patchDex(DexFile dexFile) {
        if (dexFile == null) return;
        Enumeration<String> enumeration = dexFile.entries();
        String className;
        //遍歷dexFile中的類
        while (enumeration.hasMoreElements()) {
            className = enumeration.nextElement();
            //加載修復后的類,只能修復當前Activity后加載類(可以放入Application中執(zhí)行)
            dexFile.loadClass(className, getClassLoader());
        }
    }
}

方法很簡單在啟動頁,或者Application中提前加載有bug的類

這里寫的很簡單,只是展示核心代碼,實際開發(fā)過程中,dex包下載的網(wǎng)絡請求,據(jù)當前app版本下載不同的修復dex,文件存在的時候可以在Application中先加載一次,啟動頁就不用加載,等等,一系列優(yōu)化和判斷處理,這里就不過多說明,具體一些處理看github上的代碼

###ok 代碼都了解了,這個 fix.dex 文件哪里來的呢 熟悉Android apk生成的小伙伴都知道了,跳過這個步驟,不懂的小伙伴繼續(xù)往下看

上面的InitActivitystartActivity(new Intent(this, MainActivity.class)); 啟動了一個MainActivity 看看我的MainActivity

public class MainActivity extends FragmentActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //0不能做被除數(shù),這里會報ArithmeticException異常
        Toast.makeText(this, "結(jié)果" + 10 / 0, Toast.LENGTH_LONG).show();
    }
}

哎呀不小心,寫了一個bug 0 咋能做除數(shù)呢,app已經(jīng)上線了,這里必崩啊,咋辦 不要急,按照以下步驟:

  • 我們要修復這個類MainActivity,先把bug解決
 Toast.makeText(this, "結(jié)果" + 10 / 2, Toast.LENGTH_LONG).show();

把修復類生成.class文件(可以先run一次,之后在 build/intermediates/javac/debug/classes/com開的的文件夾,找到生成的class文件,也可以通過javac 命令行生成,也可以通過右邊的gradle Task生成)

  • 把修復類.class文件 打包成dex (其他.class刪除,只保留修復類) 打開cmd命令行,輸入下面命令
D:\Android\sdk\build-tools\28.0.3\dx.bat --dex --output C:\Users\pei\Desktop\dx\fix.dex C:\Users\pei\Desktop\dx\

D:\Android\sdk 為自己sdk目錄 28.0.3build-tools版本,可以根據(jù)自己已經(jīng)下載的版本更換 后面兩個目錄分別是生成.dex文件目錄,和.class文件目錄

切記 .class文件的目錄必須是包名一樣的,我的目錄是 C:\Users\pei\Desktop\dx\com\pei\test\MainActivity.class,不然會報 class name does not match path

  • 這樣dx文件夾下就會生成fix.dex文件了,把fix.dex放進手機根目錄試試吧

再次打開App,完美Toast 結(jié)果5,完美解決

總結(jié)

  • 修復方法要在bug類之前執(zhí)行
  • 適合少量bug,太多bug影響性能
  • 目前只能修復類,不能修復資源文件
  • 目前只能適配單dex的項目,多dex的項目由于當前類和所有的引用類在同一個dex會 當前類被打上CLASS_ISPREVERIFIED標記,被打上這個標記的類不能引用其他dex中的類,否則就會報錯 解決辦法是在構(gòu)造方法里引用一個單獨的dex中的類,這樣不符合規(guī)則就不會被標記了

以上就是Android 手寫熱修復dex實例詳解的詳細內(nèi)容,更多關(guān)于Android 手寫熱修復dex的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Android自定義多節(jié)點進度條顯示的實現(xiàn)代碼(附源碼)

    Android自定義多節(jié)點進度條顯示的實現(xiàn)代碼(附源碼)

    這篇文章主要介紹了Android自定義多節(jié)點進度條顯示的實現(xiàn)代碼,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-03-03
  • Android使用SmsManager實現(xiàn)短信發(fā)送功能

    Android使用SmsManager實現(xiàn)短信發(fā)送功能

    這篇文章主要為大家詳細介紹了Android使用SmsManager實現(xiàn)短信發(fā)送功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Flutter 分頁功能表格控件詳細解析

    Flutter 分頁功能表格控件詳細解析

    這篇文章主要介紹了Flutter 分頁功能表格控件詳細解析,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • Android開發(fā)之CheckBox的簡單使用與監(jiān)聽功能示例

    Android開發(fā)之CheckBox的簡單使用與監(jiān)聽功能示例

    這篇文章主要介紹了Android開發(fā)之CheckBox的簡單使用與監(jiān)聽功能,結(jié)合簡單實例形式分析了Android使用CheckBox控件的布局與功能實現(xiàn)技巧,需要的朋友可以參考下
    2017-07-07
  • Android TextView漸變顏色和方向及動畫效果的設置詳解

    Android TextView漸變顏色和方向及動畫效果的設置詳解

    TextView的在安卓中可以理解為一個文本視圖控件,Android的視圖控件的基類是View類,可以理解的TextView是View的子類。我們通常在.XML布局文件中會為文本視圖控件指定各種屬性來設置它的樣式,今天我們要講的當然不是傳統(tǒng)常見的那種,將會帶有漸變顏色和方向及動畫效果
    2021-11-11
  • Android自定義定時鬧鐘開發(fā)

    Android自定義定時鬧鐘開發(fā)

    這篇文章主要為大家詳細介紹了Android自定義定時鬧鐘開發(fā),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • Android自定義View實現(xiàn)球形動態(tài)加速球

    Android自定義View實現(xiàn)球形動態(tài)加速球

    這篇文章主要為大家詳細介紹了Android自定義View實現(xiàn)球形動態(tài)加速球,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • Android  onSaveInstanceState和onRestoreInstanceState觸發(fā)的時機

    Android onSaveInstanceState和onRestoreInstanceState觸發(fā)的時機

    這篇文章主要介紹了Android onSaveInstanceState和onRestoreInstanceState觸發(fā)的時機的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • Android 初識 Helloworld 詳解

    Android 初識 Helloworld 詳解

    在Eclipse+ADT中創(chuàng)建HelloWorld非常簡單,直接按照導航下一步就可以了。本文重點不在如何創(chuàng)建,而在理解HelloWorld項目的文件。需要的朋友可以參考下
    2013-07-07
  • Android studio利用gradle打jar包并混淆的方法詳解

    Android studio利用gradle打jar包并混淆的方法詳解

    昨天準備把寫好的代碼使用gradle打jar包出來,并打算加混淆。打jar包容易,結(jié)果在混淆上走了彎路。所以這篇文章主要介紹了關(guān)于Android studio利用gradle打jar包并混淆的方法,需要的朋友可以參考下。
    2017-03-03

最新評論