编译环境
环境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 {
...
}
...
}