Android.mk常用笔记

来源:互联网 发布:51talk真实评价知乎 编辑:程序博客网 时间:2024/06/03 21:19

android系统用的是makefile来组织代码编译的,我们在编译系统一个make,make bootimage就能完成系统或者内核的编译,就是makefile的自动化的成果,当然自动化的实质是一系列Android.mk在一定的规则下互相协调完成的。android的makefile是基于GNU的makefile,并在其基础上增加一些环境变量等机制实现的,针对android系统,我们常常使用安卓系统特有的环境变量和函数来编译我们的模块(库,可执行文件,apk等)。

说明之前,先给个蓝牙makefile看看样子:

<span style="font-family:SimSun;font-size:14px;">## Copyright 2012 The Android Open Source Project## Licensed under the Apache License, Version 2.0 (the "License");# you may not use this file except in compliance with the License.# You may obtain a copy of the License at##      http://www.apache.org/licenses/LICENSE-2.0## Unless required by applicable law or agreed to in writing, software# distributed under the License is distributed on an "AS IS" BASIS,# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.# See the License for the specific language governing permissions and# limitations under the License.#LOCAL_PATH := $(call my-dir)ifeq ($(BOARD_HAVE_BLUETOOTH_QCOM),true)include $(CLEAR_VARS)BDROID_DIR:= external/bluetooth/bluedroidLOCAL_SRC_FILES := \        src/bt_vendor_qcom.c \        src/hardware.c \        src/userial_vendor_qcom.c \        src/hardware_ar3k.c \        src/userial_vendor_ar3k.c\        src/upio.cLOCAL_C_INCLUDES += \        $(LOCAL_PATH)/include \        $(BDROID_DIR)/hci/includeLOCAL_SHARED_LIBRARIES := \        libcutils \        liblogLOCAL_MODULE := libbt-vendorLOCAL_MODULE_TAGS := optionalLOCAL_MODULE_CLASS := SHARED_LIBRARIESLOCAL_MODULE_OWNER := qcomLOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR_SHARED_LIBRARIES)include $(LOCAL_PATH)/vnd_buildcfg.mkinclude $(BUILD_SHARED_LIBRARY)endif # BOARD_HAVE_BLUETOOTH_QCOM</span><span style="font-family: 'Arial Black'; font-size: 18px;"></span>


下面给出Android.mk一些常用的规则(与GNU一样的规则就不提了):

(1). LOCAL_PATH := $(call my-dir) 

这句是用来指定待编译代码的路径,必须先定义这个变量再干其他的。my-dir是Android系统定义的宏函数,定义在build/core/definitions.mk中,用于解析当前目录路径

(2). include $(CLEAR_VARS)

这句话必须在LOCAL_PATH之后,用于清理一些LOCAL_XXX等全局变量,统一编译环境下,要清理全局变量的,因为一个模块编译完,其他模块编译也需要这些全局变量的,CLEAR_VARS定义在build/core/config.mk,定义如下CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk,其实就是调用清理脚本,清理脚本做的就是把LOCAL_XXX变量清空,或者赋值为默认值。

因为下面有些地方还要提到config.mk,这边先贴出有用的部分:

# ################################################################ Build system internal files# ###############################################################BUILD_COMBOS:= $(BUILD_SYSTEM)/comboCLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mkBUILD_HOST_STATIC_LIBRARY:= $(BUILD_SYSTEM)/host_static_library.mkBUILD_HOST_SHARED_LIBRARY:= $(BUILD_SYSTEM)/host_shared_library.mkBUILD_STATIC_LIBRARY:= $(BUILD_SYSTEM)/static_library.mkBUILD_RAW_STATIC_LIBRARY := $(BUILD_SYSTEM)/raw_static_library.mkBUILD_SHARED_LIBRARY:= $(BUILD_SYSTEM)/shared_library.mkBUILD_EXECUTABLE:= $(BUILD_SYSTEM)/executable.mkBUILD_RAW_EXECUTABLE:= $(BUILD_SYSTEM)/raw_executable.mkBUILD_HOST_EXECUTABLE:= $(BUILD_SYSTEM)/host_executable.mkBUILD_PACKAGE:= $(BUILD_SYSTEM)/package.mkBUILD_PHONY_PACKAGE:= $(BUILD_SYSTEM)/phony_package.mkBUILD_HOST_PREBUILT:= $(BUILD_SYSTEM)/host_prebuilt.mkBUILD_PREBUILT:= $(BUILD_SYSTEM)/prebuilt.mkBUILD_MULTI_PREBUILT:= $(BUILD_SYSTEM)/multi_prebuilt.mkBUILD_JAVA_LIBRARY:= $(BUILD_SYSTEM)/java_library.mkBUILD_STATIC_JAVA_LIBRARY:= $(BUILD_SYSTEM)/static_java_library.mkBUILD_HOST_JAVA_LIBRARY:= $(BUILD_SYSTEM)/host_java_library.mkBUILD_DROIDDOC:= $(BUILD_SYSTEM)/droiddoc.mkBUILD_COPY_HEADERS := $(BUILD_SYSTEM)/copy_headers.mkBUILD_NATIVE_TEST := $(BUILD_SYSTEM)/native_test.mkBUILD_HOST_NATIVE_TEST := $(BUILD_SYSTEM)/host_native_test.mkBUILD_NOTICE_FILE := $(BUILD_SYSTEM)/notice_files.mk

(3). LOCAL_SRC_FILES

告诉编译器,这个模块要编译的源文件有哪些。

(4). LOCAL_C_INCLUDES

告诉编译器,头文件在哪,这个变量不用的话,默认在LOCAL_PATH定义的目录下

(5). LOCAL_STATIC_LIBRARIES

指定该模块使用哪些静态库,在编译时静态(相对于动态链接,更具独立性,但模块变大了)的链接进该模块。

(6). LOCAL_SHARED_LIBRARIES

指定该模块在运行时要加载的库,链接时就需要,但并不将库编入其中,只是在其中嵌入一些信息,以便运行时知道依赖什么动态库。

(7). LOCAL_MODULE

指定待编译模块的名字,这个名字在整个编译环境下要唯一,最终的模块名字会根据要编译的模块类型添加相应的前缀和后缀。比如共享库类型名为ctp的模块,最终编译的名称为libctp.so

(8). LOCAL_MODULE_TAGS

这个选项一般包含3中值(其他包括debug,tests我不常见就不说了):eng,usr,optional,分别表示工程(开发版),用户(正式发布版),可选模式编译,可赋值多个。其中optional值要在对应的board的Android.mk中指定,才能依据平台板来编译,eng和usr表示在选择编译eng或者usr镜像时才会编译该模块。

(9). LOCAL_MODULE_PATH

指定该LOCAL_MODULE被安装到哪

(10). LOCAL_CERTIFICATE

签名,默认值是testkey,还还以取值为platform,shared,media。一般当apk无法安装或者没有某个访问权限时,就是因为apk未签名,签名有2中方式:一种在代码级的Android.mk中加入LOCAL_CERTIFICATE=paltform(它的意思是用私钥$(LOCAL_CERTIFICATE).pk8和公钥$(LOCAL_CERTIFICATE).x509.pem来给apk签名),再相应的在apk源码下的AndroidManifest.xml中manifest节点中加入android:sharedUserID="android.uid.system",这样编译出来的apk运行在system进程,其他xml还可有android.uid.shared和android.media另一种是直接编译好apk后(eclipse编译未授权),用platform.pk8和platform.x509.pem(在安卓源码build\target\product\security)和Signapk(build\tools\signapk)来签名apk,用法为:signapk platform.x509.pem platform.pk8 input.apk output.apk,其中input.apk和output.apk为绝对路径,我一般直接拷贝到security目录执行,再拷贝出去。

(11). LOCAL_PACKAGE_NAME

当编译apk时指定打包apk的名称,一般在后面与include $(BUILD_PACKAGE)匹配



另参考Android编译系统架构文章

参考文章一: 理解 Android Build 系统author:强波

http://www.ibm.com/developerworks/cn/opensource/os-cn-android-build/

参考文章二: android 系统 makefile文件(Android.mk)组织结构      author:大脸猫和小白鼠

http://blog.csdn.net/dalianmaoblog/article/details/6614970


0 0
原创粉丝点击