一步步教你實現Android HotFix熱更新

這篇文章是手把手教你如何實現熱更新的,對於熱更新的原理這裏不涉及,若有疑問的請參考下面幾篇文章:
1、安卓App熱補丁動態修復技術介紹
https://mp.weixin.qq.com/s?__biz=MzI1MTA1MzM2Nw==&mid=400118620&idx=1&sn=b4fdd5055731290eef12ad0d17f39d4a&scene=1&srcid=1106Imu9ZgwybID13e7y2nEi#wechat_redirect
2、MultiDex與熱修復實現原理
http://blg.csdn.net/hp910315/article/details/51681710
3、Android 熱修復其實很簡單
http://blog.csd.net/qq_31530015/article/details/51785228?locationNum=11
4、Android熱修復:Andfix和Hotfix,兩種方案的比較與實現
http://blog.csdn.net/yuankundong/article/details/51360798
5、Android熱修復框架HotFix分析拓展
http://m.blog.csdn.net/article/details?id=51201593#
我先簡要介紹一下實現熱更新的一些要點:
(1)如何防止類被打上CLASS_ISPREVERIFIED的標誌
(2)如何製作補丁包
(3)如何動態加載需要修復的類
下面是我實現熱修復的步驟:
1、新建一個工程 HotFixDemo(包路徑:com.jxnu.hotfixdemo)
2、新建module HackDex,並創建一個java文件AntiLazyLoad(包路徑:com.jxnu.hackdex)
3、新建mudule HotFixLib,並將HotFix.java拷貝到HotFixLib中,並將HotFixLib添加爲HotFixDemo的依賴、將Utils拷貝到項目中
4、我們在HackDex的intermediates文件夾下找到AntiLazyLoad的class文件
5、將AntiLazyLoad.class放在E盤的com—>jxnu —>hackdex目錄下【目錄名與AntiLazyLoad.java所在的包名一致】
6、接着執行控制檯命令命令jar cvf hack.jar com,然後我們就在e盤下得到了一個hack.jar文件
這裏寫圖片描述
7、接着就是把這個jar做成dex的jar了,由於要用到dx,而這個dx在我們的sdk工具包裏,所以我把這個path.jar拷貝到sdk工具包,利用dx命令 dx –dex –output=hack_dex.jar hack.jar生成hack_dex.jar補丁包
這裏寫圖片描述
8、將hack_dex.jar文件放入項目的assets目錄下
9、新建HotFixApplication

@Override
    public void onCreate() {
        super.onCreate();
        File dexPath = new File(getDir("dex", Context.MODE_PRIVATE), "hack_dex.jar");
        Log.e("mainHHH","dexPath = " + dexPath.getAbsolutePath());
        Utils.prepareDex(this.getApplicationContext(), dexPath, "hack_dex.jar");
        HotFix.patch(this, dexPath.getAbsolutePath(), "com.jxnu.hackdex.AntiLazyLoad");
        try {
            this.getClassLoader().loadClass("com.jxnu.hackdex.AntiLazyLoad");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

10、新建BugClass文件

public class BugClass {

    public String getInfo(){
        return "I have been fixed";
    }
}

11、接着運行項目,得到BugClass的class文件,按照上面生成hack_dex的方法將BugClass做成path_dex.jar文件,並放入到assets文件夾下
12、將BugClass改爲

public class BugClass {

    public String getInfo(){
        return "I am a bug class";
    }
}

13、接着我們來進行測試,下面是MainActivity類

private TextView tv_info;
    private Button btn_test,btn_patch;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv_info = (TextView) findViewById(R.id.tv_info);
        btn_test = (Button) findViewById(R.id.btn_test);
        btn_patch = (Button) findViewById(R.id.btn_patch);
        btn_test.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                tv_info.setText(new BugClass().getInfo());
            }
        });
        btn_patch.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                File dexPath = new File(getDir("dex", Context.MODE_PRIVATE), "path_dex.jar");
                Utils.prepareDex(MainActivity.this, dexPath, "path_dex.jar");
                HotFix.patch(MainActivity.this, dexPath.getAbsolutePath(), "");
            }
        });
    }

14、沒有熱更新之前,點擊“測試”按鈕顯示I am a bug class
這裏寫圖片描述
15、接着測試打補丁,重啓應用,先點擊“打補丁”按鈕,然後再點擊“測試”按鈕,然後就顯示I have been fixed 了,說明補丁打成功了
這裏寫圖片描述
項目源碼地址:https://github.com/DaiQing-Zha/HotFixDemo.git

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章