`
feixf1974
  • 浏览: 42172 次
  • 来自: ...
社区版块
存档分类
最新评论

Simple Guide for Porting Android Kernel

阅读更多
作者:刘旭晖 colorant@163.com 转载请注明出处
http://blog.csdn.net/colorant/

移植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.1          Kernel
到M5-r14 release 为止,Android的Kernel是基于Linux2.6.23的内核开发的,主要添加了一个名为Goldfish的虚拟CPU以及Android所需相关特定驱动代码。
你需要一个支持EABI的内核作为你内核Porting的起点(最低版本?不知道,只要EABI OK,应该没有本质区别,但是,Android的很多驱动依赖于2.6.23的内核API,版本越低的内核,移植修改内核相关代码的工作量越大)
1.2.2          Tools 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 sbin init这几个目录/文件就可以了,其它自建,其中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 of vsync/pageflip in the fb driver.The surfaceflinger believes it will be limited by the vsync rate and the startup animation depends on that.

Ø       目前的Android的内核代码有M3-r20和M5-r14两个版本,这两个版本对binder和power两个驱动做了较大的修改,上层的文件系统和内核必须配套使用。( 另,我的板子上,M5版本可以跑起来,M3的版本会出现段错误,没跑起来 :(。如果一个版本实在跑不起来,不妨试试别的版本)

Ø       使用strace去跟踪问题!
分享到:
评论

相关推荐

    Android Kernel Porting 的简单总结文档

    Android内核移植(Android Kernel Porting)是Android系统开发中的一个重要环节,涉及到将Linux内核定制为适应Android设备硬件需求的过程。在这个过程中,开发者需要理解Linux内核与Android系统的交互,以及如何根据...

    Android Porting Guide for embedded platforms

    ### Android移植指南在嵌入式平台上的关键技术点 #### 一、引言 自谷歌推出开源的Android平台以来,移动电话领域受到了极大的关注,并且在原始设备制造商(OEM)社区中也引发了强烈的兴趣,他们希望将Android定制...

    porting android

    【Porting Android】是指将Android操作系统移植到不同的硬件平台或者设备上,使其能够在这些平台上运行。这个过程涉及到多个层面的技术工作,包括驱动程序开发、编译系统调整、内核适配以及用户空间应用的兼容性处理...

    Realtek_Linux_Bluetooth_Porting_Guide.pdf realtek 蓝牙 linux驱动源码

    《Realtek Linux Bluetooth Porting Guide》是一份针对Realtek蓝牙芯片在Linux系统中进行驱动移植的重要参考资料。本文将深入解析该指南中的关键知识点,并提供关于Realtek蓝牙驱动源码的相关信息。 1. **Realtek ...

    Android Porting Guide

    ### Android Porting Guide详解 #### 一、概览 本文档是关于如何为特定硬件平台进行Android系统移植的指南。Android作为一个开源项目,其灵活性允许开发者根据不同的硬件需求进行定制和优化。本指南由Rockie Cheng...

    A Guide to Porting C C++ to Rust 等53本

    A Guide to Porting C C++ to Rust.epub Build a Node.js Project from Scratch.epub Build your applications with Webpack.epub Build Your Own Lisp 中文版.epub C 语言进阶.epub Ceph 运维手册.epub Chromium...

    U-boot Porting guide for arm 英文

    ### U-Boot移植指南(ARM平台) #### 概述 U-Boot(Universal Boot Loader)是一种开源、多平台的引导加载程序。它支持交互式命令、环境变量、命令脚本以及从外部媒体启动等特性。U-Boot支持当今广泛使用的各种...

    lcd driver porting guide

    ### LCD Driver Porting Guide #### 1. 引言 本文档主要介绍如何在SIM8950 Android平台上通过Display Serial Interface (DSI)在内核(Kernel)和Little Kernel (LK)中启动显示面板。这是一份LCD驱动移植手册,内容...

    MTK driver porting guide

    Mt6737 all driver porting guide, eg : light, lcm, camera, sensor, keypad...

    i.MX_BSP_Porting_Guide_Linux.pdf

    This document provides an overview on how to ... This document describes how to customize kernel changes, U-Boot, memory, and various configurations for a custom hardware solution using an i.MX SoC

    GT1X Driver Porting Guide_for_Android_20150710_Rev.02.pdf

    根据给定文件的内容,以下是对GT1X驱动移植到Android系统的详细知识点梳理。 ### 1. GT1X驱动介绍 GT1X驱动是深圳汇顶科技有限公司(GOODIX)发布的触摸屏控制器驱动,主要用于GT系列触摸屏控制器。此驱动移植指南...

    Embedded Android - Porting, Extending and Customizing

    综上所述,《嵌入式Android - Porting, Extending and Customizing》这本书不仅深入浅出地讲解了如何将Android系统移植到各种嵌入式设备上,还提供了大量的实践案例和实用技巧,对于希望在这个领域有所作为的专业...

    Arnold5 porting guide

    Arnold5 porting guide Last updated: 13-Mar-17, 12:06 Types Some types have disappeared: AtUInt32 -> uint32_t AtUInt64 -> AtByte -> uint8_t

    Android Wifi Driver Porting

    标题与描述概述的知识点主要涉及Android系统中Wi-Fi驱动的移植过程,这在移动设备开发领域是一项关键技能,尤其对于那些希望优化或自定义设备Wi-Fi功能的开发者来说至关重要。以下是对这一知识点的深入解析: ### ...

    8852BS 蓝牙 8852BS 蓝牙移植

    1. "Realtek_Bluetooth_Porting_Guide_for_BT_Android12.0.pdf" 和 "Realtek_Bluetooth_Porting_Guide_for_BT_Android12.0_English.pdf":这两个文件很可能是Realtek公司提供的蓝牙移植指南,针对Android 12.0版本。...

    Embedded Android Porting, Extending, and Customizing 2013最新版

    ### 嵌入式Android移植、扩展与定制 #### 知识点概览 1. **嵌入式Android概述** 2. **移植Android系统至不同硬件平台** 3. **定制化Android系统的方法** 4. **扩展Android功能的技术** 5. **Android构建系统的深入...

    wget for android 完整版

    工作用到所以移植了一个,花了一天时间, 主要原因就是autoconfig对android还不支持,所以必须自己写Android.mk,可以直接下载运行, 移植方法还是比较麻烦,...porting for android build anman zhou <anman.zhou@qq.com>.

    porting-android-x86.rar_android_android x86_android 移植

    综上所述,"porting-android-x86.rar"文件提供的"happy-porting-x86-application-to-android.ppt"很可能是一个关于如何将Android应用程序移植到x86平台的教程或演讲稿。这个过程涉及到多方面的技术知识和实践,包括...

Global site tag (gtag.js) - Google Analytics