PAYATHON 2026

AliPay 与 Alibaba Push SDK 出现 Duplicate classes

支付阿杰

结论

exclude 无法删除 AAR 中已经打包的 class。正确的处理方法是保留 AliPay SDK 自带的 com.ut.device.*,同时从 Alibaba Push SDK 的传递依赖中排除 UTDID 模块。

不要将 class 名称写入 group,也不要尝试在本地 AliPay AAR 的依赖声明中执行排除。

推荐配置

Alibaba Push SDK 的版本应与项目当前使用的版本一致:

dependencies {
    implementation(name: 'alipaySdk-15.7.4-20200228192259', ext: 'aar')

    implementation('com.aliyun.ams:alicloud-android-push:<push-version>') {
        exclude group: 'com.aliyun.ams', module: 'alicloud-android-utdid'
    }
}

如果项目使用 Kotlin DSL:

dependencies {
    implementation(files("libs/alipaySdk-15.7.4-20200228192259.aar"))

    implementation("com.aliyun.ams:alicloud-android-push:<push-version>") {
        exclude(group = "com.aliyun.ams", module = "alicloud-android-utdid")
    }
}

不同版本的 Alibaba Push SDK 可能使用不同的 UTDID 依赖名称。可以先查看项目的实际依赖树:

./gradlew app:dependencies --configuration debugRuntimeClasspath

也可以只追踪包含 UTDID 的依赖:

./gradlew app:dependencyInsight \
  --dependency utdid \
  --configuration debugRuntimeClasspath

确认实际的 Maven 坐标后,再将对应的 group 和 module 写入 exclude。

原来的排除方式为什么无效

下面的配置有两个问题:

implementation(name: 'alipaySdk-15.7.4-20200228192259', ext: 'aar') {
    exclude group: 'com.ut.device.UTDevice', module: 'alicloud-android-push'
}

首先,Gradle 的 exclude 用于排除 Maven/Gradle 依赖模块,而不是 Java class 或 package。它需要填写模块坐标,例如:

exclude group: 'com.aliyun.ams', module: 'alicloud-android-utdid'

com.ut.device.UTDevice 是 class 名称,不能作为依赖的 group。Gradle 也不支持使用 com.ut.* 这样的 package 通配方式进行排除。

其次,AliPay SDK 是本地 AAR。它的 classes.jar 已经包含 com.ut.device.*,这些 class 不是通过 Gradle 的传递依赖下载的。因此,在该 AAR 的依赖声明中添加 exclude,并不能删除其中的 class。

如果仍有其他重复类

根据编译错误中的完整 class 名称,先确认重复的 class 分别来自哪些依赖。Android Gradle Plugin 的错误通常会列出两个来源,例如:

Duplicate class com.ut.device.UTDevice found in modules ...

如果冲突都发生在 com.ut.device.* 下,通常排除 Push SDK 的 UTDID 依赖即可。

如果还存在 com.alibaba.*、com.ta.* 或其他 package 的冲突,说明被重复打包的不只有 UTDID。此时需要逐一定位对应模块,不能直接排除整个 com.ut.* package。可以继续运行:

./gradlew app:dependencies --configuration debugRuntimeClasspath

检查依赖中是否还有 alicloud-android-ut、utdid 或其他重复的阿里系基础组件。只有在确认 AliPay AAR 已提供相同实现后,才应从 Push SDK 一侧排除相应的传递依赖。

不建议直接修改 AAR

虽然可以解压 AliPay AAR、修改其中的 classes.jar,然后重新打包,但这种做法通常不够稳妥:

  • 可能破坏 SDK 内部的依赖关系;
  • 每次升级 SDK 后都要重新处理;
  • 可能影响签名、混淆规则或运行时初始化;
  • 支付或推送出现异常时,排查难度会更高。

应优先选择官方兼容版本,或从 Maven 依赖侧排除重复模块。只有在双方 SDK 都没有兼容组合,并且已经确认保留其中一份实现不会影响运行时功能时,才考虑裁剪 AAR。

修改完成后,还需要验证 AliPay 支付流程、Push 初始化、设备标识获取和消息到达,避免编译虽然通过,运行时却出现方法缺失。

备注:内容仅供参考。