Unity集成Facebook登录APK崩溃:NoSuchMethodError问题求助
问题描述
Unity编辑器内Facebook登录操作正常,但打包为APK后调用登录流程时应用崩溃,Google Crashlytics上报错误:
No virtual method registerForActivityResult(Landroidx/activity/result/contract/ActivityResultContract;Landroidx/activity/result/ActivityResultCallback;)Landroidx/activity/result/ActivityResultLauncher; in class Lcom/facebook/login/LoginFragment; or its super classes (declaration of 'com.facebook.login.LoginFragment' appears in /data/app/~~5Q7U56IhDJWLs7NgiW1kzA==/com.DefaultCompany.ARTestApp-qBfXPRYlcXThBFc53JFwvA==/base.apk)
调用栈信息:
androidx.fragment.app.Fragment.performCreate (Fragment.java:2414) androidx.fragment.app.FragmentManagerImpl.moveToState (FragmentManager.java:1418) androidx.fragment.app.FragmentTransition.addToFirstInLastOut (FragmentTransition.java:1195) androidx.fragment.app.FragmentTransition.calculateFragments (FragmentTransition.java:1078) androidx.fragment.app.FragmentTransition.startTransitions (FragmentTransition.java:117) androidx.fragment.app.FragmentManagerImpl.executeOpsTogether (FragmentManager.java:2408) androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute (FragmentManager.java:2366) androidx.fragment.app.FragmentManagerImpl.execPendingActions (FragmentManager.java:2273) androidx.fragment.app.FragmentManagerImpl.dispatchStateChange (FragmentManager.java:3273) androidx.fragment.app.FragmentManagerImpl.dispatchActivityCreated (FragmentManager.java:3229) androidx.fragment.app.FragmentController.dispatchActivityCreated (FragmentController.java:201) androidx.fragment.app.FragmentActivity.onStart (FragmentActivity.java:620) android.app.Instrumentation.callActivityOnStart (Instrumentation.java:1485) android.app.Activity.performStart (Activity.java:8143) android.app.ActivityThread.handleStartActivity (ActivityThread.java:3797) android.app.servertransaction.TransactionExecutor.performLifecycleSequence (TransactionExecutor.java:221) android.app.servertransaction.TransactionExecutor.cycleToPath (TransactionExecutor.java:201) android.app.servertransaction.TransactionExecutor.executeLifecycleState (TransactionExecutor.java:173) android.app.servertransaction.TransactionExecutor.execute (TransactionExecutor.java:97) android.app.ActivityThread$H.handleMessage (ActivityThread.java:2336) android.os.Handler.dispatchMessage (Handler.java:106) android.os.Looper.loop (Looper.java:257) android.app.ActivityThread.main (ActivityThread.java:8246) java.lang.reflect.Method.invoke (Method.java) com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:626) com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1016)
问题根源
Facebook登录SDK依赖的AndroidX Fragment版本过低,或项目中AndroidX组件版本不统一,导致LoginFragment无法找到AndroidX Fragment新增的registerForActivityResult方法。编辑器内环境的AndroidX组件版本符合要求,但打包APK时出现版本降级或冲突。
解决办法
1. 强制统一AndroidX组件版本
在Unity项目的Assets/Plugins/Android目录下创建或修改mainTemplate.gradle文件,添加配置强制指定兼容的AndroidX版本(建议用1.4.0及以上,确保包含目标API):
android { // 保留原有配置 } dependencies { // 强制指定AndroidX Fragment和Activity版本 implementation 'androidx.fragment:fragment:1.4.0' implementation 'androidx.activity:activity:1.4.0' // 保留原有依赖 }
2. 更新Facebook SDK到最新兼容版
检查并升级Unity的Facebook SDK至最新稳定版本,新版本通常已适配更高版本的AndroidX组件,避免API不兼容问题。
3. 配置Unity Android Player设置
- 打开
Edit > Project Settings > Player > Android > Publishing Settings,勾选Custom Main Gradle Template,确保自定义的gradle配置生效。 - 将Minimum API Level设置为Android 21(Android 5.0)及以上,满足AndroidX组件的最低版本要求。
4. 清理缓存后重新打包
- 删除项目根目录下的
Library和Temp文件夹,重新导入资源。 - 执行
Build > Clean Build清理Android构建缓存,再重新打包APK。
验证方法
打包完成后,用Android Studio的APK Analyzer查看base.apk中的androidx.fragment版本,确认已更新至指定的高版本,再测试登录流程是否正常。
内容的提问来源于stack exchange,提问作者BLACK GOKU

