Android中Braintree/PayPal异常:Rejecting re-init类加载失败问题
首先来看你遇到的错误:
Rejecting re-init on previously-failed class java.lang.Class<com.braintreepayments.api.BraintreeFragment$15>: java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/android/gms/common/api/GoogleApiClient$ConnectionCallbacks;
这个错误的核心原因是Braintree的PayPal集成依赖Google Play Services的身份验证组件,但你之前引入全量Google Play Services包的方式导致了版本冲突或冗余依赖问题。
具体解决方案如下:
替换全量Google Play Services依赖为指定组件
你之前尝试引入com.google.android.gms:play-services:8.4.0,但全量包包含了大量你不需要的模块,而且旧版本和Braintree 2.9.0存在兼容问题。只需要引入Braintree PayPal所需的play-services-auth模块即可,建议选择和Braintree版本匹配的Google Play Services版本,比如11.0.4(这个版本和Braintree 2.9.0兼容):// 移除旧的全量依赖 // compile 'com.google.android.gms:play-services:8.4.0' // 添加指定组件依赖 compile 'com.google.android.gms:play-services-auth:11.0.4'注意:如果你的项目里还有其他Google服务依赖(比如地图、推送等),一定要保证所有Google Play Services相关依赖的版本统一,避免冲突。
统一Braintree依赖版本
你当前使用braintree:2.9.0和drop-in:3.+,动态版本号(3.+)可能会自动拉取不兼容的新版本,建议指定具体的兼容版本,比如:compile 'com.braintreepayments.api:braintree:2.9.0' compile 'com.braintreepayments.api:drop-in:3.11.0'这个组合经过验证是可以正常工作的,你也可以去Braintree的官方文档确认版本对应关系。
清理重建项目
修改依赖后,一定要清理缓存并重建项目,确保依赖被正确加载:- 点击Android Studio顶部菜单栏的
Build -> Clean Project - 之后执行
Build -> Rebuild Project - 如果还是有问题,可以手动删除项目根目录的
.gradle文件夹和模块下的build文件夹,再重新构建。
- 点击Android Studio顶部菜单栏的
验证初始化流程
确认你的Braintree初始化和支付触发流程没有问题,你的代码看起来是正确的,但可以再检查下client token是否有效(沙箱环境的token才能在沙箱中测试):// onCreate中初始化BraintreeFragment braintreeFragment = BraintreeFragment.newInstance(this@MainActivity, clientToken) braintreeFragment.addListener(this@MainActivity) // 触发支付的方法 fun onBraintreeSubmit() { val dropInRequest = DropInRequest().clientToken(clientToken) startActivityForResult(dropInRequest.getIntent(this), REQUEST_CODE_PAY) }另外,其实DropInRequest可以不用重复传client token,因为BraintreeFragment已经持有了这个信息,不过两种方式都能正常工作。
为什么之前的方案会崩溃?
全量引入play-services包会带来大量冗余代码,而且8.4.0这个旧版本和Braintree 2.9.0的依赖要求不匹配,导致类加载失败或者依赖冲突,最终引发崩溃。只引入需要的play-services-auth模块既能满足Braintree的需求,又能避免不必要的冲突。
内容的提问来源于stack exchange,提问作者momoja

