Android編譯系統詳解(一)——build/envsetup.sh
http://www.cloudchou.com/android/post-134.html
準備好編譯環境後,編譯Rom的第一步是 source build/envsetup.sh,該步驟把envsetup.sh裡的函式宣告為當前會話終端可用的命令。這些命令能讓我們切換目錄,提交程式碼,編譯Rom更方便。如果記不住所有命令,只要你記住hmm就可以了,也可通過hmm命令看到支援的命令列表。
1. 命令分類:
1.1 編譯用的命令
命令名稱 | 使用方式 | 說明 |
---|---|---|
breakfast 別名bib |
breakfast [product] 示例: breakfast i9100 breakfast cm_i9100-userdebug |
選擇產品 product格式: device 或者 device-build_variant 先從網上下載cm支援的產品列表 product是使用者要編譯的目標產品,例如find5或者i9100 如果選擇device-build_variant,並且是cm支援的device,一般會以cm_開頭,比如cm_i9100 如果未選擇編譯產品,那麼會彈出許多product,讓使用者選擇 這裡的product列表僅包含從網上下載的產品,不包含只有本地支援的產品 |
lunch |
lunch [product] 示例: lunch cm_i9100-userdebug |
選擇產品 product格式: build-build_variant 不再從 如果[product]為空,意味著未選擇編譯產品,也會彈出許多product,讓使用者選擇, 這裡的product列表是使用者在執行source build/envsetup.sh時,including了一些shell指令碼,從而新增至產品列表的 |
brunch | brunch [product] |
選擇產品並編譯 product格式: device 或者 device-build_variant 呼叫breakfast選擇編譯產品 然後呼叫mka bacon編譯 |
m | m [targetlist] |
編譯選中目標 示例:m otatools bacon 並沒有呼叫schedtool 充分利用所有核編譯 |
mm |
mm [mka] [targetlist] 示例: mm mka |
編譯選中目標或者當前目錄所在專案 若有mka,會呼叫mka進行編譯 如果當前目錄在頂層目錄,會編譯指定的所有目標 如果不在頂層目錄,會編譯當前目錄所在的工程 |
mmm | mmm [directory:[modulist]] -arglist |
編譯指定目錄下的模組 directory可以為以下特殊目標: snod dist mka showcommands 若指定了mka,將利用mka進行編譯 示例: mmm bootable/recovery: recovery 或者 mmm bootable/recovery |
mka | mka [targetlist] |
編譯指定目標列表 將利用SCHED_BATCH編譯指定所有目標,這樣能充分利用所有CPU |
eat | eat |
刷機 在/cahce/recovery/command檔案寫上如下命令–sideload,重啟裝置至recovery,等待裝置進入sideload狀態,呼叫adb sideload進行刷機 |
omnom | omnmon [product] | 編譯ROM並刷ROM至裝置 |
tapas | tapas [<App1> <App2> ...] [arm|x86|mips] [eng|userdebug|user] | Configures the build to build unbundled apps |
cmka | cmka [targetlist] | Cleans and builds using mka |
installboot | installboot |
安裝boot 利用$OUT/recovery/root/etc/recovery.fstab找到boot所在分割槽以及分割槽型別,找到分割槽後,先將boot.img上傳至/cache下,需要將核心需要載入的模組$OUT/system/lib/modules/*上傳至/system/lib/modules/,然後如果是mtd分割槽就利用flash_image刷至相應的分割槽,否則利用dd刷至相應的分割槽 |
installrecovery | installrecovery |
安裝recovery 與安裝boot類似 |
1.2 檢視程式碼時的輔助命令
命令名稱 | 使用方式 | 說明 |
---|---|---|
cgrep | cgrep keyword |
在C,C++程式碼中搜索指定關鍵字 呼叫find查詢C/C++程式碼檔案(包括標頭檔案),並且排除了不用的資料夾,在找到的檔案中用grep搜尋關鍵字 |
jgrep | jgrep keyword |
在java程式碼中搜索指定關鍵字 呼叫find查詢java程式碼檔案,並且排除了不用的資料夾,在找到的檔案中用grep搜尋關鍵字 |
resgrep | resgrep keyword |
在資源xml檔案中搜索指定關鍵字 呼叫find在當前資料夾查詢下res子目錄裡找xml檔案,並且排除了不用的資料夾,在找到的檔案中用grep搜尋關鍵字 |
croot | croot | 切換至Android根目錄 |
cout | cout | 切換至prodcut的out目錄 |
cproj | cproj | 從某個工程的非常深的子目錄,可迅速切換至工程的根目錄 |
get_build_var | get_build_var build_var |
獲取某個編譯變數的值, 一般是路徑 |
get_abs_build_var | get_abs_build_var |
獲取某個編譯變數的值, 是絕對路徑 |
findmakefile | 列印當前目錄所在工程的Android.mk的檔案路徑 | |
printconfig | 列印各種編譯變數的值 | |
print_lunch_menu | 列印lunch可選擇的各種product | |
godir | 切換至使用者輸入的檔案所在的目錄 | |
repodiff | 呼叫git進行diff,檢視當前修改的東西 |
1.3 輔助函式
命令名稱 | 使用方式 | 說明 |
---|---|---|
add_lunch_combo |
增加呼叫lunch命令時的選擇項 示例: add_lunch_combo full_galaxys2att-eng |
|
check_product | 檢查產品看CM是否能支援編譯 | |
check_variant | 檢查TARGET_BUILD_VARIANT,看其值是否有效,可能的值只能為user,userdebug,eng | |
choosecombo | 呼叫choosetype,chooseproduct,choosevariant等函式,確定TARGET_PRODUCT,TARGET_BUILD_TYPE,TARGET_BUILD_VARIANT | |
chooseproduct | 讓使用者輸入一個product的名字,預設為full,最終確定TARGET_PRODUCT, | |
choosetype | 選擇編譯型別即TARGET_BUILD_TYPE,可能的值為debug,release | |
choosevariant | 讓使用者選擇編譯變數TARGET_BUILD_VARIANT,可能的值為user,userdebug,eng | |
dopush |
alias mmp=’dopush mm’ alias mmmp=’dopush mmm’ alias mkap=’dopush mka’ alias cmkap=’dopush cmka’ |
|
fixup_common_out_dir | 建立$(OUT_DIR)/target/common目錄 | |
getprebuilt | 得到prebuilt的路徑 | |
getsdcardpath | 獲取Sd卡路徑 | |
gettargetarch | 獲取TARGET_ARCH的值 | |
gettop | 獲取Android原始碼根目錄 | |
set_java_home | 設定java的主目錄 | |
setpaths | 將編譯要用到的一些路徑新增到環境變數PATH裡 | |
set_sequence_number | export BUILD_ENV_SEQUENCE_NUMBER=10 | |
set_stuff_for_environment | 設定PROMPT_COMMAND變數,java_home,PATH目錄,set_sequence_number | |
settitle | 如果STAY_OFF_MY_LAWN為空,設定PROMPT_COMMAND變數,會改變SecureCrt終端視窗顯示的名字 |
1.4 除錯相關
命令名稱 | 使用方式 | 說明 |
---|---|---|
gdbclient |
gdbclient exename (progname|pid) | gdb除錯 |
pid |
pid exename | 檢視某個可執行程式對應的程序id |
getbugreports | 將bug報告從裝置上拉到本地,bug報告存放於目錄/sdcard/bugreports, | |
getlastscreenshot | 獲取最後一張截圖 | |
getscreenshotpath | 獲取螢幕截圖的路徑 | |
isviewserverstarted |
判斷viewserver是否已啟動 adb shell service call window 3 |
|
key_back | 模擬按返回鍵 | |
key_home | 模擬按Home鍵 | |
key_menu | 模擬按選單鍵 | |
runtest | 呼叫development/testrunner/runtest.py,進行測試 | |
smoketest | 利用SmokeTestApp.apk,SmokeTest.apk對系統進行一個smoke test | |
startviewserver | adb shell service call window 1 i32 $port | |
stopviewserver | adb shell service call window 2 | |
systemstack | dump the current stack trace of all threads in the system process to the usual ANR traces file | |
tracedmdump | 呼叫q2dm將系統堆疊匯出來,並利用dmtracedump將其轉為可讀的html檔案 |
1.5 提交程式碼相關命令
命令名稱 | 使用方式 | 說明 |
---|---|---|
aospremote | Add git remote for matching AOSP repository | |
cmgerrit | 從CM拉原始碼,或者將原始碼提交到gerrit給比人稽核,直接敲這個命令可得到該命令的使用幫助,最終呼叫Git完成命令功能 | |
cmrebase | 和git的rebase 衍合類似,我們不做程式碼提交,故此沒必要 | |
cmremote | Add git remote for CM Gerrit Review | |
makerecipe | 將原生代碼推送至git倉庫 | |
repopick | Utility to fetch changes from Gerrit,可選項有–ignore-missing,–start-branch,–abandon-first,–auto-branch | |
reposync | Parallel repo sync using ionice and SCHED_BATCH |
2. source build/envsetup.sh 執行流程
envsetup.sh 定義了很多函式,除此之外還執行了其它操作,程式碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
VARIANT_CHOICES=(user userdebug eng),# TARGET_BUILD_VARIANT變數的可能值 #LUNCH_MENU_CHOICES是供使用者選擇的prodcut列表, #每次source build/envsetup.sh時需重置變數LUNCH_MENU_CHOICES #不然後續的include vendor/cm/vendorsetup.sh時會繼續新增產品至變數LUNCH_MENU_CHOICES裡, #導致出現很多重複產品 unset LUNCH_MENU_CHOICES add_lunch_combo full-eng #預設新增full-eng,full_mips-eng等4個產品 add_lunch_combo full_x86-eng add_lunch_combo vbox_x86-eng add_lunch_combo full_mips-eng alias bib=breakfast#給breakfast起別名 complete -F _lunch lunch #給lunch新增tab提示 case `uname -s` in #定義sgrep函式 在所有工程型別程式碼裡搜尋 Darwin) function sgrep() { find -E . -name .repo -prune -o -name .git -prune -o -type f \ -iregex '.*\.(c|h|cpp|S|java|xml|sh|mk)' -print0 \ | xargs -0 grep --color -n "[email protected]" } ;; *) function sgrep() { find . -name .repo -prune -o -name .git -prune -o -type f \ -iregex '.*\.\(c\|h\|cpp\|S\|java\|xml\|sh\|mk\)' -print0 \ | xargs -0 grep --color -n "[email protected]" } ;; esac export -f cmremote export -f aospremote alias mmp='dopush mm' #定義更多編譯後push到裝置的函式的操作 alias mmmp='dopush mmm' alias mkap='dopush mka' alias cmkap='dopush cmka' if [ "x$SHELL" != "x/bin/bash" ]; then #只支援Bash終端 case `ps -o command -p $$` in *bash*) ;; *) echo "WARNING: Only bash is supported," \ "use of other shell would lead to erroneous results" ;; esac fi #Execute the contents of any vendorsetup.sh files we can find. #source vendor和device下能找到的所有vendorsetup.sh for f in `/bin/ls vendor/*/vendorsetup.sh vendor/*/*/vendorsetup.sh device/*/*/vendorsetup.sh 2> /dev/null` do echo "including $f" . $f done unset f #source目錄 sdk/bash_completion vendor/cm/bash_completion下的bash指令碼, #能提供tab提示 addcompletions export ANDROID_BUILD_TOP=$(gettop) |
2.1 執行的vendorsetup.sh有:
在envsetup.sh裡將執行vendor和device目錄及各自子目錄下所有的vendorsetup.sh,這些vendorsetup.sh做的事情是呼叫add_lunch_combo將它們各自的產品新增到 LUNCH_MENU_CHOICES 變數裡
#執行cm的vendorsetup.sh將從網上下載cm支援的產品列表,並新增至LUNCH_MENU_CHOICES
vendor/cm/vendorsetup.sh
#將新增mini_armv7a_neon產品 add_lunch_combo mini_armv7a_neon-userdebug
device/generic/armv7-a-neon/vendorsetup.sh
#add_lunch_combo mini_armv7a-userdebug
device/generic/armv7-a/vendorsetup.sh
#add_lunch_combo mini_mips-userdebug
device/generic/mips/vendorsetup.sh
#add_lunch_combo mini_x86-userdebug
device/generic/x86/vendorsetup.sh
#add_lunch_combo cm_jflteatt-eng
device/samsung/jflteatt/vendorsetup.sh
# add_lunch_combo full_panda-userdebug
device/ti/panda/vendorsetup.sh
# add_lunch_combo zte_blade-eng
#add_lunch_combo zte_blade-userdebug
device/zte/blade/vendorsetup.sh
2.2 執行的completion bash有:
在envsetup.sh裡將執行sdk/bash_completion和vendor/cm/bash_completion目錄下的bash指令碼,這些bash指令碼主要是為命令提供tab支援,有了這些tab支援,輸入命令後如果某個選項忘記了,只需要敲tab鍵,就能獲得提示,使用命令更加方便
including sdk/bash_completion/adb.bash
including vendor/cm/bash_completion/git.bash
including vendor/cm/bash_completion/repo.bash
分別對應adb,git,repo的tab提示
相關推薦
Android編譯系統詳解(一)——build/envsetup.sh
http://www.cloudchou.com/android/post-134.html 準備好編譯環境後,編譯Rom的第一步是 source build/envsetup.sh,該步驟把envsetup.sh裡的函式宣告為當前會話終端可用的命令。這些命令能讓我們
Android編譯系統詳解(一)
++++++++++++++++++++++++++++++++++++++++++ 本文系本站原創,歡迎轉載! 轉載請註明出處: ++++++++++++++++++++++++++++++++++++++++++ Android的優勢就在於其開源,手機和平板
Android編譯系統詳解(三)
++++++++++++++++++++++++++++++++++++++++++本文系本站原創,歡迎轉載! 轉載請註明出處:++++++++++++++++++++++++++++++++++++++++++前面兩節講解了自定義Android編譯項和建立Product產品
android編譯系統分析(一)source build/envsetup.sh與lunch
雖然已經有很多人分析過Android的編譯系統的程式碼了,我也看過他們的部落格,也學到了不少知識,但單純的看別人分析,終究還是理解的不深入,所以,我還是要自己再認真的分析一遍。 想想我們編譯android系統的過程: 首先:source build/envsetup
NTFS檔案系統詳解(一)之硬碟基本資訊
本文參考自部落格 一般硬碟正面貼有產品標籤,主要包括廠家資訊和產品資訊,如商標、型號、序列號、生產日期、容量、引數和主從設定方法等。這些資訊是正確使用硬碟的基本依據,下面將逐步介紹它們的含義。 硬碟主要由盤體、控制電路板和介面部件等組成,如圖1-1所示。
Android許可權系統詳解及管理
系統是執行在Linux核心上的,Android與Linux分別有自己的一套嚴格的安全及許可權機制, Android系統許可權相關的內容, (一)linux檔案系統上的許可權 -rwxr-x--x system system 4156 2012-0
Android openGl開發詳解(一)——繪製簡單圖形
學習五部曲,弄清楚5個W一個H(when(什麼時候使用)、where(在哪個地方使用?)、who(對誰使用)、what(是個什麼東西)、why(為什麼要這麼用?).一個H即:how(到底該怎麼用?)),基本的概念篇主要圍繞這幾個方面進行分析
Android WebView 開發詳解(一)
概覽: Android WebView在Android平臺上是一個特殊的View, 他能用來顯示網頁,這個類可以被用來在你的app中僅僅顯示一張線上的網頁,還可以用來開發瀏覽器。WebView內部實現是採用渲染引擎來展示view的內容,提供網頁前進後退,網頁
Android檔案系統詳解
前言 檔案系統一直是Android開發過程中經常接觸的東西。而關於內部儲存、外部儲存、外接儲存、私有儲存、公共儲存,以及訪問哪些檔案需要申請執行時許可權等問題,一直是許多開發者頭疼的問題。本文就將詳細地講解這些重要而模糊的知識點。 內部儲存 內部儲存主
android 編譯原理詳解
Android編譯過程詳解(一):http://www.cnblogs.com/mr-raptor/archive/2012/06/07/2540359.html Android的優勢就在於其開源,手機和平板生產商可以根據自己的硬體進行個性定製自己的手機產品,如小米
Android Paging library詳解(一)
官方文件翻譯 文章目錄 1.概覽 1.1 庫架構 1.2 支援不同的資料架構 1.2.1 網路獲取或者資料庫 1.2.2 網路和資料庫同時獲取 1.2.3 處理網路錯誤 1.2.4 更新
Android編譯系統分析之幾個關鍵點(一)
已開通新的部落格,後續文字都會發到新部落格 http://www.0xfree.top Android 編譯系統解析系列文件 解析lunch的執行過程以及make執行過程中include檔案的順序 Android編譯系統分析之lunch分析 Android
Android編譯系統分析之envsetup.sh
已開通新的部落格,後續文字都會發到新部落格 http://www.0xfree.top 我們用幾個問題來解釋這篇文章要討論的內容 為什麼用\cd 而不用cd 在android原始碼的提交中,我們發現了這個解釋: Use “\cd” to disable al
Android 融雲IM整合以及使用詳解(一)
Android 融雲IM整合以及使用詳解(一) 整合 1.具體的整合步驟就不在詳細介紹,我們只說乾貨,附上融雲IM官方文件地址,裡面有更為詳細的整合介紹 https://www.rongcloud.cn/docs/#necessary 整合後效果 2.Android
Android系統詳解之獲取圖片和視訊的縮圖
從Android 2.2開始系統新增了一個縮圖ThumbnailUtils類,位於framework的android.media.ThumbnailUtils位置,可以幫助我們從mediaprovider中獲取系統中的視訊或圖片檔案的縮圖,該類提供了三種靜態方法可以直接呼
Android 4.4 Graphic系統詳解(2) VSYNC的生成
VSYNC 的概念 VSYNC(Vertical Synchronization)是一個相當古老的概念,對於遊戲玩家,它有一個更加大名鼎鼎的中文名字—-垂直同步。 “垂直同步(vsync)”指的是顯示卡的輸出幀數和螢幕的垂直重新整理率相同,這完全是一個CRT顯
[Android]ToolBar使用詳解(一)——專案配置
private Toolbar mToolbar; private WebFragment mWebFragment; private long mBeforeTime; @Override protected void onCreate(Bundle savedInst
Android Widget工作原理詳解(一) 最全介紹
Widget是安卓的一應用程式元件,學名視窗小部件,它是微型應用程式檢視, 可以嵌入到其他應用程式(如主螢幕)和接收資料定期更新。,可以使其他應用程式的外掛被稱為應用程式部件。使用者可以通過新增視窗小部件來新增自己喜歡的APPwidget ,widget主
Android開發之藍芽詳解(一)
一.概述 這篇文章是我學習Android開發官網以及網上一些其他文章總結而來,主要就是為了好好研究一下藍芽開發,看完這篇文章以後,我們就知道了怎樣使用藍芽API完成建立藍芽連線的必要四步:1.開啟藍芽;2.查詢附近已配對或可用的裝置;3.連線裝置;4.裝置間資
交叉編譯詳解 一 概念篇
第 1 章 交叉編譯簡介 1.1 什麼是交叉編譯 對於沒有做過嵌入式程式設計的人,可能不太理解交叉編譯的概念,那麼什麼是交叉編譯?它有什麼作用? 在解釋什麼是交叉編譯之前,先要明白什麼是本地編譯。 本地編譯 本地編譯可以理解為,在當前編譯平臺下,編