Androidシステムコンパイル環境変数の設定
コンパイルする前に私たちは普通どうしますか?
androidをコンパイルする前に、次のようなコマンドを入力します.
. ./bulid/envsetup.sh
...
lunch
...
make
...
ここのenvsetup.shはandroidのコンパイル環境を設定し、デバイスタイプなどの様々な変数を初期化します.次は私が私のボードで上記のコマンドを実行した結果です.
envsetup.sh何の用だ?
/bulid/envsetup.shというスクリプトには多くの機能関数が実現されており,上のlunch,さらにm,mm,mmmなどがある.
vendorsetupをロードします.sh,lunchの追加
envsetupでshスクリプトの一番後ろに、
その役割は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はデバイスの型番などの情報を追加します.add_lunch_comboはどこですか?答えはenvsetupですsh中.
この関数の呼び出しからその作業過程を理解します.たとえば
関数では、最初のパラメータの値を新しい変数new_に与えます.combo.そしてLUNCH_を巡るMENU_CHOICESという配列は、この配列に同じ選択肢があるかどうかを調べます.
LUNCH_に新しいオプションが追加されるのは、追加されていない場合のみです.MENU_CHOICES配列にあります.
${LUNCH_MENU_CHOICES[@]}は配列LUNCH_を表すMENU_CHOICESのすべての要素.
lunchの実装解析
lunchを入力した後、私が6を入力したように番号を入力するのを待っています.このプロセスはどのようなものですか.lunchの実装を見てみましょう.
1.lunch実行の場合は、パラメータ付きで実行してもよいし、パラメータなしで先に実行してもよい.
私たちは先にlunchして、車に戻って、この時あなたにパラメータを入力させて、私たちはもう1つの6あるいはその他を入力します;
lunch 6も直接入力できます.これも同じです.したがって,lunch開始時にlunch実行時にパラメータが付いていないと判断し,パラメータが付いている場合は変数answerにパラメータを付与する.
2.answerをチェックし、answerが空であるかどうかを判断し、空のデフォルトselectionがfull-engである場合.空でない場合は、次の3つのケースがあります.
(1)数字:入力数字は私たちが「6」を入力したように、私たちが入力した数字がlunchメニュー項目の総数より大きくないことを保証するには、この数字に基づいてLUNCH_MENU_CHOICESという配列では,対応するselection,すなわち対応するデバイスモデル,コンパイルタイプなどの情報を取得する.
(2)非数値:次のようにフォーマットを正しく入力する必要があります.ここではデバイスのモデルを示し、コンパイルタイプを示します.
(3)その他の場合:この場合は不正であり,selectionの値が空であると,次のlunchは下向きに実行されない.
3.selectionを解析します.私たちはselectionを取得するためです.sedコマンドで変数productと変数variantにそれぞれ解析して保存します.変数が得られたら変数をチェックして合法かどうかを確認するのでcheck_を呼び出しますproduct$productとcheck_variant$variant、送信しないとエラーメッセージが印刷されます.
4.合法的なproductとvariantを取得した後、
5.set_を呼び出すstuff_for_Environment関数は、Java SDKパスやクロスコンパイルツールパスの設定など、環境を構成します.(老羅)
6.printconfig関数を呼び出して設定した構成を印刷します.
check_product
gettopはandroidソースコードルートディレクトリを返すために使用されます.老羅は「関数gettopはAndroidソースエンジニアリングのルートディレクトリを返すために使用されます.関数check_productはAndroidソースエンジニアリングのルートディレクトリまたはサブディレクトリの下で呼び出す必要があります.そうしないと、関数check_productはエラーで返されます」と話しています.
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テーブルはエンジニアリングマシンバージョンを します.