在Ubuntu上下载、编译、运行Android内核Linux Kernel


在Ubuntu上下载、编译、运行Android系统一文中我们学习了如何下载、编译以及运行Android系统,一睹Android_4.4.2芳容。而唯一的美中不足是使用了预编译好的kernel-qemu-armv7。那么,在这篇文章中,我们就来弥补这个缺憾,编译运行属于自己的Android Kernel。

同样,在这一篇文章中,咱们会从下载、编译、运行三个方面逐一介绍。


一、下载Kernel(goldfish for Android)

由于咱们现在是基于虚拟处理器goldfish来学习Android,那自然我们需要下载goldfish kernel了。

废话不多说,直接上源代码goldfish-android-goldfish-3.4.tar.gz
注意,Android_4.4.2对应的goldfish版本是3.4(博主亲测2.6,3.10,3.18等版本均无法启动模拟器)。

当然,通过Google官方直接下载也是OK的(自行百度),不过

  1. 下载速度比较慢呢;
  2. Google被屏,和下载Android源代码的原因一样,如果你没有的话,是无法下载kernel源代码的。
    可以试试
    git clone https://android.googlesource.com/kernel/goldfish.git

二、编译Kernel

  1. 进入Android源代码的主目录下,以下是博主的目录,因人而异。
    cd ~/442
    mkdir kernel
    cd kernel
    mkdir goldfish
    cd goldfish

  2. 将刚才下载的kernel源代码压缩包拷贝到goldfish目录中,并解压缩。
    cp ~/Downloads/goldfish-android-goldfish-3.4.tar.gz ./
    tar -zxvf goldfish-android-goldfish-3.4.tar.gz

  3. 编辑Makefile
    vim Makefile
    然后,按照如下内容修改Makefile
    ARCH ?=arm
    CROSS_COMPILE ?=arm-none-linux-gnueabi-

    注意,
    CROSS_COMPILE的定义是基于自己的交叉编译链来填写的。
    在Linux开发环境搭建 三 (在Ubuntu上Android/Linux编译环境的准备)一文中,我们已经配置了PATH变量,所以这里只需要填写arm-none-linux-gnueabi-即可(这是一个前缀,例如,编译时和gcc拼接成arm-none-linux-gnueabi-gcc命令);如果没有配置PATH,那么需要将交叉编译链的路径填上,例如/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-

  4. 配置内核
    通过如下命令为goldfish做内核配置:
    make goldfish_armv7_defconfig
    解释,
    a. 这条命令是将~/442/kernel/goldfish/arch/arm/configs/目录下的goldfish_armv7_defconfig拷贝到~/442/kernel/goldfish/目录下的隐藏文件.config中,而.config文件正是编译内核时用到的配置文件,当然这个配置文件可以通过其他的方式生成,例如,make menuconfig等。
    b. Android_4.4.2采用armv7架构,那么在选择goldfish配置时,注意选择goldfish_armv7_defconfig,如果选择goldfish_defconfig,会遇到启动模拟器黑屏的问题。

  5. 编译内核
    执行make,开始编译内核,最后将在~/442/kernel/goldfish/arch/arm/boot/目录下生成内核镜像文件zImage
    make


三、运行Kernel + Android系统

经过前面的编译,我们得到zImage镜像,另外,在Ubuntu上下载、编译、运行Android系统一文中,我们已经编译出system.img、userdata.img、ramdisk.img。
接下来,我们便可以开始运行自己编译出来的Kernel + Android系统了,是否有点小激动呢?

  1. 进入Android源代码主目录~/442
    cd ~/442

  2. 配置Android的运行参数(在上一片文章已经介绍过了)
    export PATH=$PATH:~/442/out/host/linux-x86/bin
    export ANDROID_PRODUCT_OUT=~/442/out/target/product/generic

  3. 启动模拟器
    emulator -show-kernel -partition-size 1024 -kernel ./kernel/goldfish/arch/arm/boot/zImage -sysdir ./out/target/product/generic -system system.img -data userdata.img -ramdisk ./out/target/product/generic/ramdisk.img


细心的朋友会问,预编译prebuilds下有现成的内核镜像,为何还要费老大劲编译自己的kernel呢?原因很简单,我们接下来会真正的开始Android的源码学习,从下往上,从内核到应用层,纵向的学习Android系统,那么,内核部分将是我们万里长征第一步,敬请期待……

如果你喜欢博主的分享,请关注我吧,谢谢。


itxiebo
20160405

更多相关文章

  1. Android(安卓)studio查看sdk源代码
  2. android编译系统makefile(Android.mk)写法.txt
  3. Android编译系统makefile(Android.mk)说明
  4. android中Intent简介
  5. Android系统启动分析
  6. Android(安卓)App 获取root权限后,执行shell命令
  7. 让Android(安卓)变身回一台真正的Linux系统!!!
  8. android系统更新应用的添加
  9. android provision

随机推荐

  1. Android之加载图片时自定义进度条
  2. Android(安卓)判断是否能真正上网
  3. android学习(二)——第一个android工程
  4. Android培训班(57)Dalvik虚拟机运行Zygot
  5. MifareUltralight官方文档翻译
  6. android 消息传递流程
  7. 【转载】Android(安卓)Studio大课堂 - 6.
  8. Android(安卓)Unable to resolve target
  9. Android(安卓)让adb logcat打印内核调试
  10. android学习笔记一(基础篇)