一.PC工作環境準備
首先安裝一些必須的工具包:(根據安裝的ubuntu 64和32位系統,進行如下環境配置)
Ubuntu Linux (32-bit x86):
sudo apt-get install git-core gnupg
sun-java5-jdk flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev
build-essential zip curl libncurses5-dev zlib1g-dev
Ubuntu Linux (64-bit x86):
sudo
apt-get install git-core gnupg flex bison gperf build-essential zip
curl sun-java5-jdk zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386
lib32ncurses5-dev ia32-libs x11proto-core-dev libx11-dev
lib32readline5-dev lib32z-dev
下載jdk 1.5 :
apt-get install sun-java5-jdk
設定環境變數。
根據自己的java安裝,可以在.bashrc檔案中加入如下兩行:
gedit ~/.bashrc (開啟bashrc)
export JAVAHOME=/usr/lib/jvm/java-1.5.0-sun(根據自己機子的jdk安裝路徑,就是尋找到java、javac等的路徑)
export PATH=$PATH:$JAVAHOME/bin:$JAVAHOME/jre/bin:$JAVAHOME/bin/lib
export CLASSPATH=.:$JAVAHOME/jre/bin:$JAVA_HOME/lib
二.代碼下載
在使用者目錄下,建立一個存放Andorid目錄,在裡面建個bin目錄。
1、Install Git and Repo tools 用於版本管理和代碼同步
sudo apt-get install git-core curl
mkdir sourcecode
cd sourcecode
mkdir bin
cd bin
curl
http://android.git.kernel.org/repo
> repo
sudo chmod a+x repo (擷取repo許可權)
可以為repo命令修改環境變數,在.bashrc檔案中加入如下:
export PATH=$PTAH:~/bin/ (千萬別漏了“~”,把路徑覆蓋,一些命令會丟了,可選項)
2、Download source of android;
在Android目錄下建立一個源碼的儲存目錄,androidsrc。
mkdir androidsrc
cd fandroidsrc
../bin/repo init -u git://android.git.kernel.org/platform/manifest.git(預設master版本,此版本是開發測試用的,不穩定)
或者擷取cupcake 分支
../bin/repo init -u git://android.git.kernel.org/platform/manifest.git –b cupcake
(如果上面設定PATH的環境變數,直接使用repo init -u git://android.git.kernel.org/platform/manifest.git)
進行設定完成後,開始同步代碼(根據網路大概需要數小時或數日);
../bin/repo sync
(如果上面設定PATH的環境變數,直接使用repo sync)
三.系統和開發工具編譯
Android檔案系統由於已經內建了經過最佳化的交叉編譯工具,並且為所有的源碼都提供了經過驗證的makefile,所以系統的整體編譯相對簡單,官方發布的版本中準系統都已經包含進了makefile中。如果需要增加什麼功能,可以到build/target/product/修改相應的.mk檔案。例如
為了增加中文的IME,可以按下面的方法做:
#cd /home/myandroid/androidsrc/build/target/product/
#gedit generic.mk
開啟這個檔案後,在PRODUCT_PACKAGES中,加入PinyinIME,然後儲存退出。這樣在整體編譯的時候就會把中文IME也編譯進system中了。
開始系統編譯:
#cd /home/myandroid/androidsrc/
#make
第一次進行整體編譯,這個過程大概持續2到3小時,預設情況下,會在/home/myandroid/androidsrc目錄下產生一個out檔案夾,所有的編譯產生物都在這一目錄下。如果想更改組建檔案的目錄,請參考./build/buildspec.mk.default檔案中的說明和選項,很簡單,相信大家都能看懂。這次編譯所產生的主要是out/target/product/generic/下的一些物件,如system.img等
2.開發工具的編譯
Android提供了完整的開發工具和交叉編譯工具,這些都包含在了源碼內,所以只要對源碼正確編譯,就可以獲得豐富的開發工具,並且Android的移植工作也需要這些工具的支援。
編譯Android開發工具的步奏如下:
#cd /home/myandroid/androidsrc/
#make sdk
這次編譯主要產生物件在out/host/下
#cd /out/host/linux-x86/sdk/
可以看到這裡有了一個名叫android-sdk_eng.root_linux-x86的檔案夾,這個檔案夾基本包含了Android的模擬器 和所有的開發調試工具。開啟這個檔案夾,可以看到這裡主要由以下幾部分組成:
–add-ones –需要增加的新工具路徑
–docs –關於模擬器和各種開發工具的說明等
–platform –模擬器和開發工具需要的檔案
–tools –模擬器和開發工具的應用程式
四.模擬器使用
進入~/android-sdk_eng.root_linux-x86/tools目錄下,這裡有很多Android的工具,其中模擬器對應的應用程式是emulator。下面是正確使用模擬器的步奏:
#./android create avd –n NO1 –t 1
這個命令會進入建立avd的過程,按自己的需要做出一些選擇後,名稱為NO1的avd就建立成功了,以後可以通過這 個建立的avd來使用模擬器。1.4之前的版本不需要這樣建立,1.5版本後不正確建立是無法使用的。avd是android virtual machine的縮寫。
#./android list avd
輸入命令來檢查建立是否成功,如果成功會列出來。
#./emulator –avd NO1
啟動剛才建立的名為NO1的模擬器,使用的核心,檔案系統等均使用預設的,即~/android-sdk_eng.root_linux- x86/platform/路徑下的核心和檔案系統。沒什麼問題的話,我們就可以看到Android作業系統的虛擬介面了。
五. 檔案系統提取
Android可以運行在開發板上的檔案系統的提取需要依靠模擬器,具體的操作步奏如下:
1. 將模擬器運行在一個帶SDcard的虛擬設備上
#cd /home/myandroid/androidsrc/out/ android-sdk_eng.root_linux-x86/tools/
#./mksdcard –l 200M /home/sdcard.img
這裡使用mksdcard開放工具在/home目錄下建立一個200M的sdcard.img,用於模擬器中資料和外部資料的互動,虛擬SD卡的大小不應該小於100M,否則在後期的檔案系統打包過程中,有可能會有SD卡儲存空間不夠的問題。
#./android create avd –n cupcake –t –c /home/sdcard.img 1
建立一個名為cupcake的,附帶有sdcard的虛擬設備。
#./emulator –avd cupcake –sysdir /home/myandroid/androidsrc/out/target/product/generic –data /home/myandroid/androidsrc/out/target/product/generic/userdata.img -ramdisk /home/myandroid/androidsrc/out/target/product/generic/ramdisk.img –kernel /home/myandroid/androidsrc/prebuild/android-arm/kernel/kernel-qemu
使用名為cupcake的虛擬設備啟動模擬器,並規定系統,資料等的映象檔案路徑,模擬器核心採用prebuild/android-arm/kernel/kernel-qemu。當然也可以使用自己編譯的核心鏡像。
2. 使用工具從啟動並執行模擬器中擷取檔案系統,並放到sdcard中
開啟一個新的終端進行操作:
#cd /home/myandroid/androidsrc/out/ android-sdk_eng.root_linux-x86/tools/
#./adb remount
這裡使用adb工具的remount選項來使模擬器中的system目錄許可權改為可讀寫。
#./adb push tar /system/bin
這裡使用adb工具的push指令將提前使用busybox做好的tar應用程式加入到模擬器的/system/bin目錄下。關於busybox的使用這裡不作介紹,可以自己看看網上的文章。
#./adb shell
這裡使用adb工具進入到模擬器的shell中。
進入到Android模擬器的shell中操作如下:
#tar cvf /sdcard/system.tar /system
#tar cvf /sdcard/userdata.tar /data
這裡使用前面加入到模擬器中的tar應用程式來對system和data目錄下所有內容進行打包,並儲存到sdcard裡。操作結束後,進入sdcard目錄下查看是否有了system.tar和userdata.tar檔案,如果有,則證明打包成功。
#exit
退出shell,並關閉模擬器。
#mount –o loop sdcard.img /mnt
#cd /mnt
這裡將虛擬SD卡掛載在/mnt目錄下,進入/mnt目錄後,就可以將system.tar和userdata.tar拷貝出來,檔案系統的提取完成。
經過測試,發現其實使用android提供的mkyaffsimage直接對/out/target/product/generic/system目錄進行打包,製作出system.img也完全可以使用,不過不知道userdata.img如何製作,希望有人可能指點。使用mkyaffs2image製作檔案系統映像時要注意的是一些設定檔的許可權問題,比如/system/usr/keylayout下的檔案許可權就有問題,需要修改,否則產生的映像在模擬器中載入後,鍵盤等無法正常使用。
編譯出錯情況:
frameworks/base/tools/aidl/AST.cpp:10: error: 'fprintf' was not declared in this scope的錯誤
解決辦法:下載gcc-4.3和g++-4.3apt-get install gcc-4.3 g++-4.3然後進入/usr/bincd /usr/bin建個軟串連ln -s gcc-4.3 gccln -s g++-4.3 g++