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.xpermissionsbuild 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 集成自动生成的声明,删除多余的手动声明即可。
备注:内容仅供参考。
