uni-app 打包含有第三方室内定位插件的app时运行插件闪退 报com.facebook.jni.HybridData的错
uni-app 打包含有第三方室内定位插件的app时运行插件闪退 报com.facebook.jni.HybridData的错
开发环境 | 版本号 | 项目创建方式 |
---|---|---|
Windows | win11 | HBuilderX |
产品分类:uniapp/App
PC开发环境操作系统:Windows
PC开发环境操作系统版本号:win11
HBuilderX类型:正式
HBuilderX版本号:3.98
手机系统:Android
手机系统版本号:Android 13
手机厂商:小米
手机机型:小米civi
页面类型:vue
vue版本:vue2
打包方式:云端
项目创建方式:HBuilderX
操作步骤:
- 打开第三方插件时候直接闪退
预期结果:
- 打开第三方插件时候直接正常运行
实际结果:
- 闪退
bug描述: 当前我们有一个安卓的sdk,这个sdk使用了pytorch_android-1.8.0.aar 在该sdk中引用了jni,分别是libpytorch_jni.so和libfbjni.so
将对应的SDK打包成uniapp所需要的插件之后,现在运行时存在找不到 libfbjni.so 中的方法的情况,错误为:
java.lang.ClassNotFoundException: com.facebook.jni.HybridData
at org.pytorch.NativePeer.initHybrid(Native Method)
at org.pytorch.NativePeer.<init>(NativePeer.java:25)
at org.pytorch.Module.load(Module.java:25)
at org.pytorch.Module.load(Module.java:35)
查看apk包,发现对应的目录中都有对应的so文件,且对应的cpu架构确认也是没有问题的。
这是闪退日志
BOARD:zijin
BOOTLOADER:unknown
BRAND:Xiaomi
CPU_ABI:arm64-v8a
CPU_ABI2:
DEVICE:zijin
DISPLAY:TKQ1.220807.001 test-keys
FINGERPRINT:Xiaomi/zijin/zijin:13/TKQ1.220807.001/V14.0.6.0.TLPCNXM:user/release-keys
HARDWARE:qcom
HOST:pangu-build-component-system-388170-tfp97-p073c-75mq3
ID:TKQ1.220807.001
IS_DEBUGGABLE:false
IS_EMULATOR:false
IS_MIUI:true
MANUFACTURER:Xiaomi
MODEL:2109119BC
ODM_SKU:zijin
PERMISSIONS_REVIEW_REQUIRED:true
PRODUCT:zijin
RADIO:unknown
SERIAL:unknown
SKU:zijin
SOC_MANUFACTURER:QTI
SOC_MODEL:SM7325
SUPPORTED_32_BIT_ABIS:[Ljava.lang.String;[@b24a814](/user/b24a814)
SUPPORTED_64_BIT_ABIS:[Ljava.lang.String;[@d49d8bd](/user/d49d8bd)
SUPPORTED_ABIS:[Ljava.lang.String;[@7a90eb2](/user/7a90eb2)
TAGS:release-keys
TIME:1697101476000
TYPE:user
UNKNOWN:unknown
USER:builder
java.lang.ClassNotFoundException: com.facebook.jni.HybridData
at org.pytorch.NativePeer.initHybrid(Native Method)
at org.pytorch.NativePeer.<init>(NativePeer.java:25)
at org.pytorch.Module.load(Module.java:25)
at org.pytorch.Module.load(Module.java:35)
at cn.whu.cs.niu.PDR.IMUCollectorZY$b.invoke(IMUCollectorZY.kt:2)
at cn.whu.cs.niu.PDR.IMUCollectorZY$b.invoke(IMUCollectorZY.kt:1)
at kotlin.concurrent.ThreadsKt$thread$thread$1.run(Thread.kt:30)
1 回复
在使用 uni-app 开发应用时,如果集成了第三方室内定位插件,并且在打包后运行时出现闪退,并报 com.facebook.jni.HybridData
相关的错误,可能是由于以下原因导致的:
1. JNI 库未正确加载
com.facebook.jni.HybridData
是 Facebook 的 JNI 库的一部分,通常与 React Native 或某些第三方库相关。如果插件依赖了这些库,但未正确加载,可能会导致闪退。- 解决方案:
- 确保在
build.gradle
文件中正确引入了相关的依赖库。 - 检查是否有缺失的
.so
文件(JNI 库文件),确保它们被打包到 APK 中。
- 确保在
2. 插件与 uni-app 的兼容性问题
- 某些第三方插件可能与 uni-app 的框架不兼容,尤其是在涉及到 JNI 或原生代码时。
- 解决方案:
- 检查插件的文档,确保它支持 uni-app 或 HBuilderX 的环境。
- 如果插件提供了示例项目,尝试在原生 Android 项目中运行,确认插件本身没有问题。
3. 混淆配置问题
- 如果启用了代码混淆(ProGuard 或 R8),可能会导致 JNI 相关的类或方法被错误地混淆,从而导致闪退。
- 解决方案:
- 在
proguard-rules.pro
或consumer-rules.pro
中添加规则,确保com.facebook.jni.HybridData
及其相关类不被混淆。例如:-keep class com.facebook.jni.** { *; }
- 在
4. 插件初始化问题
- 插件可能需要在应用启动时进行初始化,如果初始化失败,可能会导致闪退。
- 解决方案:
- 检查插件的文档,确保在
App.vue
或main.js
中正确初始化插件。 - 如果插件需要在原生代码中初始化,确保在
Application
类或MainActivity
中进行了正确的初始化。
- 检查插件的文档,确保在
5. NDK 版本不兼容
- 如果插件使用了特定的 NDK 版本,而你的项目配置了不同的 NDK 版本,可能会导致兼容性问题。
- 解决方案:
- 检查插件的文档,确认所需的 NDK 版本。
- 在
local.properties
中指定正确的 NDK 版本,例如:ndk.dir=/path/to/ndk/version
6. 缺少必要的权限或配置
- 某些插件可能需要特定的权限或配置,如果未正确配置,可能会导致闪退。
- 解决方案:
- 检查插件的文档,确保在
AndroidManifest.xml
中添加了所有必要的权限和配置。 - 例如,室内定位插件可能需要以下权限:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
- 检查插件的文档,确保在
7. 调试和日志
- 如果以上方法都无法解决问题,可以通过调试和日志来进一步分析问题。
- 解决方案:
- 使用
adb logcat
查看详细的崩溃日志,定位具体的错误原因。 - 在代码中添加日志,检查插件的初始化过程是否正常。
- 使用
8. 联系插件开发者
- 如果问题依然无法解决,建议联系插件的开发者,提供详细的错误日志和复现步骤,寻求帮助。
示例代码(ProGuard 规则)
# 保持 Facebook JNI 相关类不被混淆
-keep class com.facebook.jni.** { *; }
示例代码(AndroidManifest.xml 权限)
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />