加入收藏 | 设为首页 | 会员中心 | 我要投稿 辽源站长网 (https://www.0437zz.com/)- 云专线、云连接、智能数据、边缘计算、数据安全!
当前位置: 首页 > 站长资讯 > 评论 > 正文

9102年了,还不知道Android为什么卡?

发布时间:2019-08-15 02:42:10 所属栏目:评论 来源:吃猫猫的鱼
导读:导读 最近华为方舟编译器要开源了,笔者去看了下发布会PPT,发现作为一名Android开发者,PPT中所介绍的知识点我居然不能完全看懂?于是乎恶补了下PPT中的内容,整理成本文。 本文将用通俗的语言从底层介绍Android卡顿的历史原因和谷歌与之斗争的过程 阅读完
副标题[/!--empirenews.page--]

导读

最近华为方舟编译器要开源了,笔者去看了下发布会PPT,发现作为一名Android开发者,PPT中所介绍的知识点我居然不能完全看懂?于是乎恶补了下PPT中的内容,整理成本文。

9102年了,还不知道Android为什么卡?

本文将用通俗的语言从底层介绍Android卡顿的历史原因和谷歌与之斗争的过程

阅读完这篇文章后你将

  1. 理解计算机是如何解读我们所写的程序并执行相应功能的
  2. 了解Android虚拟机的进化史
  3. 从底层了解造成Android卡顿的三大原因

一、基础概念

首先我们需要补习下一些基础概念,来理解计算机是如何解读我们所写的程序并执行相应功能的。

1.编译&解释

某些编程语言(如Java)的源代码通过编译-解释的流程可被计算机读懂

先上一段Java代码

  1. public static void main(String[] args){ 
  2.     print('Hello World') 

这是所有程序员的第一课,只需要写完这段代码并执行,电脑或手机就会打印出Hello World。那么问题来了,英文是人类世界的语言,计算机(CPU)是怎么理解英文的呢?

众所周知,0和1是计算机世界的语言,可以说计算机只认识0和1。那么我们只需要把上面那段英文代码只通过0和1表达给计算机,就可以让计算机读懂并执行。

9102年了,还不知道Android为什么卡?

结合上图,Java源代码通过编译变成字节码,然后字节码按照模版中的规则解释为机器码。

2.机器码&字节码

  • 机器码

机器码就是能被CPU直接解读并执行的语言。

但是如果使用上图中生成的机器码跑在另外一台计算机中,很可能就会运行失败。

这是因为不同的计算机,能够解读的机器码可能不同。通俗而言就是能在A电脑上运行的机器码,放到B电脑上就可能就不好使了。

举个例子,中国人A认识中文,英语;俄国人B认识俄语,英语。这时他两同时做一张中文试卷,B大概连写名字的地方都找不到。

所以这时候我们需要字节码。

  • 字节码

中国人A看不懂俄文试卷,俄国人B看不懂中文试卷,但是大家都看得懂英文试卷。

字节码就是个中间码,Java能编译为字节码,同一份字节码能按照指定模版的规则解释为指定的机器码。

字节码的好处:

  1. 实现了跨平台,一份源代码只需要编译成一份字节码,然后根据不同的模版将字节码解释成当前计算机认识的机器码,这就是Java所说的“编译一次,到处运行”。
  2. 同一份源码被编译成的字节码大小远远小于机器码。

9102年了,还不知道Android为什么卡?

3.编译语言&解释语言

  • 编译语言

我们熟知的C/C++语言,是编译语言,即程序员编译之后可以一步到位(编译成机器码),可以被CPU直接解读并执行。

9102年了,还不知道Android为什么卡?

可能有人会问,既然上文中说过字节码有种种好处,为什么不使用字节码呢?

这是因为每种编程语言设计的初衷不同,有些是为了跨平台而设计的,如Java,但有些是针对某个指定机器或某批指定型号的机器设计的。

举个例子,苹果公司开发的OC语言和Swift语言,就是针对自家产品设计的,我才不管你其他人的产品呢。所以OC或Swift语言设计初衷之一就是快,可直接编译为机器码使iPhone或iPad解读并执行。这也是为什么苹果手机的应用比安卓手机应用大的主要原因。这更是为什么苹果手机更流畅的原因之一!(没有中间商赚差价)

  • 编译-解释语言

拿开发Android的语言Java为例,Java是编译-解释语言,即程序员编译之后不可以直接编译为机器码,而是会编译成字节码(在Java程序中为.class文件,在Android程序中为.dex文件)。然后我们需要将字节码再解释成机器码,使之能被CPU解读。

这第二次解释,即从字节码解释成机器码的过程,是程序安装或运行后,在Java虚拟机中实现的。

二、造成卡顿的三大因素

今年最新的Android版本已经是10了,其实在这两年关于Android手机卡顿的声音已经慢慢低了下去,取而代之的是流畅如iOS之类的声音。

但是诸如超过iOS的话,还比较少,其实是因为Android有卡顿有三大历史原因。起步就比iOS低。

1.虚拟机——解释过程慢

通过上文描述,我们可以知道,iOS之所以不卡是因为他一步到位,省略了中间解释的步骤,直接跟硬件层进行通信。而Android由于没有一步到位,每次执行都需要实时解释成机器码,所以性能较iOS明显低下。

我们已经明确知道了字节码(中间商)是造成卡顿的主要元凶之一,我们可否像iOS那样扔掉字节码,直接一步到位呢?

明显不能,因为iOS搞来搞去就那么几个机型。反观Android方面,光手机就有无数种机型,无数种CPU架构/型号,更别提什么平板,车载等其他设备了。有那么多类型的硬件设备代表着就有非常多不同的硬件架构,每种架构都有自己对应的机器码解释规则。显然像iOS那样一步到位是不现实的。

那怎么办呢?既然扔不掉字节码这个中间商,那我们只能剥削他咯,让整个解释的过程快一点,再快一点。而解释所在的“工厂”在虚拟机内。

接下来就是伟大的Android虚拟机进化之路!

① Andorid 1.0 Dalvik(DVM)+解释器

(编辑:辽源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读