首页
社区
课程
招聘
[原创]Android Linux内核编译调试
发表于: 2014-9-27 22:36 43851

[原创]Android Linux内核编译调试

2014-9-27 22:36
43851

对于在Windows上写代码写习惯的人,调试是必不可少的手段,但是转到Android以后,发现调试手段异常简陋,跟Windows简直不是一个级别,特别是Android的内核调试,网上资料也相对较少,不过通过一段时间的倒腾,我终于找到了还算靠谱的调试方法.就是利用Emulator + Eclipse进行Android Linux内核调试.
 
1.系统预装环境
在目前为止,都是使用的最新版本的Android开发环境
 
Ubuntu 14.04 
Android SDK( adt-bundle-linux-x86_64-20140702 )
Android NDK( android-ndk32-r10b-linux-x86_64 )
 
安装好这几个环境以后,设置一下环境变量
 
export PATH=$PATH:ANDROID_NDK_HOME/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin
 
ANDROID_NDK_HOME键值为Android NDK安装目录,设置这个环境变量的目的主要是为了使用gcc 4.6版本编译linux内核. 
 
export PATH=$PATH:ANDROID_SDK_HOME/sdk/tools
 
ANDROID_SDK_HOME是Android SDK的安装目录,设置这个环境变量的目的是方便使用emulator命令!
 
万事具备.使用前面安装的Android SDK创建一个虚拟的设备.并且确保 emulator -avd Device_Test这条命令可以启动Android 模拟器.先热身下. 


 
2.Android Linux内核编译
 
2.1 下载GoldFish 源码
 
mkdir kernel 
cd kernel
git clone http://android.googlesource.com/kernel/goldfish.git

GoldFish是适配模拟器的内核源码,如果是要具体适配其他机型,请选择其他源码,这边不展开了,详情参考链接有说明. 如果失败了,换https.我换https是因为使用了代理,现在google被墙,不使用代理搞不动!
 
git clone https://android.googlesource.com/kernel/goldfish.git
 

 
下载过程看你的代理速度了,而且不能中断.中断了就要重新来,特别的麻烦和恶心!所以我上传了一份到百度云. 和上面goldfish出来的一样.可以考虑去下载
 
http://pan.baidu.com/s/1i3yzhbv
 
下载或者解压完成以后会在kernel目录下会生成一个goldfish文件夹,进入此目录.查看所有分支
 
 
 
可以看到, 有很多的版本, 2.6.29和3.4我都测试过. 编译和运行没有任何问题. 所以这边我们拉2.6.29的源码
 
git checkout remotes/origin/android-goldfish-2.6.29
 
 

然后目录下就有很多文件了,说明Android Linux的源码下载成功!
 
 
 
3.2 编译GoldFish 源码
 
编译源码之前,请确认已经将NDK的编译工具设置到环境变量中.我们将使用上述这个目录下的交叉编译器arm-linux-androideabi-gcc
 
export PATH=$PATH:ANDROID_NDK_HOME/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin
 
然后在glodfish目录下用gedit打开Makefile文件,找到这两行文字:
 
#ARCH ?= $(SUBARCH)
#CROSS_COMPILE ?=
 
修改成
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-androideabi-
 
 
 
保存文件, 然后
 
make goldfish_armv7_defconfig 
 
 

注:用$make goldfish_defconfig这样配置也可以编译通过,模拟器也可以启动,但是Android的开机画机就显示不了,$adb shell也死活连不上,原因就是这个goldfish_defconfig这个配置文件问题.
 
Android Linux的基本编译就设置完成了.我们先make 一下
make
 
 

这就表示编译成功了,Linux的源码是Linux上少有的一键make过去的软件,比编译其他Linux应用简单不少.当然到这里编译出来的这个zImage已经可以运行了,但是离我们用来做调试的还是有差距.我们还要开启内核调试和关闭优化. 
 
3.3 开启调试选项
开启Linux内核的调试选项, 先安装依赖性
sudo apt-get install ncurses-dev
然后
make menuconfig
 
 

进入内核配置界面,勾选下列选项,同时关闭优化
 
General setup —> 
[ ] Optimize for size,进行开启/关闭
 

  •  Kernel hacking 
  •  Compile the kernel with debug info 

  • [招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

    收藏
    免费 3
    支持
    分享
    最新回复 (33)
    雪    币: 6976
    活跃值: (1482)
    能力值: ( LV11,RANK:180 )
    在线值:
    发帖
    回帖
    粉丝
    2
    沙发自己占!
    2014-9-27 22:37
    0
    雪    币: 3725
    活跃值: (619)
    能力值: ( LV5,RANK:60 )
    在线值:
    发帖
    回帖
    粉丝
    3
    嗯,那我就来个板凳好了.
    2014-9-27 22:39
    0
    雪    币: 46
    活跃值: (37)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    4
    大家好我是小白,楼主威武,支持,有希望了
    2014-9-27 22:42
    0
    雪    币: 185
    活跃值: (25)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    5
    好文章,特别好,支持楼主-------------------老大,我已经回贴顶贴了,能不能把上个月工资发一下。
    2014-9-27 22:42
    0
    雪    币: 204
    活跃值: (10)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    6
    对Android不是很熟悉,只能膜拜
    2014-9-27 22:43
    0
    雪    币: 170
    活跃值: (12)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    7
    刚上线就看到好贴。
    2014-9-27 22:58
    0
    雪    币: 1040
    活跃值: (1293)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    8
    想问个问题……安卓的机子崩了的话,有没有类似win的那种内核转储之类的信息看的……就是直接花瓶然后直接断电的那种,而且不重启而且没源码……有办法么……
    2014-9-27 23:55
    0
    雪    币: 114
    活跃值: (180)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    9
    好帖就要支持~
    2014-9-28 00:08
    0
    雪    币: 1098
    活跃值: (1293)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    10
    打码 收藏先!
    2014-9-28 01:09
    0
    雪    币: 8201
    活跃值: (2706)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    11
    学习了,安卓小白路过。
    2014-9-28 08:03
    0
    雪    币: 287
    活跃值: (583)
    能力值: ( LV5,RANK:60 )
    在线值:
    发帖
    回帖
    粉丝
    12
    程总好叼~ 完全看不懂~膜拜之
    2014-9-28 10:21
    0
    雪    币: 2314
    活跃值: (2205)
    能力值: (RANK:400 )
    在线值:
    发帖
    回帖
    粉丝
    13
    “熏得” 也开始搞android啦,哈哈。
    2014-9-28 10:31
    0
    雪    币: 7
    活跃值: (10)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    14
    感谢分享,学习收藏~~·
    2014-9-29 10:42
    0
    雪    币: 53
    活跃值: (280)
    能力值: ( LV3,RANK:20 )
    在线值:
    发帖
    回帖
    粉丝
    15
    以前在Android2.3及以前一直在Windows下调试这个qemu的emulator及自己编译的goldfish kernel,没有使用远程连接ubuntu的方式,
    但从2.3以后,gdb老连不上,感觉是qemu中做了修改导致的,但linux下的emulator一直无问题。
    2014-9-29 21:20
    0
    雪    币: 1482
    活跃值: (2543)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    16
    太高深了。。。
    2014-9-30 21:00
    0
    雪    币: 20
    活跃值: (25)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    17
    陈哥 厉害。 学习。
    2014-10-8 10:13
    0
    雪    币: 3542
    活跃值: (239)
    能力值: ( LV3,RANK:30 )
    在线值:
    发帖
    回帖
    粉丝
    18
    有时间看看!
    2014-10-8 17:55
    0
    雪    币: 0
    活跃值: (10)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    19
    谢谢分享
    2015-2-27 13:42
    0
    雪    币: 2323
    活跃值: (4113)
    能力值: ( LV12,RANK:530 )
    在线值:
    发帖
    回帖
    粉丝
    20
    不错,学习
    2015-2-28 09:56
    0
    雪    币: 201
    活跃值: (10)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    21
    收藏。。。。
    2015-3-3 21:38
    0
    雪    币: 199
    活跃值: (119)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    22
    在使用 zimage 开启时失败了。 我创建了 模拟器是android 4.4.2 (19), 编译过程都没有问题。

    错误信息如下:
    QEMU options list:
    emulator: argv[00] = "/home/liukun/Tools/adt-bundle-linux-x86_64-20140702/sdk/tools/emulator64-arm"
    emulator: argv[01] = "-netfast"
    emulator: argv[02] = "-show-kernel"
    emulator: argv[03] = "-gdb"
    emulator: argv[04] = "tcp::1234,ipv4,"
    emulator: argv[05] = "-S"
    emulator: argv[06] = "-android-hw"
    emulator: argv[07] = "/home/liukun/.android/avd/Device_Test.avd/hardware-qemu.ini"
    Concatenated QEMU options:
    /home/liukun/Tools/adt-bundle-linux-x86_64-20140702/sdk/tools/emulator64-arm -netfast -show-kernel -gdb tcp::1234,ipv4, -S -android-hw /home/liukun/.android/avd/Device_Test.avd/hardware-qemu.ini
    emulator: registered 'boot-properties' qemud service
    emulator: System partition format: ext4
    emulator: nand_add_dev: system,size=0x22600000,initfile=/home/liukun/Tools/adt-bundle-linux-x86_64-20140702/sdk/system-images/android-19/default/armeabi-v7a//system.img,pagesize=512,extrasize=0
    emulator: mapping 'system' NAND image to /tmp/android-liukun/emulator-UVLM11
    emulator: Data partition format: ext4
    emulator: nand_add_dev: userdata,size=0xc800000,file=/home/liukun/.android/avd/Device_Test.avd/userdata-qemu.img,pagesize=512,extrasize=0
    emulator: registered 'boot-properties' qemud service
    emulator: Adding boot property: 'dalvik.vm.heapsize' = '32m'
    emulator: Adding boot property: 'ro.config.low_ram' = 'true'
    emulator: Adding boot property: 'qemu.sf.lcd_density' = '240'
    emulator: Adding boot property: 'qemu.hw.mainkeys' = '1'
    emulator: Adding boot property: 'qemu.sf.fake_camera' = 'none'
    emulator: Cache partition format: yaffs2
    emulator: nand_add_dev: cache,size=0x4200000,file=/home/liukun/.android/avd/Device_Test.avd/cache.img
    emulator: Initializing hardware OpenGLES emulation support
    Failed to create Context 0x3005
    emulator: Can't start OpenGLES renderer?
    emulator: WARNING: Could not initialize OpenglES emulation, using software renderer.
    emulator: Kernel parameters: qemu.gles=0 qemu=1 console=ttyS0 android.qemud=ttyS1 android.checkjni=1 ndns=1
    emulator: autoconfig: -scale 1
    serial0 console
    Invalid parameter '
    ko:qemu: could not open gdbserver on device 'tcp::1234,ipv4,'
    emulator: User configuration saved to /home/liukun/.android/avd/Device_Test.avd/emulator-user.ini

    感谢回复,小弟最近一直 在搞gdb 调试Android 原生代码,希望和大牛多多交流
    2015-8-19 17:36
    0
    雪    币: 199
    活跃值: (119)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    23
    我开启模拟器的命令,参数顺序换了下, 不换的话也是有错误,下面会粘出来。

    我的命令:emulator -verbose -netfast -show-kernel -kernel '~/sys_Tools/emlator_kernel/goldfish/arch/arm/boot/zImage' -avd Device_Test -qemu -gdb tcp::1234,ipv4, -S

    使用LZ的命令出现下面的错误:

    xxx@ubuntu:~$ emulator -verbose -show-kernel -kernel  -netfast ~/sys_Tools/emlator_kernel/goldfish/arch/arm/boot/zImage -avd Device_Test -qemu -gdb tcp::1234,ipv4, -S

    invalid command-line parameter: /home/liukun/sys_Tools/emlator_kernel/goldfish/arch/arm/boot/zImage.
    Hint: use '@foo' to launch a virtual device named 'foo'.
    please use -help for more information
    2015-8-19 17:40
    0
    雪    币: 2
    活跃值: (10)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    24
    好厉害,膜拜中!
    2015-8-19 17:43
    0
    雪    币: 729
    活跃值: (1306)
    能力值: ( LV9,RANK:160 )
    在线值:
    发帖
    回帖
    粉丝
    25
    大神,看了你的帖子好牛逼。。我现在 替换android内核的时候出现问题了。手机 没有imei  不能使用adb logcat 能给个思路吗?
    2015-12-21 17:13
    0
    游客
    登录 | 注册 方可回帖
    返回
    //