详解Android.mk

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaoyantan/article/details/82118464

一、概述

1、Android.mk主要是告诉build system (编译系统)以什么样的规则编译你的源代码,并且生成对应的目标文件,目标文件可以分为如下几种:

  • APK程序 :一般的Android应用程序,编译打包生成apk文件。
  • JAVA库:编译打包生成jar文件。
  • C/C++应用程序:可执行的C\C++应用程序
  • C\C++静态库 :编译生成C\C++静态库,并打包成.a 文件
  • C\C++共享库 : 编译生成共享库(动态链接库),并打包成.so文件,有且只有共享库才能被安装/复制到你的应用软件包中。

2、以上编译生成的结果分别在如下目录:

out/target/product/product_name/obj/APPS
out/target/product/product_name/obj/JAVA_LIBRARIES
out/target/product/product_name/obj/EXECUTABLE
out/target/product/product_name/obj/STATIC_LIBRARY
out/target/product/product_name/obj/SHARED_LIBRARY

product name 为对应的target而变,如:jasmine

二、基本使用

Android.mk中可以定义多个编译模块,每个编译模块都是以include $(CLEAR_VARS)开始,以include $(BUILD_XXX)结束。

###############################################################################
# Drive
LOCAL_PATH := $(call my-dir)

my_archs := arm arm64 x86 x86_64
my_src_arch := $(call get-prebuilt-src-arch, $(my_archs))

include $(CLEAR_VARS)
LOCAL_MODULE := Drive
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_TAGS := optional
LOCAL_BUILT_MODULE_STEM := package.apk
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
#LOCAL_PRIVILEGED_MODULE :=
LOCAL_CERTIFICATE := PRESIGNED
#LOCAL_OVERRIDES_PACKAGES :=
LOCAL_DPI_VARIANTS := xxxhdpi xxhdpi xhdpi hdpi mdpi
LOCAL_DPI_FILE_STEM := $(LOCAL_MODULE)_$(my_src_arch)_%.apk
LOCAL_SRC_FILES := $(LOCAL_MODULE)_$(my_src_arch).apk
#LOCAL_REQUIRED_MODULES :=
LOCAL_MODULE_TARGET_ARCH := $(my_src_arch)

# When built, explicitly put it in the data partition except d2a
ifneq ($(TARGET_PRODUCT), tissot)
  LOCAL_MIUI_DATA_APP := $(TARGET_OUT_DATA)/miui/app
  LOCAL_MODULE_PATH := $(LOCAL_MIUI_DATA_APP)
  LOCAL_REPLACE_PREBUILT_APK_INSTALLED := $(LOCAL_PATH)/$(LOCAL_SRC_FILES)
endif

include $(BUILD_PREBUILT)

LOCAL_PATH := $(call my-dir)

每个Android.mk文件必须以定义LOCAL_PATH为开始,它用于在开发tree中查找源文件。宏my-dir则由编译系统提供,返回包含Android.mk的目录路径。

include $(CLEAR_VARS)
CLEAR_VARS变量由build system提供,定义在/build/core/config.mk中:CLEAR_VARS:=$(BUILD_SYSTEM)/clear_vars.mk),该语句的意思把build/core/clear_vars.mk文件包含进来,即由它负责清理很多LOCAL_xxx,但不清理LOCAL_PATH。因为所有的编译文件都在同一个GNU MAKE执行环境中,所有的变量都是全局的,所以我们需要清空这些变量。但是LOCAL_PATH要求在每个模块中都要设置,所以无需清空。

LOCAL_MODULE := Drive
指示当前编译出来的模块名,必须,唯一且不能包含空格。如果未设置,则默认使用LOCAL_PACKAGE_NAME。如果再没有编译失败。

LOCAL_MODULE_CLASS
标识所编译模块最后放置的为止。
值可以是APPS,JAVA_LIBRARIES,SHARED_LIBRARIES,STATIC_LIBRARIES,EXECUTABLES
LOCAL_MODULE_CLASS := ETC #表示放于system/etc目录
LOCAL_MODULE_CLASS := EXECUTABLES #放于/system/bin
LOCAL_MODULE_CLASS := SHARED_LIBRARIES #放在/system/lib下
当遇到include $(BUILD_PREBUILT)的预编译选项时,需要在自己编写的Android.mk中明确指定LOCAL_MODULE_CLASS的值如ETC/APP等,从而帮助系统确认LOCAL_MODULE_PATH的路径。

LOCAL_MODULE_TAGS
在什么情况下去编译模块。当前模块所包含的标签,默认optional
user : 模块只在user下编译
eng : 模块在eng模式下编译
tests: test状态下编译
optional: 此模块在所有版本下都编译

LOCAL_BUILT_MODULE_STEM
编译目标要生成的文件名,java的执行文件则为package.apk

**LOCAL_MODULE_SUFFIX **
后缀名,不用定义 (.apk ,.jar .so,.a)

LOCAL_PRIVILEGED_MODULE
决定编译后在Rom中的安装位置,如果不设置或false,则为/system/app,设置为true,则在/system/priv-app

LOCAL_CERTIFICATE := PRESIGNED
表示这个apk已经签过名了,系统不用再次签名

#LOCAL_OVERRIDES_PACKAGES :=
让预置的apk覆盖原生的apk

LOCAL_SRC_FILES := $(LOCAL_MODULE)_$(my_src_arch).apk
列出传给编译器的源文件,编译系统自动传递依赖。相对于LOCAL_PATH的路径。

LOCAL_REQUIRED_MODULES
指定模块运行所依赖的模块

LOCAL_MIUI_DATA_APP := $(TARGET_OUT_DATA)/miui/app LOCAL_MODULE_PATH := $(LOCAL_MIUI_DATA_APP)
指定最后的目标安装路径:
TARGET_ROOT_OUT:表示根文件系统。
TARGET_OUT:表示 system文件系统。
TARGET_OUT_DATA:表示 data文件系统。

include $(BUILD_PREBUILT)
处理一个已经编译好的文件。

LOCAL_PATH := $(call my-dir)

my_archs := arm64
my_src_arch := $(call get-prebuilt-src-arch, $(my_archs))

include $(CLEAR_VARS)
LOCAL_MODULE := Turbo
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_TAGS := optional
LOCAL_BUILT_MODULE_STEM := package.apk
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_PRIVILEGED_MODULE := true
LOCAL_CERTIFICATE := PRESIGNED
#LOCAL_OVERRIDES_PACKAGES :=
LOCAL_SRC_FILES := $(LOCAL_MODULE)_$(my_src_arch).apk
LOCAL_REQUIRED_MODULES := turbo-sysconfig.xml
#LOCAL_PREBUILT_JNI_LIBS :=
LOCAL_MODULE_TARGET_ARCH := $(my_src_arch)
include $(BUILD_PREBUILT)

include $(CLEAR_VARS)
LOCAL_MODULE := turbo-sysconfig.xml
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := ETC
LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/sysconfig/
LOCAL_SRC_FILES := $(LOCAL_MODULE)
include $(BUILD_PREBUILT)

变量和宏

编译系统提供许多可用于Android.mk文件中的变量。其中许多变量已经赋值。另一些要自己赋值。

1、NDK 定义的变量
这些变量在你的Android.mk文件解析之前,就由编译系统定义好了。

CLEAR_VARS
如上所述

猜你喜欢

转载自blog.csdn.net/xiaoyantan/article/details/82118464