您的位置:首页 > 产品设计 > UI/UE

ANDROID Porting系列三、Build Cookbook

2010-07-15 21:15 295 查看
http://source.android.com/porting/build_cookbook.html

 
Android的Build Cookbook提供代码片段以帮助您快速执行一些常见的build任务。如需指示,请参阅本节中的其他build文件.

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

这些都是变量,你会经常看到按字母顺序列出Android.mk文件。首先,关于命名变量说明:

·                                
LOCAL_ -这些变量被设置每个模块。他们清除了包括$(CLEAR_VARS)行,所以你可以依靠他们正在该文件后,包括空的。大部分你的变量在大多数模块将使用LOCAL_变量。
·                                
PRIVATE_ -这些变量是make-target-specific变量。这意味着他们只能在该模块中的命令可用。这也意味着你从后面你包含的模块回来他们也不会改变。(link to
the make documentation) 介绍了更多target-specific variables。
·                                
HOST_ and TARGET_ -这些包含特定于主机或目标的基础之上的目录和定义。不要设置HOST_和TARGET_开头的变量在你的makefile..
·                                
BUILD_ and CLEAR_VARS -这包含了名字和定义模板的makefiles。一些例子CLEAR_VARS和BUILD_HOST_PACKAGE。
·                                
任何其他的名字在您使用Android.mk是公平的。但是,请记住,这是一个非递归生成系统,因此它可能是您的变量将被改变,以后推出的另一Android.mk,并且一样当为您的规则/ module执行的命令。
Parameter
Description
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_FILES
In
Android.mk files that 
include
$(BUILD_PACKAGE)
 set this to 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
header files in. These paths are rooted at the top of the tree. Use 
LOCAL_PATH
 if you have subdirectories of your own that you want 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 to 
LOCAL_C_INCLUDES
, instead you should reference those files in the 
#include
 statement with their subdirectories. For example:

#include
<utils/KeyedVector.h>


not 
#include
<KeyedVector.h>


LOCAL_CC
If you
want to use a different C compiler for this module, set LOCAL_CC to the path
to the compiler. If LOCAL_CC is blank, the appropriate default compiler is
used.
LOCAL_CERTIFICATE
 
LOCAL_CFLAGS
If you
have additional flags to pass into the C or C++ compiler, add them 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
also supply 
LOCAL_COPY_HEADERS_TO
.

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

LOCAL_COPY_HEADERS_TO
The directory within "include" to copy the headers
listed in 
LOCAL_COPY_HEADERS
 to.

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

LOCAL_CPP_EXTENSION
If 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 same extension; it is not
currently possible to mix different extensions.
LOCAL_CPPFLAGS
If you
have additional flags to pass into only the C++ compiler, add them 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 in 
LOCAL_CFLAGS

LOCAL_CXX
If you
want to use a different C++ compiler for this module, set LOCAL_CXX to the
path to the compiler. If LOCAL_CXX is blank, the appropriate default compiler
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 short list of libraries that we have in static
form (currently only libc). This is really only used for executables in /sbin
on the root filesystem.

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

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
are two 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 libraries will 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 setting 
LOCAL_LDFLAGS
. Keep in mind that the order of parameters is very important to
ld, so test whatever you do on all platforms.

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

LOCAL_LDLIBS +=
-lcurses -lpthread

LOCAL_LDLIBS += -Wl,-z,origin


LOCAL_MODULE
LOCAL_MODULE
 is the name of what's supposed to be generated from 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_PATH
Instructs
the build system to put the module somewhere other than what's normal for its
type. If you override this, make sure you also set 
LOCAL_UNSTRIPPED_PATH
 if it's an executable or a shared library so the unstripped binary
has somewhere to go. An error will occur if you forget to.
See Putting modules elsewhere for more.

LOCAL_MODULE_STEM
 
LOCAL_MODULE_TAGS
Set 
LOCAL_MODULE_TAGS
 to any number of whitespace-separated tags.

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_NAME
LOCAL_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
module after it's been linked. You might have to go through some contortions
to 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_EXECUTABLES
When
including $(BUILD_PREBUILT) or $(BUILD_HOST_PREBUILT), set these to
executables that you want copied. They're located automatically into the right
bin directory.
LOCAL_PREBUILT_JAVA_LIBRARIES
 
LOCAL_PREBUILT_LIBS
When
including $(BUILD_PREBUILT) or $(BUILD_HOST_PREBUILT), set these to libraries
that you want copied. They're located automatically into the right 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-separated module names, like
"libblah" or "Email". If this module is installed, all of
the modules that it requires will be installed as well. This can be used to,
e.g., ensure that necessary shared libraries or providers are installed when
a given app is installed.

LOCAL_RESOURCE_DIR
 
LOCAL_SDK_VERSION
 
LOCAL_SHARED_LIBRARIES
These are
the libraries you directly link against. You don't need to pass transitively
included libraries. Specify the name without the suffix:
LOCAL_SHARED_LIBRARIES
:= /

    libutils
/

    libui /

    libaudio
/

    libexpat
/

    libsgl


LOCAL_SRC_FILES
The build
system looks at 
LOCAL_SRC_FILES
 to know what source files to compile -- .cpp .c .y .l .java. For
lex and yacc files, it knows how to correctly do the intermediate .h and
.c/.cpp files automatically. If the files are in a subdirectory of the one
containing the Android.mk, prefix them with the directory name:
LOCAL_SRC_FILES :=
/

    file1.cpp
/

    dir/file2.cpp


LOCAL_STATIC_JAVA_LIBRARIES
 
LOCAL_STATIC_LIBRARIES
These are
the static libraries that you want to include in your module. Mostly, we use
shared libraries, but there are a couple of places, like executables in sbin
and host executables where we use static libraries instead.
LOCAL_STATIC_LIBRARIES
:= /

    libutils
/

    libtinyxml


LOCAL_UNINSTALLABLE_MODULE
 
LOCAL_UNSTRIPPED_PATH
Instructs
the build system to put the unstripped version of the module somewhere other
than what's normal for its type. Usually, you override this because you
overrode 
LOCAL_MODULE_PATH
 for an executable or a shared 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_LIBRARIES
These are
the static libraries that you want to include in your module without allowing
the linker to remove dead code from them. This is mostly useful if you want
to add a static library to a shared library and have the static library's
content exposed from the shared library.
LOCAL_WHOLE_STATIC_LIBRARIES
:= /

    libsqlite3_android


LOCAL_YACCFLAGS
Any flags
to pass to invocations of yacc for your module. A known limitation here is
that the flags will be the same for all invocations of YACC for your module.
This can be fixed. If you ever need it to be, just ask.
LOCAL_YACCFLAGS :=
-p kjsyy


OVERRIDE_BUILT_MODULE_PATH
 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: