美文网首页
Android插件化开发笔记

Android插件化开发笔记

作者: 跑步与开车 | 来源:发表于2017-07-04 22:52 被阅读34次

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

    动态加载

    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插件化开发笔记

          本文链接:https://www.haomeiwen.com/subject/qngxhxtx.html