如何使用实验性 gradle 插件 0.7.x 移动 AndroidManifest.xml 文件?

How can I move the AndroidManifest.xml file with the experimental gradle plugin 0.7.x?

我试图在使用实验性 gradle 插件版本 0.7.x 时更改 AndroidManifest.xml 文件的位置。这样做的原因是我生成了文件(因为实验插件中没有清单 merger/property 替换器)所以我不想要输出文件和源代码。

我的应用程序 build.gradle:

apply plugin: "com.android.model.application"

def buildDir = project.buildDir

model {
  android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig {
      applicationId "com.myapp.android"
      minSdkVersion.apiLevel 9
      targetSdkVersion.apiLevel 23
      versionCode 1
      versionName "1.0"
    }
    sources {
      main {
        manifest {
          source {
            srcDirs = ["$buildDir"]
          }
        }
      }
    }
  }
}

task createManifest {
  doLast {
    buildDir.mkdirs()
    new FileOutputStream(new File(buildDir, "AndroidManifest.xml"))
  }
}

tasks.all { task ->
  if (task.name.startsWith('check') && task.name.endsWith('Manifest'))     {
    task.dependsOn createManifest
  }
}

上面的配置很好,但是当我尝试构建时,我得到:

A problem was found with the configuration of task ':app:checkDebugManifest'.
> File '/home/the_jk/source/test/app/src/main/AndroidManifest.xml' specified for property 'manifest' does not exist.`

我似乎根本无法更改默认清单 "property",有人运气好吗?

尝试

      manifest { source { srcDirs = $buildDir } }

这似乎只用 1 个清单就可以了,但是如果你给它 2 个要合并的目录,实验性插件就会 barfs。

(我还猜测您还有一些其他任务要在 $buildDir 中生成清单,因为它会被干净的任务吹走....)

更新:

次要问题,check[Deubg|Release]Manifest 任务希望文件在运行时存在。对于静态文件,以上内容对我来说没问题。对于从构建目录中的任务生成的内容,我必须添加一个看起来像

的依赖项
task createManifest {
         // code to create $buildDir if it did not exist
         // code to generate AndrdroidManfest.xml in $buildDir
}

tasks.all {
    task ->
       if (task.name.startsWith('check') && task.name.endsWith('Manifest')) {
           task.dependsOn createManifest
       }
}

tasks.all 循环只允许我在 checkDebugManifest and/or checkReleaseManifest 任务将要发生时添加它(我在 ./gradlew clean 没有它的情况下找不到 checkDebugManifest 任务时遇到了麻烦。)

我遇到了与 com.android.tools.build:gradle-experimental:0.7.0-alpha4 类似的问题。我解决它的方法是使用以下代码:

    sources {
        main {
            manifest {
                source {
                    srcDirs = [ "$buildDir" ]
                }
            }
        }
    }