Android 组件化、插件化

程序员自我修养之IOC框架的思想

2021-03-04  本文已影响0人  巴菲伟

一、IOC理解、应用、实现

      理解:有了 IOC 容器之后,创建对象和查找依赖的工作就交给框架完成,并由容器注入对象,这样通过 IoC 容器实现了类和类之间的解耦

    应用:注入布局文件、注入views、注入views的事件监听

    实现:注解、反射、动态代理

二、动态代理的使用三要素

    1.有Proxy代理 : 给外界动态拿到实现的对象

    2.具体拿到的对象

    3.抽象接口 : 这个是给newProxyInstance去动态反射对象的参数使用

动态代理实现

        4.反射常见方法

           补充一个:getClassLoader().loadClass(className(String 的类名))

Class.forName和ClassLoader.loadCLass的区别 getMethod和getDeclaredMetod的区别

三、APT和IOC框架的区别

两者之间的区别

四、使用动态代理+注解+反射实现

view.setOnLongClickListener(new View.OnLongClickListener() 

简易版动态替换 IOC框架具体实现

五、反射去加载一个未安装app的类

        实现思想:原理和热修复相似

        1.首先拿到app的安装目录路径

        2.再拿到要加载的ClassLoader----》DexClassLoader

        3.然后拿到未安装的DexPathList的对象

        4.从DexPathList对象去拿到未安装的PluginElement的数组

        5.把PluginElement和SrcElement合并为一个新的DesElement的数组

        6.用DesElement替换已经安装的DexPathList的SrcElement

六、IOC如何使用热修复

    1. 获取到apk的所有class

    String path=getApplicationInfo(context.getPackageName(),0).sourceDir;

    DexFile dexfile=newDexFile(path);

    Enumeration entries=dexfile.entries();

    while(entries.hasMoreElements()){

        String name=(String)entries.nextElement();

        if(name.contains(packageName)){

            classList.add(name);}}

    2.热修复的流程

        a.首先获取当前用的的PathClassLoader

        b.反射拿到DexPathList属性对象pathList

        c.反射修改pathList的dexElements的属性

        d.把补丁包path.dex转换为Element的数组

        e.path+dexElements合并,并反射赋给pathList的dexElements数组

    把.class文件转化为jar包的命令:

dx --dex --output=path.jar com/example/myapplication/Utils.class

七、反射修改系统的源码

PMS反射处理

八、反射去启动一个未安装app的类

AMS代码处理 ActivityThread代理处理

     核心思想:

    1. 先去反射IActivityManager对象,去拿到startActivity

    2.做一个ProxyActivity通过动态代理去修改TestActivity,并把它转换为Intent的参数,并且保存原始TestActivity数据

   3.反射ActivityThread的H(Handler)的对象

    3.反射ActivityThread的mCallBack的对象,通过反射去执行代码,传入H的对象,然后去覆写handleMessage的LAUNCH_ACTIVITY,把ProxyActivity的Intent的数据替换为TestActivity的数据执行

上一篇下一篇

猜你喜欢

热点阅读