搭建開發環境
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中注冊的函數,用于在模塊目錄下編譯模塊。只能在第一次編譯后使用。