RN Alipay ERR: duplicate symbols for architecture arm64 in libAlipayModule.a

https://www.cnblogs.com/yanjiez/p/11376717.html

11-11 18:01:46.028218 31958 31958 W System.err: java.lang.UnsatisfiedLinkError: couldn't find DSO to load: libhermes.so 11-11 18:01:46.028252 31958 31958 W System.err: SoSource 0: com.facebook.soloader.ApkSoSource[root = /data/data/tech.shouxun.sod/lib-main flags = 1] 11-11 18:01:46.028263 31958 31958 W System.err: SoSource 1: com.facebook.soloader.DirectorySoSource[root = /data/app/~~0GxqC7w5e3R7SKHRvMG_Dg==/tech.shouxun.sod-4XC6Qdr8XyV2QDyuuoLXxg==/lib/arm flags = 0] 11-11 18:01:46.028270 31958 31958 W System.err: SoSource 2: com.facebook.soloader.DirectorySoSource[root = /vendor/lib flags = 2] 11-11 18:01:46.028279 31958 31958 W System.err: SoSource 3: com.facebook.soloader.DirectorySoSource[root = /system/lib flags = 2] 11-11 18:01:46.028287 31958 31958 W System.err: Native lib dir: /data/app/~~0GxqC7w5e3R7SKHRvMG_Dg==/tech.shouxun.sod-4XC6Qdr8XyV2QDyuuoLXxg==/lib/arm 11-11 18:01:46.028296 31958 31958 W System.err: result: 0 11-11 18:01:46.029427 31958 31958 W System.err: at com.facebook.soloader.SoLoader.doLoadLibraryBySoName(SoLoader.java:918) 11-11 18:01:46.029492 31958 31958 W System.err: at com.facebook.soloader.SoLoader.loadLibraryBySoNameImpl(SoLoader.java:740) 11-11 18:01:46.029527 31958 31958 W System.err: at com.facebook.soloader.SoLoader.loadLibraryBySoName(SoLoader.java:654) 11-11 18:01:46.029563 31958 31958 W System.err: at com.facebook.soloader.SoLoader.loadLibrary(SoLoader.java:634) 11-11 18:01:46.029591 31958 31958 W System.err: at com.facebook.soloader.SoLoader.loadLibrary(SoLoader.java:582) 11-11 18:01:46.029620 31958 31958 W System.err: at com.facebook.hermes.reactexecutor.HermesExecutor.loadLibrary(HermesExecutor.java:25) 11-11 18:01:46.029653 31958 31958 W System.err: at com.facebook.hermes.reactexecutor.HermesExecutor.<clinit>(HermesExecutor.java:19) 11-11 18:01:46.029683 31958 31958 W System.err: at com.facebook.react.ReactInstanceManagerBuilder.getDefaultJSExecutorFactory(ReactInstanceManagerBuilder.java:370) 11-11 18:01:46.029714 31958 31958 W System.err: at com.facebook.react.ReactInstanceManagerBuilder.build(ReactInstanceManagerBuilder.java:319) 11-11 18:01:46.029744 31958 31958 W System.err: at com.facebook.react.ReactNativeHost.createReactInstanceManager(ReactNativeHost.java:95) 11-11 18:01:46.029777 31958 31958 W System.err: at com.facebook.react.ReactNativeHost.getReactInstanceManager(ReactNativeHost.java:42) 11-11 18:01:46.029804 31958 31958 W System.err: at tech.shouxun.sod.MainApplication.onCreate(MainApplication.java:53) 11-11 18:01:46.029835 31958 31958 W System.err: at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1401) 11-11 18:01:46.029874 31958 31958 W System.err: at android.app.ActivityThread.handleBindApplication(ActivityThread.java:8633) 11-11 18:01:46.029905 31958 31958 W System.err: at android.app.ActivityThread.-$$Nest$mhandleBindApplication(Unknown Source:0) 11-11 18:01:46.029934 31958 31958 W System.err: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2798) 11-11 18:01:46.029984 31958 31958 W System.err: at android.os.Handler.dispatchMessage(Handler.java:115) 11-11 18:01:46.030013 31958 31958 W System.err: at android.os.Looper.loopOnce(Looper.java:298) 11-11 18:01:46.030040 31958 31958 W System.err: at android.os.Looper.loop(Looper.java:408) 11-11 18:01:46.030068 31958 31958 W System.err: at android.app.ActivityThread.main(ActivityThread.java:9964) 11-11 18:01:46.030119 31958 31958 W System.err: at java.lang.reflect.Method.invoke(Native Method) 11-11 18:01:46.030168 31958 31958 W System.err: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:613) 11-11 18:01:46.030204 31958 31958 W System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1074) 11-11 18:01:46.030686 31958 31958 D AndroidRuntime: Shutting down VM
最新发布
11-18
<think> 我们遇到了一个类似的错误,但这次是找不到 libhermes.so。错误信息显示在加载 Hermes 引擎时失败。这通常发生在启用了 Hermes 但相应的动态库没有正确打包到 APK 中,或者设备架构不匹配。 ### 问题分析 错误信息:`java.lang.UnsatisfiedLinkError: couldn't find DSO to load: libhermes.so` - 与之前类似,但库名变为 `libhermes.so`,这表明应用试图使用 Hermes 引擎。 - 堆栈跟踪显示,在 `HermesExecutor` 的静态初始化块中加载该库失败。 ### 可能的原因 1. **ABI 架构不匹配**:设备要求的 ABI 对应的 `libhermes.so` 不存在于 APK 中。 2. **Hermes 未正确启用或配置**:可能项目中启用了 Hermes,但构建过程中未生成或包含对应的 so 文件。 3. **构建缓存问题**:之前的构建残留可能导致 so 文件未被正确打包。 4. **ProGuard/R8 配置问题**:可能混淆了 Hermes 相关的类或 native 方法。 ### 解决方案 #### ✅ 方案1:检查并配置 ABI 过滤 在 `app/build.gradle` 中,确保为所有支持的 ABI 构建,并检查是否包含 Hermes 的 so 文件。添加以下配置: ```gradle android { defaultConfig { ndk { abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64" } } } ``` 然后重新构建。 #### ✅ 方案2:确保 Hermes 已正确启用 在 `android/app/build.gradle` 文件中,检查是否启用了 Hermes: ```gradle project.ext.react = [ enableHermes: true // 确保为 true ] ``` #### ✅ 方案3:清理并重新构建 清理构建缓存并重新安装: ```bash # 进入 android 目录 cd android ./gradlew clean cd .. # 删除 node_modules 并重新安装 rm -rf node_modules npm install # 重新运行 npx react-native run-android ``` #### ✅ 方案4:检查 Hermes 库是否存在于 APK 中 解压 APK 文件,检查 `lib` 目录下对应 ABI 的文件夹中是否有 `libhermes.so` 和 `libhermes-executor-debug.so`(或 release 版本)。如果没有,则可能是构建问题。 #### ✅ 方案5:禁用 Hermes(临时方案) 如果问题无法解决,可以暂时禁用 Hermes,使用 JavaScriptCore(JSC)引擎。在 `android/app/build.gradle` 中设置: ```gradle project.ext.react = [ enableHermes: false // 禁用 Hermes ] ``` 然后重新构建。但请注意,这可能会影响性能。 ### 验证 重新构建并运行应用,检查日志中是否还有相同的错误。 §§相关问题§§ 1. 在 React Native 中,如何确认 Hermes 引擎已成功启用并运行? 2. 当使用 Hermes 引擎时,如何针对不同的 CPU 架构(ABI)打包对应的动态库? 3. 如果 Hermes 的 .so 文件在构建过程中未生成,可能的原因有哪些? 4. 如何通过配置 ProGuard 规则来避免 Hermes 相关的类被混淆? 5. 在 React Native 应用中,如何动态切换 Hermes 和 JavaScriptCore 引擎? </think>### 问题分析 日志显示 `java.lang.UnsatisfiedLinkError: couldn't find DSO to load: libhermes.so`,这是 React Native 应用在使用 Hermes JavaScript 引擎时常见的动态库加载失败错误。关键信息: 1. 设备尝试在以下位置查找 `libhermes.so` 均失败: - 应用内 `lib-main` 目录 - 应用安装目录的 `lib/arm` 子目录 - 系统级目录 (`/vendor/lib`, `/system/lib`) 2. 堆栈指向 Hermes 引擎初始化失败 (`HermesExecutor.<clinit>`) 3. 设备架构为 ARM(`lib/arm` 路径) --- ### 根本原因 1. **ABI 架构不匹配** - 设备是 ARM 架构但 APK 可能缺失 `armeabi-v7a` 或 `arm64-v8a` 的 Hermes 库 2. **Hermes 配置错误** - `gradle.properties` 中 `hermesEnabled=true` 但未正确配置 NDK 或构建脚本 3. **构建缓存污染** - 历史构建残留导致 .so 文件未正确生成/打包 4. **React Native 版本冲突** - RN 0.70+ 默认启用 Hermes,但旧项目升级时可能缺少必要配置 --- ### 解决方案 #### ✅ 方案 1:强制生成 Hermes 库 在 `android/app/build.gradle` 添加 Hermes 编译任务: ```gradle android { packagingOptions { pickFirst '**/libhermes.so' } buildTypes { release { hermesEnabled true // 添加 NDK 架构过滤 ndk { abiFilters "armeabi-v7a", "arm64-v8a" } } } } ``` #### ✅ 方案 2:清理并重建原生库 1. 清理项目: ```bash cd android ./gradlew clean rm -rf build/.transforms # 删除原生编译缓存 ``` 2. 重新安装依赖: ```bash cd .. rm -rf node_modules npm install --force ``` 3. 完整重建: ```bash npx react-native run-android --variant=release --active-arch-only ``` #### ✅ 方案 3:验证 Hermes 配置 在 `gradle.properties` 确认: ```properties # 必须为 true hermesEnabled=true # 启用新打包系统 (RN 0.71+ 必需) newArchEnabled=false ``` #### ✅ 方案 4:手动添加 Hermes 依赖 在 `app/build.gradle` 添加显式依赖: ```gradle dependencies { // 根据 RN 版本选择合适版本 implementation("com.facebook.react:hermes-engine:+") { exclude group:'com.facebook.fbjni' } } ``` --- ### 验证步骤 1. 检查 APK 内库文件: ```bash unzip -l android/app/build/outputs/apk/release/app-release.apk | grep libhermes.so ``` 2. 运行时检查日志: ```bash adb logcat | grep -E "Hermes|SoLoader" ``` 正常输出应包含: ``` D/SoLoader: libhermes.so found on ... I/Hermes: Hermes JavaScript engine started ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值