首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

移植android 到定制开发板

移植android 到定制开发板

移植Android的kernel到实际的硬件平台上,很多人很早就做过这件事了,不过相关的文档和经验总结不多,我就写一个吧,也为了自己记录一下大致的流程,以后好继续。
  1   Android内核Porting相关背景知识
  1.1   运行平台
  Google的Android平台到今天为止(2008-2-27),应用层部分还是以二进制的Binary的形式发布的,其编译的目标平台是ARM926EJ-S的CPU属于ARMV5T的版本,所以ARMV4架构的CPU平台无法使用其二进制代码。关于这点,可以参考下面这篇文章,Benno在此做了详尽的理论分析和代码测试:http://benno.id.au/blog/2007/11/21/android-neo1973
  所以目前只有基于ArmV5或以上的架构的平台可以实际运行Android。
  1.2 软件环境
  SDK下载:http://code.google.com/android/download_list.html
  KERNEL,模拟环境等SRC包下载:http://code.google.com/p/android/downloads/list
  1.2.1Kernel
  到M5-r14 release 为止,Android的Kernel是基于Linux2.6.23的内核开发的,主要添加了一个名为Goldfish的虚拟CPU以及Android所需相关特定驱动代码。
  你需要一个支持EABI的内核作为你内核Porting的起点(最低版本?不知道,只要EABI OK,应该没有本质区别,但是,Android的很多驱动依赖于2.6.23的内核API,版本越低的内核,移植修改内核相关代码的工作量越大)
  1.2.2Tools chain
  SDK中的内核使用的是4.2.1版本的GCC,基本上,你需要的是一个支持EABI的工具链,比如你可以使用Codesourcery的最新工具链:http://www.codesourcery.com/
  1.2.3 其它工具
Android的Emulator是一个很好的仿真工具,其底层是基于QEMU来实现的,可以使用SDK中的adb工具登陆Emulator的控制台,和控制台交换文件等,用于获取你所需的信息。
  1.3 相关论坛资源等
http://benno.id.au/blog/
http://groups.google.com/group/android-internals
http://groups.google.com/group/android-developers
  2 Porting基本思路
  2.1 所需资源
  2.1.1 硬件
  首先,当然是需要一个可以用来向上porting的硬件开发板了,对硬件的需求除了上面说的,需要ArmV5+兼容的CPU以外,最低要求基本需要64M+的内存,64M-128M+的FLASH(取决于你加载文件系统的方式,如果可以透过网络使用NFS-ROOT或者MMC卡等来存放文件系统的话,这个应该就无所谓了)
  2.1.2软件
  除了上述kernel和tools chain,为了方便调试,最好有静态编译的Busybox和Strace等工具。也可以从Benno的blog上下载到他编译好的版本。
  2.2 基本流程
  下载Android内核代码
  下载官方2.6.23内核
  制作Android和2.6.23内核的diff文件
  去除diff文件中和Goldfish和QEMU相关的代码,如果你的系统已经支持YAFFS2,还可以去除这部分代码
将diff文件Patch到你自己的内核上,如果需要,修改内核相关文件代码使得patch能够顺利完成。(这部分大概是主要的工作量,如果你的内核版本差得比较远的话 8 )
  如果必要,修改你的内核代码中Framebuffer的驱动,使其Virtual_yres 等于两倍的Yres,并实际分配两倍分辨率大小的framebuffer内存。
  配置内核,确保下列内容得到配置:
  CONFIG_ARM_THUMB=y
  CONFIG_AEABI=y
  CONFIG_BINDER=y
  CONFIG_ANDROID_LOG=y
  CONFIG_ANDROID_POWER=y
  CONFIG_ANDROID_POWER_STAT=y
  从SDK中获取Android的文件系统,基本上你只需要System etc sbininit这几个目录/文件就可以了,其它自建,其中data目录是有内容的,但是这个目录的内容可以由Android在启动时动态的创建出来。(可以使用adb工具在EMULATOR先tar包装,再拷贝出来。M3的release也可以从benno那里直接拿到他抓出来的文件系统)
确保你的dev目录下有足够系统启动的设备节点,如console等,其它的节点Android在启动过程中会自动创建出来。
  使用NFSROOT或者chroot等手段启动Android的文件系统。
  启动流程的大致外在表现分阶段依次是:
  LCD上出现Android几个字符
  LCD短时间的Blank
   LCD上出现一个左右滚动的红色滚动条 (如果有问题,基本上就死在这一步了 8 )
  进入主界面
  目前为止我的状态是:键盘可以工作,触摸屏有响应但是未校准,位置不对,启动最后阶段以及之后启动新的程序,出现Vmalloc分配内存Failed问题,导致如Brower等应用程序不能完全启动。其它网络等东东还没开始看呢 8 )
  3         一些TIPS
   Android会对文件使用memory mapped的方式进行操作,JFFS2不支持这种操作,所以要使用别的文件系统。当然也有绕过去的办法,自己搜一下吧 8 )
http://nemustech.blogspot.com/说的方法:
* if you have jffs2 for / patch /init
* modify with hexedit : "/system_property" -> "/tmp/sy_property"
* NOTE: jffs2 does not support memory mapped file
  为了方便测试,可以修改/etc/init.rc,注释掉 runtime,dbus-daemon,Xzygote等相关内容,在init启动以后再手工启动这些进程:
/system/bin/app_process -Xzygote /system/bin --zygote &
/system/bin/dbus-daemon --system --nofork &
sleep 1;
/system/bin/runtime &
  Android的Init位于根目录下,所以如果你需要直接启动Init,可以在内核参数命令行中用init=/init 来指定,或者chroot 目录 /init来指定。 当然,启动/bin/sh以后,再手动启动/init也是可以的。
   /dev/binder /dev/alarm /dev/log/*等文件是最重要的几个设备节点,由于这几个设备节点号的主次设备号是动态分配的,所以,最好确认你的文件系统中的这几个设备节点的主次设备号是否正确。如果不知道如何确认,直接删除掉再重启 8 )
  如果flash速度太慢或者nfs网络连接太差,可以将data tmp这两个目录mount到内存里,前提是你的内存足够大 8 )
  如果启动过程中,红色滚动条速度太快(和emulator里的表现比较),runtime或者system_server进程CPU占用率接近100%,那么你可以修改一下你的framebuffer代码中pan_display相关的函数的代码,保证其调用返回时得到足够的帧同步延迟时间。据Google的swetland给我的说法是:This is usually indicative of lack ofvsync/pageflip in the fb driver.The surfaceflinger believes it will belimited by the vsync rate and the startup animation depends on that.
返回列表