动态加载总结
来源:互联网 发布:白俄罗斯军力知乎 编辑:程序博客网 时间:2024/06/12 00:33
动态加载
总结自Android动态加载系列索引
动态加载定义
- 程序在运行的时候通过加载一些本地不存在的可执行文件实现一些特定的功能
- 这些可执行文件是可以替换的
- 更换静态资源不属于动态加载
- Android中动态加载的核心思想就是动态调用外部的dex文件
Android动态加载的类型
- 动态加载so库
- 动态加载jar/apk/dex文件
由于安全原因,Android不允许直接加载手机外部存储这类存储路径上的可执行文件(如so库或者dex包)
因此动态加载的大致过程就是:
- 把可执行文件拷贝到data/packagename内APP内部存储
- 加载可执行文件
- 调用具体的方法执行业务逻辑
动态加载的三种形式
- 简单的动态加载模式
- 代理Activity模式(核心就是使用宿主的一个代理Activity为插件所有的activity提供组件工作需要的环境)
- 动态创建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的模式
- 在主项目的代理Activity里,直接调用对应插件Activity的生命周期
在插件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动态加载oat文件总结一
- Android动态加载oat文件总结一
- 动态库加载的函数总结
- Android动态加载相关知识点总结
- [造轮子]Android动态加载框架总结
- 动态加载框架集合 总结篇
- Selenium总结:模拟浏览器动态加载页面
- 关于动态加载Actor的总结
- 动态加载JS文件方法总结
- Android动态加载学习总结(一):类加载器
- .net动态加载CSS样式表方法总结
- 项目总结—jQuery EasyUI-DataGrid动态加载表头
- Linux下无法加载动态库问题总结
- 采用dlopen、dlsym、dlclose加载动态链接库【总结】
- 近日Linux笔记
- dubbo
- ThreadLocal详解
- java缓存
- Python基本数据类型
- 动态加载总结
- 为什么jsonp只支持get请求?
- ACM的奇技淫巧-输出外挂(相关博客)
- 类加载器ClassLoader
- 基于@AspectJ的AOP的使用
- JavaFX制作一个简单的时钟
- 服务器架设
- HDFS读文件过程分析:读取文件的Block数据
- nginx在Centos下的安装,转:http://www.linuxidc.com/Linux/2016-09/134907.htm