ubuntu20.04编译Android8编译报错dex2oatd

ubuntu20.04编译Android8编译报错

编译环境

环境ubuntu20.04,因为是新买的电脑Thinkpadt14p gen3,硬件比较新导致有些驱动没有,只能将内核省级到6.11.1

报错

编译framework报错

[  0% 13/25617] build out/target/product/k63v1us_64_bsp/obj/APPS/BatteryWarning_intermediates/oat/arm64/package.odex
FAILED: out/target/product/k63v1us_64_bsp/obj/APPS/BatteryWarning_intermediates/oat/arm64/package.odex 
/bin/bash -c "(rm -f out/target/product/k63v1us_64_bsp/obj/APPS/BatteryWarning_intermediates/oat/arm64/package.odex ) && (mkdir -p out/target/product/k63v1us_64_bsp/obj/APPS/BatteryWarning_intermediates/oat/arm64/ ) && (ANDROID_LOG_TAGS=\"*:e\" out/host/linux-x86/bin/dex2oatd --runtime-arg -Xms64m --runtime-arg -Xmx512m --class-loader-context=\"&\" --boot-image=out/target/product/k63v1us_64_bsp/dex_bootjars/system/framework/boot.art --dex-file=vendor/mediatek/proprietary/packages/apps/BatteryWarning/BatteryWarning-release-unsigned.apk --dex-location=/system/app/BatteryWarning/BatteryWarning.apk --oat-file=out/target/product/k63v1us_64_bsp/obj/APPS/BatteryWarning_intermediates/oat/arm64/package.odex --android-root=out/target/product/k63v1us_64_bsp/system --instruction-set=arm64 --instruction-set-variant=cortex-a53 --instruction-set-features=default --runtime-arg -Xnorelocate --compile-pic --no-generate-debug-info --generate-build-id --abort-on-hard-verifier-error --force-determinism --no-inline-from=core-oj.jar  --compiler-filter=quicken )"
dex2oatd E 06-06 18:57:28 1042151 1042151 image_space.cc:1716] Could not create image space with image file 'out/target/product/k63v1us_64_bsp/dex_bootjars/system/framework/boot.art'. Attempting to fall back to imageless running. Error was: Failed to mmap at expected address, mapped at 0x77540a200000 instead of 0x703e5000
dex2oatd E 06-06 18:57:28 1042151 1042151 image_space.cc:1716] Attempted image: out/target/product/k63v1us_64_bsp/dex_bootjars/system/framework/boot-framework.art
dex2oatd E 06-06 18:57:28 1042151 1042151 runtime.cc:1197] Dex file fallback disabled, cannot continue without image.
dex2oatd E 06-06 18:57:28 1042151 1042151 dex2oat.cc:2652] Failed to create runtime

问题原因:

报错指出,mmap系统调用返回的内存起始地址与传下去的建议地址值不一致。
实际上,这个建议值在Linux kernel 5.18(Host端,即PC或工作站端)及其以后,基本是被无视掉了,导致每次创建的内存地址值,跟建议值都不一样,从而报错,而在Linux kernel 5.17及其以前的版本,建议值通常都会被接受,并按照该地址申请内存;

解决方式:

mmap系统调用时,flag添加MAP_FIXED_NOREPLACE标志位;
修改//art/runtime/mem_map.cc

//art/runtime/mem_map.cc
MemMap* MemMap::MapFileAtAddress(uint8_t* expected_ptr,
                                 size_t byte_count,
                                 int prot,
                                 int flags,
                                 int fd,
                                 off_t start,
                                 bool low_4gb,
                                 bool reuse,
                                 const char* filename,
                                 std::string* error_msg) {
  ...
  if (reuse) {
    // reuse means it is okay that it overlaps an existing page mapping.
    // Only use this if you actually made the page reservation yourself.
    CHECK(expected_ptr != nullptr);
    DCHECK(error_msg != nullptr);
    DCHECK(ContainedWithinExistingMap(expected_ptr, byte_count, error_msg))
        << ((error_msg != nullptr) ? *error_msg : std::string());
    flags |= MAP_FIXED;
		//Add begin @{
		#if !defined(ART_TARGET)
		  } else if (expected_ptr) {
		#define MAP_FIXED_NOREPLACE 0x100000
		    flags |= MAP_FIXED_NOREPLACE;
		#endif
		//@}
  } else {
    ...
  }
  ...
}

参考资料:这里的问题讨论这里的修改方法
困扰了一整天,记录一下

Ubuntu 20.04编译 VTK 7.1 源码时可能会遇到各种错误,这通常与依赖项缺失、配置不当或版本兼容性有关。以下是针对常见问题的解决方案: ### 常见错误及解决办法 #### 错误 1:缺少必要的库文件 如果在编译过程中提示某些头文件或库文件不存在,则可能是未安装所需的依赖。 **解决方法** 确保已安装所有必需的依赖项。对于 VTK 7.1 的编译,可以通过以下命令安装基础依赖[^2]: ```bash sudo apt-get update sudo apt-get install build-essential cmake git pkg-config qt5-default \ libgl1-mesa-dev libgles2-mesa-dev libegl1-mesa-dev freeglut3-dev \ libjpeg-dev libpng-dev libtiff-dev libglew-dev python3-dev \ python-numpy python-vtk openjdk-8-jdk openjdk-8-jre \ libx11-dev libxext-dev libxtst-dev libxrender-dev libxmu-dev libxmuu-dev ``` 这些包涵盖了 OpenGL 支持、图像处理库以及其他可能需要的功能模块。 --- #### 错误 2:CMake 配置失败 有时 CMake 可能无法找到特定组件(如 Qt 或 Python),从而导致配置过程终止。 **解决方法** 重新运行 `cmake` 并手动指定路径。例如,在终端中执行如下命令: ```bash mkdir build && cd build cmake .. -DCMAKE_BUILD_TYPE=Release \ -DBUILD_SHARED_LIBS=ON \ -DVTK_Group_QT=ON \ -DModule_vtkGUISupportQtOpenGL=ON \ -DPYTHON_EXECUTABLE=$(which python3) \ -DPYTHON_INCLUDE_DIR=/usr/include/python3.x \ -DPYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython3.x.so ``` 注意替换 `python3.x` 和对应的 `.so` 文件名以匹配实际系统中的 Python 版本。 --- #### 错误 3:编译速度过慢 当使用默认设置进行编译时,进程可能显得异常缓慢。 **优化建议** 利用多核处理器加速构建流程。假设您的机器有 4 个核心可用,则可以在调用 `make` 时附加 `-j4` 参数来并行化任务: ```bash make -j$(nproc) ``` 上述指令会自动检测 CPU 核心数并将作业分配给它们完成[^3]。 --- #### 错误 4:链接阶段报错 即使成功完成了大部分编译工作,但在最终连接各部分成果的时候仍可能出现状况——比如找不到动态共享对象(.so files). **应对策略** 确认所有的外部库都已被正确定位到;必要的话调整 LD_LIBRARY_PATH 环境变量以便加载器能够识别新增加的内容: ```bash export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/vtk/build/bin/ ``` 另外也可以尝试清理之前的中间产物再重试一次完整的流程: ```bash rm -rf * ; cmake .. make -j$(nproc) ``` --- ### 总结 以上列举了几种典型的障碍及其对应处置措施。当然实际情况或许更加复杂多样,具体还需视乎具体的错误消息而定。务必仔细阅读每一步反馈出来的日志信息,定位真正的原因所在。 ```python print("VTK compilation troubleshooting completed.") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值