Android动态加载技术(插件化技术)
No1:
插件化技术的好处:
1)减轻应用的内存和CPU占用
2)实现热插拔,即在不发布新版本的情况下更新某些模块
No2:
插件化方案必须要解决三个基础性问题:资源访问、Activity生命周期的管理和ClassLoader的管理
No3:
宿主是指普通的apk,插件一般指经过处理的dex或者apk。插件化框架大多采用apk作为插件,很多需要用到代理Activity,插件Activity的启动大多数是借助一个代理Activity来实现的。
No4:
Activity的工作主要是通过ContextImpl来完成的,Activity中有一个交mBase的成员变量,它的类型就是ContextImpl。Context中有两个抽象方法getAssets和getResources,通过它们来获取资源的,真正实现在ContextImpl中。
No5:
资源访问
加载apk中的资源
protected void loadResources(){
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());
mTheme = mResources.newTheme();
mTheme.setTo(super.getTheme());
}
通过反射,调用AssetManager中addAssetPath方法,将一个apk中的资源加载到Resources对象中。然后通过AssetManager来创建一个新的Resources对象
public final int addAssetPath(String path){
synchronized(this){
int res = addAssetPathNative(path);
makeStringBlocks(mStringBlocks);
return res;
}
}
接着在代理Activity中实现getAssets和getResources
@Override
public AssetManager getAssets(){
return mAssetManager == null?super.getAssets():mAssetManager;
} @Override
public Resources getResources(){
return mResources == null?super.getResources():mResources;
}
No6:
Activity生命周期的管理
反射方式
@Override
protected void onResume(){
super.onResume();
Method onResume = mActivityLifecircleMethods.get("onResume");
if(onResume!=null){
try{
onResume.invoke(mRemoteActivity,new Object[]{ })
}catch(Exception e){
e.printStackTrace();
}
}
} @Override
protected void onPause(){
Method onPause = mActivityLifecircleMethods.get("onPause");
if(onPause!=null){
try{
onPause.invoke(mRemoteActivity,new Object[]{ })
}catch(Exception e){
e.printStackTrace();
}
}
super.onPause();
}
接口方式
public interface DLPlugin{
public void onStart();
public void onRestart();
public void onResume();
public void onPause();
public void onStop();
public void onDestroy();
...
}
代理Actvitiy中调用
...
@Override
protected void onStart(){
mRemoteActivity.onStart();
super.onStart();
} @Override
protected void onRestart(){
mRemoteActivity.onRestart();
super.onRestart();
} @Override
protected void onResume(){
mRemoteActivity.onResume();
super.onResume();
}
mRemoteActivity就是DLPlugin的实现
No7:
插件ClassLoader的管理
public class DLClassLoader extends DexClassLoader{
private static final String TAG ="DLClassLoader";
private static final HashMap<String,DLClassLoader> mPluginClassLoaders = new HashMap<String,DLClassLoader>(); protected DLClassLoader(String dexPath,String optimizedDirectory,String libraryPath,Classloader parent){
super(dexPath,optimizedDirectory,libraryPath,parent);
} public static DLClassLoader getClassLoader(String dexPath,Context context,Classloader parentLoader){
DLClassLoader dLassLoader = mPluginClassLoaders.get(dexPath);
if(dLassLoader != null){
return DLClassLoader;
} File dexOutputDir = context.getDir("dex",Context.MODE_PRIVATE);
final String dexOutputPath = dexOutputDir.getAbsolutePath();
dLClassLoader = new DLClassLoader(dexPath,dexOutputPath,null,parentLoader);
mPluginClassLoaders.put(dexPath,dLClassLoader); return dLClassLoader;
}
}
通过将不同插件的ClassLoader存储在一个HashMap中,这样就可以保证不同插件中的类彼此互不干扰。
Android动态加载技术(插件化技术)的更多相关文章
- Adroid动态加载Apk-插件化技术框架(动态代理方案)
技术:Android + java +动态加载+插件化 概述 为什么要使用插件化?在开发中,一个项目只会越做越大.初始版本可能是单一功能,后续可能加上各种风马牛不相及的功能.所以我认为插件化可以使 ...
- Android动态加载代码技术
Android动态加载代码技术 在开发Android App的过程当中,可能希望实现插件式软件架构,将一部分代码以另外一个APK的形式单独发布,而在主程序中加载并执行这个APK中的代码. 实现这个任务 ...
- Android动态加载技术初探
一.前言: 现在,已经有实力强大的公司用这个技术开发应用了,比如淘宝,大众点评,百度地图等,之所以采用这个技术,实际上,就是方便更新功能,当然,前提是新旧功能的接口一致,不然会报Not Found等错 ...
- 深入浅出Android动态加载jar包技术
在实际项目中,由于某些业务频繁变更而导致频繁升级客户端的弊病会造成较差的用户体验,而这也恰是Web App的优势,于是便衍生了一种思路,将核心的易于变更的业务封装在jar包里然后通过网络下载下来,再由 ...
- Android 动态加载 (一) 态加载机制 案例一
在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优势.本 ...
- Android 动态加载(防止逆向编译) jar混淆加密
最近工作中接到了一个研究防止逆向编译的任务.研究了几天资料,最后基本实现了防破解技术,在这个工程中,也略有一些心得体会,现整理下来分享,供大家探讨参考研究.文中如有纰漏.失实之处,请大家及时给与指正. ...
- 【Android】Android动态加载Jar、APK的实现
本文介绍Android中动态加载Jar.APK的实现.而主要用到的就是DexClassLoader这个类.大家都知道Android和普通的Java虚拟机有差别,它只能加载经过处理的dex文件.而加载这 ...
- android动态加载
转载自: http://www.cnblogs.com/over140/archive/2012/03/29/2423116.html http://www.cnblogs.com/over140/a ...
- Android动态加载jar/dex
前言 在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优 ...
- [转载] Android动态加载Dex机制解析
本文转载自: http://blog.csdn.net/wy353208214/article/details/50859422 1.什么是类加载器? 类加载器(class loader)是 Java ...
随机推荐
- java类加载时执行顺序
源代码 class HelloA { public HelloA() { System.out.print("A"); } { System.out.print("B&q ...
- WebService学习------小实例开发(号码归属地查询)
1.WebService简介: WebService是一种跨平台,跨语言的,可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术.通过SOAP在Web上提 ...
- MongoDB之副本集
MongoDB之副本集 一.简介 MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库 ...
- 应用ntpdate小工具同步时间
应用ntpdate小工具同步时间: ntpdate pool.ntp.org 中国的时间服务器有: ntpdate .cn.pool.ntp.org ntpdate .asia.pool.ntp.or ...
- python多线程限制并发数示例
#coding: utf-8 #!/usr/bin/env python import Queue import threading import time prolock = threading.L ...
- xBIM 应用与学习 (二)
目录 xBIM 应用与学习 (一) xBIM 应用与学习 (二) xBIM 基本的模型操作 xBIM 日志操作 XBIM 3D 墙壁案例 xBIM 格式之间转换 xBIM 使用Linq 来优化查询 x ...
- Python基础篇(三)
元组是序列的一种,与列表的区别是,元组是不能修改的. 元组一般是用圆括号括起来进行定义,如下: >>> (1,2,3)[1:2] (2,) 如果元组中只有一个元素,元组的表示 ...
- BZOJ 1923: [Sdoi2010]外星千足虫 [高斯消元XOR]
1923: [Sdoi2010]外星千足虫 对于 100%的数据,满足 N≤1,000,M≤2,000. 裸高斯消元解异或方程组 给定方程顺序要求用从上到下最少的方程,那么找主元时记录一下最远找到哪个 ...
- 2019/1/10 redis学习笔记(二)
本文不涉及集群搭建操作 关于在lua脚本中操作redis的应用场景 大家都知道redis对于单个集合的操作是原子性的;但是有可能有一种场景是这样.比如说抢红包,现在有十个人抢五份红包,抽象到我们jav ...
- css居中方法与双飞翼布局
居中 类型 方法 对应属性 水平 垂直 水平&垂直 1.父元素使用外边距自动 2.子元素显示行内块级元素,写入内容,父元素设置文本居中 3.给父元素开启非绝对和固定定位作为子元素开启绝对定位的 ...