前言:本文是在Android 9.0编译基础上操作的, 请保证Android编译成功.最近抱着学习的心态想要看一下驱动方面相关的知识,所以把内核下载编译记录一下.阅读本文需要的知识:Shell, Git基本操作
下载内核
cd kernel
git clone https://aosp.tuna.tsinghua.edu.cn/android/kernel/goldfish.git
执行完这两条命令后就可以看到kernel目录下有一个goldfish目录了,goldfish内核专门是提供给emulator用的.
cd goldfish
git branch -a
git checkout remotes/origin/android-goldfish-3.18
这里涉及到要下载哪个版本的内核,emulator命令默认用的是qemu内核, 一般跟这个版本的内核一样就可以了,可以直接启用emulator然后进入到Settings->System->About phone->点击Android version,里面就有内核版本号.
编译内核
编译内核之前同样要执行source和lunch操作,一定要和Android编译时选的一样, 可以进入到out/target/product目录下查看自己编的是什么版本, 如果是generic_x86_64,那lunch的就是aosp_x86_64_eng的,其他版本依此类推.
接下来就可以编译了,下面我提供了几个编译的脚本大家可以进行对比和参照,lunch不同的版本对应的脚本是不一样的,即使编译通过了,也不能运行,我因为这个浪费了很长的时间
使用方法:
- 在goldfish目录下创建一个build.sh文件
- 将脚本里面的内容复制到build.sh中,或者根据脚本自己写, 注意luch的版本
- 执行
chmod a+rx build.sh并且执行./build.sh.
aosp_x86_64-eng
#指定编译的内核类型
export ARCH=x86_64
#指定的gcc编译器的前缀, 就是下面PATH中的x86_64-linux-android-4.9的前缀
export CROSS_COMPILE=x86_64-linux-android-
export REAL_CROSS_COMPILE=x86_64-linux-android-
#这里android_root要写是android根目录的绝对地址例如: ~/google/android-9.0
PATH=$PATH:android_root/prebuilts/gcc/linux-x86/x86/x86_64-linux-android-4.9/bin
#编译的配置,在arch/x86/configs目录下,
make x86_64_ranchu_defconfig
#编译内核命令
make
编译内核大概10来分钟就可以完成了,之后会生成一个arch/x86_64/boot/bzImage的东西,不同kernel生成的是不一样的,要看清楚.
最后回到android根目录执行emulator -kernel kernel/goldfish/arch/x86_64/boot/bzImage启动虚拟机
aosp_arm64-eng
#指定编译的内核类型
export ARCH=arm64
export SUBARCH=arm64
#gcc编译器前缀
export CROSS_COMPILE=aarch64-linux-android-
export REAL_CROSS_COMPILE=aarch64-linux-android-
#注意和上面aosp_x86_64-eng的路径区别
export PATH=$PATH:android_root/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin
#配置文件, 在arch/arm64/config目录下
make ranchu_defconfig
make -j4
aosp_arm_-eng
这里要特别注意编译器和arm64用的是不一样的
export ARCH=arm
export SUBARCH=arm
#注意和arm64的区别
export CROSS_COMPILE=arm-linux-androideabi-
export REAL_CROSS_COMPILE=arm-linux-androideabi-
#注意和arm64的区别
export PATH=$PATH:android_root/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin
make goldfish_armv7_defconfig
make -j4
总结
其实ARCH、SUBARCH、CROSS_COMPILE这些变量设置的是goldfish目录下的Makefile文件中的变量,可以在Makefile文件中找到这些变量.
个人认为ARCH变量应该是内核生成在arch下的子目录, 而且make ranchu_defconfig命令中的ranchu_defconfig文件也是通过ARCH变量找的,但是x86_64_ranchu_defconfig文件又是在arch/x86/目录下.最后,执行脚本的时候注意以下两点
lunch的版本和gcc编译版本要一一对应make ranchu_defconfig,arch/arm64下面一定要又ranchu_defconfig文件,如果没有这个配置文件,就不能进行编译