Android插件化开发笔记

目前主流的技术:插件化,热更新,增量更新

动态加载

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管理)

------待学习

你可能感兴趣的:(Android插件化开发笔记)