Android 虚拟机
而基于寄存器(硬件在CPU内部)的机器指令更长
速度: CPU - > 寄存器 -> 内存 -> 外存
http://blog.csdn.net/ljtyzhr/article/details/39859659
Android 目前有2中虚拟机, Dalvik 和 ART 虚拟机;
Android 虚拟机和编译加载顺序
Android 热修复其实主要是针对 Android 虚拟机加载类的一个过程,所以首先先我们应该知道 Android 常用的虚拟机是 Dalvik 虚拟和 ART 虚拟机;
Android 4.0 之前是主要是的 Dalvik 虚拟机。 Android 4.4 之后开始支持 ART 虚拟机(可选), Android 5.0 之后就是 ART 虚拟机;
Android 4.0 --> Android 4.4 --> Android 5.0 —> Android 7.0
Dalvik 虚拟机在 Android 2.2 的时候引入了 JIT (Just in time), 也就是一边运行,一边编译成机器码在运行;这种编译成机器码的过程在应用重启的时候需要重新编译成机器码再运行,有点浪费性能(不是持久化),重复翻译,编译,运行;
在 Android 5.0 之后就使用完全使用 ART 虚拟机;因为在 AOT (ahead of time) 的操作在安装的时候把 dex 优化成odex; 在Android N (7) 之前是全量dex 优化成 odex, 这样导致安装 apk 的时候,或者系统更新重启的时候非常耗时,特别的慢;
所以在 Android N 后引入了 JIT 和 AOT 的混合模式; 可以理解为“全时段的编译”(All-Of-the-Time compilation, 也叫 AOT;是不是发现有2个 AOT, 一开始我也很懵逼的;其实和Android 5.0 中的 AOT 是不太一样的;还有要注意的是Android N 之后的 JIT 和 Davlik 虚拟机中的JIT是不一样的,简单理解就是高级版的JIT;这个高级版本的 JIT 过程会把处理后的odex缓存到 base.art (有些地方也叫 image ) 中;等下次app启动的时候,就先直接把这个优化后的 base.art 加载到内存中;这样就不会重复的 JIT了;
混合模式的理解
ART 初期是使用全量的 AOT (aheader of time) 变成机器码(指令); 因为耗安装时间和系统升级后的启动时间;所以在 ART 的时候,先把dex 解释成中间态的,不编译成机器码。在运行的时候,或者充电的时候,只编译“热代码”
引用infoq 的一篇文章 http://www.infoq.com/cn/news/2016/04/android-n-aot-jit
Android N(7.x)开发者预览版包含了一个混合模式的运行时。应用在安装时不做编译,而是解释字节码,所以可以快速启动。ART中有一种新的、更快的解释器,通过一种新的JIT完成,但是这种JIT的信息不是持久化的。取而代之的是,代码在执行期间被分析,分析结果保存起来。然后,当设备空转和充电的时候,ART会执行针对“热代码”进行的基于分析的编译,其他代码不做编译。为了得到更优的代码,ART采用了几种技巧包括深度内联。
对同一个应用可以编译数次,或者找到变“热”的代码路径或者对已经编译的代码进行新的优化,这取决于分析器在随后的执行中的分析数据。这个步骤仍被简称为AOT,可以理解为“全时段的编译”(All-Of-the-Time compilation)。
源码类到机器执行的文件过程
主要过程: java - (dex, class) - opt/oat – odex;
Davlik 虚拟机: java - dex - opt – D 类型的 odex (优化过后的还是需要翻译); JIT
ART虚拟机: java – dex – oat – A 类型的 odex (机器码类型文件); AOT ( Ahead of time)
混合模式: java – dex – oat – (D类型的 odex, base.art: 热缓存,image) JIT(高级的JIT); AOT (All-Of-the-Time compilation)可以理解为“全时段的编译” ,profile
注意以上的 A 类型 odex 和 D 类型的 odex,只是用来代码 2 种是不同的 odex,便于理解;
补丁包
补丁包主要有 class, 资源文件,so的改动;
- 资源文件方案;替换 AssertManager, —> 加载 resources.arsc
- os 还不清楚,没研究过, 可能使用classLoader 加载放入so 目录
- 类 :底层替换和类加载器方案
本文主要诉说类加载器的方案;
类补丁生效原理
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
尾声
一转眼时间真的过的飞快。我们各奔东西,也各自踏上了自己的旅途,但是即使多年不见,也因为这份情谊我们依旧如从前那般“亲密”。不忘初心方得始终。加油吧,程序员们,在我看来35岁,40岁从来不是危机,只要永远不要忘记自己为何踏上征程!
为了让更多在学习中或者最近要准备面试的朋友们看到这篇文章,希望你们能多多评论,点赞+转发!
再次感谢所有给我提供过题目的朋友们,感谢一路有你!
一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算
3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算**