一、下載源碼
1、下載工具repo:https://android.googlesource.com/tools/repo/
在本地目錄建個bin的文件夾,進(jìn)入bin文件夾;通過git下載:
如你想下載最新的Android4.1代碼,即可將分支名稱更換成:android-4.1.1_r4
你也可以參照官網(wǎng)的下載方式來下載:http://source.android.com/source/downloading.html
實(shí)驗(yàn)證明,我總是在下載那個repo工具的時候,無法連接到相應(yīng)的地址。
下載是個漫長的過程,下載完成后的大小大概有14G,所以要提前準(zhǔn)備好這么大的空間。下載完成后的目錄大概有這些:如圖
二、編譯源碼
如果你的電腦的環(huán)境經(jīng)常做開發(fā),那么很多環(huán)境應(yīng)該已經(jīng)搭建好了,如果沒有,可以參照官網(wǎng):http://source.android.com/source/initializing.html
這里要提醒的是:用apt-get或者ubuntu軟件中直接安裝的jdk,jre的時候,編譯Android是總是編譯不過,出現(xiàn)JDK版本不一致的情況;
解決辦法如下:
到oracle官網(wǎng)中下載jdk:http://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html
建議下載這個:jdk-6u35-linux-i586.bin
下載完成后,運(yùn)行得到一個jdk1.6.0_35文件夾,然后,將相應(yīng)的JAVA環(huán)境加到系統(tǒng)環(huán)境中,簡單的可以這樣:
三、補(bǔ)充編譯及運(yùn)行模擬器
編譯完成后,可以在源碼目錄的out/target/product/generic/目錄下看到編譯好的ramdisk.img、system.img和userdata.img了。
正常情況下,可以配置好路徑環(huán)境變量后通過:
我的Android4.0.4版本啟動的畫面如圖:
這個命令來啟動模擬器;
但是,我在開始時就遇到了一個錯誤:could find/prebuilt/android-arm/kernel/kernel-qemu該文件,我在網(wǎng)上查了很多資料都沒說到這個錯誤,回來在一篇博文中得到啟示,重新再編譯了一下SDK,重啟一下就好了。
創(chuàng)建模擬器,還可以這樣:
運(yùn)行模擬器:
$ ./emulator -avd g1 或者
$ ./emulator -avd g1 -scale 0.8
其中 -avd指定Android設(shè)備名,-scale指定縮放比例。
按 Ctrl + F12 可以使模擬器屏幕旋轉(zhuǎn)90度,即橫屏、豎屏切換
刪除模擬器:
直接編譯Android源碼時,并沒有編譯 linux kernel。如果只運(yùn)行模擬器,不用編譯 linux kernel。
從emulator獲取內(nèi)核編譯參數(shù)的配置文件:
啟動模擬器
$ adb pull /proc/config.gz .
解壓縮config.gz $ gzip -d config.gz
將config文件替換kernel文件夾下的.config文件。
根據(jù)需要,修訂config與Makefile配置文件
a)準(zhǔn)備交叉編譯工具鏈
android代碼樹中有一個prebuild項(xiàng)目,包含了我們編譯內(nèi)核所需的交叉編譯工具。
b)設(shè)定環(huán)境變量
$ vi ~/.bashrc
增加如下兩行:
export PATH=$PATH:~/android/prebuilt/linux-x86/toolchain/ARM-eabi-4.4.0/bin
export ARCH=arm
保存后,同步變化:
$ source ~/.bashrc
c)獲得合適的內(nèi)核源代碼
$ cd ~/android
獲得內(nèi)核源代碼倉庫
$ git clone git://android.git.kernel.org/kernel/common.git kernel
$ cd kernel
$ git branch
顯示
* android-2.6.27
說明你現(xiàn)在在android-2.6.27這個分支上,也是kernel/common.git的默認(rèn)主分支。
顯示所有head分支:
$ git branch -a
顯示
* android-2.6.27
remotes/origin/HEAD -> origin/android-2.6.27
remotes/origin/android-2.6.25
remotes/origin/android-2.6.27
remotes/origin/android-2.6.29
remotes/origin/android-goldfish-2.6.27
remotes/origin/android-goldfish-2.6.29
我們選取最新的android-goldfish-2.6.29,其中g(shù)oldfish是android的模擬器模擬的CPU。
$ git checkout -b android-goldfish-2.6.29 origin/android-goldfish-2.6.29
$ git branch
顯示
android-2.6.27
* android-goldfish-2.6.29
我們已經(jīng)工作在android-goldfish-2.6.29分支上了。
d)設(shè)定交叉編譯參數(shù)
打開kernel目錄下的Makefile文件,把CROSS_COMPILE指向剛才下載的prebuild中的arm-eabi編譯器
CROSS_COMPILE ?= arm-eabi-
把LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,$(call ld-option, -Wl$(comma)?build-id,))
這一行注釋掉,并且添加一個空的LDFLAGS_BUILD_ID定義,如下:
LDFLAGS_BUILD_ID =
e)編譯內(nèi)核映像
$ cd ~/android/kernel
$ make goldfish_defconfig
$ make
f)測試生成的內(nèi)核映像
$ emulator -avd myavd -kernel ~/android/kernel/arch/arm/boot/zImage
編譯模塊:
Android中的一個應(yīng)用程序可以單獨(dú)編譯,編譯后需要重新生成system.img。
在Android目錄下運(yùn)行
$ . build/envsetup.sh 或者
$ source build/envsetup.sh ,然后就會多出幾個可用的命令:
- croot: Changes directory to the top of the tree.
- m: Makes from the top of the tree.
- mm: Builds all of the modules in the current directory.
- mmm: Builds all of the modules in the supplied directories.
- cgrep: Greps on all local C/C++ files.
- jgrep: Greps on all local Java files.
- resgrep: Greps on all local res/*.xml files.
- godir: Go to the directory containing a file.
- printconfig: 當(dāng)前build的配置情況.
可以使用 --help查看用法。
如:在修改了某一個模塊以后,可以使用 $ mmm <目錄> 來重新編譯所有在<目錄>中的所有模塊,使用 $ mm 編譯當(dāng)前目錄中的所有模塊。
編完之后,即修改了Android系統(tǒng)以后,可以使用 $ make snod 重新生成system.img。
編譯SDK:
直接執(zhí)行make是不包括make sdk的。make sdk用來生成SDK,這樣,我們就可以用與源碼同步的SDK來開發(fā)android了。
a)修改/frameworks/base/include/utils/Asset.h
‘UNCOMPRESS_DATA_MAX = 1 * 1024 * 1024’ 改為 ‘UNCOMPRESS_DATA_MAX = 2 * 1024 * 1024’
原因是eclipse編譯工程需要大于1.3M的buffer;
b)編譯ADT。
c)執(zhí)行make sdk。
$ make sdk
編譯很慢。編譯后生成的SDK存放在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目錄
實(shí)際上,當(dāng)用mmm命令編譯模塊時,一樣會把SDK的輸出文件清除,因此,最好把a(bǔ)ndroid-sdk_eng.xxx_linux-x86移出來
此后的應(yīng)用開發(fā),就在該SDK上進(jìn)行,所以~/.bashrc的修改注釋掉,增加如下一行:
export PATH=${PATH}:~/android/out/host/linux-x86/sdk/android-sdk_eng.xxx_linux-x86/tools
注意要把xxx換成真實(shí)的路徑;
d)關(guān)于環(huán)境變量、android工具的選擇
目前的android工具有:
A、我們從網(wǎng)上下載的SDK,如果你下載過的話( tools下有許多android工具,lib/images下有img映像)
B、我們用make sdk編譯出來的SDK( tools下也有許多android工具,lib/images下有img映像)
C、我們用make編譯出來的out目錄( tools下也有許多android工具,lib/images下有img映像)
那么我們應(yīng)該用那些工具和img呢?
首先,我們一般不會用A選項(xiàng)的工具和img,因?yàn)橐话銇碚f它比較舊,也源碼不同步。其次,也不會用C選項(xiàng)的工具和img,因?yàn)檫@些工具和img沒有經(jīng)過 SDK的歸類處理,會有工具和配置找不到的情況;事實(shí)上,make sdk產(chǎn)生的很多工具和img,在make編譯出來out目錄的時候,已經(jīng)編譯產(chǎn)生了,make sdk只是做了copy而已。
f)創(chuàng)建Android Virtual Device
編譯出來的SDK是沒有AVD(Android Virtual Device)的,我們可以通過android工具查看:
$ android list
創(chuàng)建AVD:
$ android create avd -t 1 -n myavd
可以android -help來查看上面命令選項(xiàng)的用法。創(chuàng)建中有一些選項(xiàng),默認(rèn)就行了
再執(zhí)行android list,可以看到AVD存放的位置
以后每次運(yùn)行emulator都要加-avd myavd或@myavd選項(xiàng):
$ emulator -avd myavd
聯(lián)系客服