设置Android系统源代码编译环境
作者: 胡佳

一. 摘要
虽然已经在Android系统工作了一段时间, 但是每次需要重新setup环境的时候,都需要花一点时间, 所以就想借着这次在ubuntu 12.04 64bits系统上重新安装的机会, 将安装过程记录下来, 下次照着做就行了, 或者将所有步骤做成一个脚本, 直接运行, 即可以轻松的将环境设置好。
本文还包括如何编译Android系统源代码, 其中包含kernel部分的编译和上层系统的编译, 本文所使用的环境是在Ubuntu 12.04 64bits系统上, 所用的Android系统的版本号是4.2.1_r1, 编译后的image在Galaxy Nexus上可以运行成功。

二. 环境设置及软件安装
首先要安装必要的linux工具, 操作系统的选择是必须选择64位操作系统, 一般是Ubuntu 11.04, 11.10 和12.04 版本。12.04系统虽然不是Google推荐的系统, 但是有了很多前人的尝试后, 这个系统也能用来编译Android系统源代码了。
如果选择的是Ubuntu 11.04 系统, 请运行命令安装工具:
$ 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 lib32z1-dev libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown libxml2-utils xsltproc

On Ubuntu 11.10, 还要再执行:
$ sudo apt-get install libx11-dev:i386

On Ubuntu 12.04:
$ 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
$ sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so
如果选择Ubuntu 12.04 版本, 因为这个版本自带的gcc版本为4.6, 编译Android源代码有些问题, 所以还需要安装4.4 版本的gcc。
$ sudo apt-get install gcc-4.4 g++-4.4 g++-4.4-multilib

安装JAVA SDK
因为Android系统所需的JAVA SDK 必须采用Oracle公司的JDK, 所以需要从Oracle网站下载相应版本的JDK, 本文所选用的是jdk-6u33-linux-x64.bin。
在JDK文件所在的目录执行命令:
$ chmod a+x jdk-6u33-linux-x64.bin
$ ./jdk-6u33-linux-x64.bin
$ sudo mv jdk1.6.0_33 /usr/lib/jvm/

这样JDK已经安装在系统的/usr/lib/jvm/下, 还需要将JAVA的路径放在系统的环境变量中。
打开/etc/profile文件:
$ sudo gedit /etc/profile
将以下文字拷贝到此文件中:
export JAVA_HOME=/usr/lib/jvm/jdk1.6.0_33
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

因为在Ubuntu 12.04系统中 ,系统中默认的JDK环境是OpenJDK, 所以需要设置Oracle JDK为默认的JDK环境:
$ sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk1.6.0_33/bin/javac 300
$ sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.6.0_33/bin/java 300
$ sudo update-alternatives --install /usr/bin/javaws javaws /usr/lib/jvm/jdk1.6.0_33/bin/javaws 300
$ sudo update-alternatives --install /usr/bin/jar jar /usr/lib/jvm/jdk1.6.0_33/bin/jar 300
$ sudo update-alternatives --install /usr/bin/javadoc javadoc /usr/lib/jvm/jdk1.6.0_33/bin/javadoc 300
$ sudo update-alternatives --config javac
$ sudo update-alternatives --config java
$ sudo update-alternatives --config javaws
$ sudo update-alternatives --config jar
$ sudo update-alternatives --config javadoc

最后敲入下面命令检查JDK环境是否安装成功。

$ java --version

配置udev, 使之能够识别Android手机, 并装上USB驱动, 能够运行adb命令。

$ sudo gedit /etc/udev/rules.d/51-android.rules
This file should get the contents:
Quote:
# adb protocol on passion (Nexus One)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e12", MODE="0600", OWNER="<username>"
# fastboot protocol on passion (Nexus One)
SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0fff", MODE="0600", OWNER="<username>"
# adb protocol on crespo/crespo4g (Nexus S)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e22", MODE="0600", OWNER="<username>"
# fastboot protocol on crespo/crespo4g (Nexus S)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e20", MODE="0600", OWNER="<username>"
# adb protocol on stingray/wingray (Xoom)
SUBSYSTEM=="usb", ATTR{idVendor}=="22b8", ATTR{idProduct}=="70a9", MODE="0600", OWNER="<username>"
# fastboot protocol on stingray/wingray (Xoom)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="708c", MODE="0600", OWNER="<username>"
# adb protocol on maguro/toro (Galaxy Nexus)
SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", ATTR{idProduct}=="6860", MODE="0600", OWNER="<username>"
# fastboot protocol on maguro/toro (Galaxy Nexus)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e30", MODE="0600", OWNER="<username>"
# adb protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d101", MODE="0600", OWNER="<username>"
# fastboot protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d022", MODE="0600", OWNER="<username>"
# usbboot protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d00f", MODE="0600", OWNER="<username>"
# usbboot protocol on panda (PandaBoard ES)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d010", MODE="0600", OWNER="<username>"

Don't forget to replace the red marked text with your username from Ubuntu or Linux Mint.

在谷歌官方网站下载Android SDK, 安装步骤安装SDK及工具。安装好后, 记得将工具adb, fastboot所在的目录放在当前用户和root用户的PATH路径中。


三. 下载源代码
源代码的下载可以参照Google网站 https://source.android.com/source/downloading.html 来做, 但是由于国内网络的原因, google网站又是不能访问, 所以需要单独来讲。
Google Android的代码使用Git来管理的, 在Git的基层上, Google自己用Python语言重新封装一套代码管理工具, 也就是Repo。

首先建立存放工具的目录:
$ mkdir ~/bin
$ export PATH=~/bin:$PATH

下载并安装Repo:
$ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo
$ chmod a+x ~/bin/repo

但是由于在国内该网站经常不能访问, 所以建议使用 http://code.google.com/p/git-repo/downloads/list 此链接下载。

接下来下载Android系统源代码, Android源码现在直接由Google(android.googlesource.com)管理。
按照Google官方网站上来做的话, 用repo/git下载源码时,执行

$ repo init -u https://android.googlesource.com/platform/manifest -b android-4.2.1_r1

会报错误 异常为 DownloadError: android.googlesource.com: <urlopen error [Errno 110] Connection timed out>

解决方法

1. 浏览器登录https://android.googlesource.com/new-password,并用gmail帐号登录;
2. 点击网页上的“允许访问”,得到类似
machine android.googlesource.com login git-<userName>.gmail.com password <password>
machine android-review.googlesource.com login git-<userName>.gmail.com password <password>
3. 把上面那段信息追加到~/.netrc文件结尾(请检查当前用户的权限, 如果不存在此文件则自己新建一个);
4. 下载地址的URI更改为https://android.googlesource.com/a/platform/manifest(中间加上了“/a”)。
5. $ repo init -u https://android.googlesource.com/a/platform/manifest -b android-4.2.1_r1
6. $ repo sync

即可拉下Android源码。

官方的说法是:因为访问基本是匿名的,为了防止连接过多(指内网/虚拟机),对同一IP地址的连接数做了一定的限制。看来是用gmail帐号进行认证。这样的话,在公司网络内或者用虚拟机下载的话,会经常遇到这问题。

接下来是下载Kernel代码:
下载Kernel代码之前, 可以不下载Android系统的源代码, 如果这样的话, 先要下载Android系统 device部分的代码,以Galaxy Nexus 为例, Galaxy Nexus代号为maguro.

点击网址 https://android.googlesource.com/device/samsung/maguro, 获取想要下载的branch:
Quote:
$ mkdir ~/src/kernel
$ cd ~/src/kernel
$ git clone https://android.googlesource.com/device/samsung/maguro -b jb-mr1-release

点击网站 https://android.googlesource.com/kernel/omap.git, 获取想要下载的branch:
Quote:
$ cd maguro
$ git clone https://android.googlesource.com/kernel/omap.git -b android-omap-tuna-3.0-jb-mr1

确定ARM编译工具在你的路径中.
如果你之前下载了Android系统代码, 就不需要这一步, 否则需要敲入如下命令。
Quote:
$ git clone https://android.googlesource.com/platform/prebuilt -b jb-mr1-release
$ export PATH=$(pwd)/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin:$PATH
$(pwd) is a variable holding the current working directory.

你同样可以将工具链下载在另外的目录.
Quote:
$ mkdir ~/src/toolchain
$ cd ~/src/toolchain
$ git clone https://android.googlesource.com/platform/prebuilt -b jb-mr1-release
$ export PATH=~/src/toolchain/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin:$PATH


四. 编译代码
Android系统源代码编译:
如果使用的是Ubuntu 12.04 系统, 在编译前先检查文件:build/core/combo/HOST_linux-x86.mk, 确保HOST_GLOBAL_CFLAGS的定义是这样的:
HOST_GLOBAL_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0

然后敲入命令进行编译:
$ source ./build/envsetup.sh
$ lunch 12
$ make CC=gcc-4.4 CXX=g++-4.4 -j4

kernel源代码编译方法:
Quote:
$ cd omap
$ export ARCH=arm
$ export SUBARCH=arm
$ export CROSS_COMPILE=arm-eabi-
$ make tuna_defconfig

$ make -j4

kernel编译成功后, 需要将编出的zImage文件拷贝到device/samsung相应的目录, 再使用上面系统编译的方法生产boot.img文件。


五. 烧写image
编译成功后, 得到boot.img, system.img, userdata.img, 重烧系统是主要是将这三个文件重新flash进手机的ROM里, 其中boot.img是内核文件, system.img包含Android底层, framework, 和应用程序, userdata.img是用户数据, 一般是空的。
首先使手机进入fastboot mode, 有些手机是在关机时按住音量键的同时开机, 可以进入fastboot mode。或者敲入命令:
$ adb reboot bootloader

在烧写image前, 确保手机的bootloader是解锁的, 如果没有解锁, 请在手机进入fastboot mode后敲入命令:
$ fastboot oem unlock

然后依次烧写image
$ sudo fastboot flash boot boot.img
$ sudo fastboot flash system system.img
$ sudo fastboot flash userdata userdata.img
$ sudo fastboot reboot


六. Android系统常用命令
经过上面的步骤后, Galaxy Nexus手机已经可以运行我们自己编译的系统了, 要开发应用程序的同学可以安装Eclipse进行开发, 或者在Android源代码包里直接添加相应的文件进行应用程序的开发。

Android系统上常用的命令是adb, 全名是 Android Debug Brdige。此命令需要在开启开发模式后方可使用。Android 4.2的系统默认隐藏了开发模式, 开发者需要连续点击 设置里的关于手机里的版本号七次, 方可启动开发模式。

ADB 常用命令:
$ adb root #切换为root用户
$ adb remount #挂载手机文件系统
$ adb push #拷贝文件如手机
$ adb pull #把文件从手机拷出, 某些安检严格公司的员工必用
$ adb logcat #打印手机log
$ adb shell #登录手机
$ adb shell strace #察看某些手机程序的系统调用
$ adb shell cat /proc/kmesg #察看手机内核打印消息

更多相关文章

  1. 一款常用的 Squid 日志分析工具
  2. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  3. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  4. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  5. Nginx系列教程(六)| 手把手教你搭建 LNMP 架构并部署天空网络电影
  6. android 6.0 以后 WebView改动
  7. Android(安卓)Gradle中集成AspectJ
  8. AndroidStudio 报错
  9. Android系统零碎知识整理

随机推荐

  1. Android OpenGL ES基础教程
  2. Android属性系统之build.prop的生成
  3. Eclipse 安装 Google Android 插件
  4. Android必备:Android应用程序组成
  5. Android项目架构2 - Clean Architecture
  6. 基于 Android NDK 的学习之旅-----环境搭
  7. Android开发环境的搭建
  8. [原创] Android Activity onNewIntent()
  9. EditText弹出软件盘时不进行全屏
  10. Android常用代码之普通及系统权限静默安