一、建立Android 内核开发环境

1、工作环境及所需软件包

1)系统环境:Ubuntu12.04

2)交叉编译器:arm-2012.09-64-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar

(http://www.mentor.com/embedded-software/sourcery-tools/sourcery-codebench/editions/lite-edition/)

3)Android内核源代码:linux-2.6.25-android-1.0_r1.tar.gz

(https://code.google.com/p/android/downloads/list?can=1&q=)

4)AndroidSDK:android-sdk_r11-linux_x86.tgz

(http://developer.android.com/sdk/index.html)

SDK 中带有AndroidEmulator仿真器等工具

2、搭建交叉编译环境

在用户目录下建立一个anroid_kernel_compile的文件夹,把下载的Android kernel,交叉编译器和Android SDK 都放在此目录下。

1) 安装交叉编译器

将arm-2012.09-64-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar解压缩到此目录,得到一个arm-2012.09的文件夹

2) 解压Android SDK

将android-sdk_r11-linux_x86.tgz解压缩到此目录,得到一个android-sdk-linux_x86的文件夹

3) 解压缩内核源代码

将linux-2.6.25-android-1.0_r1.tar.gz解压缩到此文件夹下,得到一个kernel.git的文件夹

4)设置一下环境变量

$export PATH=$PATH:/home/xxx/android_kernel_compile/arm-2012.09/bin/$export PATH=$PATH:/home/xxx/android_kernel_compile/android-sdk-linux_x86/tools/$export PATH=$PATH:/home/xxx/android_kernel_compile/android-sdk-linux_x86/platform-tools/


xxx为你的用户名。

二、编译和运行Android Kernel

1)获取Android官方的默认内核配置文件.config

这个.config文件可以从SDK 中得到。

打开AndroidSDK and AVD Manager建立一个Android虚拟机:

$android

Android内核编译和裁剪_第1张图片

点击new,在name里填入adrd2.1WVGA800,下面参数target选择Android2.1-update1-APILevel7,Built-in选择Default(WVGA800),点击Create AVD

启动android模拟器,然后用adb 从模拟器中提出内核配置文件:

$emulator -avd adrd2.1WVGA800 &$adb pull /proc/config.gz ./


关闭模拟器,解压缩config.gz得到config,重命名为.config,并移动到kernel.git/下:

$gunzip config.gz$mv config kernel.git/.config


2)修改kernel目录中的Makefile文件

修改CROSS_COMPILE变量为:

CROSS_COMPILE=arm-none-linux-gnueabi-

这个就是刚刚的下载和解压的工具链的前缀了,旨在告诉make,在编译的时候要使用我们的工具链。

在Makefile中注释掉LDFLAGS_BUILD_ID这个变量:

例如将如下定义:

LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,/                                   $(call ld-option,-Wl$(comma)--build-id,))


修改为:

LDFLAGS_BUILD_ID=#LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,/#                                   $(callld-option, -Wl$(comma)--build-id,))


把它注释掉的原因是目前android的内核还不支持这个选项。--build-id选项,主要是用于在生成的elf可执行文件中加入一个内置的id,这样在coredump,或者debuginfo的时候就可以很快定位这个模块是哪次build的时候弄出来的。这样就可以避免,每次都把整个文件做一遍效验,然后才能得到该文件的是由哪次build产生的。对于内核开发者来说,这是很不错的想法,可以节约定位模块版本和其影响的时间。

目前,该功能还出于earlystage的状态,未来的android或许会支持,但至少目前的版本是不支持的。

所以,用#注释掉即可,或者害怕不保险的话,就加入LDFLAGS_BUILD_ID=空,这样即使编译的时候用了,也只是一个空格而已。

对这个--build-id选项感兴趣的朋友,可以访问下面的网址,它的作者已经解释得非常明白了:http://fedoraproject.org/wiki/Releases/FeatureBuildId

3)编译

$make

在编译过程中,会提示你需不需要安装一些新的特性,这里算是可以裁剪的地方(仅限于新加的功能),按照自己的意愿选就可以了,全选n也没关系。

编译完成后在kernel.git/arch/arm/boot/路径下生成了一个zImage镜像文件,新功能全都没有加则编译后的大小为1.3m,我选择了一些功能,编译后大小为1.4m。

$ls kernel.git/arch/arm/boot/zImage -l -h-rwxrwxr-x 1 junluoyu junluoyu 1.4M  3月  6 21:30kernel.git/arch/arm/boot/zImage


运行该镜像

$emulator -kernelkernel.git/arch/arch/arm/boot/zImage -avd adrd2.1WVGA800 &


查看/proc下的version信息:

$adb shell#cat /proc/versionLinux version 2.6.25 (junluoyu@juntu) (gcc version4.7.2 (Sourcery CodeBench Lite 2012.09-64) ) #2 Thu Mar 7 20:30:22 CST 2013


上面junluoyu@juntu是 用户名@主机名,这个是我的用户名和我的主机。

查看/proc下的cpu信息

# cat /proc/cpuinfoProcessor         :ARM926EJ-S rev 5 (v5l)BogoMIPS         :419.43Features  :swp half thumb fastmult vfp edsp javaCPU implementer    :0x41CPU architecture: 5TEJCPU variant      :0x0CPU part  :0x926CPU revision    :5Cache type       :write-throughCache clean     :not requiredCache lockdown       :not supportedCache format  :HarvardI size                  :4096I assoc               :4I line length      :32I sets                  :32D size                 :65536D assoc             :4D line length    :32D sets                :512 Hardware         :GoldfishRevision   :0000Serial                  :0000000000000000


在虚拟机里查看版本信息:

[Settings]->[About phone]里可以看到:

Android内核编译和裁剪_第2张图片

三、裁剪

裁剪主要是对.config文件进行修改,从而裁剪一些模块。

未裁剪前,包的大小为1.4M,裁剪后包的大小为1.2M:

$make menuconfig

Android内核编译和裁剪_第3张图片

以下是裁剪掉的模块:

1.General setup --->

(1)Promptfor development and/or incomplete code/drivers

这个是允许使用不完整的开发中的驱动,可以裁剪掉,去掉此勾选即可

(2)ControlGroup support

控制组管理支持,去掉此勾选

2.Userspacebinary formats --->

(1)Kernelsupport for MISC binaries

内核支持MISC格式的二进制文件,可以裁剪掉,去掉此勾选

3.PowerManagement options --->

(1)PowerManagement support

电源管理支持,去掉此勾选

4.Networking--->Networking options--->

(1)802.1d Ethernet Bridging.

(2)802.1Q VLAN Support

无线网,去掉此模块

5.DeviceDrivers --->

(1)Input device support--->

1)Providelegacy /dev/psaux device

去掉此勾选

2)Keyboards

键盘支持,去掉此勾选

3)Miscellaneous devices

去掉此勾选

(2)Network device support--->

1)Ethernet (1000Mbit)

2)Ethernet (10000Mbit)

千兆以太网和万兆以太网,去掉这两项的勾选

(3)USBsupport

USB支持,去掉此勾选

(4)MMC/SD card support

SD卡支持,去掉此勾选

(5)Android--->

1)Android log driver

安卓日志驱动,去掉此勾选

6.Filesystems--->

(1)Network File Systems

网络文件系统,去掉此勾选

7.Kernelhacking--->

(1)Kernel debugging

内核调试,去掉此勾选


更多相关文章

  1. 单独编译android模块
  2. 定制Android之4G-LTE模块驱动
  3. Android版本与Linux内核的关系
  4. Android 单独抽取 WebRtc-AGC(音频增益) 模块
  5. ubuntu环境:下载、编译模拟器平台android内核源码
  6. Android 日志系统logcat内核代码分析
  7. 为Android内核添加新驱动,并添加到menuconfig菜单
  8. 关于android内核移植到YLP2440开发板
  9. 【Android 系统开发】 编译 Android文件系统 u-boot 内核 并烧写

随机推荐

  1. Android(安卓)环形布局: FloatingActionBu
  2. Android(5)---Toast用法总结
  3. Android2.2完全退出程序
  4. Android中画图总结(2)
  5. Android打开本地相册选取图片并显示在Ima
  6. Android(安卓)ImageView点击变暗效果
  7. Android(安卓)L SystemUI 流程简要分析
  8. Android(安卓)logcat 常用参数
  9. Android中使用HTTP服务上传文件
  10. Android(安卓)okhttp3中的坑