PAYATHON 2026

Codename One Android Build 出现 BILLING 权限重复错误

数据小陈

结论

com.android.vending.BILLING 被重复声明了。Codename One 的 In App Purchase 支持通常会自动添加该权限,因此需要删除 build hints 或其他扩展中手动添加的 BILLING 权限,只保留自动生成的声明。

android.licenseKey 用于配置应用内购买的许可证密钥,与权限声明无关,可以保留。

原因

报错中的两行都指向同一个权限:

uses-permission#com.android.vending.BILLING

最终生成的 AndroidManifest.xml 中很可能有两条相同的声明:

<uses-permission android:name="com.android.vending.BILLING" />
<uses-permission android:name="com.android.vending.BILLING" />

重复声明通常来自以下位置:

  • In App Purchase 代码或相关 Codename One 库自动添加了一次;
  • android.xpermissions build hint 又手动添加了一次;
  • 项目引入了两个都会声明 Billing 权限的 CN1Lib。

解决步骤

检查项目的 build hints,查找包含以下权限的配置:

<uses-permission android:name="com.android.vending.BILLING" />

如果该权限位于 android.xpermissions 中,请将它删除。例如,原配置可能是:

codename1.arg.android.xpermissions=<uses-permission android:name="com.android.vending.BILLING" />

可以删除整行。如果 android.xpermissions 中还有其他必要权限,则只移除 com.android.vending.BILLING,例如:

codename1.arg.android.xpermissions=<uses-permission android:name="android.permission.CAMERA" />

许可证密钥配置需要保留:

codename1.arg.android.licenseKey=YOUR_LICENSE_KEY

修改后执行一次干净构建,再重新提交 Android build,以免旧的构建产物继续参与打包。

如果没有手动添加权限

如果 build hints 中找不到 com.android.vending.BILLING,还需要检查:

  • 项目使用的 CN1Lib;
  • 自定义原生 Android 代码;
  • 自定义 Manifest 片段;
  • 是否同时启用了两套应用内购买实现。

最终只能由一个组件声明以下权限:

<uses-permission android:name="com.android.vending.BILLING" />

不要直接修改错误信息中的 /tmp/build.../AndroidManifest.xml。它是构建服务器生成的临时文件,下次构建时仍会重新生成。应当从项目的 build hints、依赖库或自定义 Manifest 配置中移除重复声明。

注意事项

android.licenseKey 不能替代 Billing 权限,也不应因为这个错误而删除。前者负责许可证配置,com.android.vending.BILLING 则是权限声明。

如果项目使用较新的 Google Play Billing 集成,是否仍需显式声明该权限,取决于所用的 Codename One 版本和扩展库。但这个构建错误的直接原因仍是同一权限被写入了两次。保留当前 IAP 集成自动生成的声明,删除多余的手动声明即可。

备注:内容仅供参考。