Android内核编译和裁剪

一、建立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/version
Linux 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/cpuinfo
Processor         :ARM926EJ-S rev 5 (v5l)
BogoMIPS         :419.43
Features  :swp half thumb fastmult vfp edsp java
CPU implementer    :0x41
CPU architecture: 5TEJ
CPU variant      :0x0
CPU part  :0x926
CPU revision    :5
Cache type       :write-through
Cache clean     :not required
Cache lockdown       :not supported
Cache format  :Harvard
I size                  :4096
I assoc               :4
I line length      :32
I sets                  :32
D size                 :65536
D assoc             :4
D line length    :32
D sets                :512
 
Hardware         :Goldfish
Revision   :0000
Serial                  :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

           内核调试,去掉此勾选


你可能感兴趣的:(android,内核,编译,裁剪)