能否在build.gradle中按构建变体配置AndroidManifest的queries包名?
按构建变体配置AndroidManifest中queries的包名
可以实现,以下是两种可行方案:
方案一:使用Manifest占位符(推荐)
Android Gradle Plugin 4.0及以上版本支持在queries标签中使用manifest占位符,你之前的写法无效大概率是没在gradle中为不同变体配置占位符的值。
步骤:
- 在app模块的
build.gradle(或build.gradle.kts)中,为每个productFlavor配置专属的占位符:
android { flavorDimensions "environment" productFlavors { dev { dimension "environment" // 配置开发环境需要的查询包名 manifestPlaceholders = [ queryPackage1: "com.example.dev.target", queryPackage2: "com.example.dev.target2" ] } prod { dimension "environment" // 配置生产环境需要的查询包名 manifestPlaceholders = [ queryPackage1: "com.example.prod.target", queryPackage2: "com.example.prod.target2" ] } } }
- 在主
AndroidManifest.xml中引用这些占位符:
<queries> <package android:name="${queryPackage1}" /> <package android:name="${queryPackage2}" /> </queries>
方案二:使用变体专属的Manifest文件
利用Android构建系统的manifest合并机制,为每个flavor创建单独的manifest文件,只包含对应环境的queries配置。
步骤:
- 在app源码目录下,创建对应flavor的文件夹:
app/src/dev和app/src/prod - 在每个flavor目录下创建
AndroidManifest.xml,写入对应环境的queries:
- dev环境的
app/src/dev/AndroidManifest.xml:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <queries> <package android:name="com.example.dev.target" /> <package android:name="com.example.dev.target2" /> </queries> </manifest>
- prod环境的
app/src/prod/AndroidManifest.xml:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <queries> <package android:name="com.example.prod.target" /> <package android:name="com.example.prod.target2" /> </queries> </manifest>
- 主
app/src/main/AndroidManifest.xml中移除queries标签,构建时系统会自动合并对应flavor的manifest内容。
补充说明
- 字符串资源(
@string/xxx)确实无法在queries的package标签中使用,因为Android在处理queries的权限校验时,是在构建早期阶段,此时字符串资源尚未被解析。 - 确保你的Android Gradle Plugin版本不低于4.0,否则占位符方案可能无法生效。
内容的提问来源于stack exchange,提问作者Massimo Milazzo
相关产品推荐
相关产品推荐

