第三期 Android Kernel 下载和编译 《手机就是开发板》

https://blog.csdn.net/aggresss/article/details/53461464

        Android源码默认不包含他所使用的Linux内核源码,所以需要另外下载和编译。在生成镜像包时将单独编译生成的Image文件整合到boot.img中,这一期我们来下载和编译kernel。android kernel是在Linux kernel的基础上修改而来的,增加了适用于移动设备的IPC系统,日志系统,电源管理系统等等,android刚起步时kernel部分作为Linux kernel的一部分,但google的某些非开源做法不符合Linux的开源理念,被剔除了Linux的队伍,其实android毕竟不是一个社区维护的开源系统,它的本质决定了它的开源只是一种假象,随着Android7.0的发布,我们也越来越看清Android的趋势,Google 正慢慢地把越来越多的功能从开源的 AOSP 迁徙到闭源的 GMS 里去。也就是说,随着android闭源进程的加速,给了基于Linux内核+Framework组合成的其他操作系统迅速崛起的机会,也许有一天将会有一种可以兼容Android所有应用程序的移动操作系统预装到我们的手机上,也许这件事就发生在中国。
        可以通过下面的页面查看android kernel的编译流程http://source.android.com/source/building-kernels.html
上一期我们编译好AOSP后通过emulator 来模拟了andorid的运行,其实这个模拟器就是一个qemu虚拟机,Google在开发Android系统的同时,使用qemu开发了针对每个版本的一个模拟器,这大大降低了开发人员的开发成本,便于Android技术的推广。qemu是一个开源的模拟处理器软件,而Google使用qemu模拟Goldfish处理器,如果开发人员在没有目标开发板的情况下,要对硬件进行操作的话,必然要去操作Android底层的驱动,我们可以使用模拟器的内核源码。
        Android模拟器所对应的源代码主要在external/qemu目录下。
        Goldfish是一种虚拟的处理器,在Android的仿真环境中使用。Android模拟器通过运行它来运行goldfish处理器目前支持的架构有X86,arm,mips)。
这个链接详细的介绍了goldfish的硬件定义
https://android.googlesource.com/platform/external/qemu.git/+/master/docs/GOLDFISH-VIRTUAL-HARDWARE.TXT
        Android kernel使用的Linux版本主要有 2.6.35, 3.4, 3.10, 3.18, 4.4,android kernel 的版本和android版本并没有严格的对应关系,比如android kernenl 3.10可以用在 android 4.4,5.0,6.0,7.0版本中。
        首先我们来看一下上一期模拟器中使用的kernel版本的多少,在 android-6.0.1_r66/out/target/product/generic目录下有一个hardware-qemu.ini文件,这个文件记录了模拟器qemu的各种配置参数,使用编辑器打开后找到kernel.path项,可以看到kernel文件位于prebuild/qemu-kernel/arm目录下的kernel-qemu-armv7文件,可以理解,因为kernel不参与AOSP的编译,所以编译好的kernel存在于prebuild目录下,按照Google给出的方法来确定一下kernel的版本:

dd if=kernel-qemu-armv7 bs=1 skip=$(LC_ALL=C grep -a -b -o $'\x1f\x8b\x08\x00\x00\x00\x00\x00' kernel-qemu-armv7 | cut -d ':' -f 1) | zgrep -a 'Linux version'

  

     可以看出上面这个镜像使用的是3.4的版本,那我们接下来也使用3.4版本的android kernel版本在goldfish平台模拟实验。
首先下载Google 维护的goldfish平台的android kernel 代码:
git clone https://android.googlesource.com/kernel/goldfish.git
如果速度慢或者无法下载,可以使用我的github镜像:
git clone https://github.com/aggresss/android_kernel_goldfish.git
       下载后,目录为空,使用 git branch -a 命令查看版本

phdemo@phdemo:~/workspace/android_kernel/kernel_goldfish/android_kernel_goldfish$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/android-3.10
remotes/origin/android-3.18
remotes/origin/android-3.4
remotes/origin/android-goldfish-2.6.29
remotes/origin/android-goldfish-3.10
remotes/origin/android-goldfish-3.10-l-mr1-dev
remotes/origin/android-goldfish-3.10-m-dev
remotes/origin/android-goldfish-3.18
remotes/origin/android-goldfish-3.18-dev
remotes/origin/android-goldfish-3.4
remotes/origin/android-goldfish-3.4-l-mr1-dev
remotes/origin/android-goldfish-4.4-dev
remotes/origin/heads/for/android-goldfish-3.18-dev
remotes/origin/linux-goldfish-3.0-wip
remotes/origin/master


       使用 git checkout android-goldfish-3.4 命令将 版本切换到3.4版本,然后开始编译内核。内核的编译有两种方法,一种是使用AOSP给出的编译脚本来编译,另一种是使用手动的方法提前导入一些变量,然后执行make编译,这两种方法的原理是一样的,手动的方法我就不做介绍了,只要分析自动编译脚本就能知道需要导入哪些变量,编译脚本文件为prebuild/qemu-kernel/build-kernel.sh文件,这个脚本文件主要导入ARCH和CROSS_COMPILE两个环境变量,我选择的方法是将kernel源码拷贝到AOSP的顶层目录,在顶层目录执行source ./build/envsetup和lunch命令设置好当前的环境变量,然后进入kernel目录,执行 ../prebuild/qemu-kernel/build-kernel.sh 后内核开始编译。当编译成功后会提示在/tmp/qemo-kernel/kernel3.4.67/ 目录下生成内核文件。
       这时内核已经编译完成,执行 emulator -kernel <kernel所在目录>/arch/arm/boot/bzImage就可以使用刚刚编译过的内核来启动系统。
       如果能成功启动就基本没问题了,进入android系统后进入setting-->About phone 可以查看内核版本,下图是我没有修改内核和使用自己编译的内核的对照图。

       我在实验的时候使用过3.10和3.18版本的内核都不能正常启动android系统,只有使用3.4版本才能正常启动,希望有成功替换3.10和3.18内核的大神给指点一下。
       如果内核文件可以使用我们自己编译的来替代,那么我们就打开了android学习的一扇大门,因为android就是运行在Linux kernel内核上的系统,通过修改内核来从底自上的学习android就成为可能,下一期我们就通过给内核增加模块来学习android的底层原理。
 

猜你喜欢

转载自blog.csdn.net/wxh0000mm/article/details/86300514