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 这项去掉 就可以了

更多相关文章

  1. Android编译错误Execution failed for task ':app:transformNati
  2. 编译android 64位openssl库
  3. Android(安卓)Studio电脑不支持HAXM的解决办法
  4. android 查找联系人方法(支持首拼,全拼,英文)
  5. Android(安卓)Studio编译失败:Caused by: java.lang.RuntimeExcep
  6. Android(安卓)微信朋友圈多图分享,不用申请key,不用第三方sdk
  7. Android(安卓)Wifi移植他贴收集
  8. s5p4418-android5.1.1编译出错问题1
  9. android 防止反编译重签名,C实现代码

随机推荐

  1. sql server把退款总金额拆分到尽量少的多
  2. SQLServer设置客户端使用IP地址登录的图
  3. 浅析SQL Server授予了CREATE TABLE权限但
  4. SQL server分页的4种方法示例(很全面)
  5. SQL Server 批量插入数据的完美解决方案
  6. group by 按某一时间段分组统计并查询(推
  7. 详解安装sql2012出现错误could not open
  8. SQL SERVER迁移之更换磁盘文件夹的完整步
  9. 解决sql server保存对象字符串转换成uniq
  10. 详解GaussDB(DWS) explain分布式执行计划