Android.mk常用笔记

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/bluedroid

LOCAL_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.c

LOCAL_C_INCLUDES += \
        $(LOCAL_PATH)/include \
        $(BDROID_DIR)/hci/include

LOCAL_SHARED_LIBRARIES := \
        libcutils \
        liblog

LOCAL_MODULE := libbt-vendor
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_MODULE_OWNER := qcom
LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR_SHARED_LIBRARIES)

include $(LOCAL_PATH)/vnd_buildcfg.mk

include $(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)/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_RAW_STATIC_LIBRARY := $(BUILD_SYSTEM)/raw_static_library.mk
BUILD_SHARED_LIBRARY:= $(BUILD_SYSTEM)/shared_library.mk
BUILD_EXECUTABLE:= $(BUILD_SYSTEM)/executable.mk
BUILD_RAW_EXECUTABLE:= $(BUILD_SYSTEM)/raw_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_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_COPY_HEADERS := $(BUILD_SYSTEM)/copy_headers.mk
BUILD_NATIVE_TEST := $(BUILD_SYSTEM)/native_test.mk
BUILD_HOST_NATIVE_TEST := $(BUILD_SYSTEM)/host_native_test.mk
BUILD_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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值