Android build tips

来源:互联网 发布:零基础学java pdf下载 编辑:程序博客网 时间:2024/06/09 15:01

Basic steps:

1. source build/envsetup.sh

2. lunch

3. make

list of make goals

20# A list of goals which affect parsing of makefiles and we need to pass to Kati.21PARSE_TIME_MAKE_GOALS := \22$(PARSE_TIME_MAKE_GOALS) \23$(dont_bother_goals) \24all \25APP-% \26DUMP_% \27ECLIPSE-% \28PRODUCT-% \29boottarball-nodeps \30btnod \31build-art% \32build_kernel-nodeps \33clean-oat% \34continuous_instrumentation_tests \35continuous_native_tests \36cts \37custom_images \38deps-license \39dicttool_aosp \40dist \41dump-products \42dumpvar-% \43eng \44fusion \45oem_image \46old-cts \47online-system-api-sdk-docs \48pdk \49platform \50platform-java \51product-graph \52samplecode \53sdk \54sdk_addon \55sdk_repo \56snod \57stnod \58systemimage-nodeps \59systemtarball-nodeps \60target-files-package \61test-art% \62user \63userdataimage \64userdebug \65valgrind-test-art% \66vts \67win_sdk \68winsdk-tools

Useful functions

1. hmm 

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.
- sgrep:   Greps on all local source files.
- godir:   Go to the directory containing a file.

Look at the source to view more functions. The complete list is:
adb_get_product_device adb_get_traced_by addcompletions add_def_config add_lunch_combo add_target_product_mapping cgrep check_configuration check_product check_variant choosecombo chooseconfiguration chooseproduct choosetype choosevariant config_commit_template core coredump_enable coredump_setup cproj croot findmakefile gdbclient gdbclient_old gdbwrapper get_abs_build_var getbugreports get_build_var get_configuration_choices get_def_config getdriver getlastscreenshot get_make_command getprebuilt getscreenshotpath getsdcardpath get_symbols_directory gettargetarch gettop ggrep godir hmm is isviewserverstarted jgrep key_back key_home key_menu lunch _lunch m make mangrep map_target_product mgrep mm mma mmm mmma pez pid printconfig print_lunch_menu qpid resgrep runhat runtest sepgrep set_java_home setpaths set_sequence_number set_stuff_for_environment settitle sgrep smoketest stacks startviewserver stopviewserver systemstack tapas tracedmdump treegrep

2. printconfig

============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=5.1.1
TARGET_PRODUCT=eanab
TARGET_BUILD_VARIANT=userdebug
TARGET_BUILD_CONFIGURATION=e3os
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-3.13.0-117-generic-x86_64-with-Ubuntu-12.04-precise
HOST_BUILD_TYPE=release
BUILD_ID=2.1.0-ga-rc3
OUT_DIR=out
============================================

3. print_lunch_menu

You're building on Linux

Lunch menu... pick a combo:
     1. aosp_arm-eng
     2. aosp_arm64-eng
     3. aosp_mips-eng
     4. aosp_mips64-eng
     5. aosp_x86-eng
     6. aosp_x86_64-eng
     7. aosp_shamu-userdebug
     8. mini_emulator_mips-userdebug
     9. mini_emulator_x86-userdebug

4. make dump-products

==== device/company/suez/MyDevice.mk ====
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_NAME := suez
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_MODEL := KFSUWI
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_LOCALES := en_US zh_CN zh_TW es_ES pt_BR ru_RU fr_FR de_DE tr_TR vi_VN ms_MY in_ID th_TH it_IT ar_EG hi_IN bn_IN ur_PK fa_IR pt_PT nl_NL el_GR hu_HU tl_PH ro_RO cs_CZ ko_KR km_KH iw_IL my_MM pl_PL es_US bg_BG hr_HR lv_LV lt_LT sk_SK uk_UA de_AT da_DK fi_FI nb_NO sv_SE en_GB hy_AM zh_HK et_EE ja_JP kk_KZ sr_RS sl_SI ca_ES
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_AAPT_CONFIG := normal large xlarge
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_AAPT_PREF_CONFIG := hdpi
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_AAPT_PREBUILT_DPI :=
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_PACKAGES := libfwdlockengine ...............
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_PACKAGES_DEBUG :=
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_PACKAGES_ENG :=
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_PACKAGES_TESTS :=
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_DEVICE := suez
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_MANUFACTURER := company
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_BRAND := company
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_PROPERTY_OVERRIDES := ro.com.android.dateformat=MM-dd-yyyy ro.config.ringtone=Ring_Synth_04.ogg ......
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_DEFAULT_PROPERTY_OVERRIDES := ro.zygote=zygote32 persist.sys.usb.config=mtp ro.mount.fs=EXT4 camera.disable_zsl_mode=1
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_CHARACTERISTICS := tablet
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_COPY_FILES := frameworks/base/data/sounds/Alarm_Beep_01.ogg:system/media/audio/alarms/Alarm_Beep_01.ogg .................
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_OTA_PUBLIC_KEYS :=
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_EXTRA_RECOVERY_KEYS :=
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_PACKAGE_OVERLAYS := device/company/myName/overlay/specify MyName/base/overlays/common .............
PRODUCTS.device/company/suez/MyDevice.mk.DEVICE_PACKAGE_OVERLAYS := Myname/prebuilts/middleware/FluidSupportLibrary/prebuilts/external/fluid-overlay device/company/MyDevice/overlay .....................
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_TAGS :=
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_SDK_ATREE_FILES :=
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_SDK_ADDON_NAME :=
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_SDK_ADDON_COPY_FILES :=
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_SDK_ADDON_COPY_MODULES :=
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_SDK_ADDON_DOC_MODULES :=
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_SDK_ADDON_SYS_IMG_SOURCE_PROP :=
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_DEFAULT_WIFI_CHANNELS :=
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_DEFAULT_DEV_CERTIFICATE :=
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_RESTRICT_VENDOR_FILES :=
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_VENDOR_KERNEL_HEADERS :=
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_FACTORY_RAMDISK_MODULES :=
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_FACTORY_BUNDLE_MODULES :=
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_RUNTIMES := runtime_libart_default
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_BOOT_JARS := core-libart conscrypt okhttp core-junit bouncycastle ext framework telephony-common voip-common ims-common mms-common android.policy apache-xml mediatek-framework dolby_ds dolby_ds2
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_SUPPORTS_VERITY :=
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_OEM_PROPERTIES :=
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_SYSTEM_PROPERTY_BLACKLIST :=
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_SYSTEM_SERVER_JARS := services ethernet-service wifi-service AWSRemoteConfigurationAndroidClient
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_VERITY_SIGNING_KEY :=
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_SYSTEM_VERITY_PARTITION :=
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_VENDOR_VERITY_PARTITION :=
PRODUCTS.device/company/suez/MyDevice./build/core/dumpvar.mkmk.PRODUCT_DEX_PREOPT_IMAGE_IN_DATA :=
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_DEX_PREOPT_MODULE_CONFIGS :=
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_DEX_PREOPT_DEFAULT_FLAGS :=
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_DEX_PREOPT_BOOT_FLAGS :=
PRODUCTS.device/company/suez/MyDevice.mk.PRODUCT_PACKAGE_NAME :=
--------

Add a new product configuration, how it works

1. add 3 files in device/companyName/deviceName

vendorsetup.sh AndroidProducts.mk BoardConfig.mk

2.vendorsetup.sh  (during "source build/envsetup.sh", it will search for vendorsetup.sh, and execute them)

add_lunch_combo full_myName-user  ---------------------------- Add an item in lunch menu
add_lunch_combo full_myName-userdebug
add_lunch_combo full_myName-eng
add_lunch_combo devpreview_myName-user
add_lunch_combo devpreview_myName-userdebug
add_lunch_combo devpreview_myName-eng
add_target_product_mapping devpreview_myName:full_myName  ---- map devpreview_myName to full_myName
add_def_config full_myName:tablet  ------------------  define the device's configuration (This value will be set toTARGET_BUILD_CONFIGURATION)

3. AndroidProducts.mk  (After user select a combo, it will search forAndroidProducts.mk in which has the definition of the selected combo)

PRODUCT_MAKEFILES := \
    full_myName:$(LOCAL_DIR)/tablet_full_myName.mk

The format of combo name is like "PRODUCT-BUILD_VARIANT", e.g. "full_myName-userdebug". After parsing this combo name, then

TARGET_PRODUCT=full_myName
TARGET_BUILD_VARIANT=userdebug

4. run tablet_full_myName.mk

$(call inherit-product, device/amazon/myName/myName.mk)
$(call inherit-product, device/amazon/swconfigs/tablet/tablet.mk)

5. look for BoardConfig.mk and run it

After running "tablet_full_myName.mk", we can get PRODUCT_DEVICE definition.

PRODUCT_DEVICE = myName

TARGET_DEVICE := $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_DEVICE)

Then it will look for */$(TARGET_DEVICE)/BoardConfig.mk in device(or vendor) folder.

6. How to see the result of Boardconfig.mk

Use printconfig function.

And we can customize the output by changing print_build_config_vars in/build/core/dumpvar.mk

7. include your own AndroidBoard.mk

During make, it will include AndroidBoard.mk to build kernel code.

1KERNEL_DIR := kernel/mediatek/mtxxxx23KERNEL_PROJECT := MyKernel4ifneq ($(TARGET_BUILD_VARIANT), user)5KERNEL_DEFCONFIG := $(KERNEL_PROJECT)_debug_defconfig6else7KERNEL_DEFCONFIG := $(KERNEL_PROJECT)_defconfig8endif9ifeq ($(RELEASE_DEBUG),1)10    KERNEL_DEFCONFIG := $(KERNEL_PROJECT)_defconfig11endif1213include $(KERNEL_DIR)/AndroidKernel.mk14PRELOADER_TARGET_PRODUCT ?= MyProduct15LK_PROJECT ?= MyLK1617include bootable/bootloader/lk-mtk/mtxxxxx/AndroidLK.mk18include bootable/bootloader/preloader-mtk/mtxxxxx/AndroidPL.mk