在原生代码编译时找出 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 版本?的主要内容,如果未能解决你的问题,请参考以下文章

Ubuntu 20.04编译AOSP 并启动模拟器

Android源码(AOSP) 模块编译时增加速度

编译android源代码(aosp)

编译aosp 32位linux

尝试编译 AOSP 7.1.1 第 6 版时缺少“libaudiopolicyservice_intermediates”?

AOSP 8.1.0 编译一些心得