一、编译+解释

java 语言和 iOS 不同,OC 本质是 C语言,经过 Clang 编译前端编译之后生成中间代码,再经过优化后传递给编译后端 LLVM ,根据不同的架构,生成汇编代码后经过汇编,最终生成机器码。

Andriod 因为需要兼容的设备太多,所以只能生成中间代码,完成设备的识别之后再生成机器码来执行。其中,中间代码在 java 中时 .class 文件,在 Andriod 中就是 .dex 文件,而生成机器码的过程就是 Andriod 不断优化提升速度的过程,相对复杂,进程如下:

1. DVM

java 的代码运行在虚拟机中,也就是 DVM。一遍运行代码的同时,解释器对代码进行解释,生成机器码然后运行。因为这个边运行边解释的模式,所以导致 Andriod 早期运行速度很慢。

2. DVM + JIT

朝着 iOS 的直接生成机器码的优化方向进行优化,那就是如何尽可能多的在运行之前生成机器码。

所以,Andriod 2.2 中推出了 JIT,也就是 Just-In-Time,即在 APP 启动之前编译。

很明显,启动之前不可能编译所有的中间代码,所以 JIT 只是在 APP 启动之前编译常用的代码。如此就造成了几个问题:

  1. app 启动速度贼慢;
  2. 每次 app 启动都要重复编译;
  3. 执行到未编译的代码时,还是会很慢;

针对上述几点, Andriod 退出了 ART + AOT

3. ART + AOT

ART 就是 Andriod-Runtime,用于替换虚拟机 DVM。AOT 就是 Ahead-Of-Time,也就是在 APP 安装时进行编译。

ART 如何替换 DVM 似乎值得深究,但是我不懂。

APP 安装时编译就很明显的导致几个问题:

  1. app安装缓慢;
  2. 手机开机后所有 app 执行 AOT 导致开机缓慢;
  3. 刷机后全量 AOT;
  4. 系统版本更新后全量 AOT;

除了这些问题,还会导致 AOT 之后应用控件明显增大,不知道这个是不是安卓越用越卡的原因。

因此,Andriod 继续推出了混合编译模式~

4. 混合编译:ART + AOT + JIT

混合编译基本核心就是:手机和 App 空闲时进行编译,运行时如果没有编译完成,那就使用 JIT 编译常用代码。

至此,已经是 Andriod7.0,直到这个时候,Andriod 才算是在一定程度上解决了 Andriod 卡顿的问题。

至于 Andriod 越用越卡这个原因暂时未研究~

5. 解释器优化

后面就属于模板优化的范畴了

6. 编译模板优化

7.

注意:广义的 LLVM 指的是编译的整个过程,也就是前后端的统称,Clang 只是 LLVM 的一个子集。狭义的 LLVM 指的就是编译后端;


http://www.taodudu.cc/news/show-1912785.html

相关文章:

  • bitmap位图详解
  • iOS图形学(一):viewWillUnload和内存警告
  • iOS中的坑:URL不识别##
  • WKWebview的内存问题
  • iOS中的锁和线程同步
  • semaphore的几种用法
  • 难道栈空间有缓存?
  • iOS实例、类、元类
  • id和instancetype
  • Advanced Graphics and Animations for iOS Apps
  • ivar和property
  • bound、frame、position、anchorPoint
  • Java、OC、C/C++中的null
  • iOS:Tagged Pointer
  • sqlite3源码调试
  • 红黑树、B树、B+树各自适用的场景
  • 动态库的隐式链接和显示链接
  • iOS:懒加载符号绑定流程
  • 汇编:call和jmp
  • code review的一些思考
  • iOS:fishhook原理分析
  • mach-O文件结构分析
  • 设备唯一标志的解决方案
  • iOS:主流启动优化方案浅析
  • iOS:segment对齐原则
  • HTTP缓存机制及其在iOS中的应用
  • iOS:SideTable
  • iOS:isa指针
  • iOS底层:PAGEZERO的作用
  • iOS图形学(三):屏幕成像原理

安卓为什么卡及其解决方案相关推荐

  1. android 盒子录屏apk,三种用于安卓录屏的解决方案

    本文总结三种用于安卓录屏的解决方案: adb shell命令screenrecord MediaRecorder, MediaProjection MediaProjection , MediaCod ...

  2. 安卓系统卡顿的解决方法

    作为一个安卓的用户也是会有烦恼的,通常会遇到一系列的毛病,比如:手机经常会莫名其妙的变卡?点击app半天反应不过来?电话铃声响后却迟迟看不到电话界面?多个软件无缘无故的停止运行?这些都是安卓手机用户都 ...

  3. Ansroid系统(262)---MTK安卓sim卡相关源码分析

    MTK安卓sim卡相关源码分析 原文地址:http://m.blog.csdn.net/article/details?id=50039589 最近由于一个sim卡相关的需求,就去了解了一下Andro ...

  4. android8卡顿,Android 8.0系统曝光,解决了安卓系统卡顿的问题

    原标题:Android 8.0系统曝光,解决了安卓系统卡顿的问题 8.0拟于今年5月17-19日召开的2017年谷歌I/O大会上正式宣布,之前已经曝光了该系统的一些特性,例如开发代号为奥利奥(Oero ...

  5. iOS进阶--提高XCode编译速度、Xcode卡顿解决方案

    提升编译链接的速度主要有以下三个方式: 1. 提高XCode编译时使用的线程数 defaults write com.apple.Xcode PBXNumberOfParallelBuildSubta ...

  6. 电脑变卡DOS解决方案

    电脑变卡DOS解决方案: 1- window健 + R健 输入cmd 2- 输入 ipconfig release 释放IP 3- 输入 ipconfig /renew 重新获取IP

  7. android卡刷教程,卡刷是什么意思?安卓系统卡刷教程详解

    2016-03-29 17:43:49 卡刷是什么意思?安卓系统卡刷教程详解 标签:卡刷,安卓系统卡刷教程,卡刷升级 [ROM之家]使用安卓系统手机的发烧友可能会经常提到卡刷一词,那么到底卡刷是什么意 ...

  8. 逍遥安卓模拟器卡android,逍遥安卓模拟器卡顿如何解决

    逍遥安卓模拟器是一款功能非常全面,性能十分稳定的安卓模拟器软件.可以模拟现今比较流行的一些手机型号,不仅能够方便测试不同手机的流畅性.还能够兼容各类软件及硬件,市面上百分之九十九的游戏它都可以完美运行 ...

  9. IntelliJ IDEA 运行卡顿解决方案

    IntelliJ IDEA 运行卡顿解决方案 1.开启IntelliJ IDEA缓慢,想要提升启动速度)则打开D:\JetBrains\IntelliJ IDEA 2020.3.2\bin(依据实际安 ...

  10. 原生Android手机管家,谁说安卓一定卡,诺基亚X7原生安卓自备手机管家一键优化告别卡顿...

    一提到安卓系统卡顿不流畅似乎成了安卓智能机的标签,由于安卓系统的架构层次.运行机制和开源特性,安卓智能手机在长年使用后很容易出现卡顿的现象,另外冗杂的定制预装程序.不断地接收推送消息或是后台下载,都会 ...

最新文章

  1. 基础知识漫谈(1): 想到哪儿写到哪儿
  2. 还在为数学建模的事发愁?带你一起来看看数模竞赛中必备的经典算法
  3. 注解源代码学习 - Annotation @InjectMocks and @Mock debug
  4. 鲜为人知的6个黑科技网站_6种鲜为人知的熊猫绘图工具
  5. java按照io流向基类_Java IO详解
  6. 使用Kubernetes容器服务在云上搭建AI推理环境
  7. 表格是html文档的基本属性吗,Html
  8. 细胞自动机 c语言程序,Processing精彩例程之细胞自动机
  9. Citrix StoreFront无法正常初始化
  10. linux|计划任务
  11. 个人博客 修改markdown代码块背景颜色
  12. 相机外部参数—世界坐标、相机坐标、物体坐标变换
  13. python文字处理dummy_python学习之使用multiprocessing.dummy多线程爬虫
  14. 【raft】学习六:etcd/raft 选举和选举优化
  15. 信捷pLC C语言错误格式,信捷PLC常见问题及解决方法经验分享
  16. App自动化测试 —— Appium的使用
  17. 硬盘提示初始化是什么意思?数据会丢失吗?
  18. 敏捷 | 【万字长文】 说透 如何学习敏捷开发流程和运用
  19. Office2019 卸载重新安装-2022 Win10【不花钱+官方途径】
  20. Machine learning K-Means课堂笔记

热门文章

  1. springboot使用@Async实现异步操作
  2. JVM监控及诊断工具GUI篇之Eclipse MAT
  3. MySQL Buffer Pool缓冲池总结
  4. mysql的索引(二)
  5. border-radius的8个属性值_画半圆、叶子等
  6. centos 更新内核步骤
  7. 发现《后端架构师技术图谱》
  8. 7、创建ROS msg和srv
  9. 对语音通话占用带宽的理解
  10. 【android自定义控件】TextView详解及自定义一