Android系统模块编译Makefile编写规则

Android.mk的基本构成

这个Android.mk 会编译出一个hello的可执行文件,并放入system/bin

LOCAL_PATH := $(call my-dir)             #指定当前目录   

include $(CLEAR_VARS)                    #引入编译变量 
LOCAL_MODULE := hello                    #编译出来的模块名 
LOCAL_MODULE_TAGS := optional            #编译选项便是在何种情况下编译 
LOCAL_SRC_FILES := hello.c               #源文件(可以指定多个) 
LOCAL_MODULE_CLASS := EXECUTABLES        #指定编译之后放置的位置(此处指示放在system/bin下) 
include $(BUILD_EXECUTABLE)              #引入编译成可执行文件的规则 

参考实例
LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS)
LOCAL_MODULE        := SystemCore
LOCAL_MODULE_TAGS   := optional
LOCAL_MODULE_CLASS  := APPS
LOCAL_CERTIFICATE   := platform
LOCAL_SRC_FILES     := SystemCore_v5.2.5.7-10.apk
LOCAL_MODULE_PATH   := $(PRODUCT_OUT)/system/app
include $(BUILD_PREBUILT)

include $(CLEAR_VARS)
LOCAL_MODULE        := libjni_gpiocontrol.so
LOCAL_MODULE_TAGS   := optional
LOCAL_MODULE_CLASS  := SHARED_LIBRARIES
LOCAL_CERTIFICATE   := platform
LOCAL_SRC_FILES     := libjni_gpiocontrol.so
LOCAL_MODULE_PATH   := $(PRODUCT_OUT)/system/lib
include $(BUILD_PREBUILT)
代码编译规则
  • LOCAL_PATH
    指定目录,以上是一般用法指示当前目录(my-dir函数是Android编译时. build/envsetup.sh命令生成的 能够获取当前目录的路径)

  • include $(CLEAR_VARS)
    android有自己的一套代码编译规则跟编译选项等变量的定义,此变量实际是build/core/clear_vas.mk

  • LOCAL_MODULE
    必须定义,以表示Android.mk中的每一个模块。名字必须唯一且不包含空格

  • LOCAL_MODULE_TAGS

user		模块只在user版本下编译
eng			模块只在eng版本下编译
tests		模块只在test版本下编译
optional	模块在所有版本下都编译
  • LOCAL_MODULE_CLASS
    标识了所编译模块最后放置的位置,如果不指定,不会放到系统中,之后放在最后的obj目录下的对应目录中.
    编译C/C++规则build/core/definitions.mk
    LOCAL_MODULE_CLASS用于制定LOCAL_MODULE_PATH的路径所在

自己编写的Android.mk可不显示的指定LOCAL_MODULE_CLASS的值。
但当遇到include $(BUILD_PREBUILT)的预编译选项时不会指定模块模块编译输出的类型CLASS,需要在自己编写的Android.mk中明确指定LOCAL_MODULE_CLASS的值如ETC/APP等,使其值为非空,从而帮助系统确定LOCAL_MODULE_PATH的路径,比如最终编译输出LOCAL_MODULE_PATH := $(TARGRT_OUT_ETC)。

LOCAL_MODULE_CLASS := ETC  				#表示放于system/etc目录
LOCAL_MODULE_CLASS := EXECUTABLES    	#放于/system/bin
LOCAL_MODULE_CLASS := SHARED_LIBRARIES  #放在/system/lib下
  • LOCAL_MODULE_PATH
    目标安装路径

  • LOCAL_MODULE_RELATIVE_PATH
    指定动态库的相对路径,以各自编译对象放置的目录为参考。

android.mk文件中有
LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw 改为
LOCAL_MODULE_RELATIVE_PATH := hw
后一种可以分别在lib和lib64下分别生成32位和64位的so文件
  • LOCAL_CERTIFICATE
    签名方式
testkey			普通APK,默认情况下使用。
platform		该APK完成一些系统的核心功能。经过对系统中存在的文件夹的访问测试,这种方式编译出来的APK所在进程的UID为system。
shared			该APK需要和home/contacts进程共享数据。
media			该APK是media/download系统中的一环。
  • LOCAL_SRC_FILES
    源文件列表
#添加所有cpp文件

MY_CPP_LIST += $(wildcard $(LOCAL_PATH)/src/core/*.cpp) 
LOCAL_SRC_FILES := $(MY_CPP_LIST:$(LOCAL_PATH)/%=%)
  • include $(BUILD_XXX)
    表示编译出来的模块类型,有三种
BUILD_EXECUTABLE		编译成可执行的模块	build/core/host_executable.mk
BUILD_STATIC_LIBRARY	编译成静态库			build/core/host_static_library.mk
BUILD_SHARED_LIBRARY	编译成动态库			build/core/host_shared_library.mk

BUILD_PREBUILT :
这种方式把文件当成编译项目,在Android.mk中copy一个file

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值