Androidシステムコンパイル環境変数の設定

11526 ワード

コンパイルする前に私たちは普通どうしますか?
androidをコンパイルする前に、次のようなコマンドを入力します.
. ./bulid/envsetup.sh
...
lunch
...
make
...
ここのenvsetup.shはandroidのコンパイル環境を設定し、デバイスタイプなどの様々な変数を初期化します.次は私が私のボードで上記のコマンドを実行した結果です.
mic@micpc:~/work/android4.0.4$ . ./build/envsetup.sh 
including device/moto/stingray/vendorsetup.sh
including device/moto/wingray/vendorsetup.sh
including device/samsung/smdk4x12/vendorsetup.sh
including sdk/bash_completion/adb.bash

##    ,  envsetup.sh    device        vendorsetup.sh  。
##  adb.bash   ?     ,       。
##“ sdk/bash_completion    adb.bash            ,      adb   bash completion   。
##    ,        ,     adb        ,   tab                 ”


#        lunch  ,      envsetup.sh    。
mic@micpc:~/work/android4.0.4$ lunch

You're building on Linux

Lunch menu... pick a combo:
     1. full-eng
     2. full_x86-eng
     3. vbox_x86-eng
     4. full_stingray-userdebug
     5. full_wingray-userdebug
     6. full_smdk4x12-userdebug
     7. full_smdk4x12-eng

Which would you like? [full-eng] 6

##    ,         ,          ,     6,           ,                    。      ,
##       android     。

============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=4.0.4
TARGET_PRODUCT=full_smdk4x12
TARGET_BUILD_VARIANT=userdebug
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a-neon
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=IMM76D
============================================

envsetup.sh何の用だ?
/bulid/envsetup.shというスクリプトには多くの機能関数が実現されており,上のlunch,さらにm,mm,mmmなどがある.
vendorsetupをロードします.sh,lunchの追加
envsetupでshスクリプトの一番後ろに、
# Execute the contents of any vendorsetup.sh files we can find.
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

その役割はvendorディレクトリとdeviceディレクトリの下のvendorsetupを遍歴することである.sh,
1.echoでこのvnedorsetupをshプリントアウトは、私たちが前に見た「6.full_smdk 4 x 12-userdebug」というものです
2.通過(source)このvendorsetupをロードします.sh
実はshの役割は,対応するデバイスモデルとそのコンパイルタイプをLunchメニューにサポートすることである.例:
work/android4.0.4/device/samsung/smdk4x12/vendrosetup.sh内容は以下の通り
add_lunch_combo full_smdk4x12-userdebug
add_lunch_combo full_smdk4x12-eng

addを通ってlunch_comboはデバイスの型番などの情報を追加します.add_lunch_comboはどこですか?答えはenvsetupですsh中.
# Clear this variable.  It will be built up again when the vendorsetup.sh
# files are included at the end of this file.
unset LUNCH_MENU_CHOICES
function add_lunch_combo()
{
    local new_combo=$1
    local c
    for c in ${LUNCH_MENU_CHOICES[@]} ; do
        if [ "$new_combo" = "$c" ] ; then
            return
        fi
    done
    LUNCH_MENU_CHOICES=(${LUNCH_MENU_CHOICES[@]} $new_combo)
}

# add the default one here
add_lunch_combo full-eng                      ##   ,   lunch          ,      
add_lunch_combo full_x86-eng                  ##         LUNCH_MENU_CHOICES  ,     
add_lunch_combo vbox_x86-eng                  ##    ,full-eng full_x86-eng vbox_x86-eng

この関数の呼び出しからその作業過程を理解します.たとえば
add_lunch_combo full_smdk4x12-userdebug
可視add_lunch_comboはこの関数の名前ですfull_smdk 4 x 12-userdebugはこの関数の最初のパラメータです.
関数では、最初のパラメータの値を新しい変数new_に与えます.combo.そしてLUNCH_を巡るMENU_CHOICESという配列は、この配列に同じ選択肢があるかどうかを調べます.
LUNCH_に新しいオプションが追加されるのは、追加されていない場合のみです.MENU_CHOICES配列にあります.
${LUNCH_MENU_CHOICES[@]}は配列LUNCH_を表すMENU_CHOICESのすべての要素.
lunchの実装解析
lunchを入力した後、私が6を入力したように番号を入力するのを待っています.このプロセスはどのようなものですか.lunchの実装を見てみましょう.
function lunch()
{
    local answer

    if [ "$1" ] ; then
        answer=$1
    else
        print_lunch_menu
        echo -n "Which would you like? [full-eng] "
        read answer
    fi

    local selection=

    if [ -z "$answer" ]
    then
        selection=full-eng
    elif (echo -n $answer | grep -q -e "^[0-9][0-9]*$")
    then
        if [ $answer -le ${#LUNCH_MENU_CHOICES[@]} ]
        then
            selection=${LUNCH_MENU_CHOICES[$(($answer-1))]}
        fi
    elif (echo -n $answer | grep -q -e "^[^\-][^\-]*-[^\-][^\-]*$")
    then
        selection=$answer
    fi

    if [ -z "$selection" ]
    then
        echo
        echo "Invalid lunch combo: $answer"
        return 1
    fi

    export TARGET_BUILD_APPS=

    local product=$(echo -n $selection | sed -e "s/-.*$//")
    check_product $product
    if [ $? -ne 0 ]
    then
        echo
        echo "** Don't have a product spec for: '$product'"
        echo "** Do you have the right repo manifest?"
        product=
    fi

    local variant=$(echo -n $selection | sed -e "s/^[^\-]*-//")
    check_variant $variant
    if [ $? -ne 0 ]
    then
        echo
        echo "** Invalid variant: '$variant'"
        echo "** Must be one of ${VARIANT_CHOICES[@]}"
        variant=
    fi

    if [ -z "$product" -o -z "$variant" ]
    then
        echo
        return 1
    fi

    export TARGET_PRODUCT=$product
    export TARGET_BUILD_VARIANT=$variant
    export TARGET_BUILD_TYPE=release

    echo

    set_stuff_for_environment
    printconfig
}

1.lunch実行の場合は、パラメータ付きで実行してもよいし、パラメータなしで先に実行してもよい.
私たちは先にlunchして、車に戻って、この時あなたにパラメータを入力させて、私たちはもう1つの6あるいはその他を入力します;
lunch 6も直接入力できます.これも同じです.したがって,lunch開始時にlunch実行時にパラメータが付いていないと判断し,パラメータが付いている場合は変数answerにパラメータを付与する.
2.answerをチェックし、answerが空であるかどうかを判断し、空のデフォルトselectionがfull-engである場合.空でない場合は、次の3つのケースがあります.
(1)数字:入力数字は私たちが「6」を入力したように、私たちが入力した数字がlunchメニュー項目の総数より大きくないことを保証するには、この数字に基づいてLUNCH_MENU_CHOICESという配列では,対応するselection,すなわち対応するデバイスモデル,コンパイルタイプなどの情報を取得する.
mic@micpc:~/work/android4.0.4$ lunch 6

(2)非数値:次のようにフォーマットを正しく入力する必要があります.ここではデバイスのモデルを示し、コンパイルタイプを示します.
mic@micpc:~/work/android4.0.4$ lunch full_smdk4x12-userdebug

(3)その他の場合:この場合は不正であり,selectionの値が空であると,次のlunchは下向きに実行されない.
3.selectionを解析します.私たちはselectionを取得するためです.sedコマンドで変数productと変数variantにそれぞれ解析して保存します.変数が得られたら変数をチェックして合法かどうかを確認するのでcheck_を呼び出しますproduct$productとcheck_variant$variant、送信しないとエラーメッセージが印刷されます.
4.合法的なproductとvariantを取得した後、
    export TARGET_PRODUCT=$product
    export TARGET_BUILD_VARIANT=$variant
    export TARGET_BUILD_TYPE=release
変数をTARGET_に支払うPRODUCT,TARGET_BUILD_VARINATなどの変数は、exportを介して他の人が使用するためにエクスポートされます.
5.set_を呼び出すstuff_for_Environment関数は、Java SDKパスやクロスコンパイルツールパスの設定など、環境を構成します.(老羅)
6.printconfig関数を呼び出して設定した構成を印刷します.
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=4.0.4
TARGET_PRODUCT=full_smdk4x12
TARGET_BUILD_VARIANT=userdebug
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a-neon
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=IMM76D
============================================

check_product
# check to see if the supplied product is one we can build
function check_product()
{
    T=$(gettop)
    if [ ! "$T" ]; then
        echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
        return
    fi
    CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \
        TARGET_PRODUCT=$1 \
        TARGET_BUILD_VARIANT= \
        TARGET_BUILD_TYPE= \
        TARGET_BUILD_APPS= \
        get_build_var TARGET_DEVICE > /dev/null
    # hide successful answers, but allow the errors to show
}

gettopはandroidソースコードルートディレクトリを返すために使用されます.老羅は「関数gettopはAndroidソースエンジニアリングのルートディレクトリを返すために使用されます.関数check_productはAndroidソースエンジニアリングのルートディレクトリまたはサブディレクトリの下で呼び出す必要があります.そうしないと、関数check_productはエラーで返されます」と話しています.
CALLED_FROM_SETUP         ##      true,      make      android    
BUILD_SYSTEM              ##android        
TARGET_PRODUCT            ##        ,                  $1
 
   
  

get_build_var TARGET_PRODUCT 。 TARGET_DEVICE???

# Get the exact value of a build variable.
function get_build_var()
{
    T=$(gettop)
    if [ ! "$T" ]; then
        echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
        return
    fi
    CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \
      make --no-print-directory -C "$T" -f build/core/config.mk dumpvar-$1
}
に すように、 ディレクトリがandroidソースコードルートディレクトリでmakeを び し、build/core/configを する.mk、ターゲットはdumpvar-TARGET_DEVICE.
bulid/core/config.mkは が く、 を り る.
# ---------------------------------------------------------------
# Define most of the global variables.  These are the ones that
# are specific to the user's build configuration.
include $(BUILD_SYSTEM)/envsetup.mk

# Boards may be defined under $(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)
# or under vendor/*/$(TARGET_DEVICE).  Search in both places, but
# make sure only one exists.
# Real boards should always be associated with an OEM vendor.
board_config_mk := \
	$(strip $(wildcard \
		$(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)/BoardConfig.mk \
		device/*/$(TARGET_DEVICE)/BoardConfig.mk \
		vendor/*/$(TARGET_DEVICE)/BoardConfig.mk \
	))
ifeq ($(board_config_mk),)
  $(error No config file found for TARGET_DEVICE $(TARGET_DEVICE))
endif
ifneq ($(words $(board_config_mk)),1)
  $(error Multiple board config files for TARGET_DEVICE $(TARGET_DEVICE): $(board_config_mk))
endif
include $(board_config_mk)
TARGET_DEVICE_DIR := $(patsubst %/,%,$(dir $(board_config_mk)))
board_config_mk :=
.....
.....
include $(BUILD_SYSTEM)/dumpvar.mk 

な は、3つのファイルをロードすることです.
1.include $(BUILD_SYSTEM)/envsetup.mk
2.include $(board_config_mk)
3.include $(BUILD_SYSTEM)/dumpvar.mk
さんは いました.
のコードは にenvsetupである.mk、BoardConfig、mk、dumpvar.mk 3つのMakefileクリップファイルがロードされます.そのうちenvsetup.mkファイルは$(BUILD_SYSTEM)ディレクトリ、すなわちbuild/coreディレクトリ、BoardConfigにある.mkファイルの は に TARGET_DEVICEは、ターゲット のハードウェアモジュール 、 えばCPUアーキテクチャを するために されることを する. TARGET_DEVICEはターゲットデバイスを するために され、その はenvsetupである.mkファイルのロード に されました.ターゲットデバイスが すると、$(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)、device/*/$(TARGET_DEVICE)、vendor/*/$(TARGET_DEVICE)ディレクトリに するBoradConfigを つけることができる.mkファイル. 、 SRC_TARGET_DIRの はbuild/targetに しい. にdumpvar.mkファイルもbuild/coreディレクトリにあり、 されたコンパイル を するために されます.」
まだ していないプロセスもありますが、 にはdevice/samsung/smdk 4 x 12/full_に び されます.smdk4x12.mk
# Discard inherited values and use our own instead.
PRODUCT_NAME := full_smdk4x12
PRODUCT_DEVICE := smdk4x12
PRODUCT_MANUFACTURER := S.LSI Division, TOPEET Electronics Co., Ltd.
PRODUCT_BRAND := Android
PRODUCT_MODEL := iTOP-4412
ここではPRODUCT_が されていますDEVICE:=smdk 4 x 12なので、device/samsung/smdk 4 x 12/BoardConfigに び す.mk
のBoot Loader、Kernel、CPUアーキテクチャ、CPU ABI、Opengl などの を しています.
VARIANT_CHOICES=(user userdebug eng)

# check to see if the supplied variant is valid
function check_variant()
{
    for v in ${VARIANT_CHOICES[@]}
    do
        if [ "$v" = "$1" ]
        then
            return 0
        fi
    done
    return 1
}

この はVARIANTで されます.CHOICESという では, の user,userdebug,engをそれぞれパラメータと する.
この3つの user、userdebug、eng.ここで、userはパブリケーションバージョンを し、userdebugはデバッグ きパブリケーションバージョンを し、engテーブルはエンジニアリングマシンバージョンを します.