Androidコンパイルandroid.mk

28469 ワード

1.androidシステムのソースコードのコンパイルプロセス
一般的なコンパイル手順:source build/envsetup.sh lunch xxx make -j8 2>&1 | tee build.logこの3つのステップはいったい何をしたのだろうか.徐々に分析してみましょう.
1.1 source build/envsetup.sh
build/envsetup.shこのファイルにはいくつかの変数と関数が定義され、source build/envsetupが実行されます.その後、envsetup.shの変数はグローバル変数となり、その関数は現在の端末コマンドラインで直接使用することもできる.これらの関数は、ディレクトリを切り替えたり、ファイルを検索したりするのに役立ち、ソースコードをコンパイルするときに便利になります.これらの関数はhmm関数で表示できます.以下に、一般的な関数をいくつか示します.
  • lunch:lunch-(コンパイルするターゲット製品とバージョンを選択)
  • tapas: tapas [ ...] [arm|x86|mips|armv5] [eng|userdebug|user]
  • croot: Changes directory to the top of the tree.(ソースコードの最上位ディレクトリに切り替える)
  • m: Makes from the top of the tree.(最上位ディレクトリbuildからシステム全体)
  • 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.(指定されたディレクトリの下にあるすべてのモジュールを構築しますが、依存は含まれません)
  • 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.(指定されたディレクトリの下にあるすべてのモジュールおよびそれらに依存するモジュールを構築する)
  • provision: Flash device with all required partitions. Options will be passed on to fastboot.(デバイスに必要なすべてのパーティションをブラシし、オプションをfastbootに渡します)
  • cgrep: Greps on all local C/C++ files.(C,C++ファイルで指定キーを検索)
  • ggrep: Greps on all local Gradle files.(gradleファイルで指定したキーワードを検索)
  • jgrep: Greps on all local Java files.(javaファイルで指定したキーワードを検索)
  • resgrep: Greps on all local res/*.xml files.(リソースxmlファイルで指定キーを検索)
  • mangrep: Greps on all local AndroidManifest.xml files.(AndroidManifest.xmlファイルで指定したキーワードを検索)
  • mgrep: Greps on all local Makefiles files.(Makefilesおよびandroid.mkファイルで指定したキーワードを検索)
  • sepgrep: Greps on all local sepolicy files.(sepolicyファイルで指定キーを検索)
  • sgrep: Greps on all local source files.(すべてのローカルファイルで指定キーを検索)
  • godir: Go to the directory containing a file.(ファイルを含むディレクトリに切り替える)
  • hmmのヒントに加えて、build/envsetupを直接表示する方法もあります.shファイル:
  • cproj:最近Androidを含むように上へ切り替えます.mkのディレクトリ下
  • findmakefile:現在のディレクトリが存在するプロジェクトのAndroidを印刷します.mkのファイルパス
  • getsdcardpath:Sdカードパス
  • を取得する.
  • getscreenshotpath:スクリーンショットを取得するパス
  • getlastscreenshot:最後のスクリーンショットを取得し、現在のディレクトリの下に
  • にエクスポート
  • getbugreports:バグレポートをデバイスからローカルにエクスポートし、バグレポートをディレクトリ/sdcard/bugreports
  • に格納
  • gettop:Androidソースルートディレクトリ
  • を取得
  • pid:pid processname実行可能プログラムに対応するプロセスid
  • を表示する
  • key_back:戻りキー
  • を押すシミュレーション
  • key_home:シミュレーションHomeキー
  • を押す
  • key_menu:メニューキー
  • を押すシミュレーション
    envsetup.shにはadd_も定義されているlunch_combo関数は、add_を複数回実行します.lunch_combo関数、自己定義のすべてのproductをLUNCH_に追加MENU_CHOICES:
     
    # 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 aosp_arm-eng
    add_lunch_combo aosp_arm64-eng
    add_lunch_combo aosp_mips-eng
    add_lunch_combo aosp_mips64-eng
    add_lunch_combo aosp_x86-eng
    add_lunch_combo aosp_x86_64-eng
    

    最後にenvsetup.shではvendorとdeviceディレクトリの下にあるすべてのvendorsetupも遍歴して実行する.shファイル:
     
    # 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` \
             `test -d product && find -L product -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null | sort`
    do
        echo "including $f"
        . $f
    done
    unset f
    

    これらはshにも定義されているいくつかのproductは、vendorsetupを実行する.sh後、それらに定義されたproductもLUNCH_に追加されます.MENU_CHOICES:
     
    add_lunch_combo full_k63v2_64_bsp-eng
    add_lunch_combo full_k63v2_64_bsp-user
    add_lunch_combo full_k63v2_64_bsp-userdebug
    

    その後、コマンドラインでlunch関数を使用してLUNCH_からMENU_CHOICESでコンパイルするproductを選択します.
    1.2 lunch
    lunch関数を実行する場合、ユーザーがproductを指定した場合、指定したproductを取得します.ユーザーがproductを指定していない場合はprint_を呼び出します.lunch_menu関数は、前のステップで生成したlunch menu choicesを出力してユーザーに選択させます.ユーザーがproductを指定したり、プロンプト後にproductを選択したりすると、ユーザーが指定したproductが取得され、$productと$variantが抽出されます.次にproductがサポートされていないかどうかを確認し、サポートされていないことを示し、終了します.サポートされている場合は、set_が呼び出されます.stuff_for_Environment関数は、一連の環境変数を設定し、printconfigを呼び出して関連変数と構成情報を出力します.
     
    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
        else
            selection=$answer
        fi
    
        export TARGET_BUILD_APPS=
    
        local product variant_and_version variant version
    
        product=${selection%%-*} # Trim everything after first dash
        variant_and_version=${selection#*-} # Trim everything up to first dash
        if [ "$variant_and_version" != "$selection" ]; then
            variant=${variant_and_version%%-*}
            if [ "$variant" != "$variant_and_version" ]; then
                version=${variant_and_version#*-}
            fi
        fi
    
        if [ -z "$product" ]
        then
            echo
            echo "Invalid lunch combo: $selection"
            return 1
        fi
    
        TARGET_PRODUCT=$product \
        TARGET_BUILD_VARIANT=$variant \
        TARGET_PLATFORM_VERSION=$version \
        build_build_var_cache
        if [ $? -ne 0 ]
        then
            return 1
        fi
    
        export TARGET_PRODUCT=$(get_build_var TARGET_PRODUCT)
        export TARGET_BUILD_VARIANT=$(get_build_var TARGET_BUILD_VARIANT)
        if [ -n "$version" ]; then
          export TARGET_PLATFORM_VERSION=$(get_build_var TARGET_PLATFORM_VERSION)
        else
          unset TARGET_PLATFORM_VERSION
        fi
        export TARGET_BUILD_TYPE=release
    
        echo
    
        set_stuff_for_environment
        printconfig
        destroy_build_var_cache
    }
    

    1.3 make -j8 2>&1 | tee build.log
  • -j 8はコンパイルを指定するためのcpuコアであり、コンパイルサーバが構成されている場合は、少し大きくすることができます.
  • 2>&1 | tee build.logはコンパイルのヒント、異常情報を端末とbuildに同時に出力.logファイルにあります.
  • makeはmakeコマンドを実行し、ソースコードルートディレクトリの下のMakefileを探し、Makefileを解析し、ソースコード全体のコンパイルを開始する.

  • 次に,ソースコードルートディレクトリの下にあるMakefileから逐次解析を開始する.
    2.androidのMakefileとandroid.mk
    makeを実行すると、ソースコードルートディレクトリの下にあるMakefileから逐次解析が開始されます.このMakefileの内容は少ないが、build/make/core/mainを導入しただけである.mk. Makefile:
     
    ### DO NOT EDIT THIS FILE ###
    include build/make/core/main.mk
    ### DO NOT EDIT THIS FILE ###
    

    main.mkにはbuild/make/core/configをインポートする2つの最も重要な部分がある.mkとbuild/make/core/definitions.mk. main.mk:
     
    ......
    BUILD_SYSTEM := $(TOPDIR)build/make/core
    ......
    # Set up various standard variables based on configuration
    # and host information.
    include $(BUILD_SYSTEM)/config.mk
    ......
    # Bring in standard build system definitions.
    include $(BUILD_SYSTEM)/definitions.mk
    ......
    

    config.mkでは、一般的なCLEAR_など、コンパイルに必要な変数の一連が定義されています.VARS、BUILD_PACKAGE.これらの変数は実際には各変数が別の変数にインポートする.mkファイル.各インポートされた.mkはCLEAR_のような基本的な機能を完成しましたVARS対応build/make/core/clear_vars.mkはコンパイルされた一時変数、BUILD_をクリアPACKAGE対応build/make/core/package.mkはAPKをコンパイルします.config.mk:
     
    # Set up efficient math functions which are used in make.
    # Here since this file is included by envsetup as well as during build.
    include $(BUILD_SYSTEM)/math.mk
    
    # Various mappings to avoid hard-coding paths all over the place
    include $(BUILD_SYSTEM)/pathmap.mk
    
    # Allow projects to define their own globally-available variables
    include $(BUILD_SYSTEM)/project_definitions.mk
    
    # ###############################################################
    # Build system internal files
    # ###############################################################
    
    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_HEADER_LIBRARY:= $(BUILD_SYSTEM)/header_library.mk
    BUILD_AUX_STATIC_LIBRARY:= $(BUILD_SYSTEM)/aux_static_library.mk
    BUILD_AUX_EXECUTABLE:= $(BUILD_SYSTEM)/aux_executable.mk
    BUILD_SHARED_LIBRARY:= $(BUILD_SYSTEM)/shared_library.mk
    BUILD_EXECUTABLE:= $(BUILD_SYSTEM)/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_RRO_PACKAGE:= $(BUILD_SYSTEM)/build_rro_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_APIDIFF:= $(BUILD_SYSTEM)/apidiff.mk
    BUILD_COPY_HEADERS := $(BUILD_SYSTEM)/copy_headers.mk
    BUILD_NATIVE_TEST := $(BUILD_SYSTEM)/native_test.mk
    BUILD_NATIVE_BENCHMARK := $(BUILD_SYSTEM)/native_benchmark.mk
    BUILD_HOST_NATIVE_TEST := $(BUILD_SYSTEM)/host_native_test.mk
    BUILD_FUZZ_TEST := $(BUILD_SYSTEM)/fuzz_test.mk
    BUILD_HOST_FUZZ_TEST := $(BUILD_SYSTEM)/host_fuzz_test.mk
    
    BUILD_SHARED_TEST_LIBRARY := $(BUILD_SYSTEM)/shared_test_lib.mk
    BUILD_HOST_SHARED_TEST_LIBRARY := $(BUILD_SYSTEM)/host_shared_test_lib.mk
    BUILD_STATIC_TEST_LIBRARY := $(BUILD_SYSTEM)/static_test_lib.mk
    BUILD_HOST_STATIC_TEST_LIBRARY := $(BUILD_SYSTEM)/host_static_test_lib.mk
    
    BUILD_NOTICE_FILE := $(BUILD_SYSTEM)/notice_files.mk
    BUILD_HOST_DALVIK_JAVA_LIBRARY := $(BUILD_SYSTEM)/host_dalvik_java_library.mk
    BUILD_HOST_DALVIK_STATIC_JAVA_LIBRARY := $(BUILD_SYSTEM)/host_dalvik_static_java_library.mk
    
    BUILD_HOST_TEST_CONFIG := $(BUILD_SYSTEM)/host_test_config.mk
    BUILD_TARGET_TEST_CONFIG := $(BUILD_SYSTEM)/target_test_config.mk
    

    そしてdefinitions.mkではdefineでも、一般的なmy-dir、all-subdir-makefiles、all-subdir-java-filesなど、一連の変数が定義されています.これらのコンパイルは主にディレクトリに関する機能を処理するために用いられ、例えばmy-dirは現在のディレクトリパスを取得し、all-subdir-makefilesはすべてのサブディレクトリのandroidを呼び出す.mk.definitions.mkには多くの変数があり、以下のように列挙されている.mk:
     
    define print-vars
    define true-or-empty
    define gcno-touch-rule
    define my-dir
    define all-makefiles-under
    define first-makefiles-under
    define all-subdir-makefiles
    define all-named-subdir-makefiles
    define all-named-dirs-under
    define all-subdir-named-dirs
    define all-named-files-under
    define all-subdir-named-files
    define all-java-files-under
    define all-subdir-java-files
    define all-c-files-under
    define all-subdir-c-files
    define all-cpp-files-under
    define all-subdir-cpp-files
    define all-Iaidl-files-under
    define all-subdir-Iaidl-files
    define all-vts-files-under
    define all-subdir-vts-files
    define all-logtags-files-under
    define all-proto-files-under
    define all-renderscript-files-under
    define all-S-files-under
    define all-html-files-under
    define all-subdir-html-files
    define find-subdir-files
    define find-subdir-subdir-files
    define find-subdir-assets
    define find-other-java-files
    define find-other-html-files
    define find-files-in-subdirs
    define find-parent-file
    define find-test-data-in-subdirs
    define add-dependency
    define reverse-list
    define def-host-aux-target
    define find-idf-prefix
    define intermediates-dir-for
    define local-intermediates-dir
    define generated-sources-dir-for
    define local-generated-sources-dir
    define module-built-files
    define module-installed-files
    define module-stubs-files
    define doc-timestamp-for
    define java-lib-files
    define java-lib-header-files
    define java-lib-header-files
    define java-lib-deps
    define app-lib-files
    define app-lib-header-files
    define app-lib-header-files
    define streq
    define normalize-path-list
    define normalize-comma-list
    define word-colon
    define collapse-pairs
    define uniq-pairs-by-first-component
    define modules-for-tag-list
    define module-names-for-tag-list
    define get-tagged-modules
    define append-path
    define echo-warning
    define echo-error
    define pretty-warning
    define pretty-error
    define _get-package-overrides
    define get-package-overrides
    define pretty
    define pretty
    define include-depfile
    define include-depfiles-for-objs
    define track-src-file-obj
    define _track-src-file-obj
    define track-src-file-gen
    define _track-src-file-gen
    define track-gen-file-obj
    define transform-l-to-c-or-cpp
    define transform-y-to-c-or-cpp
    define _merge-renderscript-d
    define transform-renderscripts-to-java-and-bc
    define transform-bc-to-so
    define transform-renderscripts-to-cpp-and-bc
    define transform-aidl-to-java
    define transform-aidl-to-cpp
    define define-aidl-java-rule
    define define-aidl-java-rule
    define-aidl-java-rule-src
    define define-aidl-cpp-rule
    define define-aidl-cpp-rule
    define-aidl-cpp-rule-src
    define transform-vts-to-cpp
    define define-vts-cpp-rule
    define define-vts-cpp-rule
    define-vts-cpp-rule-src
    define transform-logtags-to-java
    define transform-proto-to-java
    define transform-proto-to-cc
    define c-includes
    define transform-cpp-to-o-compiler-args
    define clang-tidy-cpp
    define transform-cpp-to-o
    define transform-cpp-to-o
    define transform-c-or-s-to-o-compiler-args
    define transform-c-to-o-compiler-args
    define clang-tidy-c
    define transform-c-to-o
    define transform-c-to-o
    define transform-s-to-o
    define transform-asm-to-o
    define transform-m-to-o
    define transform-host-cpp-to-o-compiler-args
    define clang-tidy-host-cpp
    define transform-host-cpp-to-o
    define transform-host-cpp-to-o
    define transform-host-c-or-s-to-o-common-args
    define transform-host-c-or-s-to-o
    define transform-host-c-to-o-compiler-args
    define clang-tidy-host-c
    define transform-host-c-to-o
    define transform-host-c-to-o
    define transform-host-s-to-o
    define transform-host-m-to-o
    define transform-host-mm-to-o
    define compile-dotdot-cpp-file
    define compile-dotdot-c-file
    define compile-dotdot-s-file
    define compile-dotdot-s-file-no-deps
    define _concat-if-arg2-not-empty
    define split-long-arguments
    define _extract-and-include-single-target-whole-static-lib
    define extract-and-include-whole-static-libs-first
    define extract-and-include-target-whole-static-libs
    define transform-o-to-static-lib
    define _extract-and-include-single-aux-whole-static-lib
    define extract-and-include-aux-whole-static-libs
    define transform-o-to-aux-static-lib
    define transform-o-to-aux-executable-inner
    define transform-o-to-aux-executable
    define transform-o-to-aux-static-executable-inner
    define transform-o-to-aux-static-executable
    define _extract-and-include-single-host-whole-static-lib
    define extract-and-include-host-whole-static-libs
    define create-dummy.o-if-no-objs
    define get-dummy.o-if-no-objs
    define delete-dummy.o-if-no-objs
    define transform-host-o-to-static-lib
    define transform-host-o-to-shared-lib-inner
    define transform-host-o-to-shared-lib
    define transform-host-o-to-package
    define transform-o-to-shared-lib-inner
    define transform-o-to-shared-lib
    define transform-to-stripped
    define transform-to-stripped-keep-mini-debug-info
    define transform-to-stripped-keep-symbols
    define pack-elf-relocations
    define transform-o-to-executable-inner
    define transform-o-to-executable
    define transform-o-to-static-executable-inner
    define transform-o-to-static-executable
    define transform-host-o-to-executable-inner
    define transform-host-o-to-executable
    define create-resource-java-files
    define find-generated-R.java
    define aapt2-compile-one-resource-file
    define aapt2-compile-resource-dirs
    define aapt2-compile-resource-zips
    define aapt2-compile-one-resource-file-rule
    define aapt2-compiled-resource-out-file
    define aapt2-link
    define emit-line
    define dump-words-to-file
    define unzip-jar-files
    define jar-args-sorted-files-in-directory
    define fetch-additional-java-source
    define write-java-source-list
    define compile-java
    define transform-java-to-header.jar
    define commit-change-for-toc
    define _transform-dex-to-toc
    define define-dex-to-toc-rule
    define define-dex-to-toc-rule
    define define-dex-to-toc-rule
    define define-dex-to-toc-rule
    define codename-or-sdk-to-sdk
    define desugar-classes-jar
    define transform-classes.jar-to-dex
    define transform-classes-d8.jar-to-dex
    define create-empty-package-at
    define create-empty-package
    define initialize-package-file
    define add-assets-to-package
    define _add-jni-shared-libs-to-package-per-abi
    define add-jni-shared-libs-to-package
    define add-dex-to-package
    define add-dex-to-package-arg
    define add-java-resources-to
    define add-jar-resources-to-package
    define sign-package
    define sign-package-arg
    define align-package
    define compress-package
    define remove-timestamps-from-package
    define uncompress-dexs
    define uncompress-shared-libs
    define transform-host-java-to-package
    define transform-host-java-to-dalvik-package
    define copy-one-header
    define copy-one-file
    define copy-and-uncompress-dexs
    define copy-many-files
    define copy-xml-file-checked
    define copy-file-to-target
    define copy-file-to-target-with-cp
    define copy-file-to-target-strip-comments
    define copy-file-to-new-target
    define copy-file-to-new-target-with-cp
    define transform-prebuilt-to-target
    define transform-prebuilt-to-target-strip-comments
    define copy-files-with-structure
    define symlink-file
    define _symlink-file
    define dexpreopt-copy-jar
    define dexpreopt-remove-classes.dex
    define hiddenapi-copy-dex-files
    define hiddenapi-copy-soong-jar
    define transform-jar-to-proguard
    define transform-jar-to-proguard
    define transform-jar-to-dex-r8
    define transform-generated-source
    define assert-max-image-size
    define add-radio-file
    define add-radio-file-internal
    define add-radio-file-checked
    define add-radio-file-checked-internal
    define inherit-package
    define inherit-package-internal
    define set-inherited-package-variables
    define keep-or-override
    define set-inherited-package-variables-internal
    define check-api
    define if-build-from-source
    define if-build-from-source
    define include-if-build-from-source
    define get-prebuilt-src-arch
    define record-module-type
    define compatibility_suite_dirs
    define create-suite-dependencies
    define _clean-path-strip-dotdot
    define _clean-path-strip-root-dotdots
    define _clean-path-expanded
    define clean-path
    define my_test
    define try-validate-path-is-subdir
    define validate-path-is-subdir
    define try-validate-paths-are-subdirs
    define validate-paths-are-subdirs
    define test-validate-paths-are-subdirs
    define jacoco-class-filter-to-file-args
    define jacoco-validate-file-args
    define append_enforce_rro_sources
    define generate_all_enforce_rro_packages
    define has-system-sdk-version
    define get-numeric-sdk-version
    

    main.mkのもう一つの重要な部分は、生成するターゲットファイルをコンパイルする一連のルールを定義することです.
     
    # This is the default target.  It must be the first declared target.
    .PHONY: droid
    DEFAULT_GOAL := droid
    $(DEFAULT_GOAL): droid_targets
    
    ......
    
    .PHONY: ramdisk
    ramdisk: $(INSTALLED_RAMDISK_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: bptimage
    bptimage: $(INSTALLED_BPTIMAGE_TARGET)
    
    .PHONY: vendorimage
    vendorimage: $(INSTALLED_VENDORIMAGE_TARGET)
    
    .PHONY: productimage
    productimage: $(INSTALLED_PRODUCTIMAGE_TARGET)
    
    .PHONY: systemotherimage
    systemotherimage: $(INSTALLED_SYSTEMOTHERIMAGE_TARGET)
    
    .PHONY: bootimage
    bootimage: $(MTK_BOOTIMAGE_TARGET)
    

    コンパイルされたデフォルトのターゲット、すなわち究極のターゲットdroidは、各imageファイル、すなわち各パーティションimgeファイルに段階的に依存します.
     
    # Building a full system-- the default is to build droidcore
    droid_targets: droidcore dist_files
    
    ......
    
    # Build files and then package it into the rom formats
    .PHONY: droidcore
    droidcore: files \
        systemimage \
        $(INSTALLED_BOOTIMAGE_TARGET) \
        $(MTK_BOOTIMAGE_TARGET) \
        $(INSTALLED_RECOVERYIMAGE_TARGET) \
        $(INSTALLED_VBMETAIMAGE_TARGET) \
        $(INSTALLED_USERDATAIMAGE_TARGET) \
        $(INSTALLED_CACHEIMAGE_TARGET) \
        $(INSTALLED_BPTIMAGE_TARGET) \
        $(INSTALLED_VENDORIMAGE_TARGET) \
        $(INSTALLED_PRODUCTIMAGE_TARGET) \
        $(INSTALLED_SYSTEMOTHERIMAGE_TARGET) \
        $(INSTALLED_FILES_FILE) \
        $(INSTALLED_FILES_FILE_VENDOR) \
        $(INSTALLED_FILES_FILE_PRODUCT) \
        $(INSTALLED_FILES_FILE_SYSTEMOTHER) \
        soong_docs
    

    makeのコンパイル原理によれば、コンパイル時に、imageファイル、binファイルなどの究極のターゲットの各依存ファイルをコンパイルするが、imageファイルは多くのライブラリファイル、APKファイル、リソースファイルなどに依存し、ライブラリファイル、APKファイル、リソースファイルなどのモジュールのコンパイルも再帰的にトリガーされる.依存ファイルを再帰的にコンパイルし、最終的に究極の目標を達成し、androidソースコード全体の構築を完了します.もちろんmkではandroid全体のコンパイルを完了するために一連のmkなども導入されているが,ここでは一つ一つ紹介せず,興味のあるものは自分でソースコードを見ることができる.
    同様に、makeのコンパイル原理に基づいて、makeが指定したターゲットによってモジュールを個別にコンパイルすることもでき、コンパイル速度を速めることができます.例:make systemimage.
    もちろん、コンパイル速度をさらに速めるためにenvsetupも利用できます.shにおけるmmまたはmmm関数は,モジュール自体をコンパイルするだけで,モジュールの依存をコンパイルする必要がない場合,mmまたはmmmでコンパイルする方が速い.
    実際にはmkとMakefileには明らかな差はありません.android.mkは実際にはandroidソースコードをコンパイルするのに便利な内蔵変数と内蔵関数がいくつか増えただけです.android.mkはMakefileの構文規則に完全に従い、その内蔵変数と内蔵関数もMakefile構文に従ってインポートされます.最も重要なのは、androidシステムを構築する際にもMakefileから始まります.だからandroidはmkは実際にはGNU makeが元のmakeを拡張したように拡張されたMakefileである.
    次にandroidを紹介します.mkの使用例.
    3. android.mkの使用例
    3.1 APKのコンパイル
     
    LOCAL_PATH:= $(call my-dir)
    
    include $(CLEAR_VARS)
    #    ,   java、aidl  
    LOCAL_SRC_FILES := $(call all-java-files-under, src)
    LOCAL_SRC_FILES += src/com/sprd/gallery3d/aidl/IFloatWindowController.aidl
    # resource    
    LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
    # AndroidManifest.xml  
    LOCAL_MANIFEST_FILE := $(LOCAL_PATH)/AndroidManifest.xml
    #     AAPT2
    LOCAL_USE_AAPT2 := true
    LOCAL_MODULE_TAGS := optional
    #   APK    
    LOCAL_PACKAGE_NAME := DreamCamera2
    #   override   
    LOCAL_OVERRIDES_PACKAGES := Camera2
    # APK   
    LOCAL_CERTIFICATE := platform
    #     odex  
    LOCAL_DEX_PREOPT := false
    # SDK  
    LOCAL_SDK_VERSION := current
    #       
    LOCAL_PROGUARD_FLAG_FILES := proguard.flags
    #    java   
    LOCAL_JAVA_LIBRARIES := android.test.runner
    #    java   
    LOCAL_STATIC_JAVA_LIBRARIES := zxing
    #       
    LOCAL_SHARED_LIBRARIES := libjpeg
    #       
    LOCAL_STATIC_LIBRARIES := libjpeg_static_ndk
    #    
    LOCAL_AAPT_FLAGS := \
            --auto-add-overlay \
            --version-name "$(version_name_package)" \
            --version-code $(version_code_package) \
    #   APK
    include $(BUILD_PACKAGE)
    

    3.2 java静的ライブラリのコンパイル
     
    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    #    ,   java、aidl  
    LOCAL_SRC_FILES := $(call all-subdir-java-files)
    #    java   
    LOCAL_STATIC_JAVA_LIBRARIES := zxing
    #    java   
    LOCAL_JAVA_LIBRARIES := android.test.runner
    #   java      
    LOCAL_MODULE := scan
    #   java   
    include $(BUILD_STATIC_JAVA_LIBRARY)
    

    3.3 java共有ライブラリのコンパイル
     
    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    #    ,   java、aidl  
    LOCAL_SRC_FILES := $(call all-subdir-java-files)
    #    java   
    LOCAL_JAVA_LIBRARIES := bouncycastle core-libart ext services.core
    LOCAL_MODULE_TAGS := optional
    LOCAL_JACK_ENABLED := disabled
    #   java      
    LOCAL_MODULE:= security
    #   java   
    include $(BUILD_JAVA_LIBRARY)
    

    3.4 C/C++スタティックライブラリのコンパイル
     
    LOCAL_PATH:= $(call my-dir)
    include $(CLEAR_VARS)
    
    #         
    LOCAL_MODULE := libgif-ex
    
    # C/C++   
    LOCAL_SRC_FILES := \
        dgif_lib.c     \
        egif_lib.c     \
        gifalloc.c     \
        gif_err.c      \
        gif_hash.c     \
        openbsd-reallocarray.c    \
        quantize.c
    
    LOCAL_CFLAGS += -Wno-format -Wno-sign-compare -Wno-unused-parameter -DHAVE_CONFIG_H
    LOCAL_SDK_VERSION := 8
    LOCAL_NDK_STL_VARIANT := c++_static
    #   C/C++   
    include $(BUILD_STATIC_LIBRARY)
    

    3.5 C/C++共有ライブラリのコンパイル
     
    LOCAL_PATH:= $(call my-dir)
    
    include $(CLEAR_VARS)
    # C/C++   
    LOCAL_C_INCLUDES := \
            $(LOCAL_PATH)/include \
            $(TOPDIR)system/core/include
    # C FLAG
    LOCAL_CFLAGS := -O3 -DNDEBUG
    # LDFLAG
    LOCAL_LDFLAGS := -llog
    #       
    LOCAL_SHARED_LIBRARIES := \
                              libutils \
                              myutils 
    #       
    LOCAL_STATIC_LIBRARIES := libjpeg_static_ndk
    # C/C++   
    LOCAL_SRC_FILES := \
                       main.cpp \
                       utils.cpp 
    #         
    LOCAL_MODULE    := mylib
    LOCAL_MODULE_TAGS := optional
    #      
    include $(BUILD_SHARED_LIBRARY)
    

    4.プリセット用android.mk
    4.1プリセットjar
    方法1:
     
    LOCAL_PATH:= $(call my-dir)
    
    #   
    include $(CLEAR_VARS)
    LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := zxing:libs/core.jar \
                                            gson:libs/gson-2.8.0.jar \
                                            android-support-v7:libs/android-support-v7-recyclerview.jar 
    include $(BUILD_MULTI_PREBUILT)
    
    #   
    include $(CLEAR_VARS)
    ......
    LOCAL_STATIC_JAVA_LIBRARIES += zxing
    LOCAL_STATIC_JAVA_LIBRARIES += gson
    LOCAL_STATIC_JAVA_LIBRARIES += android-support-v7
    ......
    include $(BUILD_PACKAGE)
    

    方法2:
     
    LOCAL_PATH := $(call my-dir)
    
    #   
    include $(CLEAR_VARS)
    LOCAL_MODULE_CLASS := JAVA_LIBRARIES
    LOCAL_MODULE := commons-io
    LOCAL_SDK_VERSION := current
    LOCAL_SRC_FILES := ../../../../../../../../prebuilts/tools/common/m2/repository/commons-io/commons-io/2.4/commons-io-2.4.jar
    LOCAL_UNINSTALLABLE_MODULE := true
    include $(BUILD_PREBUILT)
    
    #   
    include $(CLEAR_VARS)
    ......
    LOCAL_STATIC_JAVA_LIBRARIES += commons-io
    ......
    include $(BUILD_PACKAGE)
    

    4.2プリセットso
    方法1:
     
    LOCAL_PATH:= $(call my-dir)
    
    #   
    include $(CLEAR_VARS)
    LOCAL_MODULE := mylib2
    LOCAL_SRC_FILES_32 := lib/armeabi-v7a/mylib2.so
    LOCAL_SRC_FILES_64 := lib/arm64-v8a/mylib2.so
    LOCAL_MODULE_TAGS := optional
    LOCAL_MODULE_CLASS := SHARED_LIBRARIES
    LOCAL_MODULE_SUFFIX := .so
    LOCAL_PROPRIETARY_MODULE := true
    LOCAL_MULTILIB := both
    include $(BUILD_PREBUILT)
    
    ......
    #   
    include $(CLEAR_VARS)
    LOCAL_SHARED_LIBRARIES += mylib2
    include $(BUILD_PACKAGE)
    ......
    

    方法2:
     
    LOCAL_PATH:= $(call my-dir)
    
    #   
    include $(CLEAR_VARS)
    ......
    ifeq ($(strip $(TARGET_ARCH)), arm64)
        LOCAL_PREBUILT_JNI_LIBS := libs/arm64-v8a/mylib3.so
    else ifeq ($(strip $(TARGET_ARCH)), x86_64)
        LOCAL_PREBUILT_JNI_LIBS := libs/x86_64/mylib3.so
    else ifeq ($(strip $(TARGET_ARCH)),arm)
        LOCAL_PREBUILT_JNI_LIBS := libs/armeabi-v7a/mylib3.so
    else
        LOCAL_PREBUILT_JNI_LIBS := libs/x86/mylib3.so
    endif
    ......
    include $(BUILD_PACKAGE)
    

    4.3プリセットAPK
     
    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    
    #     
    LOCAL_MODULE := NewGallery2
    #          
    LOCAL_OVERRIDES_PACKAGES := Gallery Gallery3D GalleryNew3D Gallery2 DreamGallery2
    #      APPS
    LOCAL_MODULE_CLASS := APPS
    #           
    LOCAL_PRIVATE_PLATFORM_APIS := true
    #   ,      ,      PRESIGNED      ;    ,          。
    LOCAL_CERTIFICATE := platform
    #           
    LOCAL_MODULE_PATH := $(TARGET_OUT)/priv-app
    # APK  
    LOCAL_SRC_FILES := apk/NewGallery2.apk
    # APK   so
    ifeq ($(strip $(TARGET_ARCH)), arm64)
        LOCAL_PREBUILT_JNI_LIBS := libs/arm64-v8a/libjni_jpeg.so
    else ifeq ($(strip $(TARGET_ARCH)), x86_64)
        LOCAL_PREBUILT_JNI_LIBS := libs/x86_64/libjni_jpeg.so
    else ifeq ($(strip $(TARGET_ARCH)),arm)
        LOCAL_PREBUILT_JNI_LIBS := libs/armeabi-v7a/libjni_jpeg.so
    else
        LOCAL_PREBUILT_JNI_LIBS := libs/x86/libjni_jpeg.so
    endif
    include $(BUILD_PREBUILT)
    

    5.結語
    Makefileの基礎知識を身につけ、ソースコードを結合してandroidを明らかにした.mkの後、感じません.mkファイルはそんなによく知られていません.特にandroidを理解していますmkの内蔵変数と内蔵関数の後、私たちは作成しています.mkファイルは基本的に手に入ることができます.
    makeはandroidシステムのソースコードをコンパイルする際に効率が悪いという問題を示したため、googleは後に7.0以上のバージョンでより速いninjaを導入し、中国語では忍者を意味し、ninjaに対応するプロファイルはandroidである.bp.しかしGoogleはninjaを導入しても、ソースコードにはandroidが一部残っている.mk.そして...mkはkatiツールでninja、すなわちandroidに変換することもできる.mkは引き続き使用することもできます.だから、makeはandroid開発者の必須スキルです.