Android动态加入Activity时manifest注册报错解决。使用manifestPlaceholder
- 软件开发
- 2025-08-29 10:57:02

需求如下:
项目 测试demo 有多个渠道,部分渠道包含支付功能,在主测试代码外,需要一个单独 Activity 调用测试代码。
MainActivityPayActivity渠道A包含不包含渠道B包含包含因为支付功能需要引入对应的 moudule,因此希望是测试渠道A时,仅包含MainAcitivity 的代码。测试渠道B时,包含 MainAcitivity + PayActivity 的代码。
代码引入简单,添加 java 路径即可。
qudaob{ // 加入支付相关代码 sourceSets."$name".java.srcDirs += "src/main/code/pay" }问题是 PayActivity 的注册。如果直接在 AndroidManifest.xml 中注册,那么不包含 PayActivity 时会报错。如果不注册,那么包含 PayActivity 时无法跳转。
前期考虑在 quandaob 文件夹下添加一个AndroidManifest.xml ,让两个 Mainifest 合并,但是一直合并不了,只能另辟蹊径。
使用 manifestPlaceholders
你可以在 build.gradle 文件中为你的 Activity 添加 manifest placeholders,然后在 AndroidManifest.xml 中引用它们。
修改 build.gradle在 zebra block 中添加如下代码:
android { ... defaultConfig { ... manifestPlaceholders = [ payActivity: "com.xxx.test_playcontrol.PayActivity" // 替换为你的 Activity 完整包名 ] } } 更新 AndroidManifest.xml在 AndroidManifest.xml 中,你可以使用占位符来声明 Activity:
<activity android:name="${payActivity}"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>这样在 Manifest中虽然会报红,但是编译是没问题的。Manifest 中会一直包含PayActivity. 这样无论是否有 PayActivity 都可以正常使用了
动态引用 PayActivity try { Class<?> dynamicClass = Class.forName("com.xxx.test_playcontrol.PayActivity"); Intent intent = new Intent(this, dynamicClass); startActivity(intent); } catch (ClassNotFoundException e) { e.printStackTrace(); ToastTools.quickToast(mContext, "pay Failed!"); DemoLog.e("功能未启用"); }Android动态加入Activity时manifest注册报错解决。使用manifestPlaceholder由讯客互联软件开发栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“Android动态加入Activity时manifest注册报错解决。使用manifestPlaceholder”