美文网首页
Android实现动态加载dex, res, so

Android实现动态加载dex, res, so

作者: wsspace | 来源:发表于2020-07-21 16:05 被阅读0次

什么是动态加载?

- 简单来说动态加载可以加载原本apk不存在的代码。

什么场景适用?

  • 很多场景都适用,比如可以实现app无感更新,不过有些应用市场对含有动态更新功能的app抓得比较严,因为担心你偷偷更新了做些坏事。

动态加载的难点是哪里?

如何动态加载res文件

  • 如果只是做动态加载java代码,则只需要加载dex就行了,简单方便
  • 如果要动态加载的内容包括res资源,比如布局,资源图片。有两种方案可选:
    • 布局采用java代码编写,资源图片放到assets中,这样assets可以打包到jar包中,这样就可以只加载dex,无需加载res,但是采用java代码开发res较为耗时不方便,若是只有少量简单布局及资源图片可能采用此方法
    • 布局及资源文件等采用res的xml编写,需要避免资源的id与宿主apk的id冲突以及如何将动态加载的Resources注入到宿主Activity的Resources中,这样就能够通过宿主的context.getResources().getIdentifier接口获取到资源id了

动态更新需要怎么做?


加载dex

如何生成dex?
  • 将java代码打成jar包,再用dex2jar工具将jar打成dex
  • 需要注意,要将R.class文件也打包进入dex中,需要通过此文件关联res资源,若无res资源可忽略
如何加载dex?
  • 通过DexClassLoader加载dex文件实例出ClassLoader
  • 通过ClassLoader.loadClass("xx.xx.Xxx")
  • 再通过反射的方式调用具体的方法

加载res

res打包成什么格式?
  • apk格式,可以在在需要动态加载的项目中,生成成apk后用压缩工具打开,将里面的dex删除即可
打包res需要注意什么?
  • 需要注意其中的资源id,修改其id段,避免与资源id冲突,需要在gradle中配置
    修改为package-id为0x70段的id, 默认为0x7f,修改的id段不能大于0x7f段,否则会出问题,此方法只有在compileSdkVersion为28及以上才生效,低于28的可以在网上寻找修改aapt源码并编译出新的功能用于修改package-id
android {
    aaptOptions {
        additionalParameters '--allow-reserved-package-id','--package-id','0x70'
    }
}
如何加载res?
  • 在成功加载dex代码后,在加载dex运行的第一时间进行res的加载,或者说是将res注入到宿主中
try {
            AssetManager assetManager = AssetManager.class.newInstance();
            Method addAssetPath = assetManager.getClass().getMethod("addAssetPath", String.class);
            String resFilePath = resFile(context).getAbsolutePath();
            String baseApkPath = baseApkPath(context);
            if (!TextUtils.isEmpty(baseApkPath)) {
                LOG.i("重设原生资源--->" + baseApkPath);
                addAssetPath.invoke(assetManager, baseApkPath);
            }
            LOG.i("设置外置资源resFilePath--->" + resFilePath);
            addAssetPath.invoke(assetManager, resFilePath);
            mResources =
                    new Resources(assetManager, context.getResources().getDisplayMetrics(), context.getResources()
                            .getConfiguration());
            mAssetManager = mResources.getAssets();
        } catch (Exception ignored) {
            ignored.printStackTrace();
        }
    public String baseApkPath(Context context) {
        try {
            String s = context.getApplicationContext().getPackageResourcePath();
            if (s == null){
                Process process = Runtime.getRuntime().exec("pm path " + context.getPackageName());
                BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
                s = reader.readLine();
                LOG.i("getRuntime baseApkPath",s);
            }
            LOG.i("getApplication baseApkPath",s);
            return s.substring(s.indexOf("/"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

加载so

如何加载so?
  • 实例化DexClassLoader将so所在的路径传入即可自动搜索加载
    DexClassLoader(String dexPath, String optimizedDirectory, String librarySearchPath, ClassLoader parent)``librarySearchPath即为so所以的路径,此路径需要为当前包所在的路径data/data/package/下,要注意的是,so会根据cpu的架构不同而有不同的文件,所以我们在选择so时要先根据Build.CPU_ABI判断cpu的架构选择哪个so文件。

奈何表达能力太差,下次写个详细的,下次一定!

相关文章

  • Android实现动态加载dex, res, so

    什么是动态加载? - 简单来说动态加载可以加载原本apk不存在的代码。 什么场景适用? 很多场景都适用,比如可以实...

  • 类加载流程

    Android类加载器继承关系 动态加载Dex方案一 动态加载Dex方案二 阅读原文

  • 热修复基础(一)

    Dex的动态加载 一、Android的ClassLoader体系 PathClassLoader是Android应...

  • 热更新预言

    热更新 参考链接 安卓热更新之Nuwa实现步骤 Android动态加载Dex机制解析 https://github...

  • 动态加载

    定义 加载so文件 加载dex/jar/apk文件 动态加载的基础就是classloader,一个app中至少需要...

  • Android app如何加密?

    欢迎访问网易云社区,了解更多网易技术产品运营经验。 Android App包含的内容有dex文件,so文件,res...

  • Android动态加载so

    参考地址:https://www.jianshu.com/p/c98c2a85c75e

  • 动态加载jar、dex 热更新

    Android动态加载jar,dex,apk文件 坑 1.程序没给分配sd卡权限 mContext.getClas...

  • android动态加载jar/dex

    今天来彻底了解一下这个android的这个jar和dex,主要参考下方连接文章。 android动态加载jar/d...

  • android 热修复之类加载机制

    文章目标 Android类加载机制介绍 javassist动态修改字节码 实现热补丁动态修复 Android类加载...

网友评论

      本文标题:Android实现动态加载dex, res, so

      本文链接:https://www.haomeiwen.com/subject/syxikktx.html