如何编译Android内核

根据XDA-Developer上的文章翻译,原文连接:http://forum.xda-developers.com/showthread.php?t=1774035

建立内核编译环境和第一次编译内核:

1.

Ubuntu 10.04 64-Bit(推荐)

Ubuntu 12.04 64-Bit

注意:不要使用Ubuntu 12.04编译AOSP ROMs,但可以用于编译内核

如果你想使用虚拟机软件安装Ubuntu,用于编译内核,不要使用Virtualbox.因为使用Virtualbox可能会遭遇网络等等…问题.我建议使用VMWare Player,因为它可以免费使用: http://www.vmware.com

2.

安装最新的更新,然后重启:

1 $ sudo apt-get update
2 $ sudo apt-get dist-upgrade
3 $ sudo reboot

3.

然后我们要下载并安装最新Java 6 JDK,寻找JavaSE 6 Update33或更新版本,不要下载JDK7.我下载的是下面这个文件:

1 Linux x64 68.69 MB jdk-6u33-linux-x64.bin

下面假设你下载的JDK文件在如下文件夹下:

~/Downloads

安装JDK:

 1 $ cd ~/Downloads
 2 $ sudo chmod +x jdk-6u33-linux-x64.bin
 3 $ ./jdk-6u33-linux-x64.bin
 4 $ sudo mv jdk1.6.0_33 /usr/lib/jvm/jdk1.6.0_33
 5 $ sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk1.6.0_33/bin/javac 1
 6 $ sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.6.0_33/bin/java 1
 7 $ sudo update-alternatives --install /usr/bin/javaws javaws /usr/lib/jvm/jdk1.6.0_33/bin/javaws 1
 8 $ sudo update-alternatives --install /usr/bin/jar jar /usr/lib/jvm/jdk1.6.0_33/bin/jar 1
 9 $ sudo update-alternatives --install /usr/bin/javadoc javadoc /usr/lib/jvm/jdk1.6.0_33/bin/javadoc 1
10 $ sudo update-alternatives --config javac
11 $ sudo update-alternatives --config java
12 $ sudo update-alternatives --config javaws
13 $ sudo update-alternatives --config jar
14 $ sudo update-alternatives --config javadoc
15 $ java --version
16 $ ls -la /etc/alternatives/java*

接下来你可以选择重启,这是比较安全的做法:

1 $ sudo reboot

4.

安装需要的文件以编译Android

Ubuntu 10.04:

1 $ sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown libxml2-utils xsltproc

Ubuntu 12.04:

1 $ sudo apt-get update
2 $ sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 libgl1-mesa-dev g++-multilib mingw32 openjdk-6-jdk tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386 git
3 $ sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so
4 $ sudo reboot

5.

配置USB接口

1 $ sudo gedit /etc/udev/rules.d/51-android.rules

这个文件应该有如下内容:

 1 # adb protocol on passion (Nexus One)
 2 SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e12", MODE="0600", OWNER="<username>"
 3 # fastboot protocol on passion (Nexus One)
 4 SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0fff", MODE="0600", OWNER="<username>"
 5 # adb protocol on crespo/crespo4g (Nexus S)
 6 SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e22", MODE="0600", OWNER="<username>"
 7 # fastboot protocol on crespo/crespo4g (Nexus S)
 8 SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e20", MODE="0600", OWNER="<username>"
 9 # adb protocol on stingray/wingray (Xoom)
10 SUBSYSTEM=="usb", ATTR{idVendor}=="22b8", ATTR{idProduct}=="70a9", MODE="0600", OWNER="<username>"
11 # fastboot protocol on stingray/wingray (Xoom)
12 SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="708c", MODE="0600", OWNER="<username>"
13 # adb protocol on maguro/toro (Galaxy Nexus)
14 SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", ATTR{idProduct}=="6860", MODE="0600", OWNER="<username>"
15 # fastboot protocol on maguro/toro (Galaxy Nexus)
16 SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e30", MODE="0600", OWNER="<username>"
17 # adb protocol on panda (PandaBoard)
18 SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d101", MODE="0600", OWNER="<username>"
19 # fastboot protocol on panda (PandaBoard)
20 SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d022", MODE="0600", OWNER="<username>"
21 # usbboot protocol on panda (PandaBoard)
22 SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d00f", MODE="0600", OWNER="<username>"
23 # usbboot protocol on panda (PandaBoard ES)
24 SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d010", MODE="0600", OWNER="<username>"

6.

当编译一个内核,你只需要从这里开始。手工从git选择适当branch,我使用下面的文件作为例子,每次访问git源,选择合适branch:

https://android.googlesource.com/device/samsung/crespo

1 $ mkdir ~/Documents/kernel
2 $ cd ~/Documents/kernel
3 $ git clone https://android.googlesource.com/device/samsung/crespo -b ics-plus-aosp

然后从https://android.googlesource.com/kernel/samsung.git选择branch

1 $ cd crespo
2 $ git clone https://android.googlesource.com/kernel/samsung.git -b android-samsung-3.0-ics-mr1

7.

确认工具链在你的环境变量中:

a)默认、简单的解决方案

1 $ git clone https://android.googlesource.com/platform/prebuilt -b ics-plus-aosp
2 $ export PATH=$(pwd)/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin:$PATH

   $(pwd)是目前存在可用的工作目录

b)Bandwidth-friendly解决方案:

你也能下载工具链至别的目录,但首先写下你的工作目录:

1 mkdir ~/Documents/toolchain
2 cd ~/Documents/toolchain
3 $ git clone https://android.googlesource.com/platform/prebuilt -b ics-plus-aosp
4 export PATH=~/Documents/toolchain/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin:$PATH

我们必须在这里指定工具链位置的绝对路径,而不是相对路径

现在我们回到工作目录:

1 cd ~/Documents/kernel/crespo

8.

现在让我们build内核

1 $ export ARCH=arm
2 $ export SUBARCH=arm
3 $ export CROSS_COMPILE=arm-eabi-
4 $ cd samsung
5 $ make ARCH=arm herring_defconfig (maybe ARCH=arm is unneeded here but added it to be sure)
6 $ make

9.

现在你需要将它放入刷机包中

 

常见问题及解决方案

-避免下载内核源码到目录可能需要root/superuser权限

该问题的原因是我下载所有源码至'~/Documents'目录。这将节省许多时间但可能导致文件属性及权限混乱。

-什么是'herring',这不应该是crespo吗?

不,当然不是。Herring是公示名,而crespo是Nexus S的开发代号,crespo代号是你在build内核时应该记住的。

 

令人感兴趣的文件和路径

<kernel_directory>/samsung/arch/arm/mach-s5pv210/cpu-freq.c
Overclocking
Voltages

 

源码连接

Ezekeel的内核源码:https://github.com/Ezekeel/GLaDOS-nexus-s-ics

包括:

  • BLN
  • BLX
  • Custom Voltage
  • Deep Idle
  • Live OC
  • Touchwake
  • USB OTG
  • Voodoo

适用于S5PV210的Samsung IDLE2的相关:http://forum.xda-developers.com/showthread.php?p=28959134

posted @ 2012-08-09 01:38  hello破军  阅读(3136)  评论(0编辑  收藏  举报