我们的项目的 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 这边有没有针对这个报错的解决方案。