Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3167401
  • 博文数量: 685
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 5303
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-19 14:17
个人简介

文章分类

全部博文(685)

文章存档

2015年(116)

2014年(569)

分类: 嵌入式

2015-03-11 21:39:11

原文地址:http://blog.chinaunix.net/uid-20548090-id-1927427.html

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

5 android为了支持emulator ,增加了goldfish
  在kernel的源码目录下:
  git checkout origin/android-goldfish-2.6.29
  cp ./arch/arm/configs/goldfish_defconfig  .config
 修改Makefile ,用arm-2008q3编译器,然后make ARCH=arm 将生成zImage 
 此image可以在emulator下跑 



  
第二部分 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  这项去掉 就可以了
阅读(1305) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~