• Android介绍



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

  • 相关阅读:
    python redis
    Celery
    RabbitMQ
    python的文件锁操作
    cloud-init alibaba
    cloud-init tencent
    关于 python 的类
    jnija2模板渲染
    python multiprocessing
    学习html5的WebSocket连接
  • 原文地址:https://www.cnblogs.com/simonshi/p/1682913.html
Copyright © 2020-2023  润新知