android + gradle:每种风格的不同清单元数据

Jef*_*man 17 android gradle android-manifest

我想meta-data根据产品风格定义不同的清单属性.我试着这样做,

src/
  main/
    AndroidManifest.xml
  prod/
    AndroidManifest.xml
  dev/
    AndroidManifest.xml
Run Code Online (Sandbox Code Playgroud)

main清单是完整的,但proddev版本稀疏,仅包含元数据,

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.inventory"
          android:versionCode="1"
          android:versionName="1.0">

  <meta-data android:name="analytics"
             android:value="true"/>

</manifest>
Run Code Online (Sandbox Code Playgroud)

这是我的理解,味道清单将与主要合并.在我的build.gradle中,我这样做,

android {
  productFlavors {
    prod {
      manifest.srcFile "prod/AndroidManifest.xml"
    }
    dev {
      manifest.srcFile "dev/AndroidManifest.xml"
    }
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)

然而,找到我尝试建立"assembleProdDebug",我明白了,

* What went wrong:
A problem occurred evaluating project ':Inventory'.
> No signature of method: org.gradle.api.java.archives.internal.DefaultManifest.srcFile() is applicable for argument types: (java.lang.String) values: [prod/AndroidManifest.xml]
Run Code Online (Sandbox Code Playgroud)

谢谢.

小智 20

在gradle文件中,您无需定义清单的路径.

使用:

productFlavors{
 prod {}
 dev{}
}
Run Code Online (Sandbox Code Playgroud)

验证您的目录结构是否正确:在src目录下和每个目录中的每个flavor的名称为flavor的目录放置了覆盖清单文件.

Gradle将合并文件.

PS - 如果您的元数据标记位于应用程序标记内,您还应该在覆盖清单中应用应用程序标记.