You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编译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模块的编译配置:

  1. 打开art/build/Android.common_build.mk文件
  2. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 17:50:19