2016-06-09 178 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

相關問題