搭建开发环境
Android Jelly Bean的编译依赖Sun JDK 1.6,所以首先需要安装JDK 1.6。
- 下载JDK 1.6
在oracle官网上下载 jdk-6u45-linux-x64.bin
下载地址
- 安装JDK 1.6:
$ sudo ./jdk-6u45-linux-x64.bin
$ sudo cp jdk1.6.0_45 /usr/local
- 配置java及环境变量
** 配置环境变量
在启动终端并输入
edit /etc/profile
在末尾添加一下配置,保存并退出
#set jdk environment
export JAVA_HOME=/usr/lib/jvm/jdk1.7.0_21
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
终端输入一下命令使配置生效
source /etc/profile
update-alternatives配置java
$ sudo update-alternatives --install /usr/bin/java java /usr/local/jdk1.6.0_45/bin/java 100
$ sudo update-alternatives --install /usr/bin/javac javac /usr/local/jdk1.6.0_45/bin/javac 100
$ sudo update-alternatives --install /usr/bin/javadoc javadoc /usr/local/jdk1.6.0_45/bin/javadoc 100
- 安装必须的开发包
$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 gcc-4.4 gcc-4.4-multilib mingw32 tofrodos \
python-markdown libxml2-utils xsltproc zlib1g-dev:i386 \
u-boot-tools openssh-client libswitch-perl g++-4.4 g++-4.4-multilib \
cksfv uuid-dev:i386 liblzo2-dev:i386
如果想要了解上述安装包的作用,可以到Ubuntu网站查询。
- 配置gcc 4.4和g++ 4.4
$sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.4 100
$sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 50
$sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.4 100
$sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 50
$sudo update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-4.4 100
$sudo update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-4.8 50
下载Android上层系统源代码
Android源代码分成两部分,其中Kernel部分需要单独下载。这里先给出上层系统源码的下载流程。该部分可以参考Android官网。
- 建立repo工作目录
$ mkdir ~/bin
- 下载repo脚本
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
- 建立Android源码目录
$ mkdir -p ~/android/jellybean
$ cd ~/android/jellybean
- 配置用户名和邮箱(可选)
$ git config --global user.name "Your Name"
$ git config --global user.email "you@example.com"
该步骤只有在使用Gerrit工具进行review-code提交代码时才会用到,可以在初始化repo之后用repo init --config-name
进行修改。
- 初始化repo
~/bin/repo init -u https://android.googlesource.com/platform/manifest -b android-4.1.1_r3
其中,-u为源码的git服务器地址,-b为源码的分支。分支列表可以查看Android官网,或者利用git ls-remote
指令查看:
$ git ls-remote --tags https://android.googlesource.com/platform/manifest
如果没有指定分支,将会下载Android主线上最新的源代码。
- 下载Android源码
初始化repo之后,如果需要下载Android源码,只需要进入源码根目录,然后在终端执行一下命令:
~/bin/repo sync
Android全部源码十分庞大,如果只需要下载部分源码,可以单独指定模块名称。
查看Android源码中所有的模块:
~/bin/repo manifest -o-
执行后显示的信息。
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote fetch=".." name="aosp"/>
<default remote="aosp" revision="refs/tags/android-4.1.1_r3" sync-j="4"/>
<project name="device/asus/grouper"/>
<project name="device/common"/>
<project name="device/generic/armv7-a"/>
<project name="device/generic/armv7-a-neon"/>
<project name="device/generic/goldfish"/>
<project name="device/google/accessory/arduino"/>
<project name="device/google/accessory/demokit"/>
<project name="device/moto/common"/>
<project name="device/moto/stingray"/>
<project name="device/moto/wingray"/>
<project name="device/sample"/>
<project name="device/samsung/crespo"/>
<project name="device/samsung/crespo4g"/>
<project name="device/samsung/maguro"/>
<project name="device/samsung/toro"/>
<project name="device/samsung/torospr"/>
<project name="device/samsung/tuna"/>
<project name="device/ti/panda"/>
<project name="platform/abi/cpp" path="abi/cpp"/>
<project name="platform/bionic" path="bionic"/>
<project name="platform/bootable/bootloader/legacy" path="bootable/bootloader/legacy"/>
<project name="platform/bootable/diskinstaller" path="bootable/diskinstaller"/>
<project name="platform/bootable/recovery" path="bootable/recovery"/>
<project name="platform/build" path="build">
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="platform/cts" path="cts"/>
<project name="platform/dalvik" path="dalvik"/>
<!-- Some lines are omitted -->
</manifest>
其中,name表示项目模块的名称以及在源码服务器上的相对路径。如果需要下载某个特定的模块,只需要执行~/bin/repo sync [name]
。
path表示项目的本地路径。本地路径也可以通过查看本地源码根目录下.repo/manifests/default.xml
文件得到。
下载Android Linux Kernel源码
- 进入Android源码根目录
$ cd ~/android/jellybean
$ mkdir kernel
$ cd kernel
- 下载Kernel源码
Kernel部分的源码可以直接通过git工具下载
$ git clone https://android.googlesource.com/kernel/common.git
由于Kernel源码是与硬件平台相关的,因此在下载时需要指定平台类型。也就是说,可以将该调指令中的common
替换为sumsung, tegra
等。
- 切换到kernel 3.0分支
由于Android JellyBean使用的是Linux 3.10内核,因此需要切换到Kernel 3.10分支。
$ cd common
$ git branch -a
$ git checkout remotes/origin/Android-3.10
编译Android上传系统源码
- 导入预设脚本
~/android/jellybean $ source build/envsetup.sh
- 指定产品名和编译变量
~/android/jellybean $ lunch
You're building on Linux
Lunch menu... pick a combo:
1. full-eng
2. full_x86-eng
3. vbox_x86-eng
4. full_grouper-userdebug
5. mini_armv7a_neon-userdebug
6. mini_armv7a-userdebug
7. full_wingray-userdebug
8. full_crespo-userdebug
9. full_maguro-userdebug
10. full_panda-userdebug
Which would you like? [full-eng] 1
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=4.1.1
TARGET_PRODUCT=full
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a
HOST_ARCH=x86
HOST_OS=linux
HOST_OS_EXTRA=Linux-3.13.0-86-generic-x86_64-with-Ubuntu-14.04-trusty
HOST_BUILD_TYPE=release
BUILD_ID=JRO03H
OUT_DIR=out
============================================
lunch是envsetup.sh中提供的函数,负责设置环境变量。full表示完全编译,eng表示工程版。full-eng对应模拟器设备。
- 编译源码
** 编译全部源码
~/android/jellybean $ make
** 编译指定模块源码
- make模块名
这种方法适合第一次编译,会把依赖模块一并编译。对于应用层源码模块,需要查看Android.mk中的LOCAL_PACKGAGE_NAME变量;对于框架层和系统运行库模块,需要查看Android.mk中的LOCAL_MODULE变量。 - mmm命令
该命令是envsetup.sh中注册的函数,用于在源码根目录编译指定模块,参数为模块的相对路径。只能在第一次编译后使用。 - mm命令
该命令是envsetup.sh中注册的函数,用于在模块目录下编译模块。只能在第一次编译后使用。