目前主流的技术:插件化,热更新,增量更新
动态加载
1.解决一个dex不能加载65535个方法的问题
2.解耦合
3.AB类产品
主流的开源框架
1.DynamicAPK
2.DroidPlugin(360的)
3.VirtualAPK
4.small
5.Android-plugin-framework
6.TWSPluginFramework
加载XML资源解析
1.加载插件apk
public static void loadPlugin(Context context){
InputStream is = null;
OutputStream os = null;
int len;
byte buffer = new byte[1024];
while((len = is.read(buffer))!=-1){
//把文件加载出来
}
}
2.DexClassLoader
apk在系统里面运行时进行了安装的,二plugin时没有安装的
所以要使用plugin,要清楚系统系统安装apk的流程
DexClassLoader可以解析apk dex;要传入一个实例,
DesClassLoader desClassLoader = new DexClassLoader(apkFile.getAbsolutePath,this.getDir(Constant.PLUGIN_NAME,Cotext.MODE_PRIVATE).getAbsolutePath,null,getClassLoader());
Class<?> loadClass = classLoader.loadClass(Constants.PackageName,+"R$drawable");
FieId[] declareFields = loadClass.getgetFieIds();
for(FieId fieId:declareFieIds){
int animId = fieId.getInt(R.drawable.class);
//Drawable sour = this.getResource().getDrawable(animId);//这个是不行的- -
//跟读系统源码,找到Resource的初始化方法,初始化插件的资源文件
AssetManager assetManager = PluginManager.getPlugnAssetManager(apkFile);
Resource resource = new Resource(assetManager,this.getResurce().getDisplayMetries,this.getResource().getConfiguration());
Drawable source = resource.getDrawable(animId);
Log.d(TAG,"animid"+animid);
}
反射到系统的AssetManager
public static AssetManager getPluginAssetManager(File apkFile){
Class<?> forName = Class.forName("android.content.res.AssetManager");
Method[] declareMethod = forName.getDeclareMethod();
for(Method method:declareMethod){
if(method.getName().equals("addAssetPath")){
AssetManager assetManager = AssetManager.newInstance();
method.invoke(assetManager,)//系统的方法
}
}
}
HOOK原理
通过反射拿到一个func1实例,在Application onCreate initHOOK的时候埋进去,作为动态代理,然后走系统的func2
例如startActivity的时候会走ActivityManagerService, 然后把里面的Intent换掉,换成PluginActivity的Intent,然后再回到ActivityManagerService扫描清单然后这时候再换回来
非侵入式钩子,通过系统的方式替换(系统的ActivityManager管理)
侵入式,好实现,但是会杀毒软件被杀掉(使用代理ActivityManager管理)
------待学习
网友评论