請按照“獲取Android源代碼”一節(jié)中的內(nèi)容安裝所需的相關(guān)包,否則在編譯源代碼的時(shí)候會報(bào)很多的錯(cuò)。為了方便起見,現(xiàn)將所有需要安裝的包羅列如下,其中有些包是可選的,但最好都裝上,同時(shí),在安裝之前,最好先更新一下:
$
sudo aptitude update
$
sudo aptitude upgrade
Ubuntu
Linux (32位
x86)
$
sudo aptitude install git-core gnupg flex bison gperf libsdl-dev
libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev
zlib1g-dev make gcc g++ libc6‐dev
patch texinfo ncurses‐dev
python2.6 valgrind lib32readline5-dev
$
sudo aptitude
install sun‐java6‐jdk
Ubuntu
Linux (64位
x86)
$
sudo apt-get install git-core gnupg flex bison gperf libsdl-dev
libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev
zlib1g-dev make gcc g++ libc6-dev patch texinfo ncurses-dev
python2.6 valgrind gcc-multilib g++-multilib libc6-dev-i386
lib32ncurses5-dev ia32-libs x11proto-core-dev libx11-dev
lib32readline5-dev lib32z-dev
$
sudo ln -s /usr/lib32/libX11.so.6 /usr/lib32/libX11.so
$
sudo aptitude
install sun‐java6‐jdk
基本上安裝上面羅列的包,編譯時(shí)就不會有太大的問題,下面列舉本人(64位機(jī)子,Ubuntu10.04系統(tǒng))在編譯時(shí)出現(xiàn)的一些錯(cuò)誤,以及在出現(xiàn)錯(cuò)誤時(shí),相關(guān)的解決包。雖然google已將這些必需包在
android文檔中進(jìn)行說明了,但在此聲明這些問題的解決還是參考網(wǎng)址:http://code.google.com/p/android/issues/detail?id=1005
/usr/include/gnu/stubs.h:7:27:
error: gnu/stubs-32.h: No such file or directory make: ***
[out/host/linux-x86/obj/EXECUTABLES/acp_intermediates/acp.o] Error 1
解決包:$
sudo aptitude install libc6-dev-i386
/usr/bin/ld:
cannot find -lstdc++
collect2:
ld returned 1 exit status
make:
*** [out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl]
Error 1
dpkg-query
-l &> packages.txt (該工具可用來查詢dpkg數(shù)據(jù)庫)
解決包:$
sudo aptitude install g++-multilib
/usr/bin/ld:
cannot find -lncurses
collect2:
ld returned 1 exit status
make:
*** [out/host/linux-x86/obj/EXECUTABLES/adb_intermediates/adb] Error
1
make:
*** Waiting for unfinished jobs....
解決包:$
sudo aptitude search lib32ncurses5-dev
/usr/bin/ld:
cannot find -lz
collect2:
ld returned 1 exit status
make:
***
[out/host/linux-x86/obj/EXECUTABLES/zipalign_intermediates/zipalign]
Error 1
make:
*** Waiting for unfinished jobs....
解決包:$
sudo aptitude install lib32z-dev
同時(shí),網(wǎng)友kees.jongenburger提出了使用getlibs(該工具可自動解決32位程序在64位系統(tǒng)上的依賴關(guān)系)來解決這個(gè)問題。具體用法如下:
$
getlibs -l libz.so
libz.so:
zlib1g-dev
The following i386 packages will be installed:
zlib1g-dev
Continue [Y/n]? y
Downloading ...
Installing libraries ...
具體getlibs工具的介紹請參考網(wǎng)址: http:///showthread.php?t=474790
注:在“獲取Android源代碼”一節(jié)中已介紹使用java
6時(shí)會有不兼容的問題,但經(jīng)過測試發(fā)現(xiàn),如果僅僅make(make
不包括make
sdk),用sun‐java6‐jdk
是沒有問題的。而make
sdk,就會有問題,嚴(yán)格來說是在make
doc 時(shí)會出問題,它需要的javadoc
版本為1.5。
因此,我們安裝完sun‐java6‐jdk
后最好再安裝sun‐java5‐jdk,或者只安裝sun‐java5‐jdk。這里sun‐java6‐jdk
和sun‐java5‐jdk
都安裝,并只修改javadoc.1.gz
和javadoc。因?yàn)橹挥羞@兩個(gè)是make
sdk 用到的。這樣的話,除了javadoc
工具是用1.5
版本,其它均用1.6
版本,java的安裝目錄及結(jié)構(gòu)如下:
derek@derek-desktop:/usr/lib/jvm$
ls -l
total
4
lrwxrwxrwx
1 root root 19 2010-08-20 23:19 java-6-sun ->
java-6-sun-1.6.0.20
drwxr-xr-x
8 root root 4096 2010-08-21 00:06 java-6-sun-1.6.0.20
sudo
aptitude install sun‐java5‐jdk (現(xiàn)在發(fā)現(xiàn)找不到java
5的包,可能是源的問題)
修改javadoc
的link
$
cd /etc/alternatives
$
sudo rm javadoc.1.gz
$
sudo ln ‐s /usr/lib/jvm/java‐1.5.0‐sun/man/man1/javadoc.1.gz
javadoc.1.gz
$
sudo rm javadoc
$
sudo ln ‐s /usr/lib/jvm/java‐1.5.0‐sun/bin/javadoc javadoc
但是,本人在編譯2.2系統(tǒng)時(shí)測試發(fā)現(xiàn)使用java
6并沒有上述問題。估計(jì)應(yīng)該是解決了。所以上述對javadoc這快的處理就可以不做了。
設(shè)置環(huán)境變量
$
vim ~/.bashrc
增加如下的環(huán)境變量,包括java以及android程序開發(fā)、運(yùn)行的一些環(huán)境變量
JAVA_HOME=/usr/lib/jvm/java-6-sun
export
JAVA_HOME
JRE_HOME=${JAVA_HOME}/jre
export
JRE_HOME
export
ANDROID_JAVA_HOME=${JAVA_HOME}
export
CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH
export
JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
HOME_BIN=~/android/bin/
export
PATH=${PATH}:${JAVA_PATH}:${HOME_BIN}
$
source ~/.bashrc (使環(huán)境變量的設(shè)置立即生效,即同步變化)
編譯android源碼
$
cd ~/android/androidplatform/ (cd
到android源碼目錄)
$
make (或者使用
make
-jn 命令,其中,n值的確定參考原則為2m-1,m為處理器核數(shù),本人實(shí)驗(yàn)機(jī)子為雙核,故用
make
-j3)
這個(gè)過程很久,大概花兩個(gè)小時(shí)左右,編譯完后將得到~/android/androidplatform/out
目錄,可參加附件中的目錄樹文件。
編譯SDK
直接執(zhí)行make
是不包括make
sdk 的。make
sdk 用來生成SDK,這樣,我們就可以用與源碼同步的SDK
來開發(fā)
android
了。
1、查看~/android/androidplatform/frameworks/base/include/utils/Asset.h
$
cd ~/android/androidplatform/
$
vim frameworks/base/include/utils/Asset.h
查看
UNCOMPRESS_DATA_MAX
值:
enum
{
/*
data larger than this does not get uncompressed into a buffer */
#ifdef
HAVE_ANDROID_OS
UNCOMPRESS_DATA_MAX
= 1 * 1024 * 1024
#else
UNCOMPRESS_DATA_MAX
= 2 * 1024 * 1024
#endif
};
由于Eclipse
編譯工程需要大于1.3M
的buffer,如果僅為1
* 1024 * 1024
請改為2
* 1024 * 1024,由于本人實(shí)驗(yàn)的版本為2.2已使用enum進(jìn)行了更正,故不用修改。
輸入以下命令進(jìn)行sdk編譯:
$
make sdk
注意如果這里出現(xiàn)問題請按照上面所介紹的將javadoc換回1.5版本。
編譯后生成的SDK
存放在~/android/android/platform/out/host/linux‐x86/sdk/
,
此目錄下有android‐sdk_eng.xxx_linux‐x86.zip
和android‐sdk_eng.xxx_linux‐x86
目錄。android‐sdk_eng.xxx_linux‐x86
就是SDK
目錄。參加附件中的目錄樹文件。
模擬器使用
進(jìn)入~/android/androidplatform/out/host/linux-x86/sdk/android-sdk_eng.derek_linux-x86/tools目錄下,這里有很多Android的工具,其中模擬器對應(yīng)的應(yīng)用
程序是emulator。下面是正確使用模擬器的步奏:
輸入以下命令啟動Android
SDK 和
AVD
管理器,可以通過該圖形化界面進(jìn)行很多操作,比如SDK下載,虛擬設(shè)備的創(chuàng)建,啟動模擬器等等。
derek@derek-desktop:~/android/androidplatform/out/host/linux-x86/sdk/android-sdk_eng.derek_linux-x86/tools$
./android
Starting
Android SDK and AVD Manager
No
command line parameters provided, launching UI.
See
'android --help' for operations from the command line.
列出機(jī)子上的所有target版本,可以理解為android
sdk 版本。
derek@derek-desktop:~/android/androidplatform/out/host/linux-x86/sdk/android-sdk_eng.derek_linux-x86/tools$
./android list target
Available
Android targets:
id:
1 or "android-AOSP"
Name:
Android AOSP (Preview)
Type:
Platform
API
level: AOSP
Revision:
2
Skins:
WQVGA400, WQVGA432, WVGA800, WVGA854, HVGA (default), QVGA
創(chuàng)建一個(gè)名為
My_AVD_2.2的虛擬設(shè)備
derek@derek-desktop:~/android/androidplatform/out/host/linux-x86/sdk/android-sdk_eng.derek_linux-x86/tools$
./android create avd -n My_AVD_2.2 -t 1
Android
AOSP (Preview) is a basic Android platform.
Do
you wish to create a custom hardware profile [no]
Created
AVD 'My_AVD_2.2' based on Android AOSP (Preview),
with
the following hardware config:
hw.lcd.density=160
使用剛創(chuàng)建的虛擬設(shè)備啟動模擬器
derek@derek-desktop:~/android/androidplatform/out/host/linux-x86/sdk/android-sdk_eng.derek_linux-x86/tools$
./emulator -avd My_AVD_2.2
創(chuàng)建虛擬sdcard,用于模擬器中數(shù)據(jù)和外部數(shù)據(jù)的交互,
虛擬SD卡的大小不應(yīng)該小于100M,否則在后期的文件系統(tǒng)打包過程中,有可能會有SD卡存儲空間不夠的問題。
derek@derek-desktop:~/android/androidplatform/out/host/linux-x86/sdk/android-sdk_eng.derek_linux-x86/tools$
./mksdcard -l smallone 256M
~/android/androidplatform/out/host/linux-x86/sdk/android-sdk_eng.derek_linux-x86/sdcard.img
使用剛剛創(chuàng)建的虛擬sdcard創(chuàng)建一虛擬設(shè)備
derek@derek-desktop:~/android/androidplatform/out/host/linux-x86/sdk/android-sdk_eng.derek_linux-x86/tools$
./android create avd -n MyAOSP -t 1 -c
~/android/androidplatform/out/host/linux-x86/sdk/android-sdk_eng.derek_linux-x86/sdcard.img
列出本機(jī)上的所有虛擬設(shè)備
derek@derek-desktop:~/android/androidplatform/out/host/linux-x86/sdk/android-sdk_eng.derek_linux-x86/tools$
./android list avd
Available
Android Virtual Devices:
Name:
MyAOSP
Path:
/home/derek/.android/avd/MyAOSP.avd
Target:
Android AOSP (Preview) (API level AOSP)
Skin:
HVGA
Sdcard:
/home/derek/android/androidplatform/out/host/linux-x86/sdk/android-sdk_eng.derek_linux-x86/sdcard.img
---------
Name:
My_AVD_2.2
Path:
/home/derek/.android/avd/My_AVD_2.2.avd
Target:
Android AOSP (Preview) (API level AOSP)
Skin:
HVGA
Sdcard:
256M
使用剛編譯完成的SDK中的模擬器啟動android系統(tǒng)時(shí),默認(rèn)采用的系統(tǒng)鏡像為~/android/androidplatform/out/host/linux-x86/sdk/android-sdk_eng.derek_linux-x86/platforms/android-AOSP/images目錄(剛編譯完的SDK目錄中的android-sdk_eng.derek_linux-x86/platforms/android-AOSP/images)下的kernel-qemu
ramdisk.img system.img userdata.img 。
其中kernel-qemu為內(nèi)核鏡像,其他組合為文件系統(tǒng)。
當(dāng)然也可以使用自己編譯的內(nèi)核鏡像,關(guān)于如果編譯內(nèi)核的問題
會在后續(xù)文章中說明。
使用名為MyAOSP
的虛擬設(shè)備啟動模擬器,并規(guī)定系統(tǒng),數(shù)據(jù)等的映象文件路徑,模擬器內(nèi)核采用prebuild/android-arm/kernel/kernel-qemu。當(dāng)然也可以使用自己編譯的內(nèi)核鏡像,關(guān)于如果編譯內(nèi)核的問題
會在后續(xù)文章中說明。
derek@derek-desktop:~/android/androidplatform/out/host/linux-x86/sdk/android-sdk_eng.derek_linux-x86/tools$
./emulator -avd MyAOSP -sysdir
~/android/androidplatform/out/target/product/generic/ -data
~/android/androidplatform/out/target/product/generic/userdata.img
-ramdisk
~/android/androidplatform/out/target/product/generic/ramdisk.img
-kernel
~/android/androidplatform/prebuilt/android-arm/kernel/kernel-qemu
也可以再加上下面的參數(shù)進(jìn)行啟動,
-system
~/android/androidplatform/out/target/product/generic/system.img
或
-image
~/android/androidplatform/out/target/product/generic/system.img
但后者已過時(shí)。
可以輸入emulator
-help 進(jìn)行進(jìn)一步的工作。
注意:細(xì)心的人可能會發(fā)現(xiàn)剛剛編譯生成的SDK目錄下的tools目錄(~/android/androidplatform/out/host/linux-x86/sdk/android-sdk_eng.derek_linux-x86/tools)中的所有工具在剛剛源碼編譯完的host目錄下的bin目錄(~/android/androidplatform/out/host/linux-x86/bin)中都有。