编译Android 8.0.0_r22时出现ANDROID_DATA未设置且/data不存在错误
解决AOSP 8.0.0_r22编译时ANDROID_DATA未找到的问题
问题场景
编译AOSP 8.0.0_r22版本(选择lunch 31编译目标)时,进度到约一半阶段会稳定报错:
ANDROID_DATA not set and /data does not exist
错误来自dex2oatd执行过程,对应art/runtime/utils.cc:761代码行,堆栈追踪指向ART模块的缓存清理与boot image创建环节。本地Ubuntu 22.04机器和官方提供的Ubuntu 14.04 Docker容器中均能复现,且已严格遵循官方搭建指南操作。
修复方案
方案1:临时设置环境变量(快速解决)
编译前执行以下命令,创建临时目录并设置为ANDROID_DATA:
export ANDROID_DATA=$(mktemp -d)
之后继续执行编译命令(如make -j$(nproc))即可,临时目录会被dex2oatd自动使用,避免找不到/data的问题。
方案2:修改ART编译脚本(永久解决)
如果不想每次编译都手动设置变量,可以修改ART模块的编译配置:
- 打开
art/build/Android.common_build.mk文件 - 在
DEX2OATD_FLAGS相关配置段添加:
DEX2OATD_FLAGS += --setenv ANDROID_DATA=$(OUT_DIR)/data
或者在调用dex2oatd的脚本中提前创建并设置目录:
export ANDROID_DATA=$(OUT_DIR)/data mkdir -p $(ANDROID_DATA)
方案3:修复ART源码中的错误处理
如果确认是错误处理逻辑缺失导致的问题,可修改art/runtime/utils.cc第761行附近的代码:
找到原代码:
if (android_data == nullptr) { LOG(FATAL) << "ANDROID_DATA not set and /data does not exist"; }
替换为:
if (android_data == nullptr) { const char* out_dir = getenv("OUT_DIR"); if (out_dir != nullptr) { std::string data_path = std::string(out_dir) + "/data"; android_data = data_path.c_str(); mkdir(android_data, 0755); } else { LOG(FATAL) << "ANDROID_DATA not set and /data does not exist"; } }
修改后重新编译ART模块,再继续整体编译流程。
问题根源
编译环境中不存在Android系统的/data目录,而ART模块在创建boot image的流程中,未自动为dex2oatd设置合法的ANDROID_DATA路径,导致触发FATAL级别的检查错误。通过手动指定或自动配置合法路径,即可绕过该检查。
内容的提问来源于stack exchange,提问作者Calix Barrus
相关产品推荐
相关产品推荐

