2019-03-27 09:08:51 qq_26093511 阅读数 1922

众所周知Google的Android系统跟Linux系统有着千丝万缕的关系,可究竟有什么关系呢?有人说Android是Android,Linux是Linux,两个只是kernel一样调度机制一样,其他没一毛钱关系,有人说Android说到底就是个Linux系统,可如果是这样,那么为什么Android系统能这么火,其他的Linux发行版(Ubuntu/Fedora/centos等)为什么在移动端火不起来呢?下面的图或许可以解开这些迷惑。


上面两幅图应该很直观的展示了Android系统和Linux发行版系统(Ubuntu/Fedora/centos)之间的区别和联系。可以这么说Android本质上还是一个Linux系统,只不过Google对它进行了裁剪和定制,这跟我们定制Linux到自己的嵌入式设备上的做法大同小异,只不过Google做的更多罢了,那么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类库这样才是正确的。

说了这么多Android的,再看看Linux发行版的做法,Linux发行版一般是在Linux的基础上开发了一套桌面管理系统,比如基于GTK框架的gnome,比如基于Qt框架的LXQT(听说Ubuntu准备抛弃gnome投向Qt怀抱了?Qt的死忠粉表示干得好!)。跟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可以很方便的实现监控运行,怎么样,是不是跟Android的做法很相似呢?

codesys软PLC软件架构如下图所示:

 

转自:https://blog.csdn.net/u013752202/article/details/53648823

2014-03-10 16:03:42 netwalk 阅读数 10830

Android系统信息获取 之十三:Linux内核版本信息获取


Android系统是基于Linux的,各个Android版本对应的Linux版本不尽相同,我们这里不去追究各个Android对应的Linux版本是什么,而是通过工具或者使用代码的方法去获取我们使用的Android源码或者我们的Android手机目前使用的Linux版本。

 

首先,使用adb工具我们能够很快获取Android手机(Android模拟器)的Linux内核版本。

adb工具连接模拟器,查看内核版本信息,看看模拟器上跑的内核是不是我们刚才编译出来的内核:

     USER-NAME@MACHINE-NAME:~/Android$ adb shell

      这时候如果是第一次运行 adb shell命令,会看到以下输出,不用管它,再运行一次adb shell命令就可以了。

     切换到proc目录:

root@android:/ # cd proc
root@android:/proc # cat version
Linux version 3.0.8 (user@machine) (gcc version 4.4.3 (GCC) ) #1 SMP PREEMP
T Mon Mar 3 11:32:08 CST 2014

 机器名user@machine;日期Mon Mar 3 11:32:08 CST 2014;Linux内核版本为Linux ersion 3.0.8

         其次,在一些应用中我们有可能需要获取Linux内核的版本信息,基于adb命令行的的获取方式,我们知道Linux版本信息是通过Linux命令获取的,那么该过程我们当然可以通过代码来实现它。


/***
	 * 获取Android Linux内核版本信息
	 */
	public void getLinuxKernalInfo() {
		Process process = null;
		String mLinuxKernal = null;
		try {
			process = Runtime.getRuntime().exec("cat /proc/version");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		// get the output line
		InputStream outs = process.getInputStream();
		InputStreamReader isrout = new InputStreamReader(outs);
		BufferedReader brout = new BufferedReader(isrout, 8 * 1024);

		String result = "";
		String line;
		// get the whole standard output string
		try {
			while ((line = brout.readLine()) != null) {
				result += line;
				// result += "\n";
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		if (result != "") {
			String Keyword = "version ";
			int index = result.indexOf(Keyword);
			Log.v(TAG, "----"+result);
			line = result.substring(index + Keyword.length());
			index = line.indexOf(" ");
			// tv01.setText(line.substring(0,index));
			mLinuxKernal = line.substring(0, index);

			Log.d(TAG, "----Linux Kernal is : " + mLinuxKernal);
		}
	}

除了上面的方法以外还可以通过给processbuilder传入一个String数组,String数组有两个String,前一个代表liunx系统的命令,后面一个代表要执行该命令的文件然后就是获得该命令执行后所返回的字符串信息以流的形式再传回来得到 result。

这个方法和上面的大同小异,只是使用的方法略微不同。

具体如下:


public String getLinuxKernalInfoEx() {
		String result = "";
		String line;
		String[] cmd = new String[] { "/system/bin/cat", "/proc/version" };
		String workdirectory = "/system/bin/";
		try {
			ProcessBuilder bulider = new ProcessBuilder(cmd);
			bulider.directory(new File(workdirectory));
			bulider.redirectErrorStream(true);
			Process process = bulider.start();
			InputStream in = process.getInputStream();			
			InputStreamReader isrout = new InputStreamReader(in);
			BufferedReader brout = new BufferedReader(isrout, 8 * 1024);

			while ((line = brout.readLine()) != null) {
				result += line;
				// result += "\n";
			}
			in.close();			

		} catch (Exception e) {
			e.printStackTrace();
		}
		Log.i(TAG,"----Linux Kernal is :"+result);
		return result;
	}

 在开发中可酌情使用。

----------------------------------

欢迎浏览、技术交流
请尊重劳动成果
转载请注明出处,谢谢!

http://blog.csdn.net/netwalk/article/details/20928221



2015-06-30 15:04:46 lxl584685501 阅读数 24544
Android和Linux kernel发展史(BY 夕つ云 整理)
英文名 中文名 Android系统版本 发布时间 Linux kernel内核版本 备注
Astro 铁臂阿童木 Android  beta 2007年11月5日 未知 它作为一个面向开发者的软件开发包(SDK)进行发布。
Wind Up Robots 发条机器人 1.0 2008年9月23日 未知 全球第一台Android设备HTC  Dream(G1)就是搭载Android 1.0操作系统。
1.1 2009年2月2日 未知 由于版权问题和员工喜好Android系统开始是以A-Z的字母开头的甜品命名!
Cupcake 纸杯蛋糕 1.5 2009年4月30日 2.6.27 拍摄/播放影片,支持立体声蓝牙耳机,支持复制/贴上和页面中搜索等。
Donut 甜甜圈 1.6 2009年9月15日 2.6.29 重新设计的Android  Market,手势支持,支持CDMA网络,文字转语音系统等。
Eclair 松饼 2.0 2009年10月26日 2.6.29 优化硬件速度,支持内置相机闪光灯和数码变焦,新的浏览器的用户接口和支持HTML5等。
2.0.1 2009年12月3日 部分API进行修改变化,BUG修复。
2.1 2010年1月12日 部分API进行修改变化,BUG修复。
Froyo 冻酸奶 2.2 2010年5月20日 2.6.32 支持将软件安装至扩展内存,USB分享器和WiFi热点功能,速度和性能优化。
2.2.1 2011年1月18日 存在的bug修复,安全性的提高,性能提升以及流畅性提升。
2.2.2 2011年1月22日 存在的bug修复,修复了Nexus  One中的短信问题。
2.2.3 2011年11月21日 修复了两个存在的安全性问题。
Gingerbread 姜饼 2.3 2010年12月7日 2.6.35 Linux  Kernel 2.6.33版代码库移除了Android代码。
2.3.3 2011年2月9日 进行了API改进
2.3.4 2011年4月28日 屏幕截图功能
2.3.5 2011年7月25日 改进了个别机型的功能,优化相机和电池续航。
2.3.6 2011年9月2日 修复了语音搜索存在的bug
2.3.7 2011年9月21日 增加NFC功能
Honeycomb 蜂巢 3.0 2011年2月2日 2.6.36 平板专用
3.1 2011年5月11日
3.2 2011年7月13日
3.2.1 2011年8月30日
3.2.2 2011年9月20日
Ice  Cream Sandwich 冰淇淋三明治 4.0 2011年11月14日 3.0.X

(目前miui V4-4.0.4的内核版本是3.0.8)
统一了手机和平板电脑使用的系统,提升硬件的性能以及系统的优化,支持在系统中使用虚拟按键等。
4.0.1 2011年10月19日  
4.0.2 2011年11月28日 修复了存在于Verizon版本Galaxy  Nexus中的bug。
4.0.3 2011年12月16日 包括修复bug和系统的优化,并且针对图形,数据库,拼写检查,蓝牙功能和其他功能的改进。
4.0.4 2012年2月6日 更快的运行性能,电池漏洞修复,3G/4G切换改进,信号强度增强,更快速启动等。
4.0.9   由美国Spirit定制的非官方Android版本。
Jelly  Bean 果冻豆 4.1/4.1.1 2012年6月28日 3.0.31/3.1.10 “黄油计划”。
4.1.2 2012年10月9日 加入主画面的旋转功能,单手指开合通知中心讯息,提升性能及稳定性。
A new flavor of Jelly Bean 一种新口味的果冻豆 4.2
2012年10月30日 3.4.0
(目前miui V5-4.1.2的内核版本是3.4)
Android  的Linux kernel代码重新回归Linux kernel 3.3代码库。
4.2.1


4.2.2



4.3
2012年11月28日

2013年2月11日


2013年7月24日
PhotoSphere  360°全景拍摄,手势输入键盘,支援多重帐户,修复丢失的12月等。

性能及稳定性的提升,一些错误的修正,优化电池耗电量,增加续航时间

新增了Bluetooth Low Energy(低功耗蓝牙技术)功能,同时支持OpenGL ES 3.0。
KitKat 奇巧巧克力 4.4 2013年待定 3.8.0  

 LOLLIPOP                | 棒棒糖      |  5.0                         |2014年10.15  |3.10                                  |最新16项新特性

                                    |                   |  5.1                         |2015年03.10  |3.10                                  |新曾3项

________________|________|_______________|___________|________________________________________________

    备注:2012年5月18日,Linux kernel  3.3发布,这个版本更新上第一个新特性也是最重要的新特性,便是Android 的Linux kernel代码重新回归Linux kernel  代码库,同时,内核中也包含着Android的硬件驱动。今后的Android内核将直接驱动硬件,对于软硬件开发者而言都是好事情,而芯片制造商则需要调整硬件架构,以兼容更强大的Linux  3.3以上版本内核了。对于Google而言,这是必须要做的事情,并且越快越好——为了更好的体验,和系统版本更好的融合与升级。











2016-07-05 13:43:07 zjli321 阅读数 1586
内核来源
官方:www.kernel.org
git clone git://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-stable-rt.git/

Google维护的android参考内核
https://github.com/android/kernel_common
git clone https://github.com/android/kernel_common.git linux-android-common

Linaro维护的Linaro Stable kernel
https://git.linaro.org/kernel/linux-linaro-stable.git
git clone https://git.linaro.org/kernel/linux-linaro-stable.git

选定原则
Longterm stable kernel,持续更新,bugfix
Android本身功能要求

新功能支持,比如big LITTLE,power管理等


android代码在线查看:

http://androidxref.com/
linux代码在线查看:
http://lxr.free-electrons.com/source

2017-07-12 20:29:54 ly890700 阅读数 24305

https://android.stackexchange.com/questions/51651/which-android-runs-which-linux-kernel


Android Version    |API Level  |Linux Kernel in AOSP
----------------------------------------------------
1.5   Cupcake      |3          |2.6.27
1.6   Donut        |4          |2.6.29
2.0/1 Eclair       |5-7        |2.6.29
2.2.x Froyo        |8          |2.6.32
2.3.x Gingerbread  |9, 10      |2.6.35
3.x.x Honeycomb    |11-13      |2.6.36
4.0.x Ice Cream San|14, 15     |3.0.1
4.1.x Jelly Bean   |16         |3.0.31
4.2.x Jelly Bean   |17         |3.4.0
4.3   Jelly Bean   |18         |3.4.39
4.4   Kit Kat      |19, 20     |3.10
5.x   Lollipop     |21, 22     |3.16.1
6.0   Marshmallow  |23         |3.18.10
7.0   Nougat       |24         |4.4.1
7.1   Nougat       |25         |4.4.1 (To be updated)


Table compiled from:

Note: other “distributions” of Android might run different kernel versions.

Anyone is welcome to correct and expand this table. Please keep formatting.


wKiom1Vhw-qQFexwAAE9DtXdWqs887.jpg


Android和Linux kernel发展史(BY 夕つ云 整理)
英文名 中文名 Android系统版本 发布时间 Linux kernel内核版本 备注
Astro 铁臂阿童木 Android  beta 2007年11月5日 未知 它作为一个面向开发者的软件开发包(SDK)进行发布。
Wind Up Robots 发条机器人 1.0 2008年9月23日 未知 全球第一台Android设备HTC  Dream(G1)就是搭载Android 1.0操作系统。
1.1 2009年2月2日 未知 由于版权问题和员工喜好Android系统开始是以A-Z的字母开头的甜品命名!
Cupcake 纸杯蛋糕 1.5 2009年4月30日 2.6.27 拍摄/播放影片,支持立体声蓝牙耳机,支持复制/贴上和页面中搜索等。
Donut 甜甜圈 1.6 2009年9月15日 2.6.29 重新设计的Android  Market,手势支持,支持CDMA网络,文字转语音系统等。
Eclair 松饼 2.0 2009年10月26日 2.6.29 优化硬件速度,支持内置相机闪光灯和数码变焦,新的浏览器的用户接口和支持HTML5等。
2.0.1 2009年12月3日 部分API进行修改变化,BUG修复。
2.1 2010年1月12日 部分API进行修改变化,BUG修复。
Froyo 冻酸奶 2.2 2010年5月20日 2.6.32 支持将软件安装至扩展内存,USB分享器和WiFi热点功能,速度和性能优化。
2.2.1 2011年1月18日 存在的bug修复,安全性的提高,性能提升以及流畅性提升。
2.2.2 2011年1月22日 存在的bug修复,修复了Nexus  One中的短信问题。
2.2.3 2011年11月21日 修复了两个存在的安全性问题。
Gingerbread 姜饼 2.3 2010年12月7日 2.6.35 Linux  Kernel 2.6.33版代码库移除了Android代码。
2.3.3 2011年2月9日 进行了API改进
2.3.4 2011年4月28日 屏幕截图功能
2.3.5 2011年7月25日 改进了个别机型的功能,优化相机和电池续航。
2.3.6 2011年9月2日 修复了语音搜索存在的bug
2.3.7 2011年9月21日 增加NFC功能
Honeycomb 蜂巢 3.0 2011年2月2日 2.6.36 平板专用
3.1 2011年5月11日
3.2 2011年7月13日
3.2.1 2011年8月30日
3.2.2 2011年9月20日
Ice  Cream Sandwich 冰淇淋三明治 4.0 2011年11月14日 3.0.X

(目前miui V4-4.0.4的内核版本是3.0.8)

统一了手机和平板电脑使用的系统,提升硬件的性能以及系统的优化,支持在系统中使用虚拟按键等。
4.0.1 2011年10月19日  
4.0.2 2011年11月28日 修复了存在于Verizon版本Galaxy  Nexus中的bug。
4.0.3 2011年12月16日 包括修复bug和系统的优化,并且针对图形,数据库,拼写检查,蓝牙功能和其他功能的改进。
4.0.4 2012年2月6日 更快的运行性能,电池漏洞修复,3G/4G切换改进,信号强度增强,更快速启动等。
4.0.9   由美国Spirit定制的非官方Android版本。
Jelly  Bean 果冻豆 4.1/4.1.1 2012年6月28日 3.0.31/3.1.10 “黄油计划”。
4.1.2 2012年10月9日 加入主画面的旋转功能,单手指开合通知中心讯息,提升性能及稳定性。
A new flavor of Jelly Bean 一种新口味的果冻豆 4.2

2012年10月30日 3.4.0
(目前miui V5-4.1.2的内核版本是3.4)
Android  的Linux kernel代码重新回归Linux kernel 3.3代码库。
4.2.1


4.2.2



4.3
2012年11月28日

2013年2月11日


2013年7月24日
PhotoSphere  360°全景拍摄,手势输入键盘,支援多重帐户,修复丢失的12月等。

性能及稳定性的提升,一些错误的修正,优化电池耗电量,增加续航时间 

新增了Bluetooth Low Energy(低功耗蓝牙技术)功能,同时支持OpenGL ES 3.0。
KitKat 奇巧巧克力 4.4 2013年待定 3.8.0


查看版本号

阅读数 1419