Android主要有6部分
Applications (java)
--------------------------------
FrameWork (java)
=====================================
| Core Libraries
external Lib | --------------
| dalvik (jvm)
|
-----------------------------------
HAL
====================================
Linux Kernel
第一部分 : Kernel
先把kernel的代码拉下来
1 git clone git://android.git.kernel.org/kernel/common.git
git clone git://android.git.kernel.org/kernel/common.git -o eclair
git clone git://android.git.kernel.org/kernel/common.git -o v2.6.29
怎么kernel的版本总是2.6.27呢?我要的kernel版本是2.6.29,因为从2.6.29以后,kernel以及支持S3C6410了
(虽然支持S3C6410 ,但是大部分S3C6410的驱动没有) 而在2.6.27中没有 。
solution : git branch -a
git checkout v2.6.29/android-2.6.29
如果修改了Makefile,则出现:
error: You have local changes to 'Makefile'; cannot switch branches.
先把Makefile 重新checkout
git checkout Makefile
然后 git checkout v2.6.29/android-2.6.29
2 make menuconfig ACRH=arm
然后编译
an
In file included from arch/arm/plat-s3c/include/plat/cpu-freq.h:14,
from arch/arm/mach-s3c6410/cpu.c:32:
include/linux/cpufreq.h:258:31: error: macro parameters must be comma-separated
make[1]: *** [arch/arm/mach-s3c6410/cpu.o] 错误 1
solution :
#define cpufreq_exit_idle(int cpu, unsigned long ticks) do {} while (0)
修改为:
#define cpufreq_exit_idle( cpu, ticks) do {} while (0)
3 Android对kernel 主要有哪些改动呢?
1) 采用了Yaffs2
在文件系统 fs/yaffs2
2) 增加了Alarm,Ashmem,Binder,Power Management,Logger, Kernel Debugger,Low Memory Killer
其中Binder,Logger等在driver/staging/android下面
alarm 在 driver/rtc/alarm.c
Binder 为Application IPC所用,而 Power Managerment 为 android.os.PowerManager 所调用
从linux官方网站下载了一个2.6.29版本,和android的2.6.29进行比较,发现不同之处还很多。
所以,对于移植,最好还是在android的2.6.29的基础上,把一些相关的驱动移植上去,而不是把android的东西移植到linux 2.6.29之上。
4 kernel 的 GPS driver 在哪里 ?
在android中,定义了gps.h,需要自己按照 gps.h去实现GPS driver
第二部分 HAL
HAL 在hardware 目录下 ,它不是驱动,它其实是属于user space ,而不属于Kernel层。
也就是用HAL把上层的应用,服务 和下层的系统分开,在Android的早期版本中,没有这一层,1.0之后HAL层就比较明显了。
比如 背光的设置,我们可以实现一个lights.default.so动态库,这个库实现了接口 set_light ,而set_light会打开Kernel的
device,然后进行操作(通过IO Control ,或者写等)来调节背光。
HAL中有一个 RIL (Radio Interface Layer),主要是为了电话功能
第三部分 external Libs
这部分在external下面
1 它不是用glibc ,而用bionic
bionic 更快 更小 ,但不完全支持POSIX标准,比如C++ exceptions,wide char
这样其他的toolchain不能用于编译Android
个人认为,其实系统的快慢和glibc没有多大的关系,android的慢是因为平台的原因,而非glibc ,
所以android把glibc换成bionic,非明智之举,这样需要开发自己的编译器toolchain, bionic ,还不如把这个精力放在平台开发上
难道是为了绕开 GPL?
2 采用opencore 而非mplayer
支持hardware / software codec plug-ins
3 采用了sqlite 而非db4o
这样对于很多java人员,数据库方面的操作要修改,除非把db4o移植到android上(db4o可以无缝的运行在Android平台)
第四部分 Dalvik虚拟机
这部分是android的核心。在目录dalvik下,编译后生成dalvikvm
它和标准JVM的区别有
1)dalvik基于寄存器,而JVM基于stack
2) 性能上优与标准的JVM
它属于J2SE的一个子集,但是没有通过JAVA标准认证,支持Swing. 而J2ME的标准界面类就是lcdui包中的类,不支持swing.
参见 : http://www.mcuol.com/Tech/122/29755.htm
第五部分 Framework
这部分在framework下面。包括
. Activity manager
• Telephony manager
• Window Manager
• Power Manager
• Resource manager
• Notification Manager
它提供一个给应用调用的接口。
第六部分 Applications
这部分Google提供了很多应用,这部分在packages目录下面。比如packages/apps下面就有很多应用。
这些应用也是用Java写的,包括Google地图,浏览器,Google商店等
除了以上的6部分外,android还提供了一套toolchain,在prebuilt/linux-x86/toolchain/下有arm交叉编译器. 对于Native应用程序,必须要用android toolchain编译,用其他的toolchain编译的程序在android平台上用不了,因为其他的不是bionic.而对于kernel ,uboot可以用其他的toolchain编译,因为kernel,uboot是一个独立的,没有用到glibc .
由于toolchain已支持arm v5以上。所以如果要移植android ,假如cpu为arm V4 如S3C2440,则除了移植kernel外,还必须移植toolchain .
不过,很奇怪的是,我用android的toolchain编译kernel,出现错误,而用arm2008-q3却没问题???
fs/binfmt_aout.c: In function 'load_aout_binary':
fs/binfmt_aout.c:270: error: 'SEGMENT_SIZE' undeclared (first use in this function)
fs/binfmt_aout.c:270: error: (Each undeclared identifier is reported only once
fs/binfmt_aout.c:270: error: for each function it appears in.)
解决办法是:
Userspace binary formats --->
Kernel support for a.out and ECOFF binaries 这项去掉 就可以了