android系统移植(一) 总述

jopen 12年前
     <p><strong>一、先说明一下平台要求</strong></p>    <p>平台硬件要求</p>    <div>     <div>      •RAM: 512MB     </div>     <div>      •FLASH:256MB     </div>     <div>      •CPU:     </div>     <div>         ARM平台指令集要求     </div>     <div>         ARM9 Family以上,ARMv5以上指令集,     </div>     <div>         mips平台指令集要求     </div>     <div>         MIPS32 revision 2 - Little-Endian, O32     </div>    </div>    <br />    <div>     软件需求    </div>    <div>     <div>      •Linux2.6以上版本,目前froyo(v2.2)对应于linux2.6.32 - linux2.6.35版本,最好是使用android官方网可以下载到的代码【目前linux2.6.23官方网下不了,最低也是linux2.6.25】     </div>     <div>      •Android源码     </div>    </div>    <div>     每个android版本对应不同的linux版本    </div>    <div>     <br />    </div>    <div>     android 2.1 ----- linux 2.6.29    </div>    <div>     android 2.2 ----- linux 2.6.32     <br />    </div> android 2.3 ----- linux 2.6.35    <p> </p>    <p><strong>二、移植主要四大模块</strong></p>    <div>     <div>      •1、bootload运行起来,无论使用u-boot还是fastboot,主要是关于flash分区问题     </div>     <div>      •2、linux kernel 主要涉及到android driver层驱动代码     </div>     <div>      •3、android 系统移植     </div>     <div>      •4、应用程序移植     </div>     <div>      【后面则详细讲解各个模块的移植过程】     </div>    </div>    <br />    <div>     1、Bootload    </div>    <div>     <div>      •一般使用u-boot或者fastboot,主要的工作就是flash分区问题,一般划分为如下几个分区:     </div>     <div>      1、fastboot      【快速启动,裸板启动区】     </div>     <div>      2、recovery     【系统恢复分区】     </div>     <div>            recovery就好比外套,fastboot就好比内裤     </div>     <div>      3、kernel         【linux内核分区】     </div>     <div>      4、system       【android核心系统分区】     </div>     <div>      5、userdata    【用户数据分区】     </div>     <div>      6、factorydata【工厂数据分区】     </div>    </div>    <br />    <div>     2、linux kernel 移植    </div>    <div>     <div>      <div>       由于android系统对于linux kernel的限制,首先是要选定合      </div>      <div>       适的kernel版本,然后剩下的工作就是整个一个全新的kernel代码,系统移植有三份kernel代码需要集成      </div>      <div>       •1、机顶盒厂商提供的linux源码,包含有针对平台的驱动代码及修改      </div>      <div>       •2、项目主页下载的linux源码,与厂商的版本可能有所不同      </div>      <div>       •3、增加了android linux driver的源码,这部分已经从linux kernel中分离开来,需要单独移植      </div>      <div>         所以首要的问题是将三份统一到一起,目标是支持      </div>      <div>         厂商驱动,支持android驱动以及更新到一定      </div>      <div>         linux内核版本(android driver +sdk driver + linux kernel )      </div>      <div>         这部分工作需要深入到linux kernel driver层代码,一定的      </div>      <div>         技术功底+细心      </div>     </div>     <br />    </div>    <div>     <div>      Kernel移植要点     </div>     <div>      <div>       •1、尽可能将硬件平台相关的代码从旧版移植到新版本      </div>      <div>       •2、针对硬件平台相关的代码,以旧版本为主,毕竟旧版的是可以正常运行的版本,      </div>      <div>       •3、非硬件平台相关代码尽量使用新版本      </div>      <div>       •4、若遇到不知如何处理问题,先跳过,记录下该文件及修改点,这部分需要多参考部份原码进行移植      </div>      <div>       •5、对于配置.config文件,需要根据相关功能进行修改及配置,可以从模拟器上拿到config.gz文件解开即可      </div>      <div>       •6、编译及测式,采用nfs挂载根文件系统,一般遇到kernel panic错误时,打开kernel debug,printk加打印,或者disable此功能进行调试      </div>     </div>     <br />    </div>    <div>     3、android启动步骤    </div>    <div>     <div>      <div>       Android从Linux系统启动有4个步骤;      </div>      <div>       1、 init进程启动 (system\core\init\中的main函数)      </div>      <div>           init进程,它是一个由内核启动的用户级进程。内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程,此后android将接管所有工作,这里涉及到两个脚本文件:init.rc 及 init.xxx.rc【arch】      </div>      <div>       2、 Native服务启动      </div>      <div>           Servicemanager和zygote进程就奠定了Android的基础。Zygote这个进程起来才会建立起真正的Android运行空间,主要是Zytote创建JAVA 虚拟机,装载classes等      </div>      <div>          【受精卵,典型的C/S结构,请求生产,fork子进程,ok,出产品完成】      </div>     </div>     <div>      <div>       3、 System Server服务循环框架      </div>      <div>           Android服务启动不停的通过Zygote fork新的进程,并建立了一大堆服务,并add Service到service Manager,Android的所有服务循环框架都是建立SystemServer@(SystemServer.java)上      </div>      <div>       4、 Home启动      </div>      <div>          启动完所有的Android服务后,然后启动第一个home应用程序,即第一个启动HomeActivity 应用程序      </div>     </div>    </div>    <div>     <br />    </div>    <div>     <div>      4、应用程序移植     </div>     <div>      <div>       •不同的android版本差异性      </div>      <div>       •不同的sdk api函数差异性      </div>      <div>       •只要搞定以上两点就可以写出完全移植于不同平台的应用程序 【*.apk 应用程序】      </div>     </div>    </div>