Android 编译过程分析(1)

以Google Nexus 5 为例:

1. 编译文件

    系统编译文件存放位置: android4.4.2_r1/build/core/

    产品编译文件存放位置:android4.4.2_r1/build/target/product/  

    Device 编译文件存放位置:android4.4.2_r1/device/lge/hammerhead/

    Android 编译初始文件位置: android4.4.2_r1/Makefile

2.  设置环境变量

    $cd android4.4.2_r1

    $. build/envsetup.sh 

    ##################################################################
    #                                                                #
    #              Read me before you modify this code               #
    #                                                                #
    #   This function sets ANDROID_BUILD_PATHS to what it is adding  #
    #   to PATH, and the next time it is run, it removes that from   #
    #   PATH.  This is required so lunch can be run more than once   #
    #   and still have working paths.                                #
    #                                                                #
    ##################################################################

   lunch 命令: 选择产品及配置编译环境变量

   function lunch()
{
    local answer


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


    local selection=


    if [ -z "$answer" ]
    then
        selection=aosp_arm-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
}

2. 编译文件之间的关系:

    android4.4.2_r1/Makefile==> build/core/main.mk 

    in main.mk 

    定义系统编译文件目录;  BUILD_SYSTEM := $(TOPDIR)build/core


     包含了help.mk  给出了make 命令后可以跟的参数,如下:

   @echo
@echo "Common make targets:"
@echo "----------------------------------------------------------------------------------"
@echo "droid                   Default target"
@echo "clean                   (aka clobber) equivalent to rm -rf out/"
@echo "snod                    Quickly rebuild the system image from built packages"
@echo "offline-sdk-docs        Generate the HTML for the developer SDK docs"
@echo "doc-comment-check-docs  Check HTML doc links & validity, without generating HTML"
@echo "libandroid_runtime      All the JNI framework stuff"
@echo "framework               All the java framework stuff"
@echo "services                The system server (Java) and friends"
@echo "help                    You're reading it right now"

  包含了config.mk:  

# This is included by the top-level Makefile.
# It sets up standard variables based on the
# current configuration and platform, which
# are not specific to what is being built.


# ###############################################################
# Build system internal files
# ###############################################################


# The 'showcommands' goal says to show the full command
# lines being executed, instead of a short message about
# the kind of operation being done.


# The default key if not set as LOCAL_CERTIFICATE
ifdef PRODUCT_DEFAULT_DEV_CERTIFICATE
  DEFAULT_SYSTEM_DEV_CERTIFICATE := $(PRODUCT_DEFAULT_DEV_CERTIFICATE)
else
  DEFAULT_SYSTEM_DEV_CERTIFICATE := build/target/product/security/testkey
endif

  config.mk 最后调用dumpvar.mk 输出配置结果

HOST_OS_EXTRA:=$(shell python -c "import platform; print(platform.platform())")
$(info ============================================)
$(info   PLATFORM_VERSION_CODENAME=$(PLATFORM_VERSION_CODENAME))
$(info   PLATFORM_VERSION=$(PLATFORM_VERSION))
$(info   TARGET_PRODUCT=$(TARGET_PRODUCT))
$(info   TARGET_BUILD_VARIANT=$(TARGET_BUILD_VARIANT))
$(info   TARGET_BUILD_TYPE=$(TARGET_BUILD_TYPE))
$(info   TARGET_BUILD_APPS=$(TARGET_BUILD_APPS))
$(info   TARGET_ARCH=$(TARGET_ARCH))
$(info   TARGET_ARCH_VARIANT=$(TARGET_ARCH_VARIANT))
$(info   TARGET_CPU_VARIANT=$(TARGET_CPU_VARIANT))
$(info   HOST_ARCH=$(HOST_ARCH))
$(info   HOST_OS=$(HOST_OS))
$(info   HOST_OS_EXTRA=$(HOST_OS_EXTRA))
$(info   HOST_BUILD_TYPE=$(HOST_BUILD_TYPE))
$(info   BUILD_ID=$(BUILD_ID))
$(info   OUT_DIR=$(OUT_DIR))
$(info ============================================)

    接下来会检查当前操作系统、Java、等编译工具的检查


检查所有Android.mk 文件

   #
# Typical build; include any Android.mk files we can find.
#

    将文件打包

 .PHONY: ramdisk
ramdisk: $(INSTALLED_RAMDISK_TARGET)


.PHONY: factory_ramdisk
factory_ramdisk: $(INSTALLED_FACTORY_RAMDISK_TARGET)


.PHONY: factory_bundle
factory_bundle: $(INSTALLED_FACTORY_BUNDLE_TARGET)


.PHONY: systemtarball
systemtarball: $(INSTALLED_SYSTEMTARBALL_TARGET)


.PHONY: boottarball
boottarball: $(INSTALLED_BOOTTARBALL_TARGET)


.PHONY: userdataimage
userdataimage: $(INSTALLED_USERDATAIMAGE_TARGET)


ifneq (,$(filter userdataimage, $(MAKECMDGOALS)))
$(call dist-for-goals, userdataimage, $(BUILT_USERDATAIMAGE_TARGET))
endif


.PHONY: userdatatarball
userdatatarball: $(INSTALLED_USERDATATARBALL_TARGET)


.PHONY: cacheimage
cacheimage: $(INSTALLED_CACHEIMAGE_TARGET)


.PHONY: vendorimage
vendorimage: $(INSTALLED_VENDORIMAGE_TARGET)


.PHONY: bootimage
bootimage: $(INSTALLED_BOOTIMAGE_TARGET)

将打包文件编译为ROM 文件

# Build files and then package it into the rom formats
.PHONY: droidcore
droidcore: files \
systemimage \
$(INSTALLED_BOOTIMAGE_TARGET) \
$(INSTALLED_RECOVERYIMAGE_TARGET) \
$(INSTALLED_USERDATAIMAGE_TARGET) \
$(INSTALLED_CACHEIMAGE_TARGET) \
$(INSTALLED_VENDORIMAGE_TARGET) \
$(INSTALLED_FILES_FILE)


把打包文件及ROM 文件拷贝到安装目录

.PHONY: lintall

你可能感兴趣的:(android,编译系统,Ma,系统编译)