在原生代码编译时找出 AOSP 中的 Android 版本?
Posted
技术标签:
【中文标题】在原生代码编译时找出 AOSP 中的 Android 版本?【英文标题】:Finding out Android's version in AOSP on native code compile time? 【发布时间】:2013-05-23 15:32:31 【问题描述】:我正在为设备构建 AOSP。有没有办法在本机代码编译时获取当前的 AOSP 版本?我正在寻找类似于 Linux 中的 LINUX_VERSION_CODE 和 KERNEL_VERSION(X,Y,Z) 指令的东西。更具体地说,我想在我自己的一个 AOSP 附加项目中做一些看起来像这样的事情:
#if (android_VERSION_CODE >= ANDROID_VERSION(4,2,1))
... compile something ...
#else
... compile something else...
#endif
【问题讨论】:
【参考方案1】:大概,你可以使用PLATFORM_VERSION
和/或PLATFORM_SDK_VERSION
,请看version_defaults.mk
【讨论】:
我就是这么做的。在构建时解析 PLATFORM_VERSION 字符串,将它们作为 PLATFORM_VERSION_MAJOR、PLATFORM_VERSION_MINOR、PLATFORM_VERSION_REVISION 传递,并定义一个 ANDROID_VERSION 用于通过在编译时移动和或运算这些 PLATFORM_VERSION_* 值来创建平台版本代码。 smichak - 你能在这里发布你的代码吗? PLATFORM_VERSION 对我来说总是空的。不知道我做错了什么。 PLATFORM_VERSION 是在 build/core/version_defaults.mk 中定义的 make 变量。您可以在自己的 makefile 中解析它,从中提取主要、次要和修订号并构建版本代码。我为此添加了答案。【参考方案2】:PLATFORM_VERSION 在 AOSP 构建目录中定义:
build/core/version_defaults.mk:
ifeq "" "$(PLATFORM_VERSION)"
# This is the canonical definition of the platform version,
# which is the version that we reveal to the end user.
# Update this value when the platform version changes (rather
# than overriding it somewhere else). Can be an arbitrary string.
PLATFORM_VERSION := 5.1
endif
在您的产品(或其他任何地方)的 makefile 中定义以下 make 变量并将它们作为宏传递给编译器:
# Passing Android version to C compiler
PLATFORM_VERSION_MAJOR := $(word 1, $(subst ., ,$(PLATFORM_VERSION)))
PLATFORM_VERSION_MINOR := $(word 2, $(subst ., ,$(PLATFORM_VERSION)))
PLATFORM_VERSION_REVISION := $(word 3, $(subst ., ,$(PLATFORM_VERSION)))
COMMON_GLOBAL_CFLAGS += -DPLATFORM_VERSION_MAJOR=$(PLATFORM_VERSION_MAJOR) \
-DPLATFORM_VERSION_MINOR=$(PLATFORM_VERSION_MINOR)
ifneq ($(PLATFORM_VERSION_REVISION),)
COMMON_GLOBAL_CFLAGS += -DPLATFORM_VERSION_REVISION=$(PLATFORM_VERSION_REVISION)
endif
定义一个带有版本代码的头文件:
android_version.h:
#define ANDROID_VERSION(major, minor, rev) \
((rev) | (minor << 8) | (major << 16))
#ifndef PLATFORM_VERSION_REVISION
#define PLATFORM_VERSION_REVISION 0
#endif
#define ANDROID_VERSION_CODE ANDROID_VERSION( \
PLATFORM_VERSION_MAJOR, \
PLATFORM_VERSION_MINOR, \
PLATFORM_VERSION_REVISION)
现在,要根据 android 版本做出编译时间决定,只需包含 android_version.h 文件并使用预处理器#if。
【讨论】:
以上是关于在原生代码编译时找出 AOSP 中的 Android 版本?的主要内容,如果未能解决你的问题,请参考以下文章
尝试编译 AOSP 7.1.1 第 6 版时缺少“libaudiopolicyservice_intermediates”?