Android-makefile学习总结

目录

一、Android.mk概述

二、Android.mk的常用构成

三、参考实例

3.1 共享库mk

LOCAL_PATH := $(call my-dir)

include $( CLEAR_VARS)

LOCAL_MODULE:= helloworld

LOCAL_SRC_FILES:= helloworld.c

include$(BUILD_SHARED_LIBRARY)

3.2 预编译应用程序mk

ifeq ($(strip $(SYSTEMUI_SUPPORT)),yes)

LOCAL_MODULE_TAGS := optional

LOCAL_MODULE_CLASS := APPS

LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)

LOCAL_CERTIFICATE := platform

LOCAL_MULTILIB := both

LOCAL_PRIVILEGED_MODULE := true


一、Android.mk概述

Android.mk file用来向编译系统描述你的源代码。具体来说:-该文件是GNU Makefile的一小部分,会被编译系统解析一次或更多次的build系统。这个文件的语法允许把你的源代码组织成模块,如:静态库、共享库(将被安装/复制到您的应用软件包);我们可以在每一个Android.mk file中定义一个或多个模块,也可以在几个模块中使用同一个源代码文件。

二、Android.mk的常用构成

  • LOCAL_PATH := $(call my-dir)             #指定当前目录   
  • include $(CLEAR_VARS)                    #引入编译变量 
  • LOCAL_MODULE := hello                    #编译出来的模块名 
  • LOCAL_MODULE_TAGS := optional               #编译选项便是在何种情况下编译 
  • LOCAL_SRC_FILES := hello.c               #源文件(可以指定多个) 
  • LOCAL_MODULE_CLASS := EXECUTABLES        #指定编译之后放置的位置
  • include $(BUILD_EXECUTABLE)              #引入编译成可执行文件的规则 
  • LOCAL_PACKAGE_NAME                       #指定APP应用名称
  • LOCAL_PRIVATE_PLATFORM_APIS := true    #设置后,会使用sdk的hide的api來编译
  • LOCAL_USE_AAPT2 := true    #aapt 是编译和打包资源的工具。而aapt2是在aapt上做了优化
  • LOCAL_JNI_SHARED_LIBRARIES := libbluetooth_jni    #声明要使用到的共享 JNI 库的名称
  • LOCAL_JAVA_LIBRARIES := javax.obex telephony-common services.net    #指定依赖的共享java类库,这个是编译时依赖,最终不会打包
  • LOCAL_STATIC_JAVA_LIBRARIES := \
     com.android.vcard \
     bluetooth.cc\ 
     services.net \
    libprotobuf-java-lite \    #指定依赖的静态java类库,最终会打包到apk里面。引用多个的时候,可以像上面那样写。
  • LOCAL_STATIC_ANDROID_LIBRARIES := android-support-v4 #声明要调用 android 的包,这里是v4包
  • LOCAL_REQUIRED_MODULES := libbluetooth #指定依赖的模块。一旦本模块被安装,通过此变量指定的模块也将被安装
  • LOCAL_PROGUARD_ENABLED := disabled #混淆配置,默认为full obfuscation,全代码混淆,disabled不开启
  • include $(BUILD_PACKAGE) #编译成APK 文件
  • include $(BUILD_STATIC_JAVA_LIBRARY) #生成静态JAVA库

三、参考实例

3.1 共享库mk

下面这是一个生成共享库的mk文件实例。

LOCAL_PATH:= $(call my-dir)

include$(CLEAR_VARS)

LOCAL_MODULE:=helloworld

LOCAL_SRC_FILES:= helloworld.c

include$(BUILD_SHARED_LIBRARY)

我们来解释一下这几行代码

LOCAL_PATH := $(call my-dir)

Android.mk file必须定义好LOCAL_PATH变量。它用于在开发树中查找源文件。函数’my-dir’, 由编译系统提供,用于返回当前路径(即包含Android.mk file文件的目录)。

include $( CLEAR_VARS)

CLEAR_VARS由编译系统提供,指定让GNU MAKEFILE为你清除许多LOCAL_XXX变量(例如 LOCAL_MODULE, LOCAL_SRC_FILES,LOCAL_STATIC_LIBRARIES, 等等...),

除LOCAL_PATH 。这是必要的,因为所有的编译控制文件都在同一个GNU MAKE执行环境中,所有的变量都是全局的。

LOCAL_MODULE:= helloworld

LOCAL_MODULE变量是必须定义的,它是你在Android.mk文件中描述的每个模块的标识。它必须是唯一的,而且不包含任何空格。注意编译系统会自动产生合适的前缀和后缀,例如一个被命名为'foo'的共享库模块,将会生成'libfoo.so'文件。

LOCAL_SRC_FILES:= helloworld.c

LOCAL_SRC_FILES变量包含将要编译打包进模块中的源文件列表。

include$(BUILD_SHARED_LIBRARY)

需要编译成什么模块类型,BUILD_SHARED_LIBRARY是编译系统提供的变量,它表示的是生成一个动态库;它指向一个GNU Makefile脚本(应该就是在build/core目录下的shared_library.mk)。

3.2 预编译应用程序mk

LOCAL_PATH := $(call my-dir)
ifeq ($(strip $(SYSTEMUI_SUPPORT)),yes)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := platform
LOCAL_MODULE := SystemUI
ifeq ($(TARGET_BUILD_VARIANT),user)
LOCAL_SRC_FILES := $(LOCAL_MODULE)-release.apk
else
LOCAL_SRC_FILES := $(LOCAL_MODULE)-debug.apk
endif
LOCAL_MULTILIB := both
LOCAL_PRIVILEGED_MODULE := true
include $(BUILD_PREBUILT)
endif

接着分析下新增的部分变量:

ifeq ($(strip $(SYSTEMUI_SUPPORT)),yes)

ifneq : 判断语句,用于比较两个参数,如果两个参数不等,则该语句通过。

# 如果a和b不相等,则do something
ifneq ($(a), $(b))
    # do something
endif

这里是判断是否需要继续执行;

LOCAL_MODULE_TAGS := optional

LOCAL_MODULE_TAGS,表示模块在什么版本中编译,optional 是模块在所有版本下都编译。

LOCAL_MODULE_CLASS := APPS

LOCAL_MODULE_CLASS 定义模块的分类。根据分类,生成的模块文件会安装到目标系统相应的目录下。例如:APPS:安装到/system/app下;SHARED_LIBRARIES:安装到/system/lib下;EXECUTABLES:安装到/system/bin下;ETC:安装到/system/etc下;

LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)

LOCAL_MODULE_SUFFIX 指定当前模块的后缀。一旦指定,系统在产生目标文件时,会以模块名加后缀来创建目标文件。这里是指定为apk。

LOCAL_CERTIFICATE := platform

LOCAL_CERTIFICATE 签名认证,platform表示使用平台签名文件签名。

LOCAL_MULTILIB := both

指定编译目标为 32位 或 64位,它的值可以是32,64,both,表示可以编译的apk可以运行在32位、64位,或者32&64位硬件平台。

LOCAL_PRIVILEGED_MODULE := true

LOCAL_PRIVILEGED_MODULE  与编译、安装、权限管理等几个方面都有关系,不设置或者设置为false,安装位置为system/app;为true,安装位置为system/priv-app。

 

最后感谢您抽出宝贵的时间阅读本文,如有错误的地方欢迎提出一起讨论!

 

参考文章链接:https://blog.csdn.net/weixin_38503885/article/details/80748329?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161579764816780269842900%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=161579764816780269842900&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~rank_v29-4-80748329.pc_search_result_cache&utm_term=android+makefile%E5%AE%9E%E4%BE%8B

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值