为啥感觉没有纯Linux的手机系统呢?不用虚拟机,硬件利用率百分百?

春菇凉


首先不是没有纯linux手机,也有人列举了,只是不火,太小众.

安卓是运行在linux内核上的,硬件还是底层linux进行操作的,所以也无关硬件利用率,只是多了一层有效率上的问题.

为什么纯linux手机少, 原因只有一个,那就是没有生态圈,你手机做出来了,但是应用少,销量肯定不行喽.

为什么不能像苹果那样建立起一个生态圈?

手机硬件是多种多样的,如果纯linux,一个app如果想在所有设备上运行,需要真对不同硬件重新编译,这个不现实. 苹果为什么可以? 应为苹果只有一套硬件. 所以linux的生态建立不起来,导致linux手机也起不来.


m1517


纯Linux而不需要虚拟机的手机系统当然有,火狐的FirefoxOS、Ubuntu Touch、三星Tizen操作系统、以及曾经大名鼎鼎的Megoo都是没有虚拟机的。

Android使用虚拟机是因为采用了Java作为核心开发语言,Java足够成熟、生态健全、开发者众多,这是Android早期发展迅速的主要原因,当然Android的高速发展也给了Java第二春。Oracle公司现在又在作死,各种用Java的问题刁难Google,Google推出Flutter框架、扶持Kotlin,以及打造Fuchsia操作系统,就是为了能够找到取代Java甚至直接取代Android的解决方案。

值得提一下的是尽管Megoo系统随着诺基亚的失败而消失了,不过Megoo系统的很多理念到现在还被iOS和Android系统借鉴,现在智能机的主要手势操作基本上全是借鉴Megoo操作系统的设计理念。

Android为什么要用虚拟机

Android诞生之初并不是师出名门,后来被Google收购也算是傍上了大款,Android使用虚拟机的主要原因还是因为Java,因为Java有足够好的凯源生态,更重要的是Java有成熟的开发者生态,最最重要的当然还是Java是第一大编程语言、背后有最多的开发者。

Android诞生之初,跟Java普遍使用JVM家在字节码文件(

.class

),Android的虚拟机是Dalvik虚拟机,每次运行程序,Dalvik负责加载dex/odex文件然后解析成机器码让Android系统调用。

2010年5月20日,Google正式向外界发布了版本代号为Froyo冻酸奶的Android2.2版本,这是Android第一个成熟版本,Google在这个版本的虚拟中加入了即时编译、也就是我们通常所说的Just-In-Time Compiler(JIT)编译器,Dalvik使用JIT进行编译,JIT可以对经常使用的dex/odex进行编译和优化,将其翻译成精简的Native Code执行,引入JIT之后Dalvik性能提升了3到6倍。

2013年10月31日,Google正式对外发布代号为Kitkat的Android4.4,Google为了改善Android糟糕的用户体验,开发了全新的虚拟机运行环境,也就是Android Runtime(ART),在这个版本中Google还有了新的编译策略Ahead of time(AOT),不过这时候ART和Dalvik共存,直到2014年10月16日代号为Lollipop棒棒糖的Android5.0版本,ART彻底取代Dalvik,AOT成为了唯一的编译模式,AOT相对于JIT的优点是,JIT是运行时动态编译,每次运行程序的时候都要编译,AOT则是静态编译,应用在安装的时候就已经完成了编译,程序运行的时候不用重新编译,这才是真正的本地应用概念。

ART还对垃圾回收机制进行了改革,ART只有一次垃圾回收暂停、而Dalvik有两次,ART在垃圾回收保持暂停的时候并行处理,ART还优化了垃圾回收的效率,让系统能够及时垃圾回收、及时减少后台内存使用和碎片化问题。

不过在Android7.0之后JIT又重新回归了,AOT/JIT混合编译模式又重新回归了,混合编译当然有优点,不过还是很难解决Android存在的各种问题,毕竟Android的问题一大部分是Java自身的问题,除此之外Android生态本身也比较混乱,这也是Android体验差的重要原因之一。


EmacserVimer


纯Linux的手机操作系统,没有中间虚拟机不是没有,还挺多的,比如Ubuntu Touch,火狐操作系统,三星Tizen操作系统,还有号称首款真正的Linux智能手机Librem 5。

这些系统发展的并不好,导致很少进入大众的视线,让你觉得好像所有的操作系统都是Android的虚拟机架构。

有些人说为这些没发展起来的手机是因为界面丑,其实不然,Android早期的版本1.0. 2.0也丑的要命,就是它的引入的Java虚拟机,引来了无数Java开发者加入,快速的构建起了Android的开发生态。逐渐发展成今天你们看到的样子。

你们都还看过那些纯Linux的手机操作系统呢?晒出来。





拉那烈


我理解的楼主意思是,android中间有个java虚拟机,而linux没有,那么有没有手机可以采用linux,让操作系统或者app直接与硬件之间进行操作,以求效率更高?

楼主理解错了,linux也有虚拟机的。看图:

当然从图中可以看出,两者都有虚拟机。

当然,从linux架构图可以看到有个“程序 n”以及“程序2”是直接通过机器码操作内核的,那么问题来了,既然可以通过程序直接操作内核,为什么android要把这一块裁掉,不直接让程序操作内核呢?主要有以下几个方面:

1.程序兼容性,众所周知java是个跨平台语言,不依赖cpu指令集,这样就能保证兼容性。android在历史的演变过程中,运行在多种平台上,例如:arm,mips,x86,x64,arm-64等等,这个传统来自于linux,曾经linux运行的平台更多,例如:x86,x64,mips,arm,ibm-power,hp,motorala等等。

2.方便移植,作为后来者,android出现的时代,已经有了智能手机或者设备和对应的操作系统,例如:palm os,windows mobile,motorala linux,还有索尼爱立信和nokia主导的symbian os等等,android如果要生存下来必须要让开发者很方便的将他们为其他系统开发的软件移植到android上,而java虚拟机是最好的选择。

3.无奈之选,开发一个新的系统,绝不是吹几句牛,埋头苦干就能行的,那么只能站在巨人的肩膀之上,但是当时没有人愿意公开自己的系统,windows mobile作为微软的产品,虽然可以兼容多种不同品牌手机,但是不开源,palm和黑莓以及苹果是软硬件全是自家,更不可能开源,motorala虽然采用linux但是软件封装却是自成一派,在这样情况下,android只能采用开源的linux,所以形成了这样的架构。




天行健31293242


不能说没有纯手机linux系统,ubuntu touch firefoxOS Tizen等等,ubuntu touch可以自行下载刷机,但支持的机型少。不知道 题主是否知道刷机,曾经安卓刷机成风。什么 MIUI CyanogenMod(团队被三星收了)LineageOS 魔趣 乐蛙等等 ,这些第三方安卓系统做到现在留下来的快没了,这些原生硬改的系统都不能支持所有的安卓手机为何?手机型号厂商太多了,硬件都不一样,需要重新开发驱动,界面等。比如一个相机,每台都不一样,你找sony要驱动不给怎么办,就算给了,那cpu端的DSP高通又不给怎么办?以前我的三星 glacier刷三方系统,系统流畅,相机渣渣,驱动无法解决,就算解决了,还要开发者写相机算法。工程很大。再回来说Linux,也一样这么多手机硬件要从底层重新构建,不像苹果一年就出一部手机。软件写好了关键还卖不到钱,Linux本身就是免费的码农们自愿维护的系统,主要用在服务器上,消费端生态比较差,操作容易程度更差,装个软件还要去下各种支持库,一般人哪里懂。所以呵呵,没有个大财团加上几家大手机厂商去推动是非常难的。想想当年Google首发安卓时的厂商阵容,全球大的手机厂商,软件商都来了,Google面子大啊,有钱,而且技术积累深厚。自己程序加支持的开源项目程序员都好几十万人了。所以没有颠覆的系统,现在想插一脚很难的。


煮酒论乾坤


你问出这样的问题,说明你完全不理解啥是操作系统。

操作系统分系统内核和应用程序,其中有一类特殊的应用程序,就是人机交互界面,也叫shell.

人机界面是我们人类控制电脑的接口,一个操作系统必须得有一个人界面,否则看起来和没有一样.

linux系统内核,可以运行各种个样的界面,比如最常用的命令行界面,这个通常是由bash这个程序提供的.

除此之外,还有图形化界面,比如KDE,GNOME,这些都是不同的界面.Linux可以自己选择安装你喜欢的界面.

但是上面说的都是面向电脑的界面,这些界面很显然是不能用于手机了。

所以,当你用Linux作为手机操作系统的时候,你就的制作一个符合手机操作习惯的界面,对于安卓系统,这个界面就是安卓桌面,也就是尼进系统能看到的一切.

你所谓的虚拟机,是指jvm,并不是你电脑上win系统下面装一个Linux虚拟机的那个虚拟机,jvm根本是两码事。

并不是说安卓是用虚拟机跑在Linux系统上的另外一个系统,这纯属不懂技术的人胡说八道.

jvm作用是为程序员编写的程序提供运行环境的,并不是一个系统.

为什么要用jvm?这是因为计算机程序要想运行,必须通过编译器编译成机器码。

但是,对于手机程序来说,程序直接编译的话太麻烦了,因为编译过程直接喝计算机硬件相关,但是手机硬件千差万别,这种各样,程序员就必须给每一个型号的手机开发一个人独立版本,这个工作量是不可想象的.

如果头条以编译方式直接编译成app,程序员恐怕一次得编译几十甚至上百个版本,简直不是人干的事情.

这时候就需要jvm,只要把jvm在不同的机器上编译好,做好适配,然后应用程序都通过jvm来运行,这样就避免程序员反复编译听一个程序,升级,解决bug也方便多了.

所以,不管任何系统,采用这种方式来管理应用程序才合理,才具有实用性,不用这种方式,就不可能有安卓上成千上万得app的,程序员绝对不会闲的没事干整天编译各种app玩.一套源码,多处运行是最基本要求.

当然,除了jvm,还有一种runtime的解决方案,其实本质上runtime也是一个类似jvm的虚拟机,只不过实现的方法不同,效率要比jvm高。

5.0以上的安卓已经支持了android runtime 也就是art.


shawn25


操作系统是一层一层搭起来的,Linux打桩,Java虚拟机做地基,Android是楼层框架,各种UI是装修,这才有了你看到的漂亮的楼房。

不知楼主要的纯Linux是不是命令行界面的Linux内核。

按照这个要求,装了第三方应用,没有编译进内核的系统都不能算是纯的Linux。楼主连打电话拨号都要自己写代码才能实现了。


飘162829324


本人有幸玩过摩托罗拉zn5 似乎是linux系统 开源率非常之高 所以一切都可以diy 它是兼容jar格式软件 当初在手机上玩过cs 也只是为了达成这个想法 具体参数配置忘了 不过这台手机在当时的确很牛


昂首挺胸i


android用的是linux内核,ios用的是类unix内核,理解提问者的疑问应该是是否有用户可以直接操作内核的手机,答案是不可能,现在商品化的手机必须考虑应用开发和使用环境,所以为了不同手机硬件兼容性考虑,需要封装底层的接口调用并标准化,而且基于安全考虑必须将每个应用权限控制在很小的范围,目前的做法都是用类脚本的语言做中间件,手机应用基本上都是基于脚本的开发,效率上比直接操作硬件的c语言会差一些


vcasm48


简单理解下,有java虚拟机存在。app开发适配更容易。不然会像windows和Linux一样,安装一个软件先装几十个依赖。


分享到:


相關文章: