05
2017
10

动态加载总结

动态加载

总结自Android动态加载系列索引

动态加载定义

  1. 程序在运行的时候通过加载一些本地不存在的可执行文件实现一些特定的功能
  2. 这些可执行文件是可以替换的
  3. 更换静态资源不属于动态加载
  4. Android中动态加载的核心思想就是动态调用外部的dex文件

Android动态加载的类型

  1. 动态加载so库
  2. 动态加载jar/apk/dex文件

由于安全原因,Android不允许直接加载手机外部存储这类存储路径上的可执行文件(如so库或者dex包)
因此动态加载的大致过程就是:

  1. 把可执行文件拷贝到data/packagename内APP内部存储
  2. 加载可执行文件
  3. 调用具体的方法执行业务逻辑

动态加载的三种形式

  1. 简单的动态加载模式
  2. 代理Activity模式(核心就是使用宿主的一个代理Activity为插件所有的activity提供组件工作需要的环境)
  3. 动态创建Activity模式

加载SD卡中的so库

原理:把so库移动内部存储,并用load来进行加载

System.load(String absolutePath)

load(String absolutePath)与loadLibrary(String nicename)的区别

loadLibrary根据libName,扫描apk内部的nativeLibrary目录,并返回so库的完整路径,后调用Runtime类的doLoad方法

doLoad(String name,ClassLoader classload)

而load方法则是跳过前面的查找so库路径,直接调用doLoad方法

简单加载模式

如笔记ClassLoader中所写

代理Activity模式

由于AndroidManifeest文件不能动态注册的原因,所以不能采取直接调用Activity的方式,而是使用代理Activity的模式

  1. 在主项目的代理Activity里,直接调用对应插件Activity的生命周期
  2. 在插件Activity使用R资源方法如下

    try {
    AssetManager assetManager = AssetManager.class.newInstance();
    Method addAssetPath = assetManager.getClass().getMethod(“addAssetPath”, String.class);
    addAssetPath.invoke(assetManager, mDexPath);
    mAssetManager = assetManager;
    } catch (Exception e) {
    e.printStackTrace();
    }
    Resources superRes = super.getResources();
    mResources = new Resources(mAssetManager, superRes.getDisplayMetrics(),
    superRes.getConfiguration());

这种做法相当于应用中两个Resource实例
插件的开发可以基于自己继承一个MyBaseActivity进行

上一篇:Android内存泄漏与优化(下) 下一篇:类加载器ClassLoader