Android为什么不直接执行Linux的程序?而是自己搞一套?

关注者
244
被浏览
424,928

55 个回答

1.Android 本身运行Linux之上,同样环境可以直接运行Linux程序的。只不过Android的标准C库是重写过,所以在Linux 下编译动态链接程序无法直接运行,但静态链接程序或者是在Android的环境重编译一次后是可以运行。比如说root后手机运行嵌入式shell解释器--busybox 。就是一个标准Linux C程序,只不过重编译一下。

Android 自己也带了大量小工具,比如手机上运行 setprop ,getevent 就是命令行工具。

并且程序还能跳开Android界面直接操作显存,这样就象粗暴把屏幕冲掉一样。

2.Android 开发一整套框架的最核心的原因,在iphone当出世的年代,其它能够与其抗衡的移动设备GUI框架几乎没有。比如支持多点解摸,比较漂亮又适合移动设备界面,以及一个移动设备需要配套各种支持组件(成熟的输入法,硬件配置,移动的浏览器,稳定的电话通讯模块)。Android自己从头写一套东西。

至于说其它,使用java虚拟机,HAL版权保护之类,都是这个出发点带出来东东。

ps: 魅族的M8相当于实现Android一半的工作量。它在WinCE上几乎完整开发一整套体系。但是很可惜这个WinCE太不给力,主要对新兴硬件支持很难。还不如在Android上来改进。

ps2:Moto出一款在中国大卖的 A1200 到后升级到A1800。就比较超前的Linux手机,用的Qtopia,就是后来死在Nokia手里MeeGo 前身,也有一整套东西,但是公司实力太小了,而当时没有iphone 界面参考,大家都是很简单的图形界面,即便这样已经超前很多了。




3.至于说Android 说的自己HAL可以跳开开源协议,做自己的私有驱动,至少我看到几乎没几个产家这样做。现有HAL驱动仍是对Linux的驱动的封装,很简单Linux的驱动又多又好,更新还快,免费拿来马上就用。自己重新整个还得自己花钱请人开发,不见的比Linux做得好,而且调试相当相当相当麻烦,我相作做过Android HAL驱动的人最常见动作就是不停重启机器吧。

安卓是可以执行Linux程序的,因为安卓自己就是基于Linux内核,底层的那些东西仍然是靠Linux ELF可执行文件实现。

但是,安卓并不能直接运行传统的基于glibc的Linux软件。由于glibc是遵守LGPL许可的运行库,但是Google的Android为了实现商业用途,就将包括glibc在内的遵守(L)GPL的组件都给砍掉了,并自行开发了一套名为bionic的运行库。实际上bionic库本质上也是libc的一种实现,只不过适用于手机等小型设备,并且Android NDK也是使用bionic库进行编译的。

除此之外,安卓系统本身的文件系统也有限制,同样也限制了Linux软件的安装使用。

不过好在,运行Linux软件我们还有别的方案。其中最典型的方案就是Linux容器,可以借助Termux等软件实现。实际上Termux本身就自带了Linux上的常见软件,可以通过apt/pkg命令安装,其实质上就是将Linux上的常见软件用bionic库重新移植以便在安卓系统运行。

当然,termux自带的那些软件还是不够用。不过好在termux提供了chroot和proot这两种构建容器的方案(前者需要获取root,后者不需要)。关于二者的使用,网上的教程有很多,这里就不再赘述了。

通过容器运行Linux发行版可以实现更丰富的功能,除了能运行Linux上的常见软件,运行图形界面也是没问题的(可以借助vnc x11等进行画面输出,如果使用vnc的话还可以远程连接)

WPS for Linux在Linux容器的运行效果(非P图)

甚至可以用Linux容器,借助wine-ce运行Windows软件。

当然,Linux容器的缺陷还是不少的,例如无法使用systemd(因为无法确保init的PID为1),以及无法调用某些硬件(不过有些缺陷倒是可以用曲线救国的方式解决,除了x11本身就有的转发功能外,声音输入输出可以借助pulseaudio,GPU渲染可以借助virglrenderer(需要挂载/tmp目录到termux的tmp目录)等实现)。不管怎么说,Linux容器还算是可玩性比较高的。