現(xiàn)僅就工作遇到的問題做個總結。所用硬件平臺為amlogic stvm3。---------------------------------------------------------------------------關于版本號:文件build/core/version_defaults.mk用來檢查一些跟版本相關的變量是否定義;如果未定義,則使用默認值。這些變量包括 PLATFORM_VERSION # 如 2.2.5 PLATFORM_SDK_VERSION # 8, 對應2.2.5 PLATFORM_VERSION_CODENAME # REL,即發(fā)行版 DEFAULT_APP_TARGET_SDK # 同SDK_VERSION或VERSION_CODENAME BUILD_ID # 默認為UNKNOWN BUILD_NUMBER # 默認eng.$(USER).$(shell date +%Y%m%d.%H%M%S)的形式。 version_defaults.mk首先包含進build_id.mk。用戶應當配置build_id.mk,而不應該改動version_defaults.mk文件。然后檢查上述變量,如未定義則賦值默認值。---------------------------------------------------------------------------關于調試功能(adb)的開啟編譯android源碼之前總是要先運行build/envsetup.sh,以初始化一些常用命令(實際上是bash的函數,如add_lunch_combo)。其中也從以下文件中引入了一些編譯設置: device/${CHIPSET_VENDOR}/vendorsetup.sh我們這里使用的CHIPSET_VENDOR為amlogic。比如我們有文件device/amlogic/vendorsetup.sh,內容為"產品名-編譯類型(flavor)"列表(稱為combo),如下: add_lunch_combo m1ref-eng add_lunch_combo m1ref-user add_lunch_combo m2ref-eng add_lunch_combo m2ref-user add_lunch_combo stvm3-eng add_lunch_combo stvm3-user其中,m1ref和stvm3是產品名(作前綴),后面為編譯類型。除此前綴外可選的combo值有: eng, user, userdebug, tests。(參考文件build/core/main.mk中對于變量TARGET_BUILD_VARIANT的篩查條件)我們可以修改vendorsetup.sh文件,來改變?yōu)樘囟ㄔO備編譯的結果。以下是各個編譯類型的特點: eng: 工程模式,用于平臺級的調試,是默認的編譯類型。
站在用戶的角度思考問題,與客戶深入溝通,找到富陽網站設計與富陽網站推廣的解決方案,憑借多年的經驗,讓設計與互聯(lián)網技術結合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都網站制作、網站建設、企業(yè)官網、英文網站、手機端網站、網站推廣、國際域名空間、虛擬空間、企業(yè)郵箱。業(yè)務覆蓋富陽地區(qū)。
123456789101112131415161718192021第一次下載好Android源代碼工程后,我們通常是在Android源代碼工程目錄下執(zhí)行make命令,經過漫長的等待之后,就可以得到Android系統(tǒng)鏡像system.img了。以后如果我們修改了Android源代碼中的某個模塊或者在Android源代碼工程新增一個自己的模塊,是不是還是執(zhí)行make命令呢?答案是否定的,Google為我們準備了另外的命令來支持編譯單獨的模塊,以及重新打包system.img的命令。在繼續(xù)學習Android源代碼之前,就讓我們先來看看這個命令吧。
一. 首先在Android源代碼目錄下的build目錄下,有個腳本文件envsetup.sh,執(zhí)行這個腳本文件后,就可以獲得一些有用的工具: USER-NAME@MACHINE-NAME:~/Android$ . ./build/envsetup.sh 注意,這是一個source命令,執(zhí)行之后,就會有一些額外的命令可以使用: - 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. 這些命令的具體用法,可以在命令的后面加-help來查看,這里我們只關注mmm命令,也就是可以用它來編譯指定目錄的所有模塊,通常這個目錄只包含一個模塊。
二. 使用mmm命令來編譯指定的模塊,例如Email應用程序: USER-NAME@MACHINE-NAME:~/Android$ mmm packages/apps/Email/ 編譯完成之后,就可以在out/target/product/generic/system/app目錄下看到Email.apk文件了。Android系統(tǒng)自帶的App都放在這具目錄下。另外,Android系統(tǒng)的一些可執(zhí)行文件,例如C編譯的可執(zhí)行文件,放在out/target/product/generic/system/bin目錄下,動態(tài)鏈接庫文件放在out/target/product/generic/system/lib目錄下,out/target/product/generic/system/lib/hw目錄存放的是硬件抽象層(HAL)接口文件。
三. 編譯好模塊后,還要重新打包一下system.img文件,這樣我們把system.img運行在模擬器上時,就可以看到我們的程序了。 USER-NAME@MACHINE-NAME:~/Android$ make snod
四. 參照Ubuntu上下載、編譯和安裝Android最新源代碼一文介紹的方法運行模擬器: USER-NAME@MACHINE-NAME:~/Android$ emulator 這樣一切就搞定了。
用最新的Ubuntu 16.04,請首先確保自己已經安裝了Git.沒安裝的同學可以通過以下命令進行安裝:
sudo apt-get install git git config –global user.email “test@test.com” git config –global user.name “test”
其中test@test.com為你自己的郵箱.
簡要說明
android源碼編譯的四個流程:1.源碼下載;2.構建編譯環(huán)境;3.編譯源碼;4運行.下文也將按照該流程講述.
源碼下載
由于某墻的原因,這里我們采用國內的鏡像源進行下載.
目前,可用的鏡像源一般是科大和清華的,具體使用差不多,這里我選擇清華大學鏡像進行說明.(參考:科大源,清華源)
repo工具下載及安裝
通過執(zhí)行以下命令實現(xiàn)repo工具的下載和安裝
mkdir ~/binPATH=~/bin:$PATHcurl ~/bin/repochmod a+x ~/bin/repo
補充說明
這里,我來簡單的介紹下repo工具,我們知道AOSP項目由不同的子項目組成,為了方便進行管理,Google采用Git對AOSP項目進行多倉庫管理.在聊repo工具之前,我先帶你來聊聊多倉庫項目:
我們有個非常龐大的項目Pre,該項目由很多個子項目R1,R2,...Rn等組成,為了方便管理和協(xié)同開發(fā),我們?yōu)槊總€子項目創(chuàng)立自己的倉庫,整個項目的結構如下:
這里寫圖片描述
將一個項目Pre進行分庫后會遇到這么一個問題:如果我們想要創(chuàng)建Pre分支來做feature開發(fā),這就意味著,我們需要到每個子項目中分別創(chuàng)建對應的分支,這個過程如果純粹靠手工做,那簡直是個災難,利索當然我們會想寫個自動化處理程序(我們假設這個工具叫做RepoUtil)來幫助我們解決這個問題.這個RepoUtil也會有版本管理之類的需求,因此我們也用Git對其管理,并為其創(chuàng)建對應的倉庫.此時整個項目的結構如下:
這里寫圖片描述
這里RepoUtil知道整個項目Pre下的每個子項目(即維護子項目的列表),同時需要提供對這些子項目的管理功能,比如統(tǒng)一創(chuàng)建分支等.但是從"單一職責"角度來看,RepoUitl這個工具的功能過于復雜,我們完全可以將維護子項目列表這個功能抽取出來作為一個新項目sub_projects,因為子項目也會變化,因此,為其創(chuàng)建對應的倉庫,并用Git管理,這樣的化,RepoUtil只需要通過簡單的對ub_projects進行依賴即可,此時整個項目的結構如下:
這里寫圖片描述
AOSP項目結構和我上文的描述非常類似.repo工具對應RepoUtil,mainfest對應sub_projects.
總結一下:repo就是這么一種工具,由一系列python腳本組成,通過調用Git命令實現(xiàn)對AOSP項目的管理.
建立源碼文件夾
熟悉Git的同學都應該知道,我們需要為項目在本地創(chuàng)建對應的倉庫.同樣,這里為了方便對代碼進行管理,我們?yōu)槠鋭?chuàng)建一個文件夾.這里我在當前用戶目錄下創(chuàng)建了source文件夾,后面所有的下載的源碼和編譯出的產物也都放在這里,命令如下:
mkdir sourcecd source
初始化倉庫
我們將上面的source文件夾作為倉庫,現(xiàn)在需要來初始化這個倉庫了.通過執(zhí)行初始化倉庫命令可以獲取AOSP項目master上最新的代碼并初始化該倉庫,命令如下:
repo init -u
或者使用:
repo init -u git://aosp.tuna.tsinghua.edu.cn/aosp/platform/manifest
兩者實現(xiàn)的效果一致,僅僅只是協(xié)議不同.
如果執(zhí)行該命令的過程中,如果提示無法連接到 gerrit.googlesource.com,那么我們只需要編輯 ~/bin/repo文件,找到REPO_URL這一行,然后將其內容修改為:
REPO_URL = ''
然后重新執(zhí)行上述命令即可.
補充說明
不帶參數的manifest命令用于獲取master上最新的代碼,但是可以通過-b參數指定獲取某個特定的android版本,比如我們想要獲取android-4.0.1_r1分支,那么命令如下:
repo init -u -b android-4.0.1_r1
(AOSP項目當前所有的分支列表參看:分支列表)
同步源碼到本地
初始化倉庫之后,就可以開始正式同步代碼到本地了,命令如下:
repo sync
以后如果需要同步最新的遠程代碼到本地,也只需要執(zhí)行該命令即可.在同步過程中,如果因為網絡原因中斷,使用該命令繼續(xù)同步即可.不出意外,5個小時便可以將全部源碼同步到本地.所以呢,這個過程可以放在晚上睡覺期間完成.
(提示:一定要確定代碼完全同步了,不然在下面編譯過程出現(xiàn)的錯誤會讓你痛不欲生,不確定的童鞋可以多用repo sync同步幾次)
構建編譯環(huán)境
源碼下載完成后,就可以構建編譯環(huán)境了.在開始之前,我們先來看看一些編譯要求:
1. 硬件要求:
64位的操作系統(tǒng)只能編譯2.3.x以上的版本,如果你想要編譯2.3.x以下的,那么需要32位的操作系統(tǒng).
磁盤空間越多越好,至少在100GB以上.意思就是,你可以去買個大點的硬盤了啊
如果你想要在是在虛擬機運行l(wèi)inux,那么至少需要16GB的RAM/swap.
(實際上,我非常不推薦在虛擬機中編譯2.3.x以上的代碼.)
2. 軟件要求:
1. 操作系統(tǒng)要求
在AOSP開源中,主分支使用Ubuntu長期版本開發(fā)和測試的,因此也建議你使用Ubuntu進行編譯,下面我們列出不同版本的的Ubuntu能夠編譯那些android版本:
Android版本
編譯要求的Ubuntu最低版本
Android 6.0至AOSP master ? ?Ubuntu 14.04 ?
Android 2.3.x至Android 5.x ? ?Ubuntu 12.04 ?
Android 1.5至Android 2.2.x ? ?Ubuntu 10.04 ?
2. JDK版本要求
除了操作系統(tǒng)版本這個問題外,我們還需要關注JDK版本問題,為了方便,同樣我們也列出的不同Android版本的源碼需要用到的JDK版本:
Android版本
編譯要求的JDK版本
AOSP的Android主線 ? ?OpenJDK 8 ?
Android 5.x至android 6.0 ? ?OpenJDK 7 ?
Android 2.3.x至Android 4.4.x ? ?Oracle JDK 6 ?
Android 1.5至Android 2.2.x ? ?Oracle JDK 5 ?
更具體的可以參看:Google源碼編譯要求
我現(xiàn)在在Ubuntu 16.04下編譯AOSP主線代碼,因此需要安裝OpenJDK 8,執(zhí)行命令如下:
sudo apt-get install openjdk-8-jdk
如果你需要在Ubuntu 14.04下編譯AOSP主線代碼,同樣需要安裝OpenJDK 8,此時需要執(zhí)行如下命令:
sudo apt-get updatesudo apt-get install openjdk-8-jdk
如果你要編譯的是Android 5.x到android 6.0之間的系統(tǒng)版本,需要采用openjdk7.但是在Ubuntu 15.04及之后的版本的在線安裝庫中只支持openjdk8和openjdk9的安裝.因此,如果你想要安裝openjdk 7需要首先設置ppa:
sudo add-apt-repository ppa:openjdk-r/ppa sudo apt-get update
然后再執(zhí)行安裝命令:
sudo apt-get install openjdk-7-jdk
有時候,我們需要編譯不同版本的android系統(tǒng),就可能使用不同的jdk版本.關于jdk版本切換,可以使用如下命令:
sudo update-alternative --config javasudo update-alternative --config javac
3. 其他要求
Google官方構建編譯環(huán)境指南中已經說明了Ubuntu14.04,Ubuntu 12.04,Ubuntu 10.04需要添加的依賴,這里我們就不做介紹了.我原先以為,Ubuntu16.04的設置和Ubuntu14.04的依賴設置應該差不多,但是只能說too young too simple.
下面是Ubuntu16.04中的依賴設置:
sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386 sudo apt-get install tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386 sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-devsudo apt-get install git-core gnupg flex bison gperf build-essential ?sudo apt-get install zip curl zlib1g-dev gcc-multilib g++-multilib sudo apt-get install libc6-dev-i386 sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4sudo apt-get install lib32z-dev ccache
(其中幾個命令中參數是重復的,但不妨礙我們)
初始化編譯環(huán)境
確保上述過程完成后,接下來我們需要初始化編譯環(huán)境,命令如下:
source build/envsetup.sh
執(zhí)行該命令結果如下:
這里寫圖片描述
不難發(fā)現(xiàn)該命令只是引入了其他執(zhí)行腳本,至于這些腳本做什么,目前不在本文中細說.
該命令執(zhí)行成功后,我們會得到了一些有用的命令,比如最下面要用到的lunch命令.
編譯源碼
初始化編譯環(huán)境之后,就進入源碼編譯階段.這個階段又包括兩個階段:選擇編譯目標和執(zhí)行編譯.
選擇編譯目標
通過lunch指令設置編譯目標,所謂的編譯目標就是生成的鏡像要運行在什么樣的設備上.這里我們設置的編譯目標是aosp_arm64-eng,因此執(zhí)行指令:
lunch aosp_arm64-eng
編譯目標格式說明
編譯目標的格式:BUILD-BUILDTYPE,比如上面的aosp_arm-eng的BUILD是aosp_arm,BUILDTYPE是eng.
什么是BUILD
BUILD指的是特定功能的組合的特定名稱,即表示編譯出的鏡像可以運行在什么環(huán)境.其中,aosp(Android Open Source Project)代表Android開源項目;arm表示系統(tǒng)是運行在arm架構的處理器上,arm64則是指64位arm架構;處理器,x86則表示x86架構的處理器;此外,還有一些單詞代表了特定的Nexus設備,下面是常用的設備代碼和編譯目標,更多參考官方文檔
|受型號|設備代碼|編譯目標|
|---|----|---|
|Nexus 6P|angler|aosp_angler-userdebug|
|Nexus 5X|bullhead|aosp_bullhead-userdebug|
|Nexus 6|shamu|aosp_shamu-userdebug|
|Nexus 5|hammerhead|aosp_hammerhead-userdebug|
提示:如果你沒有Nexus設備,那么通常選擇arm或者x86即可
什么是BUILDTYPE
BUILD TYPE則指的是編譯類型,通常有三種:
-user:代表這是編譯出的系統(tǒng)鏡像是可以用來正式發(fā)布到市場的版本,其權限是被限制的(如,沒有root權限,不鞥年dedug等)
-userdebug:在user版本的基礎上開放了root權限和debug權限.
-eng:代表engineer,也就是所謂的開發(fā)工程師的版本,擁有最大的權限(root等),此外還附帶了許多debug工具
了解編譯目標的組成之后,我們就可以根據自己目前的情況選擇了.那不知道編譯目標怎么辦?
我們只需要執(zhí)行不帶參數的lunch指令,稍后,控制臺會列出所有的編譯目標,如下:
這里寫圖片描述
接著我們只需要輸入相應的數字即可.
來舉個例子:你沒有Nexus設備,只想編譯完后運行看看,那么就可以選擇aosp_arm-eng.
(我在ubuntu 16.04(64位)中編譯完成后啟動虛擬機時,卡在黑屏,嘗試編譯aosp_arm64-eng解決.因此,這里我使用了aosp_arm64-eng)
開始編譯
通過make指令進行代碼編譯,該指令通過-j參數來設置參與編譯的線程數量,以提高編譯速度.比如這里我們設置8個線程同時編譯:
make -j8
需要注意的是,參與編譯的線程并不是越多越好,通常是根據你機器cup的核心來確定:core*2,即當前cpu的核心的2倍.比如,我現(xiàn)在的筆記本是雙核四線程的,因此根據公式,最快速的編譯可以make -j8.
(通過cat /proc/cpuinfo查看相關cpu信息)
如果一切順利的化,在幾個小時之后,便可以編譯完成.看到### make completed successfully (01:18:45(hh:mm:ss)) ###表示你編譯成功了.
運行模擬器
在編譯完成之后,就可以通過以下命令運行Android虛擬機了,命令如下:
source build/envsetup.shlunch(選擇剛才你設置的目標版本,比如這里了我選擇的是2)emulator
如果你是在編譯完后立刻運行虛擬機,由于我們之前已經執(zhí)行過source及l(fā)unch命令了,因此現(xiàn)在你只需要執(zhí)行命令就可以運行虛擬機:
emulator
不出意外,在等待一會之后,你會看到運行界面:
這里寫圖片描述
補充
既然談到了模擬器運行,這里我們順便介紹模擬器運行所需要四個文件:
Linux Kernel
system.img
userdate.img
ramdisk.img
如果你在使用lunch命令時選擇的是aosp_arm-eng,那么在執(zhí)行不帶參數的emualtor命令時,Linux Kernel默認使用的是/source/prebuilds/qemu-kernel/arm/kernel-qemu目錄下的kernel-qemu文件;而android鏡像文件則是默認使用source/out/target/product/generic目錄下的system.img,userdata.img和ramdisk.img,也就是我們剛剛編譯出來的鏡像文件.
上面我在使用lunch命令時選擇的是aosp_arm64-eng,因此linux默認使用的/source/prebuilds/qemu-kernel/arm64/kernel-qemu下的kernel-qemu,而其他文件則是使用的source/out/target/product/generic64目錄下的system.img,userdata.img和ramdisk.img.
當然,emulator指令允許你通過參數制定使用不同的文件,具體用法可以通過emulator --help查看
模塊編譯
除了通過make命令編譯可以整個android源碼外,Google也為我們提供了相應的命令來支持單獨模塊的編譯.
編譯環(huán)境初始化(即執(zhí)行source build/envsetup.sh)之后,我們可以得到一些有用的指令,除了上邊用到的lunch,還有以下:
- 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.
其中mmm指令就是用來編譯指定目錄.通常來說,每個目錄只包含一個模塊.比如這里我們要編譯Launcher2模塊,執(zhí)行指令:
mmm packages/apps/Launcher2/
稍等一會之后,如果提示:
### make completed success fully ###
即表示編譯完成,此時在out/target/product/gereric/system/app就可以看到編譯的Launcher2.apk文件了.
重新打包系統(tǒng)鏡像
編譯好指定模塊后,如果我們想要將該模塊對應的apk集成到系統(tǒng)鏡像中,需要借助make snod指令重新打包系統(tǒng)鏡像,這樣我們新生成的system.img中就包含了剛才編譯的Launcher2模塊了.重啟模擬器之后生效.
單獨安裝模塊
我們在不斷的修改某些模塊,總不能每次編譯完成后都要重新打包system.img,然后重啟手機吧?有沒有什么簡單的方法呢?
在編譯完后,借助adb install命令直接將生成的apk文件安裝到設備上即可,相比使用make snod,會節(jié)省很多事件.
補充
我們簡單的來介紹out/target/product/generic/system目錄下的常用目錄:
Android系統(tǒng)自帶的apk文件都在out/target/product/generic/system/apk目錄下;
一些可執(zhí)行文件(比如C編譯的執(zhí)行),放在out/target/product/generic/system/bin目錄下;
動態(tài)鏈接庫放在out/target/product/generic/system/lib目錄下;
硬件抽象層文件都放在out/targer/product/generic/system/lib/hw目錄下.
SDK編譯
如果你需要自己編譯SDK使用,很簡單,只需要執(zhí)行命令make sdk即可.
錯誤集合
在編譯過程中,遇到的大部分錯誤都可以在google搜到解決方案.這里只列舉幾個常見的錯誤:
錯誤一: You are attemping to build with the incorrect version.具體錯誤如下:
請點擊輸入圖片描述
這里寫圖片描述
如果你認真看了構建環(huán)境的的要求,那么這個錯誤是可以避免的.當然,這個問題也很容易解決:安裝openjdk 8,別忘了使用sudo update-alternative命令切換jdk版本.
錯誤二: Out of memory error.具體錯誤如下:
請點擊輸入圖片描述
這里寫圖片描述
這個錯誤比較常見,尤其是在編譯AOSP主線代碼時,常常會因為JVM heap size太小而導致該錯誤.
此時有兩種解決方法:
方法一:
在編譯命令之前,修改prebuilts/sdk/tools/jack-admin文件,找到文件中的這一行:
JACK_SERVER_COMMAND="java -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -cp $LAUNCHER_JAR $LAUNCHER_NAME"
然后在該行添加-Xmx4096m,如:
JACK_SERVER_COMMAND="java -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -Xmx4096m -cp $LAUNCHER_JAR $LAUNCHER_NAME"
然后再執(zhí)行time make -8j
方法二:
在控制臺執(zhí)行以下命令:
export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4096m"out/host/linux-x86/bin/jack-admin kill-serverout/host/linux-x86/bin/jack-admin start-server
如圖:
請點擊輸入圖片描述
這里寫圖片描述
執(zhí)行完該命令后,再使用make命令繼續(xù)編譯.某些情況下,當你執(zhí)行jack-admin kill-server時可能提示你命令不存在,此時去你去out/host/linux-x86/bin/目錄下會發(fā)現(xiàn)不存在jack-admin文件.如果我是你,我就會重新repo sync下,然后從頭來過.
錯誤三:使用emulator時,虛擬機停在黑屏界面,點擊無任何響應.此時,可能是kerner內核問題,解決方法如下:
執(zhí)行如下命令:
./out/host/linux-x86/bin/emulator -partition-size 1024 -kernel ./prebuilts/qemu-kernel/arm/kernel-qemu-armv7
通過使用kernel-qemu-armv7內核 解決模擬器等待黑屏問題.而-partition-size 1024 則是解決警告: system partion siez adjusted to match image file (163 MB 66 MB)
如果你一開始編譯的版本是aosp_arm-eng,使用上述命令仍然不能解決等待黑屏問題時,不妨編譯aosp_arm64-eng試試.
結束吧
到現(xiàn)在為止,你已經了解了整個android編譯的流程.除此之外,我也簡單的說明android源碼的多倉庫管理機制.下面,不妨自己動手嘗試一下.
android源碼中有著許多的源代碼,其中有c和c++編寫的也有java編寫,這些代碼需要通過重新編譯后才能在android機器上運行的!當然你修改源碼,改完源碼后還是需要對源碼進行編譯的編譯的!android系統(tǒng)源碼的整體編譯需要很長時間,所以一般否是分開來編譯的!這樣縮短了編譯的等待時間,而且也實現(xiàn)了不同人對不同板塊代碼的修改和編譯的分工了!
編譯android系統(tǒng)源碼準備工作:
下載android源碼
在windows上用gitbash ,git clone 下載代碼
在linux上這樣下載
創(chuàng)建~/bin目錄,用來存放repo程序,如下:
$ cd ~
$ mkdir bin
初始化repo
repo是android對git的一個封裝,簡化了一些git的操作。
創(chuàng)建工程目錄:
$ mkdir android
$ cd android
下載repo腳本并使其可執(zhí)行:
$ curl ~/bin/repo
$ chmod a+x ~/bin/repo
repo初始化:
$ repo init -u git://android.git.kernel.org/platform/manifest.git
在此過程中需要輸入名字和email地址。初始化成功后,會顯示:
repo initialized in /android
在~/android下會有一個.repo的隱藏目錄。
5)同步源代碼
$ repo sync
這一步要很久很久。
安裝linux系統(tǒng),推薦ubuntu,圖形界面
安裝編譯需要的支持包
$ 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
安裝java6.0
$ sudo apt-get install sun-java6-jdk
配置java環(huán)境
sudo gedit ~/.bashrc
末尾加上
JAVA_HOME=/usr/lib/jvm/java-6-sun
JRE_HOME=${JAVA_HOME}/jre
export ANDROID_JAVA_HOME=$JAVA_HOME
export CLASSPATH=.:${JAVA_HOME}/lib:$JRE_HOME/lib:$CLASSPATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export JAVA_HOME;
export JRE_HOME;
export CLASSPATH;
HOME_BIN=~/bin/
export PATH=${PATH}:${JAVA_PATH}:${HOME_BIN};
sudo source ~/.bashrc
是環(huán)境變量生效
編譯android源碼,并得到~/android/out目錄
$ cd ~/andoird
$ make
這一過程很久。
這就編譯結束了
Android源碼目錄下的build/envsetup.sh文件,描述編譯的命令
- 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.
要想使用這些命令,首先需要在android源碼根目錄執(zhí)行. build/envsetup.sh 腳本設置環(huán)境
m:編譯所有的模塊
mm:編譯當前目錄下的模塊,當前目錄下要有Android.mk文件
mmm:編譯指定路徑下的模塊,指定路徑下要有Android.mk文件
下面舉個例子說明,假設我要編譯android下的\hardware\libhardware_legacy\power模塊,當前目錄為源碼根目錄,方法如下:
1、. build/envsetup.sh
2、mmm hardware/libhardware_legacy/power/
編譯完后 運行 make snod
會重新將你改過的模塊打入到system.img中
文章名稱:android源碼編譯,android源碼編譯暫停方法
URL網址:http://www.rwnh.cn/article16/dsdjedg.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供外貿建站、網站設計、軟件開發(fā)、用戶體驗、網站導航、服務器托管
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)