2013-10-28 30 views
2

我无法创建使用不同清单的两种不同构建类型。即使在使用--rerun任务重新运行gradle并完全删除build目录之后,Android中包含的AndroidManifest也不正确。例如,我运行assembleRelease,它包含ReleasePlus构建类型中的AndroidManifest。我想保持项目结构不需要切换到新的src // *结构。我也尝试过使用产品风味,但是如果不改变结构,这似乎不是一种可能。导入的Eclipse项目 - 具有不同AndroidManifest的Gradle构建类型

的build.gradle:

buildscript { 
    repositories { 
     mavenCentral() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:0.6.+' 
    } 
} 
apply plugin: 'android' 

dependencies { 
    compile fileTree(dir: 'libs', include: '*.jar') 
} 

android { 
    compileSdkVersion 18 
    buildToolsVersion "17.0.0" 

    sourceSets { 
     main { 
      manifest.srcFile 'AndroidManifest.xml' 
      java.srcDirs = ['src'] 
      resources.srcDirs = ['src'] 
      aidl.srcDirs = ['src'] 
      renderscript.srcDirs = ['src'] 
      res.srcDirs = ['res'] 
      assets.srcDirs = ['assets'] 
     } 

     // Move the tests to tests/java, tests/res, etc... 
     instrumentTest.setRoot('tests') 

     // Move the build types to build-types/<type> 
     // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ... 
     // This moves them out of them default location under src/<type>/... which would 
     // conflict with src/ being used by the main source set. 
     // Adding new build types or product flavors should be accompanied 
     // by a similar customization. 
     debug.setRoot('build-types/debug') 
     release.setRoot('build-types/release') 
    } 

    signingConfigs { 
     myConfig { 
      storeFile file("app.keystore") 
      ... 
     } 
    } 

    buildTypes { 
     release { 
      runProguard true 
      proguardFile 'proguard.flags' 
      signingConfig signingConfigs.myConfig 
      buildConfig 'public final static boolean PLUS = false; public final static String PROVIDER_AUTHORITY = "com.app.settings";' 
     } 
     debug { 
      buildConfig 'public final static boolean PLUS = false; public final static String PROVIDER_AUTHORITY = "com.app.settings";' 
     } 
     debugPlus.initWith(buildTypes.debug) 
     debugPlus { 
      packageNameSuffix '.plus' 
      buildConfig 'public final static boolean PLUS = true; public final static String PROVIDER_AUTHORITY = "com.app.plus.settings";' 
      sourceSets { 
       main { 
        manifest.srcFile 'AndroidManifestPlus.xml' 
        java.srcDirs = ['src', 'src-plus'] 
        res.srcDirs = ['res', 'res-plus'] 
       } 
       debugPlus.setRoot('build-types/debugPlus') 
      } 
     } 
     releasePlus.initWith(buildTypes.release) 
     releasePlus { 
      packageNameSuffix '.plus' 
      buildConfig 'public final static boolean PLUS = true; public final static String PROVIDER_AUTHORITY = "com.app.plus.settings";' 
      sourceSets { 
       main { 
        manifest.srcFile 'AndroidManifestPlus.xml' 
        java.srcDirs = ['src', 'src-plus'] 
        res.srcDirs = ['res', 'res-plus'] 
       } 
       releasePlus.setRoot('build-types/releasePlus') 
      } 
     } 
    } 
} 

回答

0

尝试使用一个结构:

android { 

    sourceSets { 
     main { 
      manifest.srcFile 'AndroidManifest.xml' 
     } 

     debug { 
      manifest.srcFile 'debug/AndroidManifest.xml' 
     } 

     release { 
      manifest.srcFile 'release/AndroidManifest.xml' 
     } 
    } 
} 

注意,这gradle这个会尝试你的清单合并成一个,但它并不像混帐作为动力,所以很可能您需要复制粘贴整个文件。 2可以,但应该被认为是不好的做法。您可以从此答案中了解如何在AndroidManifest中自动执行更改:Replacing a string in AndroidManifest.xml for a buildvariant doesn't work for Gradle Android Plugin Version > 0.5.4

相关问题