zoukankan      html  css  js  c++  java
  • Android为TV端助力之热修复原理

    通过源码我们知道Android加载类是通过ClassLoad类里面的findClass先去查找的,如下图所示

     

     

     通过看源码我们知道,ClassLoad是一个抽象类,它本身并没有实现findclass()方法,而是通过Android双亲委托机制交给它的子类去实现的,如果子类没有找到,那最终就会调用自己的findclass方法

    抛出ClassNotFoundException异常,接下来我们去看它的子类是如何实现findclass方法的,通过源码我们知道ClassLoad有两个子类SecureClassLoader跟BaseDexClassLoader,

     

     

     我们在BaseDexClassLoader里面找到的findclass类的实现方法

     

     

     通过此方法我们看到它是调用了pathList.findClass方法去查找类,而pathList是属于DexPathList的对象,那么我们点进去看看此方法是如何查找的

     

     

     我们看到它首先遍历的一个叫dexElements的数组,得到一个DexFile对象,接着往下看,它接着又调用的dex.loadClassBinaryName方法的,我们在点进去看看

     

     

     

     

     

     发现它最终走到的native方法里面了,那么我们就不深究的,回来上一步来看看dexElements是个什么东西??? dexFile是什么东西? 为什么要遍历它???

     

    通过DexPahtList的构造方法,我们可以知道dexElements是在这里赋值的,如果

     

     

     那么我们一如既往的点进去看看是如何实现的

     

     

     

     

     

     

     

     

     

    看到这里我们明白的前面的dexFile是什么的,他是由loadDexFile构造出来的DexFile文件,纳尼???我们接着看loadDexFile

     

     

     这里的optimizedDirectory:dex文件的输出目录(因为在加载jar/apk/zip等压缩格式的程序文件时会解压出其中的dex文件,该目录就是专门用于存放这些被解压出来的dex文件的)。

    在构造方法的时候就已经传过来的,所以我们接着看optomizedPathFor方法

     

     这个file就是在这里创建的

     

     

     

     optimizedPathFor 方法执行完了,就是返回的一个FIle路径,里面放的是你补丁包,然后再把路径传给

     

     返回一个dexFile文件,loadDex最终执行的是naitve方法,直白点说就是把我们的补丁包dex文件加载成dexFile对象,然后放到我们最开始的数组里面

     

     

     

     

    最后回到我们最开始的地方,遍历这个数组,找到我们的class文件,返回结果,好了原理就讲到这里的,后续还需要自己多多操作,越用越熟练!

     

  • 相关阅读:
    解决大量TCPIP连接后出现“因为系统缺乏足够缓冲区空间或者因为队列已满无法执行套接字上操作”的问题
    网站/网页 变灰的方法
    [收藏]General things to take into consideration while doing socket programming.
    数据库主体在该数据库中拥有 架构,无法删除解决方法
    Word字体与像素的对应关系
    50个网站设计开发必备的资源素材网站
    apache实现页面重定向(地址跳转)
    JS eval(function(p,a,c,k,e,r){e=function(c)*****解密
    JS打印指定区域内容
    如何才能做到网站高并发访问? .
  • 原文地址:https://www.cnblogs.com/xiaoxiaing/p/11957029.html
Copyright © 2011-2022 走看看