您的位置:首页 > 移动开发 > Android开发

Android 编译过程分析(1)

2014-03-11 18:06 429 查看
以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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息