记录:动态加载dex实现某些热修复

日记。

对于一些发布后可能还会经常修改的函数,而又不想频繁更新app,动态加载dex是个不错的选择。实现步骤如下:

1、在需要的地方,调用如下函数(dexPath为下载下来的路径,函数名暂不明确指定,这样后续会有较大的灵活空间):

private boolean loadDex() {
        try {
            File dexOutputDir = getDir("dex1", 0);
            String dexPath = Environment.getExternalStorageDirectory().toString() + File.separator + "jemen.jar";
            DexClassLoader loader = new DexClassLoader(dexPath, dexOutputDir.getAbsolutePath(), null, getClassLoader());
    
            Class clz = loader.loadClass("org.jemen.test.MyDex");
            Object ins = clz.newInstance();
            Method[] methods = clz.getMethods();
            for (Method method : methods) {
                try {
                    if(method.getName().contains("jemen"))
                    method.invoke(ins, this);
                } catch (Exception e) {
                    ExceptionHandler.handleException(e);
                }
            }
            return true;
        } catch (Exception e) {
            ExceptionHandler.handleException(e);
        }
        return false;
    }

2、创建一个项目,以org.jemen.test为包名,创建MyDex类,想要热更新的方法名包含“jemen”。Export出jar文件,暂叫output.jar。

3、用AndroidSDK下platform-tools文件夹下的dex工具(本次使用的是23.0.3里边的),将导出的jar文件转为dex的jar文件,命令如下:

dx --dex --output=F:/jemen/output.jar D:/jemen/jemen.jar

可用解压缩工具查看,此时的jar文件已包含dex文件。

4、将jemen.jar文件发布到服务器。App中根据dex文件版本,更新下载jemen.jar文件到1中所述的路径。

因无法改变Android.manifest,无法注册Activity,故无法创建新的Activity,创建的做法就是用代理Activity,修正里边的方法实现,项目暂未用到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值