Understanding Android AOSP build system

Starting Steps

source build/envsetup.sh

This adds functions like “lunch” into environment. Check build/envsetup.sh for more details. You can check all added functions ( which also acts like a command ) by,

$ cat build/envsetup.sh | grep function

OR

[bash] $ cat build/envsetup.sh | sed -n "/^[ \t]*function /s/function \([a-z_]*\).*/\1/p" | sort | uniq [/bash]

The first thing which happens is the display of “lunch” options which are built like below,

# 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)
}

This searches the vendorsetup.sh which actually identifies the supported vendors,

[bash] # Execute the contents of any vendorsetup.sh files we can find. for f in `test -d device && find -L device -maxdepth 4 -name ‘vendorsetup.sh’ 2> /dev/null | sort` \ `test -d vendor && find -L vendor -maxdepth 4 -name ‘vendorsetup.sh’ 2> /dev/null | sort` do echo "including $f" . $f done unset f [/bash]

So if we check for vendorsetup.sh we will be able to find in “vendor” and “device” directory and it will help to build the lunch menu. and will print like below,

 $ source build/envsetup.sh
including device/vendor_name/product_name/vendorsetup.sh

Next thing is to select target using the lunch menu, which was added to your bash shell environment after sourcing envsetup.sh. After making your selection, the chosen product and variant is verified and environment variables are set, like as below,

$ lunch
[bash] PLATFORM_VERSION_CODENAME=REL PLATFORM_VERSION=a.b.c TARGET_PRODUCT=xxxx TARGET_BUILD_VARIANT=userdebug TARGET_BUILD_TYPE=release TARGET_BUILD_APPS= TARGET_ARCH=arm TARGET_ARCH_VARIANT=armv7-a-neon TARGET_CPU_VARIANT=cortex-a9 TARGET_2ND_ARCH= TARGET_2ND_ARCH_VARIANT= TARGET_2ND_CPU_VARIANT= HOST_ARCH=x86_64 HOST_OS=linux HOST_OS_EXTRA=Linux-4.4.0-104-generic-x86_64-with-Ubuntu-16.04-xenial HOST_BUILD_TYPE=release BUILD_ID= OUT_DIR=out [/bash]

After this when we type make with debugging enabled, we see following makefiles getting added,

After this when we type make with debugging enabled, we see following makefiles getting added,

$ make -d
[bash] device/vendor_name/product_name/AndroidProducts.mk build/target/product/AndroidProducts.mk [/bash]

This adds, build/core/envsetup.mk into environment, and starting point is from build/core/main.mk

$ hmm
[bash] Invoke ". build/envsetup.sh" from your shell to add the following functions to your environment: – lunch: lunch <product_name>-<build_variant> – tapas: tapas [<App1> <App2> …] [arm|x86|mips|armv5|arm64|x86_64|mips64] [eng|userdebug|user] – croot: Changes directory to the top of the tree. – m: Makes from the top of the tree. – mm: Builds all of the modules in the current directory, but not their dependencies. – mmm: Builds all of the modules in the supplied directories, but not their dependencies. To limit the modules being built use the syntax: mmm dir/:target1,target2. – mma: Builds all of the modules in the current directory, and their dependencies. – mmma: Builds all of the modules in the supplied directories, and their dependencies. – cgrep: Greps on all local C/C++ files. – ggrep: Greps on all local Gradle files. – jgrep: Greps on all local Java files. – resgrep: Greps on all local res/*.xml files. – mangrep: Greps on all local AndroidManifest.xml files. – sepgrep: Greps on all local sepolicy files. – sgrep: Greps on all local source files. – godir: Go to the directory containing a file. [/bash]

Leave a Comment