zoukankan      html  css  js  c++  java
  • Android系统移植(一)-让android系统在目标平台上运行起来

    Android系统由于用的是linux内核,因此内核移植和嵌入式linux内核移植差异不大,过程如下:

    (1)
    移植boot-loaderlinux2.6内核到目标平台上,让linux内核可以启动起来,基本的驱动允许正常。
    此过程完全是嵌入式linux的开发,这里直接跳过。需要注意的是,由于android已经被linux官方开除,因此从
    网站上(http://www.kernel.org/)下载的最新linux内核源代码已经不包含android的专有驱动,因此建议
    google网上下下载Linux内核,android源代码浏览网站如下:
    http://android.git.kernel.org/
    从该网站上发现内核相关的包如下:
    kernel/common.git
    通用android内核项目
    kernel/experimental.git
    实验性内核项目
    kernel/linux-2.6.git
    这个是标准的Linux内核,没有android的驱动
    kernel/lk.git
    微内核项目
    kernel/msm.git
    这个是高通msm7xxx系列芯片所用内核
    kernel/omap.git
    kernel/tegra.git NVIDIA Tegra
    系列芯片所用内核
    下载内核代码的方法如下:
    git clone git://android.git.kernel.org/kernel/common.git
    下载完后用git branch -a查看所有git分支,结果如下:
      android-2.6.27
      origin/HEAD
      origin/android-2.6.25
      origin/android-2.6.27
      origin/android-2.6.29
      origin/android-2.6.32
      origin/android-2.6.35
      origin/android-2.6.36
      origin/android-goldfish-2.6.27
      origin/android-goldfish-2.6.29
    然后切换到最新分支git checkout origin/android-2.6.36

    (2)
    修改内核配置文件,打开Android必须的驱动(日志和BINDER)如下:
    CONFIG_ANDROID=y
    CONFIG_ANDROID_BINDER_IPC=y
    CONFIG_ANDROID_LOGGER=y
    此部分的代码在内核drivers/staging/android目录下。

    (3)
    为了提高启动速度,采用ramdisk,将android文件系统的部分内容压缩到内核中。
    首先打开内核驱动:
    CONFIG_BLK_DEV_INITRD=y
    CONFIG_INITRAMFS_SOURCE="root"
    CONFIG_INITRAMFS_ROOT_UID=0
    CONFIG_INITRAMFS_ROOT_GID=0
    然后在android源代码编译出来的out/target/product/merlin/root目录复制到内核目录下。

    (4)
    根据android文件系统的要求对nand flash进行重新分区,举例如下:
    nand flash分区以下8个分区
    NTIM
    OBM
    U-boot
    Kernel
    System
    UserData
    Mass Storage
    BBT

    (5)
    根据分区表修改内核启动参数如下:
    CONFIG_CMDLINE="ubi.mtd=4 ubi.mtd=5 ubi.mtd=6 root=ubi0_0 rootfstype=ubifs console=ttyS1,115200 uart_dma init=/init"
    参数的意思是:载入的文件系统部分有3个分区,分别为nand flash的第4,5,6分区(0编号),文件系统采用ubifs格式,控制台设备为ttyS1,波特率为115200
    启动的第一个应用程序是/init

    (6)
    确保控制台的设置和硬件保持一致,如:硬件上串口用的是UART1,则内核启动参数中设置有console=ttyS1,而且android的启动过程中设要设置正确,修改
    部分位于android源代码system/core/init/init.c文件中,将
    static char *console_name = "/dev/console";
    修改成
    static char *console_name = "/dev/ttyS1";

    (7)
    修改android源代码system/core/rootdir目录下的init.rc文件,作如下修改(android默认yaffs2文件系统)
    首先将android文件系统修改成可读写,将
        mount rootfs rootfs / ro remount
    修改成
        mount rootfs rootfs / rw remount
    然后修改挂载systemuserdata部分的代码,将
        # Mount /system rw first to give the filesystem a chance to save a checkpoint
        mount yaffs2 mtd@system /system
        mount yaffs2 mtd@system /system ro remount

        # We chown/chmod /data again so because mount is run as root + defaults
        mount yaffs2 mtd@userdata /data nosuid nodev
        chown system system /data
        chmod 0771 /data
    改成
        # Mount /system rw first to give the filesystem a chance to save a checkpoint
        mount ubifs ubi0_0 /system ro

        # We chown/chmod /data again so because mount is run as root + defaults
        mount ubifs ubi1_0 /data nosuid nodev
        chown system system /data
        chmod 0771 /data

    (8)
    完成后编译内核,可以启动文件系统,控制台可用,但是没有显示启动log,而且不停的重启。

    (9)
    系统不停的重启,因此控制台已经可用了,自然而然的想到看到logcat日志,一看,发现logcat设备居然没起来,配置文件里面都定义了
    居然没起来,查看了下内核drivers/staging/android目录,没有.o文件,证明是没编译到,在看内核目录下的.config文件,发现居然没有了
    logcat
    binder的宏定义,配置文件里面有定义而.config文件中无定义,肯定是相关Kconfig文件的问题,通过分析drivers/staging目录下的
    Kconfig
    文件发现是因为STAGING_EXCLUDE_BUILD宏默认是y,在配置文件中否定此宏即可,在配置文件中CONFIG_STAGING定义后加上即可,如下:
    CONFIG_STAGING=y
    # CONFIG_STAGING_EXCLUDE_BUILD is not set
    修改后重新编译发现系统完成正常启动,启动过程中启动log也显示正常。

    至此,android初步移植工作已经完成,当然,系统还有很多问题,需要下一步继续修改。

    总结:android的移植按如下流程:
    (1)android linux
    内核的普通驱动移植,让内核可以在目标平台上运行起来。
    (2)
    正确挂载文件系统,确保内核启动参数和android源代码system/core/rootdir目录下的init.rc中的文件系统挂载正确。
    (3)
    调试控制台,让内核启动参数中的console参数以及android源代码system/core/init/init.c中的console_name设置和硬件保持一致
    (4)
    打开android相关的驱动(logger,binder),串口输入logcatlogger驱动起来,没有的话调试logger驱动。


    说明:ARM的内核配置文件定义在内核arch/arm/configs目录下

  • 相关阅读:
    面向接口程序设计思想实践
    Block Chain Learning Notes
    ECMAScript 6.0
    Etcd Learning Notes
    Travis CI Build Continuous Integration
    Markdown Learning Notes
    SPRING MICROSERVICES IN ACTION
    Java Interview Questions Summary
    Node.js Learning Notes
    Apache Thrift Learning Notes
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3174342.html
Copyright © 2011-2022 走看看