分享 Android 内核源代码交叉编译
本文是在 Ubuntu10.10 系统上进行实践的。
1 因为我们需要 Android 的模拟器,所以需要安装 Android 的 SDK,并创建 AVD,
可以一次命名为 AVD15,AVD22,AVD23,...
AVD15 对应 1.5,AVD22 对应 2.2,AVD23 对应 2.3,...
获取.config 文件:
在启动模拟器 AVD15:
$emulator -avd AVD15
$pull /proc/config.gz . //将/proc/config.gz 这个文件复制到本地的目录,对应 Linux 上运行该命令的当前工作的目录,下同
然后,将其解压并保存为.config,留待后面使用
2 arm 编译器
去网站下载 arm 工具链
注意选择较早的版本,很有可能是 google 那班人在编译的时候 选择的是当时的最新的版本,但是后来就一直用那个版 本
http://www.codesourcery.com/sgpp/lite/arm/portal/subscription?@template=lite
要之前的版本:点击 All versions 即可看到所有的发行版本,2008q3-41 这个版本是经过很多人测试可以用的。
解压后,设置环境变量,将/usr/local/arm-2008q3/bin 添加到$PATH 中
其中 /usr/local/为保存解压后的 arm-tools-chain 的根目录
3 下载 Android 的 Linux 内核 记住是 Android 的 Linux 内核(git
clone git://android.git.kernel.org/kernel/common.git), 而不是通用的 Linuxe 内核源码(git clone git://android.git.kernel.org/kernel/linux-2.6.git)
$ git clone git://android.git.kernel.org/kernel/common.git kernel-common
//其中 kernel-common 为存放从代码库下来的代码的目录,下同
这一步是个漫长的等待...
$ cd ~/kernel-common
$ git branch
$ android-2.6.36
//这个随着版本的变化而变化
4 下载完 Android 的 Linux 内核源码,你会发现在/arch/arm/configs/下没有 goldfish_defconfig 这个文件,恩我们需要 check_out gold_fish 版本(模拟器的硬件配置就是 Gold_Fish 的)
$ cd ~/kernel_common
$ git branch -a
$ *android-2.6.36 remotes/origin/HEAD -> origin/android-2.6.36 remotes/origin/android-2.6.35 remotes/origin/android-2.6.36 remotes/origin/archive/android-2.6.25 remotes/origin/archive/android-2.6.27 remotes/origin/archive/android-2.6.29 remotes/origin/archive/android-2.6.32 remotes/origin/archive/android-gldfish-2.6.29 remotes/origin/archive/android-goldfish-2.6.27
//以上显示是目前看到的,将来的某个时候可以就有点不同了,甚至老版本的 Branch 名字也会被修改
//故要特别注意
$ git checkout remotes/origin/archive/android-gldfish-2.6.29
//这个过程就快多了,等待下载完数据
//git 这个东西确实不怎么好用,还是想念 Windows 上 TortoiseSVN
当下载完,你就能在 kernel-common/arch/arm/configs/下看到 goldfish_defconfig 这个文件
5 编译
1)将 1 中的.config 文件拷贝到 ~/kernel_common 目录下
2)修改 ~/kernel_common 目录下的 Makefile 文件(修改两处) -- 修改之掐最好备份下这个文件,因为如果你修改 了这个文件 用 git 获取新版本的时候
会提示 Makefile 文件被修改
ARCH
?= arm //制定 CPU 的架构为 ARM ?= arm-none-linux-gnueabi- //arm 编译工具前缀
CROSS_COMPILE
3)
$ make goldfish_defconfig
$ make -j2 //现在的机器都是双核的,这样代码编译就快多了
编译最后两行信息:
OBJCOPY arch/arm/boot/zImage Kernel: arch/arm/boot/zImage is ready
6 用我们刚刚编译成功内核启动模拟器(这样不会对原有的模拟器产生任何的影响)
$ emulator -avd AVD15 -kernel ~/kernel_common/arch/arm/boot/zImage
如果模拟器能起来,那说明成功了。
打开另外一个终端,这样就能解决上面的终端被占用的情况下,也能使用终端
$ adb shell
#cd /proc
# cat version Linux version 2.6.29-00262-gb0d93fb-dirty (dream@dream-VGN-FW351J) (gcc version 4.3.2 (Sourcery G++ Lite 2008q3-41) ) #1 Fri Dec 24 12:31:28 CST 2010 # cat cupinfo cupinfo: No such file or directory # cat cpuinfo Processor BogoMIPS Features : ARM926EJ-S rev 5 (v5l) : 272.79 : swp half thumb fastmult vfp edsp java : 0x41
CPU implementer
CPU architecture: 5TEJ CPU variant : 0x0
CPU part
: 0x926 :5
CPU revision
Hardware Revision Serial
: Goldfish : 0000 : 0000000000000000
注: dream@dream-VGN-FW351J,其中的 dream 为当前登录 Ubuntu 的用户名,而 dream-VGN-FW351J 是机器名
Sourcery G++ Lite 2008q3-41 这个就是 arm tools chain 的版本了
1 因为我们需要 Android 的模拟器,所以需要安装 Android 的 SDK,并创建 AVD,
可以一次命名为 AVD15,AVD22,AVD23,...
AVD15 对应 1.5,AVD22 对应 2.2,AVD23 对应 2.3,...
获取.config 文件:
在启动模拟器 AVD15:
$emulator -avd AVD15
$pull /proc/config.gz . //将/proc/config.gz 这个文件复制到本地的目录,对应 Linux 上运行该命令的当前工作的目录,下同
然后,将其解压并保存为.config,留待后面使用
2 arm 编译器
去网站下载 arm 工具链
注意选择较早的版本,很有可能是 google 那班人在编译的时候 选择的是当时的最新的版本,但是后来就一直用那个版 本
http://www.codesourcery.com/sgpp/lite/arm/portal/subscription?@template=lite
要之前的版本:点击 All versions 即可看到所有的发行版本,2008q3-41 这个版本是经过很多人测试可以用的。
解压后,设置环境变量,将/usr/local/arm-2008q3/bin 添加到$PATH 中
其中 /usr/local/为保存解压后的 arm-tools-chain 的根目录
3 下载 Android 的 Linux 内核 记住是 Android 的 Linux 内核(git
clone git://android.git.kernel.org/kernel/common.git), 而不是通用的 Linuxe 内核源码(git clone git://android.git.kernel.org/kernel/linux-2.6.git)
$ git clone git://android.git.kernel.org/kernel/common.git kernel-common
//其中 kernel-common 为存放从代码库下来的代码的目录,下同
这一步是个漫长的等待...
$ cd ~/kernel-common
$ git branch
$ android-2.6.36
//这个随着版本的变化而变化
4 下载完 Android 的 Linux 内核源码,你会发现在/arch/arm/configs/下没有 goldfish_defconfig 这个文件,恩我们需要 check_out gold_fish 版本(模拟器的硬件配置就是 Gold_Fish 的)
$ cd ~/kernel_common
$ git branch -a
$ *android-2.6.36 remotes/origin/HEAD -> origin/android-2.6.36 remotes/origin/android-2.6.35 remotes/origin/android-2.6.36 remotes/origin/archive/android-2.6.25 remotes/origin/archive/android-2.6.27 remotes/origin/archive/android-2.6.29 remotes/origin/archive/android-2.6.32 remotes/origin/archive/android-gldfish-2.6.29 remotes/origin/archive/android-goldfish-2.6.27
//以上显示是目前看到的,将来的某个时候可以就有点不同了,甚至老版本的 Branch 名字也会被修改
//故要特别注意
$ git checkout remotes/origin/archive/android-gldfish-2.6.29
//这个过程就快多了,等待下载完数据
//git 这个东西确实不怎么好用,还是想念 Windows 上 TortoiseSVN
当下载完,你就能在 kernel-common/arch/arm/configs/下看到 goldfish_defconfig 这个文件
5 编译
1)将 1 中的.config 文件拷贝到 ~/kernel_common 目录下
2)修改 ~/kernel_common 目录下的 Makefile 文件(修改两处) -- 修改之掐最好备份下这个文件,因为如果你修改 了这个文件 用 git 获取新版本的时候
会提示 Makefile 文件被修改
ARCH
?= arm //制定 CPU 的架构为 ARM ?= arm-none-linux-gnueabi- //arm 编译工具前缀
CROSS_COMPILE
3)
$ make goldfish_defconfig
$ make -j2 //现在的机器都是双核的,这样代码编译就快多了
编译最后两行信息:
OBJCOPY arch/arm/boot/zImage Kernel: arch/arm/boot/zImage is ready
6 用我们刚刚编译成功内核启动模拟器(这样不会对原有的模拟器产生任何的影响)
$ emulator -avd AVD15 -kernel ~/kernel_common/arch/arm/boot/zImage
如果模拟器能起来,那说明成功了。
打开另外一个终端,这样就能解决上面的终端被占用的情况下,也能使用终端
$ adb shell
#cd /proc
# cat version Linux version 2.6.29-00262-gb0d93fb-dirty (dream@dream-VGN-FW351J) (gcc version 4.3.2 (Sourcery G++ Lite 2008q3-41) ) #1 Fri Dec 24 12:31:28 CST 2010 # cat cupinfo cupinfo: No such file or directory # cat cpuinfo Processor BogoMIPS Features : ARM926EJ-S rev 5 (v5l) : 272.79 : swp half thumb fastmult vfp edsp java : 0x41
CPU implementer
CPU architecture: 5TEJ CPU variant : 0x0
CPU part
: 0x926 :5
CPU revision
Hardware Revision Serial
: Goldfish : 0000 : 0000000000000000
注: dream@dream-VGN-FW351J,其中的 dream 为当前登录 Ubuntu 的用户名,而 dream-VGN-FW351J 是机器名
Sourcery G++ Lite 2008q3-41 这个就是 arm tools chain 的版本了