Android学習ノートのコンパイルシステム(一)コンパイルフレーム


転載は出典を明記してください.http://blog.csdn.net/droyon/article/details/8639773
最近はアンディのカーネル分析を読んでいます.メモを取って、自分で調べやすいです.
Androdのコンパイル環境は、androidソースコードフォルダの下に存在します.彼の下のファイルはコンパイルシステムを構成しています.
私たちがシステムをコンパイルする時、まず実行します.
. build/envsetup.sh 
make
makeの後にパラメータを追跡することができます.パラメータは、製品名、モジュール名、sdkを含みます.
makeの後に付いているのは製品名であろうと、モジュール名であろうと、まずシステムをコンパイルして認識します.どのようにして製品とモジュール名をAndroidシステムに認識させるかは、Androidコンパイルシステムで定義され、出力経路out(outの下に2つのディレクトリがあり、targetは最終的な出力先であり、hostはsdk、またはctsのコンパイル時に生成されるpcで使用されるいくつかのツール)ディレクトリの指定です.Androidコンパイルシステムはbuildフォルダの下で実現され、そこに一連の*.mkファイルが保存されています.各サブプロジェクトディレクトリにはAndroid.mkがあり、サブプロジェクトが生成するターゲットファイルをファイルに定義しています.
1、Android.mkの文法について:
LOCAL_PATH:サブプロジェクトの絶対パスを指定しました.一般的にコンパイルシステムで定義されたcall-dirで取得します.
LOCAL_PATH:= $(call my-dir)
LOCAL_MOKULE_TAGS:サブプロジェクトのラベルを指定して、ラベルはuser、eng、userdebug、optionalを含みます.
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES:サブプロジェクトに含まれるすべてのソースファイルを指定します.下記のように関数で得られます.
LOCAL_SRC_FILES := $(call all-java-files-under, src) \
        src/com/android/music/IMediaPlaybackService.aidl
LOCAL_PACKAGE_NAME:プロジェクト名を指定します.この名前はサブプロジェクト名です.c+++プロジェクトに対してLOCAL_を使用する.MODULE
LOCAL_PACKAGE_NAME := Music
LOCAL_MODULE:= reference-ril
BUILE_PACKAGE:代表コンパイルでappkが生成され、またBUILE_があります.HOST_EXECUTABLE、BUILE_HOST_STATIC_LIBRARY
2、buildコンパイルシステムファイルのロード順序
makeコマンドを実行すると、ルートディレクトリのMakefileがロードされます.このファイルでは、buile/core/main.mkがロードされます.このファイルで定義されています.makeコマンドはパラメータとは関係なく実行されています.
.PHONY: droid
DEFAULT_GOAL := droid
$(DEFAULT_GOAL):
は、main.mkを実行する過程において、build/core/config.mkを含み、このファイルには一連のパス変数が定義されている.
SRC_HEADERS := \
        $(TOPDIR)system/core/include \
        $(TOPDIR)hardware/libhardware/include \
        $(TOPDIR)hardware/libhardware_legacy/include \
        $(TOPDIR)hardware/ril/include \
        $(TOPDIR)dalvik/libnativehelper/include \
        $(TOPDIR)frameworks/base/include \
        $(TOPDIR)frameworks/base/opengl/include \
    $(TOPDIR)frameworks/base/native/include \
        $(TOPDIR)external/skia/include
SRC_HOST_HEADERS:=$(TOPDIR)tools/include
SRC_LIBRARIES:= $(TOPDIR)libs
SRC_SERVERS:= $(TOPDIR)servers
SRC_TARGET_DIR := $(TOPDIR)build/target
SRC_API_DIR := $(TOPDIR)frameworks/base/api
はconfig.mkファイルにpathmap.mkファイルが含まれています.このファイルには一連のframe ewark層定数も定義されています.重要です.後で参照します.
FRAMEWORKS_BASE_SUBDIRS := \
        $(addsuffix /java, \
            core \
            graphics \
            location \
            media \
            drm \
            opengl \
            sax \
            telephony \
            wifi \
            keystore \
            icu4j \
            voip \
         )
FRAMEWORKS_BASE_JAVA_SRC_DIRS := \
        $(addprefix frameworks/base/,$(FRAMEWORKS_BASE_SUBDIRS))
など、この定数はフレームワーク.jarにコンパイルされたソースファイルディレクトリを定義しています.もしあなたがアンディフレームワーク層のコードを修正したら、ディレクトリを新規に作成しました.ディレクトリが最初のセグメントコードからなくなったら、frame ebook.jarにコンパイルできないかもしれません.
その後もconfig.mkの実行を続けます.その後config.mkは一連のコンパイルマクロを定義し、Android.mkで最後に使用したそのコマンドincludeドル(BUILD_UPACKAGE)
BUILD_COMBOS:= $(BUILD_SYSTEM)/combo

CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk
BUILD_HOST_STATIC_LIBRARY:= $(BUILD_SYSTEM)/host_static_library.mk
BUILD_HOST_SHARED_LIBRARY:= $(BUILD_SYSTEM)/host_shared_library.mk
BUILD_STATIC_LIBRARY:= $(BUILD_SYSTEM)/static_library.mk
BUILD_RAW_STATIC_LIBRARY := $(BUILD_SYSTEM)/raw_static_library.mk
BUILD_SHARED_LIBRARY:= $(BUILD_SYSTEM)/shared_library.mk
BUILD_EXECUTABLE:= $(BUILD_SYSTEM)/executable.mk
BUILD_RAW_EXECUTABLE:= $(BUILD_SYSTEM)/raw_executable.mk
BUILD_HOST_EXECUTABLE:= $(BUILD_SYSTEM)/host_executable.mk
BUILD_PACKAGE:= $(BUILD_SYSTEM)/package.mk
BUILD_PHONY_PACKAGE:= $(BUILD_SYSTEM)/phony_package.mk
BUILD_HOST_PREBUILT:= $(BUILD_SYSTEM)/host_prebuilt.mk
BUILD_PREBUILT:= $(BUILD_SYSTEM)/prebuilt.mk
BUILD_MULTI_PREBUILT:= $(BUILD_SYSTEM)/multi_prebuilt.mk
BUILD_JAVA_LIBRARY:= $(BUILD_SYSTEM)/java_library.mk
BUILD_STATIC_JAVA_LIBRARY:= $(BUILD_SYSTEM)/static_java_library.mk
BUILD_HOST_JAVA_LIBRARY:= $(BUILD_SYSTEM)/host_java_library.mk
BUILD_DROIDDOC:= $(BUILD_SYSTEM)/droiddoc.mk
BUILD_COPY_HEADERS := $(BUILD_SYSTEM)/copy_headers.mk
この中に私達の熟知しているBUILD_があります.PACKAGEは、コンパイル元のファイルがappkになることを表します.
下のconfig.mkファイルにはbuildspec.mkが含まれています.このファイルでは私たちがコンパイルする製品の名前を定義します.(エラーがあったら指摘してください)ファイルパスは、ルートディレクトリ/buildspec.mkからcofig.mkファイルにenvsetup.mkが含まれます.主に環境の構成、例えば、appkインストール経路定数、ターゲット出力経路を設定します.
OUT_DIR := $(TOPDIR)out
TARGET_SYSLOADER_SYSTEM_OUT := $(TARGET_SYSLOADER_OUT)/root/system

TARGET_INSTALLER_OUT := $(PRODUCT_OUT)/installer
TARGET_INSTALLER_DATA_OUT := $(TARGET_INSTALLER_OUT)/data
その中にプロジェクトが含まれています.config.mkファイルは、このファイルにはproduct.mkファイルが含まれています.product.mkファイルでは、device、verndor、build/target/productディレクトリの下にあるすべてのAndroid Product.mkファイルが検出されます.
define _find-android-products-files
$(shell test -d device && find device -maxdepth 6 -name AndroidProducts.mk) \
  $(shell test -d vendor && find vendor -maxdepth 6 -name AndroidProducts.mk) \
  $(SRC_TARGET_DIR)/product/AndroidProducts.mk
endef
ファイルディレクトリの深さは6レベルです.
そしてプロジェクトでconfig.mkファイルでは、自身の関数を呼び出してプロジェクトを追加します.
ifneq ($(strip $(TARGET_BUILD_APPS)),)
  # An unbundled app build needs only the core product makefiles.
  $(call import-products,$(call get-product-makefiles,\
      $(SRC_TARGET_DIR)/product/AndroidProducts.mk))
else
  # Read in all of the product definitions specified by the AndroidProducts.mk
  # files in the tree.
  #
  #TODO: when we start allowing direct pointers to product files,
  #    guarantee that they're in this list.
  $(call import-products, $(get-all-product-makefiles))
endif # TARGET_BUILD_APPS
ここでプロジェクトを作ります.config.mkが終了し、config.mkファイルの実行を継続します.つまり、上記の設定環境変数はOUT(u)を設定します.DIR:=$(TOPIR)out、など.
これでenvsetup.mkファイルの実行が終了します.config.mkファイルを継続して実行し、その後config.mkファイルに各プロジェクトのBoardConfig.mkファイルをロードします.
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
BoardCOnfig.mkはいくつかの属性をロードし、これらの属性はシステム属性に追加される.
最後のconfig.mkファイルはツールコマンドマクロを設定します.
AAPT := $(HOST_OUT_EXECUTABLES)/aapt$(HOST_EXECUTABLE_SUFFIX)
config.mkファイルの実行は終了しました.
引き続きmain.mkファイルの実行を行います.続いてコンパイルシステムをチェックします.linuxやwindow、アップルDarwinなど、openJDKのバージョンをチェックします.
その後、definations.mkをロードして、Android.mkで使用するmy-dirを含む様々な関数をロードします.
define my-dir
今日は遅すぎて、明日また書きます.main.mkファイルは次に実行します.