You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中Braintree/PayPal异常:Rejecting re-init类加载失败问题

解决Braintree PayPal支付时的NoClassDefFoundError问题

首先来看你遇到的错误:

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包的方式导致了版本冲突或冗余依赖问题。

具体解决方案如下:

  1. 替换全量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相关依赖的版本统一,避免冲突。

  2. 统一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的官方文档确认版本对应关系。

  3. 清理重建项目
    修改依赖后,一定要清理缓存并重建项目,确保依赖被正确加载:

    • 点击Android Studio顶部菜单栏的Build -> Clean Project
    • 之后执行Build -> Rebuild Project
    • 如果还是有问题,可以手动删除项目根目录的.gradle文件夹和模块下的build文件夹,再重新构建。
  4. 验证初始化流程
    确认你的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:42:08