一、确定Android 内核版本
用虚拟机打开上一节产生的Android系统镜像,与上一节不一样的是我们使用后台打开
$ /home/stone/Android/Sdk/emulator/emulator -avd MyPhone -system out/target/product/generic/system.img &
使用Android SDK自带调试工具adb进入正在的运行的虚拟的终端界面,读取当前的内核版本号
这里可以看出使用的是3.10版本的内核,后面我们就下载编译自己的3.10版本内核。
二、Android 内核源码下载
Android 内核并不是原生Linux 内核,而是经过特殊修改的Linux 内核。因此Android 内核并不是从kernel.org网站下载,而是直接在Android官网下载。
访问网址:https://source.android.com/
这里我们可以看到一个Android 设备与内核的对应表
我们这是使用的设备是虚拟机,虚拟平台并不在这个表中。继续看这个页面的下方可以找到一个专门用于虚拟平台的内核源码下载方式:
但实际上由于某种原因我们不能从这个地址下载源码,因此选择使用国内的清华大学镜像源:https://mirrors.tuna.tsinghua.edu.cn/,Android 相关的源码都可以在这里下载。
我们创建一个新的目录kernel-source/用于保存内核源码:
$ mkdir kernel-source
$ cd kernel-source
$ git clone https://aosp.tuna.tsinghua.edu.cn/kernel/goldfish.git
$ cd goldfish
查看远程分支情况
$ git branch -a
切换分支,使用3.10+的内核
$ git checkout remotes/origin/android-goldfish-3.10
二、Android 内核源码编译
1、设置交叉工具链
交叉工具链在上一节Android 源码目录下
$ ls android-source/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/
$ sudo vim /etc/profile
在PATH中加入交叉工具链路径
重启电脑
$ sudo reboot
重启后测试交叉工具链
$ arm-linux-androideabi-gcc -v
正确显示gcc版本号表示交叉工具链安装成功
2、配置
$ cd goldfish/
$ make distclean
$ make ARCH=arm goldfish_armv7_defconfig
这里有一个问题,就是3.10内核源码的arch/arm/configs/目录下并没有文件goldfish_armv7_defconfig,因此上面的命令会执行失败。关于为什么没有这个问题不得而知,这里采取简单的解决办法,从之前的Android系统中读取配置文件。还是使用adb工具:
(如果之前的adb shell界面没有退出,使用exit退出)
首先切换到root权限
$ /home/stone/Android/Sdk/platform-tools/adb kill-server
$ /home/stone/Android/Sdk/platform-tools/adb root
导出配置文件
$ /home/stone/Android/Sdk/platform-tools/adb pull /proc/config.gz
拷贝配置文件到内核源码中
$ gunzip config.gz
$ cp config kernel-source/goldfish/.config
3、编译
$ make ARCH=arm CROSS_COMPILE=arm-linux-androideabi-
若编译过程中要求选择某些配置,选NO即可,除非有特殊需要。
三、测试Android 内核
测试同样使用上一节使用的虚拟机MyPhone
$ /home/stone/Android/Sdk/emulator/emulator -avd MyPhone -kernel arch/arm/boot/zImage
等待若干分钟我们就能看到虚拟机正常启动了