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

fs/binfmt_aout.c:270: error: 'SEGMENT_SIZE' undeclared相关推荐

  1. 编译内核遇到:error: ‘ovl_v1_fs_type’ undeclared (first use in this function)错误

    如遇到如下错误: fs/overlayfs/super.c: In function 'ovl_init': fs/overlayfs/super.c:1331:30: error: 'ovl_v1_ ...

  2. Hadoop put file 错误:fs.FSInputChecker: Found checksum error

    Hadoop往hdfs上put file的时候,今天报错如下: 16/03/12 08:15:17 INFO fs.FSInputChecker: Found checksum error: b[0, ...

  3. 【c语言 gcc9.1.0环境下编译报错】error: ‘true’ undeclared (first use in this function)

    问题 网上验证一个单链表是否有环的c语言demo,放到gcc9.1.0的环境下编译,发现编译报错: error: 'true' undeclared (first use in this functi ...

  4. Android之ndk-build出现c:28:51: error: ‘get_string‘ undeclared here (not in a function)解决办法

    1 problem ndk-build error: 'get_string' undeclared here (not in a function) 2 resolve jstring get_st ...

  5. 安装nginx时关系依赖库openssl.lib时,出现:error: 'NR_syscalls' undeclared (first use in this function)

    安装nginx时关系依赖库openssl.lib时,出现:error: 'NR_syscalls' undeclared (first use in this function) 解决方案:根据arc ...

  6. /phalcon.zep.c:130892: error: ‘ZEND_FE_END’ undeclared here (not in a function)

    /phalcon.zep.c:130892: error: 'ZEND_FE_END' undeclared here (not in a function) 因为centos6.5上的最新php版本 ...

  7. error: 'FILE' undeclared (first use in this function)

    error: 'FILE' undeclared (first use in this function) 今天在打trace调试底层代码的时候添加: {FILE* fp = fopen(" ...

  8. Error ‘false‘ undeclared (first use in this function)解决

    Error: 'false' undeclared (first use in this function)解决 在用DEVC++敲代码时,对如下程序报错 bool ok(int t){//判定第t个 ...

  9. error: ‘CLOCK_MONOTONIC‘ undeclared (first use in this function)

    错误信息: /home/xx/test/main.c: In function 'main': /home/xx/test/main.c:37:21: error: storage size of ' ...

最新文章

  1. 2006年猪的述职报告
  2. linux vim python配置文件,Linux VIM8 Python 编辑器配置文件
  3. Swagger3.0
  4. 本地通过域名访问虚拟机的网站部署方法(Nginx)
  5. HTML5 Geolocation(地理定位)
  6. 随想录(找工作20问)
  7. labview csv文件处理_LabVIEW 相关知识点分类汇总
  8. ubunt18.04LTS+vscode+anaconda3下的python+C++调试
  9. 洛谷 P1144 最短路计数 解题报告
  10. 计算机初级程序员哪里颁发的,初级程序员证书怎么考_初级程序员证书考什么_上学吧...
  11. 杭电ACM-LCY算法进阶培训班-专题训练(Hash及其应用)
  12. 一文了解Clickhouse
  13. Ivor Horton's Beginning Visual C++ 2008
  14. 计算机毕业设计之java+ssm供应链管理信息系统
  15. 远程桌面连接:提示出现身份验证错误,要求的函数不受支持。这可能是由于CredSSP加密数据库修正错误。
  16. execve系统调用_Linux下的sys_execve系统调用
  17. 多模式交通需求预测模型-CMGAT
  18. 游龙传说服务器维护,3月15日维护:渡劫后155可传说
  19. java计算机毕业设计高校后勤保修系统源码+mysql数据库+系统+lw文档+部署
  20. 黑群晖+七彩虹CH84-DV全固态主板+4GDDR3+i3 4160+HP LJM 1005打印机+120G固态 捡垃圾装备弄一个黑群晖的无线打印机+后期再加硬盘接着整蛊

热门文章

  1. Python爬取京东商品数据
  2. OpenGL ES EGL eglQueryContext
  3. 写博客能月入10K?
  4. 【转载】Sftp搭建与配置
  5. 从AWS S3换成阿里云OSS存储所踩的坑
  6. uc浏览器电脑版翻译设置在哪 uc浏览器翻译网页教程
  7. android应用和苹果,同一款软件,在安卓和苹果间差别原来这么大
  8. java8精简的jre,精简版jre,只有9M多哦!
  9. C语言 运算符优先级表
  10. ale插件 vim_vim 撸码必备插件之 autoformat 与 ale[视频]