1. 程式人生 > >Android編譯系統詳解(一)——build/envsetup.sh

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 什麼是交叉編譯 對於沒有做過嵌入式程式設計的人,可能不太理解交叉編譯的概念,那麼什麼是交叉編譯?它有什麼作用? 在解釋什麼是交叉編譯之前,先要明白什麼是本地編譯。 本地編譯 本地編譯可以理解為,在當前編譯平臺下,編