如何更新本地共享库以兼容Android 15 16KB内存页设备?
问题:Ananas库在Android 15 16KB内存页模拟器中加载libphotoprocessing.so失败
我们的应用使用Ananas库,在Android 15 16KB系统镜像模拟器(Pixel 8a API 35,镜像路径system-images/android-35/google_apis_playstore_ps16k/x86_64/)中测试时,添加图片滤镜时应用卡住无响应,Logcat报错:
2025-01-14 19:27:52.368 16574-18462 nativeloader io....amutkarshtiwari.ananasproject D Load /data/app/~~K2DsRcC_nLSnacu1r-e0kA==/io.github.iamutkarshtiwari.ananasproject-Sla3ZLIGIN1Ma-aDhtc6TA==/lib/x86_64/libphotoprocessing.so using ns clns-7 from class loader (caller=/data/app/~~K2DsRcC_nLSnacu1r-e0kA==/io.github.iamutkarshtiwari.ananasproject-Sla3ZLIGIN1Ma-aDhtc6TA==/base.apk!classes2.dex): dlopen failed: empty/missing DT_HASH/DT_GNU_HASH in "/data/app/~~K2DsRcC_nLSnacu1r-e0kA==/io.github.iamutkarshtiwari.ananasproject-Sla3ZLIGIN1Ma-aDhtc6TA==/lib/x86_64/libphotoprocessing.so" (new hash type from the future?)
但在普通Android 15模拟器(Pixel 7 API 35,镜像路径system-images/android-35/google_apis_playstore/x86_64/)中测试正常,问题明确源于16KB内存页兼容性。
已尝试但无效的操作
- 将
targetSdkVersion、compileSdk更新至34,升级AGP至8.6.0并修复编译错误; - 在Gradle中指定
ndkVersion = "27.2.12479018"; - 配置Gradle关联NDK:
externalNativeBuild { ndkBuild { path file('jni/Android.mk') } } - 重建
libphotoprocessing.so库:~/Library/Android/sdk/ndk/27.2.12479018/ndk-build -C /MY_PROJECT_PATH/Ananas/ananas clean ~/Library/Android/sdk/ndk/27.2.12479018/ndk-build -C /MY_PROJECT_PATH/Ananas/ananas - 在
Application.mk中添加APP_SUPPORT_FLEXIBLE_PAGE_SIZES := true。
使用官方check_elf_alignment.sh脚本检测APK,显示库仍未对齐:
-e /var/folders/22/7bl_jpq137l883cghrfhxzt80000gn/T/app-debug_out_XXXXX.DA2PVl6sGv/lib/x86_64/libphotoprocessing.so: \e[31mUNALIGNED\e[0m (2**12)
最终解决步骤
通过以下修改解决了问题:
- 移除
Android.mk中的LOCAL_CFLAGS,在build.gradle的ndkBuild块中设置:externalNativeBuild { ndkBuild { path file('jni/Android.mk') cFlags "-DANDROID_NDK -DDISABLE_IMPORTGL -DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON" abiFilters 'arm64-v8a', 'armeabi-v7a', 'riscv64', 'x86', 'x86_64' } } - 在
Application.mk中指定全ABI支持:APP_ABI := arm64-v8a armeabi-v7a riscv64 x86 x86_64 - 删除项目中的
build和.gradle文件夹,重置项目配置; - 重新编译原生库:
~/Library/Android/sdk/ndk/27.2.12479018/ndk-build -C /MY_PROJECT_PATH/Ananas/ananas clean ~/Library/Android/sdk/ndk/27.2.12479018/ndk-build -C /MY_PROJECT_PATH/Ananas/ananas -B V=1 NDK_LOG=1
验证结果
编译后在同款Android 15 16KB模拟器中测试,滤镜功能正常。再次使用check_elf_alignment.sh检测,显示x86_64架构库已对齐:
-e /var/folders/22/7bl_jpq137l883cghrfhxzt80000gn/T/app-debug_out_XXXXX.wQrETumTaI/lib/x86_64/libphotoprocessing.so: \e[32mALIGNED\e[0m (2**14)
用readelf查看.so文件,所有LOAD行的Align列均为0x4000。
内容的提问来源于stack exchange,提问作者Fercho_27
相关产品推荐
相关产品推荐

