上面两幅图展示了Android系统和Linux发行版系统(Ubuntu/Fedora/centos)之间的区别和联系。可以这么说Android本质上还是一个Linux系统,只不过Google对它进行了裁剪和定制,这跟我们定制Linux到自己的嵌入式设备上的做法大同小异,只不过Google做的更多罢了。
上图中也可以看出来,很多人说Android系统的程序只能用Java开发,这么说的说明对Android系统的架构了解的还不是很深入,其实从图上看到,Google自己写了一个叫Dalvik的程序运行在Linux的系统上面,这个程序就是Android的Java虚拟机(JVM),由于效率等问题Android4.4以后改为Android Run Time(ART),但不管是Dalvik还是ART,都是用c/c++开发的,而用Java开发出来的APP其实是运行在Dalvik/ART上面的,皮之不存毛将焉附,没有Dalvik/ART,那些Java开发的APP是根本没法运行的,所以说那些说Android系统不能用c/c++开发的说法是站不住脚的,只要用AOSP(安卓开放源码项目)里面的交叉编译器编译出来的二进制文件在Android上面照样也是可以运行的,而且跟Dalvik/ART属于同一层次的东西,即(都是init进程的子进程),但是一般的Android系统上init进程只有一个子进程即Dalvik/ART,如果非要说Dalvik/ART才算Android的话,那么Android确实不能用c/c++开发,因为Java程序编译出来的是字节码,只能在Dalvik/ART上运行,c/c++编译出来的是二进制机器码直接在CPU中运行,应该说c/c++开发(这里不是说的JNI方式)Android程序无法调用Android的Java类库这样才是正确的。
再看看Linux发行版的做法,Linux发行版一般是在Linux的基础上开发了一套桌面管理系统,比如基于GTK框架的gnome,比如基于Qt框架的LXQT。跟Windows一样,经典的一个桌面系统+N个软件的模式,用c/c++开发出来程序编译成二进制的机器码直接运行在Linux系统上,这些软件全部都是跟Dalvik/ART一个层次的东西,而Linux发行版的程序能不能用Java开发呢?这个问题就跟问Windows上能不能用Java开发一样没水准。毕竟Dalvik/ART本身也是运行在Linux系统上的,你只要把Dalvik/ART移植到Linux发行版甚至Windows上,你手机里的那些APP就可以运行了(当然是不依赖硬件的,如果要打电话肯定是不行了),不然你以为Android模拟器是怎么弄的。
总结起来,Android系统和Linux发行版的系统根本区别是Android上面只跑了一个Dalvik/ART,而Linux发行版上面跑了很多“Dalvik/ART”而已。如果你把gnome或者LXQT部署到Android上,或者把Dalvik/ART部署到Linux发行版上的话,那么二者的区别可能并没你想象的那么大。
其实,在Linux上面跑一个软件(虚拟机、解释器),然后再基于这个软件做二次开发的的做法Google的Android并不是第一个这么干的。工控行业的小伙伴对控制器应该很熟悉吧?什么,你不知道控制器?或者说PLC更亲切吧,PLC(可编程控制器)只是一种通用的控制器而已,PLC分为两种,一种是编译型的PLC,我们在学校里学习的什么欧姆龙,三菱,西门子S300都是这种PLC,这种PLC的软件架构很简单,就是一个单片机,然后我们画的梯形图跟我们编译单片机程序一样直接被编译成了机器码,然后烧写到单片机里面执行,这种PLC是没有办法监控运行的,不过我要说的是另外一种PLC,曾经机缘巧合接触过一段时间,那就是软PLC,最常用的软PLC就是codesys,codesys可不止是一个简单的PLC编译工具!它是一个软PLC核!为什么说他跟Android的做法十分相似呢?看看它的架构就知道了,codesys通常被部署在Linux系统上面,开机即运行,然后我们的梯形图程序被codesys编译工具转成梯形图指令保存到内存中,然后codesys内核逐句解析梯形图指令,边解析边执行,而不是像传统的编译型的PLC一样先把所有程序编译成机器码再烧写到flash中,运行的时候再搬到内存里面运行,这跟JVM执行字节码如出一辙,这种PLC可以很方便的实现监控运行。