Android.mk介绍之一基础语法

Android2018年5月14日 pm11:49发布3年前 (2021)更新 3xcn.com@站长
1 0 0
广告也精彩

Android.mk一系列文章计划介绍内容如下几个章节:

1、Android.mk介绍之一基础语法

2、Android.mk介绍之二预编译生成的文件类型

3、Android.mk介绍之三引用静态库,动态库

1、Android.mk的基本语法

对于Android开发,尤其是Android源码开发,一定会接触到Android.mk文件.

Android.mk是Android提供的一种makefile文件,用来指定诸如编译生成so库名、引用的头文件目录、需要编译的.c/.cpp文件和.a静态库文件等。

下面直接上一个简单的Test目录

.
├── Android.mk
└── test.c

test.c

#include<stdio.h>

int main( void ){
  printf("Hello Android!\n");

  return 0;
}

Android.mk

  1 #调用my-dir获取当前Android.mk的路径
  2 LOCAL_PATH:=$(call my-dir)
  3 #清除除了LOCAL_PATH变量之外的所有变量
  4 #切记,此句决不可在LOCAL_PATH之前执行
  5 include $(CLEAR_VARS)
  6 #指定生产模块的名字
  7 LOCAL_MODULE:=test
  8 #指定当前编译需要的源文件
  9 LOCAL_SRC_FILES:=test.c
 10 #指定当前编译的格式,这里是指定生产可执行文件
 11 include $(BUILD_EXECUTABLE)

 

LOCAL_PATH := $(call my-dir)

这句代码LOCAL_PATH是变量名,$(call my-dir)的意思是调用my-dir这个函数,这个函数的返回值是Android.mk这个文件所在的位置,对我这个项目来说该函数的返回值就是<android源码路径>/packsges/app/Test/。LOCAL_PATH这个变量是一定要定义的,它告诉编译系统当前模块的位置。

include $(CLEAR_VARS)

这句代码的作用是清楚除了LOCAL_PATH变量之外的LOCAL_XXX变量

LOCAL_MODULE:=test

生成的模块名,这个变量必须定义,表示make后将要生成的文件的名字为test

LOCAL_SRC_FILES:=test.c

编译时需要的源文件

include $(BUILD_EXECUTABLE)

指定了编译的脚本,这里是指定编译成可执行文件

我们通过mmm package/app/Test/ 或在在package/app/Test/ 目录下执行mm

就会编译生产test,安装目录如下:

Install: out/target/product/flo/system/bin/test

2、其他的一些环境变量配置简介

以下部分摘抄于<Android.mk中那些编译参数总结>

变量名 意义
LOCAL_MODULE LOCAL_MODULE变量必须定义,以标识你在Android.mk文件中描述的每个模块。名称必须是唯一的,而且不包含任何空格。注意编译系统会自动产生合适的前缀和后缀,换句话说,一个被命名为'foo'的共享库模块,将会生成'libfoo.so'文件。
LOCAL_SRC_FILES 当前模块包含的所有源码文件, 我们可以这么写LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_MODULE_TAGS 当前模块所包含的标签,一个模块可以包含多个标签。标签的值可能是 debug, eng, user,development 或者 optional。其中,optional 是默认标签。标签是提供给编译类型使用的。不同的编译类型会安装包含不同标签的模块,建议写成LOCAL_MODULE_TAGS := optional
LOCAL_STATIC_JAVA_LIBRARIES 当前模块依赖的Java静态库,所谓静态库,即编译完会存在于你的module里面,成为其一部分
LOCAL_SHARED_LIBRARIES 当前模块在运行时依赖的动态库名, 即编译完不会存在于你的module里面
LOCAL_CERTIFICATE 签署当前应用的证书名称,比如platform, 如下LOCAL_CERTIFICATE := platforms
LOCAL_SHARED_LIBRARIE 当前模块在运行时依赖的动态库名
LOCAL_PRELINK_MODULE 是否需要预连接处理(默认需要,用来做动态库优化)
LOCAL_REQUIRED_MODULES 指定模块运行所依赖的模块(模块安装时将会同步安装它所依赖的模块)
LOCAL_PROGUARD_ENABLED enabled或者disabled 指定是否启动混淆
LOCAL_PROGUARD_FLAG_FILES 指定混淆配置 proguard.config
LOCAL_PACKAGE_NAM 当前 APK 应用的名称。
LOCAL_CFLAGS 提供给 C/C++ 编译器的额外编译参数, 比如指定所有warning成error, 指定优化等级这些, 比如: LOCAL_CFLAGS := -Werror
LOCAL_C_INCLUDES C/C++所需的头文件路径,比如:LOCAL_C_INCLUDES += $(JNI_H_INCLUDE) \ $(LOCAL_PATH) \ system/core/include \ frameworks/base/include \ libnativehelper/include \
LOCAL_JAVA_LIBRARIES 编译java应用程序和库的时候指定包含的java类库,目前有core和framework两种, 多数情况下定义成LOCAL_JAVA_LIBRARIES := core framework注意LOCAL_JAVA_LIBRARIES不是必须的,而且编译APK时不允许定义(系统会自动添加)
LOCAL_REQUIRED_MODULES 指定模块运行所依赖的模块(模块安装时将会同步安装它所依赖的模块)
LOCAL_PREBUILT_LIBS 需要预编译的lib, 类似PREBUILT的还有很多,比如LOCAL_PREBUILT_JAVA_LIBRARIES, LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES
include $(BUILD_STATIC_LIBRARY) 表示编译成静态库
include $(BUILD_SHARED_LIBRARY) 表示编译成动态库。
include $(BUILD_EXECUTABLE) 表示编译成可执行程序
include $(BUILD_PACKAGE) 编译成APK
include $(BUILD_STATIC_JAVA_LIBRARY) 编译成Java静态库
include $(BUILD_MULTI_PREBUILT) 其实是会将prebuild的那些,还有required那些库拷到本地来编译

 历史上的今天

版权声明 1、 本站名称: 91易搜
2、 本站网址: 91es.com3xcn.com
3、 本站文章: 部分来源于网络,仅供站长学习和参考,若侵权请留言
广告也精彩

相关文章

广告也精彩

暂无评论

评论审核已启用。您的评论可能需要一段时间后才能被显示。

暂无评论...

网站升级中

公告

近期网站升级中,可能存在一些bug。欢迎反馈 https://www.91es.com/we.html

本站域名

本站域名 : 91es.com3xcn.com。本站邮箱 : 站长邮箱 i@oorr.cn,通知邮箱we@oorr.cn ,如有更新,请看公告 。