2016-06-09 97 views
1

我试图改变AndroidManifest.xml文件的位置,当使用实验gradle插件版本0.7.x.这样做的原因是我生成该文件(因为实验性插件中没有清单合并器/属性替换器),所以我不想将输出文件与源文件放在一起。如何使用实验gradle插件0.7.x移动AndroidManifest.xml文件?

我的应用程序的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.` 

我似乎无法在所有更改默认清单“属性” ,谁有幸运?

回答

0

尝试

 manifest { source { srcDirs = $buildDir } } 

这似乎做的好的只有1明显,但如果你给它,你要合并2个目录实验插件barfs。

(我也猜你有一些其他的任务来生成在$ buildDir清单,因为这被通过清洁任务吹走....)

更新:

次要问题,检查[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和/或checkReleaseManifest任务将要发生的(我有麻烦./gradlew干净没有找到checkDebugManifest任务。)

+0

不为我工作(仍然抱怨测试/应用/ src目录/主/ AndroidManifest.xml中不存在的),即使寿buildDir是另一回事。 gradle实验版0.7.2与gradle 2.10? –

+0

我的测试用例是=目录在项目结构之外,并且在开始评估之前已经存在。 (具体来说,“../../otherSource/src/main”)当我将它指向“outputs/manifest”之类的东西,并将任务设置为在该目录中组装它时,它会失败。我已经尝试过让我的任务在整个过程中尽早完成,但它很虚弱。 'project.afterEvaluate { build.dependsOn mergeManifest }'我认为文件需要存在很早,不知道如何实现它。 –

+0

嗯,感谢非常早期的评论 - 现在我明白了,使androidDebug和androidRelease依赖于createManifest最终让checkManifest任务看起来正确的文件 –

0

我有一个类似的问题com.android.tools.build:gradle-experimental:0.7.0-alpha4。我解决它与下面的代码的方式:

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

而且您没有app/src/main/AndroidManifest.xml文件? –

+0

这是正确的,我的项目中没有'app/src/main/AndroidManifest.xml'。 – OlivierM

相关问题