通过源码我们知道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文件,返回结果,好了原理就讲到这里的,后续还需要自己多多操作,越用越熟练!

Android为TV端助力之热修复原理的更多相关文章

  1. Android为TV端助力之QQ空间热更新技术

    直接上代码 package com.enjoy.patch; import android.content.Context;import android.os.Build;import android ...

  2. Android为TV端助力 转载:RecyclerView分页加载

    package com.android.ryane.pulltoloaddata_recyclerview; import android.os.Handler;import android.os.L ...

  3. Android为TV端助力(转载)

    作者地址http://www.jianshu.com/u/63915ef020e2 针对Android Tv的自定义RecyclerView 作者 wenju_song 关注 2016.12.09 1 ...

  4. Android为TV端助力 不需要Socket的跨进程推送消息AIDL!

    上篇介绍了跨进程实时通讯http://www.cnblogs.com/xiaoxiaing/p/5818161.html 但是他有个缺点就是服务端无法推送消息给客户端,今天这篇文章主要说的就是服务器推 ...

  5. Android为TV端助力之Webview与JS双向交互

    package com.hhzt.iptv.adservice; import android.app.Activity;import android.graphics.Bitmap;import a ...

  6. Android为TV端助力之WebView开发踩坑一

    在Android清单配置文件里面 自定义application时,在4.4系统上面不能加上一个属性,见下图 否则界面将不会显示任何数据,在更高或者更低的系统上面没有测试!

  7. Android为TV端助力:(转载)修改TextView字体样式

    一.开篇 因为 Android 字体相关的内容还比较多的.有时候其实我们只需要调整一下属性就可以满足设计师的需求,或者是一个退后的方案(毕竟有发版的时间卡住了),有一些效果可以大概满足需求. 那么本文 ...

  8. Android为TV端助力:UDP协议(接收组播和单播)

    private static String MulticastHost="224.9.9.98";private static int POST=19999;private sta ...

  9. Android为TV端助力:自定义view之太阳

    先看效果图 package com.hhzt.iptv.lvb_w8.view; import android.content.Context;import android.graphics.Canv ...

随机推荐

  1. centos 查看版本 及 升级

     查看系统版本: cat /etc/redhat-release(/etc/centos-release)// 或者 rpm -q centos-release [root@56 ~]# cat /e ...

  2. QByteArray数据进行CRC32校验时产生的随机结果

    QT中使用QByteArray来存放了C++中的char数组. 两端使用相同的crc32进行校验,QT中却产生了随机的校验结果, C++端产生唯一的正确校验结果. 查看QByteArray相关资料,未 ...

  3. Python Linux系统管理与自动化运维

    Python Linux系统管理与自动化运维 前言 第1章Python语言与Linux系统管理1 1.1Python语言有多流行1 1.2Python语言为什么流行3 1.3Python语言有什么缺点 ...

  4. Linux 中的-rwxr-xr-x权限代表什么意思

    Linux 中的权限 这里我拿一个tomcat目录举例说明.首先我们在linux系统中执行命令:ls -l 我们拿出其中一个说明-rwxr-xr-x,在Linux 系统中权限是区分用户的,即用户.组用 ...

  5. zabbix自动停用与开启agent

    我们在升级环境时遇到了一个问题,那就是zabbix会自动发送邮件给领导,此时领导心里会嘎嘣一下,为了给领导营造一个良好的环境,减少不必要的告警邮件,减少嘎嘣次数,于是在升级之前,取消zabbix监控的 ...

  6. 【Docker学习之二】Docker部署安装

    环境 docker-ce-19.03.1-3.el7.x86_64 一.Docker的部署安装 Docker采用Linux(内核)技术,所以只能运行在Linux上,官方说Linux kernel至少3 ...

  7. Error: Error occured while starting App. Original error: Activity used to start app doesn't exist or cannot be launched! Make sure it exists and is a launchable activity

    Error: Error occured while starting App. Original error: Activity used to start app doesn't exist or ...

  8. 直击JavaScript之面向对象

    有时候,我们使用电脑的时候,并不知道它的原理是什么,但是就是会使用他,这就是面向对象.同样的,在JavaScript中也可使用这种原理,接下来就随我一起探索一下关于JavaScript面向对象的内容吧 ...

  9. Feign 自定义编码器、解码器和客户端,Feign 转发请求头(header参数)、Feign输出Info级别日志

    Feign 的编码器.解码器和客户端都是支持自定义扩展,可以对请求以及结果和发起请求的过程进行自定义实现,Feign 默认支持 JSON 格式的编码器和解码器,如果希望支持其他的或者自定义格式就需要编 ...

  10. Mysql 索引基础

    [1]什么是索引?为什么要建立索引? 索引,其实就是目录. 索引,用于快速找出在某个列中有某个特定值的行. 不使用索引,MySQL必须从第一条记录开始查找整张表,直到找出相关的行,那么表越大,查询数据 ...