编译Android10.0.0_r2
1.选择aosp_x86_64-eng版本,因为编译成aosp_arm64-eng的启动不了。
2.emulator启动
1 | emulator: ERROR: x86_64 emulation currently requires hardware acceleration! |
解决方法:
(1)安装kvm
1 | $ sudo apt-get install qemu-kvm cpu-checker |
(2)创建kvm用户组并把当前用户加入
1 | $ sudo addgroup kvm |
(3)重启运行emulator
可以成功启动模拟器,但此时的内核使用的是默认内核:
1 | $ adb shell uname -r |
编译goldfish内核
接下来下载goldfish内核编译,goldfish是专门供模拟器使用的内核。
1 | $ git clone https://android.googlesource.com/kernel/goldfish |
AOSP里有编译工具链,下面开始编译过程:
1 | $ export CROSS_COMPILE=x86_64-linux-android- |
这样就能在根目录生成.config文件,但是这个默认的.config文件编译后调试会出问题,需要如下修改:
1 | CONFIG_DEBUG_KERNEL=y |
一定确保CONFIG_DEBUG_RODATA和CONFIG_RANDOMIZE_BASE不开启,如果开启这两个选项,通过gdb不能设置断点,报如下错误:
1 | (gdb) b vfs_write |
这样配置编译后可以调试,但是调试时没有符号信息,原因是Makefile
里的编译选项为-O2
,但是修改为-O0
会编译不过,解决方法是改成-Og
。
1 | $ make -j8 |
emulator是基于qemu开发的,-s
是qemu参数,等同于-gdb tcp::1234
,意思就是通过tcp的1234端口,gdb可以连接到内核中的kgdb。一般连接kgdb都要通过串口来连接,但是qemu通过指定-gdb tcp::1234
就可以了。
使用gdb调试内核
gdb使用的是aosp/prebuilts/gdb/linux-x86/bin里的gdb,它是兼容所有体系结构的:
1 | $ aosp/prebuilts/gdb/linux-x86/bin/gdb vmlinux |
这里我安装了peda,在sdcardfs_open
函数下断点,继续运行,点击相机的照相功能,拍照后会保存到sdcard,会调用sdcardfs_open函数,触发断点,然后就可以单步调试啦。
reference
https://blog.csdn.net/zhangjg_blog/article/details/84291663
https://gist.github.com/yan12125/78a9004acb1bed5faf2ffd442163e2ef
http://pwn4.fun/2016/08/19/Android%E5%86%85%E6%A0%B8%E6%BA%90%E7%A0%81%E7%BC%96%E8%AF%91%E8%B0%83%E8%AF%95/
https://lwn.net/Articles/754219/