pixel 8 上使用 16kb 模式启动 app 崩溃

我们的项目的 apk 已经通过了 google 的 16kb 验证:

[Image Removed]

但是在 pixel 8 设备上,开启了开发选项中的“以 16kb 页面大小启动设备”的选项之后,启动 app 闪退,报错:

10-14 14:22:02.511 12367 12367 E linker : “/data/app/~~AR8ZLnjY-meJ2PPKUCU0lg==/com.game.coo-V1uG0DTh9t1x9l4U8MlSSw==/lib/arm64/libc++_shared.so” program alignment (8192) cannot be smaller than system page size (16384)

libc++_shared.so 的 elf 信息如下,已经 16kb 对齐:

[Image Removed]

将 log 中的 libc++_shared.so 检验了 md5,发现和 apk 包中的 libc++_shared.so 完全一致。

用 readlink -f 排除了so是外链的情况。

libc++_shared.so 的来源是 ndk 官方提供的 r21 的 16kb 版本。因为我们项目有些第三方的 sdk 无法使用 ndk r21 以上 版本,所以仍然使用 ndk r21.

我比较了一下 ndk r29 的 libc++_shared.so,并没有什么明显的差别会导致报错:

[Image Removed]

我的 pixel 8 是 android 16,我查看 android 16的代码,发现报错来自如下代码:

https://github.com/aosp-mirror/platform_bionic/blob/android16-release/linker/linker_phdr.cpp

[Image Removed]

而 min_align_也只是读取 so 的 LOAD 段的 align 的最小值,从我们的 so 看,应该是 16kb。

[Image Removed]

不知道 ue 这边有没有针对这个报错的解决方案。

Steps to Reproduce

Hi,

我们在4.27Plus分支上支持了Android15 16kb page,可以看一下CL#43497234 或者https://github.com/EpicGames/UnrealEngine/commit/c79de00e3ba31b0b96220f8a0591a93d6770a3e3。不过github上的改动缺少一个bundletool\-all\-1\.18\.1\.jar的更新,可以在https://github.com/google/bundletool/releases里下载。[Image Removed]