Build Cookbook

The Android Build Cookbook offers code snippets to help you quickly implement some common build tasks. For additional instruction, please see the other build documents in this section.

Building a simple APK

  LOCAL_PATH := $(call my-dir)
  include $(CLEAR_VARS)
   
  # Build all java files in the java subdirectory
  LOCAL_SRC_FILES := $(call all-subdir-java-files)
   
  # Name of the APK to build
  LOCAL_PACKAGE_NAME := LocalPackage
   
  # Tell it to build an APK
  include $(BUILD_PACKAGE)

Building a APK that depends on a static .jar file

  LOCAL_PATH := $(call my-dir)
  include $(CLEAR_VARS)
   
  # List of static libraries to include in the package
  LOCAL_STATIC_JAVA_LIBRARIES := static-library
   
  # Build all java files in the java subdirectory
  LOCAL_SRC_FILES := $(call all-subdir-java-files)
   
  # Name of the APK to build
  LOCAL_PACKAGE_NAME := LocalPackage
   
  # Tell it to build an APK
  include $(BUILD_PACKAGE)

Building a APK that should be signed with the platform key

  LOCAL_PATH := $(call my-dir)
  include $(CLEAR_VARS)
   
  # Build all java files in the java subdirectory
  LOCAL_SRC_FILES := $(call all-subdir-java-files)
   
  # Name of the APK to build
  LOCAL_PACKAGE_NAME := LocalPackage
   
  LOCAL_CERTIFICATE := platform
   
  # Tell it to build an APK
  include $(BUILD_PACKAGE)

Building a APK that should be signed with a specific vendor key

  LOCAL_PATH := $(call my-dir)
  include $(CLEAR_VARS)
   
  # Build all java files in the java subdirectory
  LOCAL_SRC_FILES := $(call all-subdir-java-files)
   
  # Name of the APK to build
  LOCAL_PACKAGE_NAME := LocalPackage
   
  LOCAL_CERTIFICATE := vendor/example/certs/app
   
  # Tell it to build an APK
  include $(BUILD_PACKAGE)

Adding a prebuilt APK

  LOCAL_PATH := $(call my-dir)
  include $(CLEAR_VARS)
   
  # Module name should match apk name to be installed.
  LOCAL_MODULE := LocalModuleName
  LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
  LOCAL_MODULE_CLASS := APPS
  LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
   
  include $(BUILD_PREBUILT)

Adding a Static Java Library

  LOCAL_PATH := $(call my-dir)
  include $(CLEAR_VARS)
   
  # Build all java files in the java subdirectory
  LOCAL_SRC_FILES := $(call all-subdir-java-files)
   
  # Any libraries that this library depends on
  LOCAL_JAVA_LIBRARIES := android.test.runner
   
  # The name of the jar file to create
  LOCAL_MODULE := sample
   
  # Build a static jar file.
  include $(BUILD_STATIC_JAVA_LIBRARY)

Android.mk Variables

These are the variables that you'll commonly see in Android.mk files, listedalphabetically. First, a note on the variable naming:

  • LOCAL_ - These variables are set per-module. They are cleared by the include $(CLEAR_VARS) line, so you can rely on them being empty after including that file. Most of the variables you'll use in most modules are LOCAL_ variables.
  • PRIVATE_ - These variables are make-target-specific variables. That means they're only usable within the commands for that module. It also means that they're unlikely to change behind your back from modules that are included after yours. This link to the make documentation describes more about target-specific variables.
  • HOST_ and TARGET_ - These contain the directories and definitions that are specific to either the host or the target builds. Do not set variables that start with HOST_ or TARGET_ in your makefiles.
  • BUILD_ and CLEAR_VARS - These contain the names of well-defined template makefiles to include. Some examples are CLEAR_VARS and BUILD_HOST_PACKAGE.
  • Any other name is fair-game for you to use in your Android.mk. However, remember that this is a non-recursive build system, so it is possible that your variable will be changed by another Android.mk included later, and be different when the commands for your rule / module are executed.
ParameterDescription
LOCAL_AAPT_FLAGS 
LOCAL_ACP_UNAVAILABLE 
LOCAL_ADDITIONAL_JAVA_DIR 
LOCAL_AIDL_INCLUDES 
LOCAL_ALLOW_UNDEFINED_SYMBOLS 
LOCAL_ARM_MODE 
LOCAL_ASFLAGS 
LOCAL_ASSET_DIR 
LOCAL_ASSET_FILESIn Android.mk files that include $(BUILD_PACKAGE) set thisto the set of files you want built into your app. Usually:

LOCAL_ASSET_FILES += $(call find-subdir-assets)

LOCAL_BUILT_MODULE_STEM 
LOCAL_C_INCLUDES

Additional directories to instruct the C/C++ compilers to look for headerfiles in. These paths are rooted at the top of the tree. UseLOCAL_PATH if you have subdirectories of your own that youwant in the include paths. For example:

LOCAL_C_INCLUDES += extlibs/zlib-1.2.3
LOCAL_C_INCLUDES += $(LOCAL_PATH)/src

You should not add subdirectories of include toLOCAL_C_INCLUDES, instead you should reference those filesin the #include statement with their subdirectories. Forexample:

#include <utils/KeyedVector.h>
not #include <KeyedVector.h>

LOCAL_CCIf you want to use a different C compiler for this module, set LOCAL_CCto the path to the compiler. If LOCAL_CC is blank, the appropriate defaultcompiler is used.
LOCAL_CERTIFICATE 
LOCAL_CFLAGSIf you have additional flags to pass into the C or C++ compiler, addthem here. For example:

LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1

LOCAL_CLASSPATH 
LOCAL_COMPRESS_MODULE_SYMBOLS 
LOCAL_COPY_HEADERS

The set of files to copy to the install include tree. You must alsosupply LOCAL_COPY_HEADERS_TO.

This is going away because copying headers messes up the error messages, andmay lead to people editing those headers instead of the correct ones. It alsomakes it easier to do bad layering in the system, which we want to avoid. Wealso aren't doing a C/C++ SDK, so there is no ultimate requirement to copy anyheaders.

LOCAL_COPY_HEADERS_TO

The directory within "include" to copy the headers listed inLOCAL_COPY_HEADERS to.

This is going away because copying headers messes up the error messages, andmay lead to people editing those headers instead of the correct ones. It alsomakes it easier to do bad layering in the system, which we want to avoid. Wealso aren't doing a C/C++ SDK, so there is no ultimate requirement to copy anyheaders.

LOCAL_CPP_EXTENSIONIf your C++ files end in something other than ".cpp",you can specify the custom extension here. For example:

LOCAL_CPP_EXTENSION := .cc

Note that all C++ files for a given module must have the sameextension; it is not currently possible to mix different extensions.
LOCAL_CPPFLAGSIf you have additional flags to pass into only the C++ compiler, addthem here. For example:

LOCAL_CPPFLAGS += -ffriend-injection

LOCAL_CPPFLAGS is guaranteed to be after LOCAL_CFLAGS on the compile line, so you can use it to override flags listed inLOCAL_CFLAGS
LOCAL_CXXIf you want to use a different C++ compiler for this module, set LOCAL_CXXto the path to the compiler. If LOCAL_CXX is blank, the appropriate defaultcompiler is used.
LOCAL_DX_FLAGS 
LOCAL_EXPORT_PACKAGE_RESOURCES 
LOCAL_FORCE_STATIC_EXECUTABLE

If your executable should be linked statically, set LOCAL_FORCE_STATIC_EXECUTABLE:=true. There is a very shortlist of libraries that we have in static form (currently only libc). This isreally only used for executables in /sbin on the root filesystem.

LOCAL_GENERATED_SOURCES

Files that you add to LOCAL_GENERATED_SOURCES will beautomatically generated and then linked in when your module is built.See the Custom Tools template makefile for anexample.

LOCAL_INSTRUMENTATION_FOR 
LOCAL_INSTRUMENTATION_FOR_PACKAGE_NAME 
LOCAL_INTERMEDIATE_SOURCES 
LOCAL_INTERMEDIATE_TARGETS 
LOCAL_IS_HOST_MODULE 
LOCAL_JAR_MANIFEST 
LOCAL_JARJAR_RULES 
LOCAL_JAVA_LIBRARIES

When linking Java apps and libraries, LOCAL_JAVA_LIBRARIES specifies which sets of java classes to include. Currently there aretwo of these: core and framework.In most cases, it will look like this:

LOCAL_JAVA_LIBRARIES := core framework

Note that setting LOCAL_JAVA_LIBRARIES is not necessary(and is not allowed) when building an APK with"include $(BUILD_PACKAGE)". The appropriate librarieswill be included automatically.

LOCAL_JAVA_RESOURCE_DIRS 
LOCAL_JAVA_RESOURCE_FILES 
LOCAL_JNI_SHARED_LIBRARIES 
LOCAL_LDFLAGS

You can pass additional flags to the linker by settingLOCAL_LDFLAGS. Keep in mind that the order of parameters isvery important to ld, so test whatever you do on all platforms.

LOCAL_LDLIBS

LOCAL_LDLIBS allows you to specify additional librariesthat are not part of the build for your executable or library. Specifythe libraries you want in -lxxx format; they're passed directly to the link line. However, keep in mind that there will be no dependency generatedfor these libraries. It's most useful in simulator builds where you wantto use a library preinstalled on the host. The linker (ld) is a particularlyfussy beast, so it's sometimes necessary to pass other flags here if you'redoing something sneaky. Some examples:

LOCAL_LDLIBS += -lcurses -lpthread
LOCAL_LDLIBS += -Wl,-z,origin

LOCAL_MODULELOCAL_MODULE is the name of what's supposed to be generatedfrom your Android.mk. For exmample, for libkjs, the LOCAL_MODULE is "libkjs" (the build system adds the appropriate suffix -- .so .dylib .dll).For app modules, use LOCAL_PACKAGE_NAME instead of LOCAL_MODULE.
LOCAL_MODULE_PATHInstructs the build system to put the module somewhere other than what'snormal for its type. If you override this, make sure you also setLOCAL_UNSTRIPPED_PATH if it's an executable or a shared libraryso the unstripped binary has somewhere to go. An error will occur if you forgetto.

See Putting modules elsewhere for more.

LOCAL_MODULE_STEM 
LOCAL_MODULE_TAGS

Set LOCAL_MODULE_TAGS to any number of whitespace-separatedtags.

This variable controls what build flavors the package gets included in. For example:

  • user: include this in user/userdebug builds
  • eng: include this in eng builds
  • tests: the target is a testing target and makes it available for tests
  • optional: don't include this
LOCAL_NO_DEFAULT_COMPILER_FLAGS 
LOCAL_NO_EMMA_COMPILE 
LOCAL_NO_EMMA_INSTRUMENT 
LOCAL_NO_STANDARD_LIBRARIES 
LOCAL_OVERRIDES_PACKAGES 
LOCAL_PACKAGE_NAMELOCAL_PACKAGE_NAME is the name of an app. For example,Dialer, Contacts, etc.
LOCAL_POST_PROCESS_COMMAND

For host executables, you can specify a command to run on the moduleafter it's been linked. You might have to go through some contortionsto get variables right because of early or late variable evaluation:

module := $(HOST_OUT_EXECUTABLES)/$(LOCAL_MODULE)
LOCAL_POST_PROCESS_COMMAND := /Developer/Tools/Rez -d __DARWIN__ -t APPL\
       -d __WXMAC__ -o $(module) Carbon.r

LOCAL_PREBUILT_EXECUTABLESWhen including $(BUILD_PREBUILT) or $(BUILD_HOST_PREBUILT), set these toexecutables that you want copied. They're located automatically into theright bin directory.
LOCAL_PREBUILT_JAVA_LIBRARIES 
LOCAL_PREBUILT_LIBSWhen including $(BUILD_PREBUILT) or $(BUILD_HOST_PREBUILT), set these tolibraries that you want copied. They're located automatically into theright lib directory.
LOCAL_PREBUILT_OBJ_FILES 
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES 
LOCAL_PRELINK_MODULE 
LOCAL_REQUIRED_MODULES

Set LOCAL_REQUIRED_MODULES to any number of whitespace-separatedmodule names, like "libblah" or "Email". If this module is installed, allof the modules that it requires will be installed as well. This can beused to, e.g., ensure that necessary shared libraries or providers areinstalled when a given app is installed.

LOCAL_RESOURCE_DIR 
LOCAL_SDK_VERSION 
LOCAL_SHARED_LIBRARIESThese are the libraries you directly link against. You don't need topass transitively included libraries. Specify the name without the suffix:

LOCAL_SHARED_LIBRARIES := \
    libutils \
    libui \
    libaudio \
    libexpat \
    libsgl

LOCAL_SRC_FILESThe build system looks at LOCAL_SRC_FILES to know what sourcefiles to compile -- .cpp .c .y .l .java. For lex and yacc files, it knowshow to correctly do the intermediate .h and .c/.cpp files automatically. Ifthe files are in a subdirectory of the one containing the Android.mk, prefixthem with the directory name:

LOCAL_SRC_FILES := \
    file1.cpp \
    dir/file2.cpp

LOCAL_STATIC_JAVA_LIBRARIES 
LOCAL_STATIC_LIBRARIESThese are the static libraries that you want to include in your module.Mostly, we use shared libraries, but there are a couple of places, likeexecutables in sbin and host executables where we use static libraries instead.

LOCAL_STATIC_LIBRARIES := \
    libutils \
    libtinyxml

LOCAL_UNINSTALLABLE_MODULE 
LOCAL_UNSTRIPPED_PATHInstructs the build system to put the unstripped version of the modulesomewhere other than what's normal for its type. Usually, you override thisbecause you overrode LOCAL_MODULE_PATH for an executable or ashared library. If you overrode LOCAL_MODULE_PATH, but not LOCAL_UNSTRIPPED_PATH, an error will occur.

See Putting modules elsewhere for more.

LOCAL_WHOLE_STATIC_LIBRARIESThese are the static libraries that you want to include in your module without allowingthe linker to remove dead code from them. This is mostly useful if you want to add a static libraryto a shared library and have the static library's content exposed from the shared library.

LOCAL_WHOLE_STATIC_LIBRARIES := \
    libsqlite3_android

LOCAL_YACCFLAGSAny flags to pass to invocations of yacc for your module. A known limitationhere is that the flags will be the same for all invocations of YACC for yourmodule. This can be fixed. If you ever need it to be, just ask.

LOCAL_YACCFLAGS := -p kjsyy

OVERRIDE_BUILT_MODULE_PATH 



from:http://www.kandroid.org/online-pdk/guide/build_cookbook.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值