清单合并-Android studio 0.8.1升级生成错误:属性';文件';不存在
我刚刚升级到Android Studio 0.8.1,并升级了构建工具等。来自Android Studio 0.6 但是我得到了这个构建错误: 发现任务的配置有问题 “:processDevelopmentDebugResources” 文件“C:\ProjectFolder\build\manifests\DevelopmentDebug\Development\debug\AndroidManifest.xml” 为属性“manifestFile”指定的不存在 但我不知道问题出在哪里。生成中的文件夹清单不存在。清单合并-Android studio 0.8.1升级生成错误:属性';文件';不存在,android,android-studio,android-manifest,android-gradle-plugin,build.gradle,Android,Android Studio,Android Manifest,Android Gradle Plugin,Build.gradle,我刚刚升级到Android Studio 0.8.1,并升级了构建工具等。来自Android Studio 0.6 但是我得到了这个构建错误: 发现任务的配置有问题 “:processDevelopmentDebugResources” 文件“C:\ProjectFolder\build\manifests\DevelopmentDebug\Development\debug\AndroidManifest.xml” 为属性“manifestFile”指定的不存在 但我不知道问题出在哪里。生成中
我怀疑这与替换清单文件中的值的代码的最后一部分有关。构建工具变更列表中的“清单合并中的修复”有所改变,但我不知道这是否相关。但是,同样-文件夹不存在,此代码应该更改其中的一些文件 有线索吗 编辑1: 我刚刚试着注释掉“variant.processManifest.doLast”部分,它是有效的,所以问题在于这段代码。(为什么我以前没试过……)
但上一个版本中发生了什么变化导致此代码失败?它在升级之前起作用 编辑2: 见ianhanniballake回答下的评论 这是我的build.gradle文件:
buildscript {
repositories {
mavenCentral()
maven { url 'http://download.crashlytics.com/maven' }
}
dependencies {
classpath 'com.android.tools.build:gradle:0.12.+'
classpath 'com.crashlytics.tools.gradle:crashlytics-gradle:1.+'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.2'
}
}
repositories {
mavenCentral()
maven { url 'http://download.crashlytics.com/maven' }
}
apply plugin: 'com.android.application'
apply plugin: 'crashlytics'
apply plugin: 'android-apt'
dependencies {
compile 'com.crashlytics.android:crashlytics:1.+'
compile fileTree(dir: 'libs', include: '*.jar')
apt "org.androidannotations:androidannotations:3.0.1"
compile "org.androidannotations:androidannotations-api:3.0.1"
}
apt {
arguments {
resourcePackageName "dk.packagename"
androidManifestFile variant.processResources.manifestFile
}
}
android {
packagingOptions { //Fix: http://stackoverflow.com/a/20675331/860488
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/LICENSE'
exclude 'META-INF/NOTICE'
}
compileSdkVersion 10
buildToolsVersion "20.0"
defaultConfig {
minSdkVersion 8
targetSdkVersion 10
buildConfigField "int", "appId", "2"
}
lintOptions {
checkReleaseBuilds false
}
signingConfigs {
//Use terminal command: gradle assembleKonnektRelease
releaseKonnekt {
}
}
productFlavors{
def konnektSigningConfig = signingConfigs.releaseKonnekt
Development {
applicationId "dk.packagename"
versionCode 1
versionName "1.0.0"
buildConfigField "int", "appId", "2"
}
}
buildTypes {
testflight.initWith(buildTypes.debug)
debug {
applicationIdSuffix ".debug"
}
testflight {
applicationIdSuffix ".test"
}
release {
}
}
// Override Data in Manifest
android.applicationVariants.all { variant ->
variant.processManifest.doLast {
copy {
// *** SET COPY PATHS ***
try {
from("${buildDir}/manifests") {
//println "from: ${buildDir}/manifests"
include "${variant.dirName}/AndroidManifest.xml"
//println "included: ${variant.dirName}/AndroidManifest.xml"
}
} catch (e) {
println "error: " + e
}
into("${buildDir}/manifests/${variant.name}")
def variantName = variant.name.toString()
def appName = "empty"
def facebookId = "empty"
// *** SET APP NAME ***
if (variantName.contains("Development")) {
appName = "Development"
} else if (variantName.contains("Konnekt")) {
appName = "Konnekt"
facebookId = "**"
}
if(variantName.contains("Debug")){
appName = appName + " debug"
} else if(variantName.contains("Test")){
appName = appName + " test"
}
// *** REPLACE LINES IN MANIFEST ***
filter {
String line -> line.replaceAll("<application android:allowBackup=\"true\" android:icon=\"@drawable/ic_launcher\" android:label=\"todo\" android:name=\"dk.packagename.App\">", // implicit "." is replaced with: "dk.packagename."
"<application android:allowBackup=\"true\" android:icon=\"@drawable/ic_launcher\" android:label=\"" + appName + "\" android:name=\"dk.packagename.App\">");
}
filter {
String line -> line.replaceAll("<activity android:label=\"todo\" android:name=\"dk.packagename.SplashActivity\">",
"<activity android:label=\"" + appName + "\" android:name=\"dk.packagename.SplashActivity\">");
}
filter{
String line -> line.replaceAll("<meta-data android:name=\"com.facebook.sdk.ApplicationId\" android:value=\"\"/>",
"<meta-data android:name=\"com.facebook.sdk.ApplicationId\" android:value=\"" + facebookId + "\"/>")
}
}
}
// *** SET PATH TO NEW MANIFEST ***
variant.processResources.manifestFile = file("${buildDir}/manifests/${variant.name}/${variant.dirName}/AndroidManifest.xml")
//println "newManifest: ${buildDir}/manifests/${variant.name}/${variant.dirName}/AndroidManifest.xml"
}
}
buildscript{
存储库{
mavenCentral()
maven{url'http://download.crashlytics.com/maven' }
}
依赖关系{
classpath'com.android.tools.build:gradle:0.12.+'
类路径'com.crashlytics.tools.gradle:crashlytics gradle:1.+'
类路径'com.neenbedankt.gradle.plugins:android apt:1.2'
}
}
存储库{
mavenCentral()
maven{url'http://download.crashlytics.com/maven' }
}
应用插件:“com.android.application”
应用插件:“crashlytics”
应用插件:“安卓apt”
依赖关系{
编译'com.crashlytics.android:crashlytics:1.+'
编译文件树(目录:“libs”,包括:“*.jar”)
apt“org.androidannotations:androidannotations:3.0.1”
编译“org.androidannotations:AndroidAnnotationsAPI:3.0.1”
}
贴切{
论据{
resourcePackageName“dk.packagename”
androidManifestFile variant.processResources.manifestFile
}
}
安卓{
打包选项{//Fix:http://stackoverflow.com/a/20675331/860488
排除“META-INF/依赖项”
排除“META-INF/许可证”
排除“META-INF/通知”
}
编译DK10版
buildToolsVersion“20.0”
默认配置{
明斯克版本8
targetSdkVersion 10
buildConfigField“int”、“appId”、“2”
}
林特选项{
checkReleaseBuilds为false
}
签名配置{
//使用终端命令:gradleassemblekonnektrelease
释放孔奈克{
}
}
产品风味{
def konnektSigningConfig=signingConfigs.releaseKonnekt
发展{
应用程序ID“dk.packagename”
版本代码1
版本名称“1.0.0”
buildConfigField“int”、“appId”、“2”
}
}
建筑类型{
initWith(buildTypes.debug)
调试{
applicationIdSuffix“.debug”
}
试飞{
applicationIdSuffix“.test”
}
释放{
}
}
//覆盖清单中的数据
android.applicationVariants.all{variant->
variant.processManifest.doLast{
抄袭{
//***设置复制路径***
试一试{
来自(“${buildDir}/manifests”){
//println“from:${buildDir}/manifests”
包括“${variant.dirName}/AndroidManifest.xml”
//println“包括:${variant.dirName}/AndroidManifest.xml”
}
}捕获(e){
println“错误:+e
}
进入(“${buildDir}/manifests/${variant.name}”)
def variantName=variant.name.toString()
def appName=“空”
def facebook id=“空”
//***设置应用程序名称***
如果(variantName.contains(“开发”)){
appName=“开发”
}else if(variantName.contains(“Konnekt”)){
appName=“Konnekt”
facebookId=“**”
}
if(variantName.contains(“调试”)){
appName=appName+“调试”
}else if(variantName.contains(“测试”)){
appName=appName+“测试”
}
//***替换清单中的行***
滤器{
字符串行->行.replaceAll(“,//隐式”。”替换为:“dk.packagename。”
"");
}
滤器{
字符串行->行.replaceAll(“,
"");
}
滤器{
字符串行->行.replaceAll(“,
"")
}
}
}
//***设置新清单的路径***
variant.processResources.manifestFile=file(“${buildDir}/manifests/${variant.name}/${variant.dirName}/AndroidManifest.xml”)
//println“newManifest:${buildDir}/manifests/${variant.name}/${variant.dirName}/AndroidManifest.xml”
}
}
这很可能是由于成为默认值。新清单合并的一个好处是,您不必使用这种方法-相反,您可以定义自定义占位符并将其插入合并过程:
android {
defaultConfig {
manifestPlaceholders = [ activityLabel:"defaultName"]
}
productFlavors {
free {
}
pro {
manifestPlaceholders = [ activityLabel:"proName" ]
}
}
将替换以下声明中的占位符:
<activity android:name=".MainActivity" android:label="${activityLabel}" >
注意:您还可以将多个占位符组合在一起,例如android:
from("${buildDir}/manifests")