Android BSP成长计划随笔之虚拟设备搭建和input系统

由于工作关系,对Android关注将从FWK(Framework)转向BSP,也就是Linux Kernel。在工作的5年中,曾经数次研究过kernel,但一直没有合适的机会或者说推动力去深入研究。这次有机会了,岂能放过呢?

以前搞kernel,总是觉得没有合适的设备,都玩不转。最近琢磨了几天,打算从android虚拟设备goldfish开始吧。(惭愧啊,以前还买过一个板子,结果完了2天就腻味了)。

本随笔包括一下几个部分:

先介绍Android kernel的下载和编译。 配置模拟器以使之使用我们编译的kernel。 介绍下输入系统方面的内容。我的目标是在最短的时间内把Android的驱动撸一遍。在这个过程中,流程,模块之间的关系最重要。细节问题到以后碰到具体情况时再来深入研究。

一 Android GoldFish kernel下载和编译

老方法,用git下载。kernel和非kernel代码不在一个git库中,Android的代码由repo下载,而kernel得单独用git下载。goldfish的代码下载方法如下:

先在Android JB源码根目录下建立kernel目录。 cd kernel,然后git clone   (还可以下载高通的msm,普通common及omap分支的kernel) 下载完成后,得到kernel/goldfish目录。cd kernel/goldfish git branch -a,查看所有分支。里边有2.6.29以及3.4的 git checkout -b 2.6.29 remotes/origin/android-goldfish-2.6.29    建立本地分支2.6.29 用以跟踪远程的android-goldfish-2.6.29分支。此时goldfish目录下就有文件了。

下面就来编译。假设我们已经下载了JB源码。

还是在kernel/goldfish目录下。执行make ARCH=arm goldfish_armv7_defconfig   这个命令执行前,make将到arch/arm/config下读取goldfish_armv7_defconfig文件,获得板卡(恩,没有真实板卡,有一块虚拟的板卡)相关的编译配置文件(无非就是定义一些宏,使能kernel一些功能模块,驱动等等)。该命令执行完后,将得到一个.config文件。 设置环境变量export CROSS_COMPILE=Anroid-JB/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-   这个是设置交叉编译工具链的位置和前缀。这样在编译kernel时将使用这个前缀+gcc相关工具来编译kernel 然后就是make ARCH=arm。编译完成后最后一个输出就是 Kernel: arch/arm/boot/zImage is ready   zImage就是最后编译得到的kernel内核镜像。关于kernel内核镜像的组成,请参考

OK,到此我们就到得自己编译的kernel了。下面就是找个机器把它烧进去并启动之。由于我们没有真机,那就找模拟器吧。

 

二 利用Android模拟器加载goldFish kernel

我在JB源码目录下建立了一个android emulator脚本,各位看看其内容:

#!/bin/sh

 /disk/android/android-sdk-linux_86/tools/emulator    #这是android emulator的文件位置

-avd 4.1    #启动4.1这个机器,我之前已经用AVD工具制造了一个名叫4.1的机器

-system  /Android-4.1/out/target/product/generic/system.new.image  #我自己定制了一个极简单的system.image,里边只有5个APK,这样启动速度贼快。此参数用来指定该机器运行的system镜像文件

-kernel    /Android-4.1/kernel/goldfish/arch/arm/boot/zImage   #此参数用来指定kernel镜像文件。现在已经指向我自己编译的kernel了

-ramdisk  /thunderst/work-branches/Android-4.1/out/target/product/generic/ramdisk.new.img #我也重新定制了ramdisk,修改了其中的init程序。此参数指定ramdisk镜像文件

-partition-size 512  #指定system和data分区大小为512MB

&  #后台运行

 有了这个脚本,我就happy了。感觉比烧真机再启动要爽、快多了。

解释下ramdisk。ramdisk我们的android根目录的一个压缩表达文件。其操作如下:

假设已经有一个x夹文件,现在想把它打包成ramdisk文件。 首先读取x文件中的目录信息,然后写到结果文件ramdisk.temp。然后遍历x目录的所有文件(直接open,然后read吧,管你是二进制还是啥文本文件)。所有读取的数据都写到一个最终文件中。假设是ramdisk.temp. 这其实是得到一个archive的过程 再用gzip压缩此ramdisk.temp,得到ramdisk.image(后缀名是自己取的)。

如果现在已经有了一个ramdisk.image,如何还原它呢?

可用file ramdisk.image看看此文件信息,发现它是一个gzip压缩的文件(正如上面所讲)。gunzip ramdisk.image就可以了。 然后建立一个文件夹,mkdir test,并cd test cpio -i -F ../ramdisk  这样,刚才那个ramdisk.image就反archive到test目录了。以前x目录中的内容又回到test目录下了。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/a5a351e7ec22f9dde624cc007c67042f.html