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文件,返回结果,好了原理就讲到这里的,后续还需要自己多多操作,越用越熟练!
Android为TV端助力之热修复原理的更多相关文章
- Android为TV端助力之QQ空间热更新技术
直接上代码 package com.enjoy.patch; import android.content.Context;import android.os.Build;import android ...
- Android为TV端助力 转载:RecyclerView分页加载
package com.android.ryane.pulltoloaddata_recyclerview; import android.os.Handler;import android.os.L ...
- Android为TV端助力(转载)
作者地址http://www.jianshu.com/u/63915ef020e2 针对Android Tv的自定义RecyclerView 作者 wenju_song 关注 2016.12.09 1 ...
- Android为TV端助力 不需要Socket的跨进程推送消息AIDL!
上篇介绍了跨进程实时通讯http://www.cnblogs.com/xiaoxiaing/p/5818161.html 但是他有个缺点就是服务端无法推送消息给客户端,今天这篇文章主要说的就是服务器推 ...
- Android为TV端助力之Webview与JS双向交互
package com.hhzt.iptv.adservice; import android.app.Activity;import android.graphics.Bitmap;import a ...
- Android为TV端助力之WebView开发踩坑一
在Android清单配置文件里面 自定义application时,在4.4系统上面不能加上一个属性,见下图 否则界面将不会显示任何数据,在更高或者更低的系统上面没有测试!
- Android为TV端助力:(转载)修改TextView字体样式
一.开篇 因为 Android 字体相关的内容还比较多的.有时候其实我们只需要调整一下属性就可以满足设计师的需求,或者是一个退后的方案(毕竟有发版的时间卡住了),有一些效果可以大概满足需求. 那么本文 ...
- Android为TV端助力:UDP协议(接收组播和单播)
private static String MulticastHost="224.9.9.98";private static int POST=19999;private sta ...
- Android为TV端助力:自定义view之太阳
先看效果图 package com.hhzt.iptv.lvb_w8.view; import android.content.Context;import android.graphics.Canv ...
随机推荐
- 650. Find Leaves of Binary Tree
class Solution { public: vector<vector<int>> findLeaves(TreeNode* root) { vector<vect ...
- Linux实现定时备份MySQL数据库并删除30天前的备份文件
1. MySQL5.6以上版本 2. 修改 /etc/my.cnf 文件 # vim /etc/my.cnf [client] host=localhost user=你的数据库用户 password ...
- C++内存管理4-Windows编程中的堆管理(转)
1 引言 在大多数Windows应用程序设计中,都几乎不可避免的要对内存进行操作和管理.在进行大尺寸内存的动态分配时尤其显的重要.本文即主要对内存管理中的堆管理技术进行论述. 堆(Heap)实际是位于 ...
- WebGL学习笔记二——绘制基本图元
webGL的基本图元点.线.三角形 gl.drawArrays(mode, first,count) first,代表从第几个点开始绘制即顶点的起始位置 count,代表绘制的点的数量. mode,代 ...
- linux 程序失败自动重启
最近写了一个spark streaming 程序,但是程序跑着跑着就报错了,而且不会自动重启,以下脚本实现了程序失败自动重启 基本原理:查看程序日志文件是否有ERROR或Exception字样,有说明 ...
- 006 SpringCloud 学习笔记2-----SpringCloud基础入门
1.SpringCloud概述 微服务是一种架构方式,最终肯定需要技术架构去实施. 微服务的实现方式很多,但是最火的莫过于Spring Cloud了.SpringCloud优点: - 后台硬:作为Sp ...
- 大数据之路【第十篇】:kafka消息系统
一.简介 1.简介 简 介• Kafka是Linkedin于2010年12月份开源的消息系统• 一种分布式的.基于发布/订阅的消息系统 2.特点 – 消息持久化:通过O(1)的磁盘数据结构提供数据的持 ...
- c# EF插入数据报错跟踪代码
我们在使用EF进行数据库插入的时候或出现一些插入失败的情况,但是具体是哪个字段不符合数据库设计要求无法得知,普通的try catch 无法捕获加上一下方法就可以 try { ...
- hadoop功能与用途
1.hadoop是什么? 开源的分布式存储和分布式计算平台. 2.hadoop组成? HDFS:分布式文件存储系统,存储海量数据. Mapreduce:并行处理框架,实现任务分配和调度. 3.hado ...
- nginx静态文件不设置缓存
找到nginx安装目录下的nginx.conf文件,再nginx里面添加如下的内容 location / { add_header Cache-Control no-cache; add_header ...