Android2.3.1系統原始碼編譯
1. 環境準備:
編譯安卓原始碼只能在Linux上面,建議使用64位電腦進行編譯,這裡使用Ubuntu14.04系統來進行編譯
Java環境,需要使用Oracle的JDK, Android5.0以後才可以使用OpenJDK來進行編譯,推薦去Oracle官網下載壓縮包自己配置環境變數來安裝:(後面編譯發現編譯2.3.1版本Android系統原始碼需要jdk1.6)
編譯依賴包準備: ( sudo apt-get install -y flex bison gperf libesd0-dev build-essential zip curl valgrind git-core gnupg)
2. 原始碼下載:
Google使用repo來封裝git對android原始碼進行管理,方便開發,這裡先獲取repo執行指令碼並放到/bin目錄以便執行:
sudo apt-get install phablet-tools
repo放到/bin目錄後,新建一個資料夾,然後可以下載程式碼了:
(repo init -u https://android.googlesource.com/platform/manifest -> 這是下載最新的程式碼,現在估計是android7.x了吧,正如研究linux的都喜歡先看linux0.11原始碼,這裡也不求新,先看透2.3.1的原始碼,所以,這裡需要指定下載的原始碼分支)
然後就是漫長的等待過程了……………………
中途如果網路斷開,重新執行"repo sync"即可。Tips: 下載原始碼需要科學上網,哈哈~
大約花了3小時,下載完成後如下:
根目錄就一個Makefile,看看那裡面有啥:
它只是包含了build/core/main.mk主入庫編譯,再看看它的內容:
接近800行,現在先不看它,先編譯再說,如果編譯都通過不了,看懂了好像不懂,因為你後面都沒法進行程式執行測試。
3. 原始碼編譯,在原始碼根目錄直接執行make,將編譯Android系統的全部模組
報錯,提示需要JDK1.6版本,那就安裝唄,另外,對於許可權禁止的,增加可執行許可權即可:
上面的執行生成jdk6的包:
新增環境變數即可:
//
接著我們再make一次看看,出現如下錯誤:
安裝依賴庫:
再次make,出現如下錯誤:
安裝依賴庫:
再次make,報錯:
修改檔案frameworks/base/tools/aapt/Android.mk,在28行加多一個引數"-fpermissive":
再次make,提示類似錯誤,修改檔案frameworks/base/libs/utils/Android.mk,在60行增加-fpermissive引數:
再次編譯出現如下錯誤:
安裝依賴包: sudo apt-get install zlib1g-dev && sudo apt-get install lib32z1-dev && sudo apt-get install libncurses5-dev:i386
另外,為了編譯順利,建議降級gcc和g++到4.4版本:
sudo apt-get install gcc-4.4 g++-4.4
sudo rm -rf /usr/bin/gcc
sudo rm -rf /usr/bin/g++
sudo ln -s /usr/bin/gcc-4.4 /usr/bin/gcc
sudo ln -s /usr/bin/g++-4.4 /usr/bin/g++
再次make,出現如下錯誤:
編輯提示的檔案,增加如下的28行:
再次make, 出現如下錯誤:
zlib1g-dev有個標頭檔案修改了路徑,及zconf.h放到了/usr/include/x86_64-Linux-gnu/,所以將其拷貝到/usr/include/下即可:
sudo cp /usr/include/x86_64-linux-gnu/zconf.h /usr/include/
再次make:
sudo apt-get install libswitch-perl
再次make,等了半個多小時,終於編譯成功:
4. 生成SDK,可用於開發Android應用程式
make sdk
5. 執行
啟動Android模擬器需要四個檔案:
1. Linux核心映象檔案--> zImage
2. Android系統映象檔案--> system.img, userdata.img, ramdisk.img,上面已經編譯生成,在目錄out/target/product/generic下面
export PATH=$PATH:~/Documents/source_code/android-2.3.1/out/host/linux-x86/bin (out/host/linux-x86/bin目錄下是Android模擬器的位置,這裡加入到環境變數中)
export ANDROID_PRODUCT_OUT=~/Documents/source_code/android-2.3.1/out/target/product/generic
啟動模擬器:
1. 不加任何引數表示已經配置好上面兩行的環境變數: emulator
2. 如果不配置環境變數,則要加引數指定映象檔案的位置
emulator -kernel ./prebuilt/android-arm/kernel/kernel-qemu -sysdir ./out/target/product/generic -system out/target/product/generic/system.img -data out/target/product/generic/userdata.img -ramdisk out/target/product/generic/ramdisk.img
啟動模擬器提示如下錯誤:
安裝依賴包:(來自StackOver Flow: https://stackoverflow.com/questions/4841908/sdl-init-failure-reason-is-no-available-video-device/22625691)
sudo apt-get install libsdl1.2debian:i386
然後再次啟動:
可以看看其系統資訊:
6. 下載Linux核心原始碼
上面使用repo下載同步的Android原始碼並不包含Linux核心原始碼,因此,如果需要定製Linux核心原始碼,就要下載下來自己進行修改編譯,從上面也可以看到Android2.3.1使用的Linux核心位2.6.29。
我們在Android系統原始碼根目錄下進行如下操作:
mkdir kernel && cd kernel
git clone https://android.googlesource.com/kernel/goldfish.git
下載完成後,我們需要checkout核心版本為2.6.29版本的分支:
cd goldfish
git branch -a
git checkout remotes/origin/android-goldfish-2.6.29
7. 編譯Linux核心原始碼
準備工作:
修改Makefile檔案,修改目標CPU架構(ARCH)為arm和交叉編譯工具(CROSS_COMPILE),如下195和196行:
Android原始碼提供的交叉編譯工具位於prebuild/linux-x86/toolchain目錄下。
編譯步驟:
1. 配置交叉編譯工具的環境變數: export PATH=$PATH:~/Documents/source_code/android-2.3.1/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin
2. 生成指定CPU架構的硬體配置檔案
首先看看模擬器的CPU體系結構版本,為arm v5的,因此使用goldfish_defconfig檔案,若為arm v7的,則使用goldfish_armv7_defconfig:
make goldfish_defconfig
3. 編譯make生成Linux核心映象檔案zImage
8. 基於定製編譯的Linux核心原始碼啟動Android模擬器
emulator -kernel kernel/goldfish/arch/arm/boot/zImage -sysdir ./out/target/product/generic -system out/target/product/generic/system.img -data out/target/product/generic/userdata.img -ramdisk out/target/product/generic/ramdisk.img
和前面命令相比,就是修改了核心檔案的路徑而已,這裡使它基於剛剛編譯的核心來啟動:
到這裡,Android2.3.1原始碼的開發環境搭建和編譯、模擬器啟動都完成了,可以進入下一步學習了。
後記:
原本打算記錄一下流程,結果因為是新配置的Ubuntu虛擬機器,在編譯原始碼那裡遇到一堆問題,總算搞定了,不知不覺,時間到了00:11,趕緊睡覺,明天還要搬磚,啊哈~~