Add support for extra lines in BuildConfig.
Xavier Ducrohet [Fri, 31 Aug 2012 18:37:48 +0000 (11:37 -0700)]
Created a -Dsl class for each ProductFlavor and BuildType in order to
improve the DSL.

Added some examples in basic/ and flavored/ samples.

Change-Id: I7c0613b0a81569a17737b2aa4b94d207bf464989

19 files changed:
builder/src/main/java/com/android/builder/BuildType.java
builder/src/main/java/com/android/builder/ProductFlavor.java
builder/src/main/java/com/android/builder/VariantConfiguration.java
gradle/src/main/groovy/com/android/build/gradle/AndroidBasePlugin.groovy
gradle/src/main/groovy/com/android/build/gradle/AndroidExtension.groovy
gradle/src/main/groovy/com/android/build/gradle/AndroidLibraryExtension.groovy
gradle/src/main/groovy/com/android/build/gradle/AndroidLibraryPlugin.groovy
gradle/src/main/groovy/com/android/build/gradle/AndroidLogger.groovy
gradle/src/main/groovy/com/android/build/gradle/AndroidPlugin.groovy
gradle/src/main/groovy/com/android/build/gradle/BaseAndroidExtension.groovy
gradle/src/main/groovy/com/android/build/gradle/InstallApplication.groovy
gradle/src/main/groovy/com/android/build/gradle/RunTestsTask.groovy
gradle/src/main/groovy/com/android/build/gradle/ZipAlign.groovy
gradle/src/main/groovy/com/android/build/gradle/internal/ApplicationVariant.groovy
gradle/src/main/groovy/com/android/build/gradle/internal/BuildTypeDsl.groovy [new file with mode: 0644]
gradle/src/main/groovy/com/android/build/gradle/internal/ProductFlavorDsl.groovy [new file with mode: 0644]
testapps/basic/build.gradle
testapps/flavored/build.gradle
testapps/tictactoe/app/build.gradle

index 561d713..e4b5c50 100644 (file)
@@ -35,7 +35,6 @@ public class BuildType implements Serializable {
     private boolean mDebugSigned;
     private String mPackageNameSuffix = null;
     private boolean mRunProguard = false;
-    private boolean mBuildConfigDebug;
     private final List<String> mBuildConfigLines = new ArrayList<String>();
 
     private boolean mZipAlign = true;
@@ -54,14 +53,12 @@ public class BuildType implements Serializable {
         mDebugJniBuild = true;
         mDebugSigned = true;
         mZipAlign = false;
-        mBuildConfigDebug = true;
     }
 
     private void initRelease() {
         mDebuggable = false;
         mDebugJniBuild = false;
         mDebugSigned = false;
-        mBuildConfigDebug = false;
     }
 
     public String getName() {
@@ -116,10 +113,14 @@ public class BuildType implements Serializable {
         return mZipAlign;
     }
 
-    public void setBuildConfigLines(List<String> lines) {
+    protected void addBuildConfigLines(List<String> lines) {
         mBuildConfigLines.addAll(lines);
     }
 
+    protected void clearBuildConfigLines() {
+        mBuildConfigLines.clear();
+    }
+
     public List<String> getBuildConfigLines() {
         return mBuildConfigLines;
     }
@@ -131,7 +132,7 @@ public class BuildType implements Serializable {
 
         BuildType buildType = (BuildType) o;
 
-        if (mBuildConfigDebug != buildType.mBuildConfigDebug) return false;
+        if (mName != null ? !mName.equals(buildType.mName) : buildType.mName != null) return false;
         if (mDebugJniBuild != buildType.mDebugJniBuild) return false;
         if (mDebugSigned != buildType.mDebugSigned) return false;
         if (mDebuggable != buildType.mDebuggable) return false;
@@ -141,7 +142,6 @@ public class BuildType implements Serializable {
                 !mBuildConfigLines.equals(buildType.mBuildConfigLines) :
                 buildType.mBuildConfigLines != null)
             return false;
-        if (mName != null ? !mName.equals(buildType.mName) : buildType.mName != null) return false;
         if (mPackageNameSuffix != null ?
                 !mPackageNameSuffix.equals(buildType.mPackageNameSuffix) :
                 buildType.mPackageNameSuffix != null)
@@ -158,7 +158,6 @@ public class BuildType implements Serializable {
         result = 31 * result + (mDebugSigned ? 1 : 0);
         result = 31 * result + (mPackageNameSuffix != null ? mPackageNameSuffix.hashCode() : 0);
         result = 31 * result + (mRunProguard ? 1 : 0);
-        result = 31 * result + (mBuildConfigDebug ? 1 : 0);
         result = 31 * result + (mBuildConfigLines != null ? mBuildConfigLines.hashCode() : 0);
         result = 31 * result + (mZipAlign ? 1 : 0);
         return result;
index fd72ad8..ed7bb0b 100644 (file)
@@ -144,10 +144,14 @@ public class ProductFlavor implements Serializable {
                 mSigningKeyPassword != null;
     }
 
-    public void setBuildConfigLines(List<String> lines) {
+    protected void addBuildConfigLines(List<String> lines) {
         mBuildConfigLines.addAll(lines);
     }
 
+    protected void clearBuildConfigLines() {
+        mBuildConfigLines.clear();
+    }
+
     public List<String> getBuildConfigLines() {
         return mBuildConfigLines;
     }
@@ -197,6 +201,7 @@ public class ProductFlavor implements Serializable {
 
         ProductFlavor that = (ProductFlavor) o;
 
+        if (mName != null ? !mName.equals(that.mName) : that.mName != null) return false;
         if (mMinSdkVersion != that.mMinSdkVersion) return false;
         if (mTargetSdkVersion != that.mTargetSdkVersion) return false;
         if (mVersionCode != that.mVersionCode) return false;
@@ -204,7 +209,6 @@ public class ProductFlavor implements Serializable {
                 !mBuildConfigLines.equals(that.mBuildConfigLines) :
                 that.mBuildConfigLines != null)
             return false;
-        if (mName != null ? !mName.equals(that.mName) : that.mName != null) return false;
         if (mPackageName != null ?
                 !mPackageName.equals(that.mPackageName) :
                 that.mPackageName != null)
index 31f17b7..bd5f96c 100644 (file)
@@ -472,6 +472,31 @@ public class VariantConfiguration {
         return classpath;
     }
 
+    public List<String> getBuildConfigLines() {
+        List<String> fullList = new ArrayList<String>();
+
+        List<String> list = mDefaultConfig.getBuildConfigLines();
+        if (!list.isEmpty()) {
+            fullList.add("// lines from default config.");
+            fullList.addAll(list);
+        }
+
+        list = mBuildType.getBuildConfigLines();
+        if (!list.isEmpty()) {
+            fullList.add("// lines from build type: " + mBuildType.getName());
+            fullList.addAll(list);
+        }
+
+        for (ProductFlavor flavor : mFlavorConfigs) {
+            list = flavor.getBuildConfigLines();
+            if (!list.isEmpty()) {
+                fullList.add("// lines from product flavor: " + flavor.getName());
+                fullList.addAll(list);
+            }
+        }
+
+        return fullList;
+    }
 
     protected void validate() {
         if (mType != Type.TEST) {
index fb22009..921076a 100644 (file)
@@ -198,6 +198,7 @@ abstract class AndroidBasePlugin {
         generateBuildConfigTask.plugin = this
         generateBuildConfigTask.variant = variant
         generateBuildConfigTask.configObjects = variant.configObjects
+        generateBuildConfigTask.optionalJavaLines = variant.buildConfigLines
         generateBuildConfigTask.conventionMapping.sourceOutputDir = {
             project.file("$project.buildDir/source/${variant.dirName}")
         }
index ce37122..ded923e 100644 (file)
  */
 package com.android.build.gradle
 
-import com.android.builder.BuildType
-import com.android.builder.ProductFlavor
+import com.android.build.gradle.internal.BuildTypeDsl
+import com.android.build.gradle.internal.ProductFlavorDsl
 import org.gradle.api.Action
 import org.gradle.api.NamedDomainObjectContainer
 
 class AndroidExtension extends BaseAndroidExtension {
-    final NamedDomainObjectContainer<ProductFlavor> productFlavors
-    final NamedDomainObjectContainer<BuildType> buildTypes
+    final NamedDomainObjectContainer<ProductFlavorDsl> productFlavors
+    final NamedDomainObjectContainer<BuildTypeDsl> buildTypes
 
 
     String testBuildType = "debug"
 
-    AndroidExtension(NamedDomainObjectContainer<BuildType> buildTypes,
-                     NamedDomainObjectContainer<ProductFlavor> productFlavors) {
+    AndroidExtension(NamedDomainObjectContainer<BuildTypeDsl> buildTypes,
+                     NamedDomainObjectContainer<ProductFlavorDsl> productFlavors) {
         this.buildTypes = buildTypes
         this.productFlavors = productFlavors
     }
 
-    void buildTypes(Action<? super NamedDomainObjectContainer<BuildType>> action) {
+    void buildTypes(Action<? super NamedDomainObjectContainer<BuildTypeDsl>> action) {
         action.execute(buildTypes)
     }
 
-    void productFlavors(Action<? super NamedDomainObjectContainer<ProductFlavor>> action) {
+    void productFlavors(Action<? super NamedDomainObjectContainer<ProductFlavorDsl>> action) {
         action.execute(productFlavors)
     }
 }
index 5ac9ea1..ca18ea2 100644 (file)
  */
 package com.android.build.gradle
 
+import com.android.build.gradle.internal.BuildTypeDsl
 import com.android.builder.BuildType
 import org.gradle.api.Action
 
 class AndroidLibraryExtension extends BaseAndroidExtension {
 
-    final BuildType debug = new BuildType(BuildType.DEBUG)
-    final BuildType release = new BuildType(BuildType.RELEASE)
+    final BuildTypeDsl debug = new BuildTypeDsl(BuildType.DEBUG)
+    final BuildTypeDsl release = new BuildTypeDsl(BuildType.RELEASE)
 
     AndroidLibraryExtension() {
         super()
     }
 
-    void debug(Action<BuildType> action) {
+    void debug(Action<BuildTypeDsl> action) {
         action.execute(debug);
     }
 
-    void release(Action<BuildType> action) {
+    void release(Action<BuildTypeDsl> action) {
         action.execute(release);
     }
 }
index c8b7a99..7c5832f 100644 (file)
@@ -18,6 +18,8 @@ package com.android.build.gradle
 import com.android.build.gradle.internal.BuildTypeData
 import com.android.build.gradle.internal.ProductFlavorData
 import com.android.build.gradle.internal.ProductionAppVariant
+import com.android.build.gradle.internal.TestAppVariant
+import com.android.builder.AndroidDependency
 import com.android.builder.BuildType
 import com.android.builder.VariantConfiguration
 import org.gradle.api.Plugin
@@ -25,8 +27,6 @@ import org.gradle.api.Project
 import org.gradle.api.tasks.Copy
 import org.gradle.api.tasks.bundling.Jar
 import org.gradle.api.tasks.bundling.Zip
-import com.android.build.gradle.internal.TestAppVariant
-import com.android.builder.AndroidDependency
 
 class AndroidLibraryPlugin extends AndroidBasePlugin implements Plugin<Project> {
 
index 0241b4f..9cacdbb 100644 (file)
@@ -16,8 +16,8 @@
 package com.android.build.gradle
 
 import com.android.utils.ILogger
-import org.gradle.api.logging.Logger
 import org.gradle.api.logging.LogLevel
+import org.gradle.api.logging.Logger
 
 /**
  * Implementation of Android's {@link ILogger} over gradle's {@link Logger}.
index 0efd852..0dc5930 100644 (file)
@@ -16,7 +16,9 @@
 package com.android.build.gradle
 
 import com.android.build.gradle.internal.BuildTypeData
+import com.android.build.gradle.internal.BuildTypeDsl
 import com.android.build.gradle.internal.ProductFlavorData
+import com.android.build.gradle.internal.ProductFlavorDsl
 import com.android.build.gradle.internal.ProductionAppVariant
 import com.android.build.gradle.internal.TestAppVariant
 import com.android.builder.BuildType
@@ -37,8 +39,8 @@ class AndroidPlugin extends AndroidBasePlugin implements Plugin<Project> {
     void apply(Project project) {
         super.apply(project)
 
-        def buildTypes = project.container(BuildType)
-        def productFlavors = project.container(ProductFlavor)
+        def buildTypes = project.container(BuildTypeDsl)
+        def productFlavors = project.container(ProductFlavorDsl)
 
         extension = project.extensions.create('android', AndroidExtension,
                 buildTypes, productFlavors)
index 758b8da..2f3d3c7 100644 (file)
  */
 package com.android.build.gradle
 
-import com.android.builder.ProductFlavor
-import org.gradle.api.Action
 import com.android.build.gradle.internal.AaptOptionsImpl
 import com.android.build.gradle.internal.DexOptionsImpl
+import com.android.build.gradle.internal.ProductFlavorDsl
+import org.gradle.api.Action
 
 /**
  * Base android extension for all android plugins.
@@ -26,7 +26,7 @@ import com.android.build.gradle.internal.DexOptionsImpl
 class BaseAndroidExtension {
 
     String target
-    final ProductFlavor defaultConfig = new ProductFlavor("main");
+    final ProductFlavorDsl defaultConfig = new ProductFlavorDsl("main");
 
     final AaptOptionsImpl aaptOptions = new AaptOptionsImpl()
     final DexOptionsImpl dexOptions = new DexOptionsImpl()
@@ -34,7 +34,7 @@ class BaseAndroidExtension {
     BaseAndroidExtension() {
     }
 
-    void defaultConfig(Action<ProductFlavor> action) {
+    void defaultConfig(Action<ProductFlavorDsl> action) {
         action.execute(defaultConfig)
     }
 
index 83a2aa0..bb3bb5c 100644 (file)
@@ -16,7 +16,9 @@
 package com.android.build.gradle
 
 import org.gradle.api.DefaultTask
-import org.gradle.api.tasks.*
+import org.gradle.api.tasks.Input
+import org.gradle.api.tasks.InputFile
+import org.gradle.api.tasks.TaskAction
 
 class InstallApplication extends DefaultTask {
     @Input
index 38d9caf..d7c0e1a 100644 (file)
@@ -15,8 +15,8 @@
  */
 package com.android.build.gradle
 
-import org.gradle.api.tasks.TaskAction
 import org.gradle.api.tasks.Input
+import org.gradle.api.tasks.TaskAction
 
 /**
  * Run tests for a given variant
index b608671..f7e5e98 100644 (file)
 package com.android.build.gradle
 
 import org.gradle.api.DefaultTask
-import org.gradle.api.tasks.*
+import org.gradle.api.tasks.Input
+import org.gradle.api.tasks.InputFile
+import org.gradle.api.tasks.OutputFile
+import org.gradle.api.tasks.TaskAction
 
 class ZipAlign extends DefaultTask {
     @OutputFile
index 673a0d4..7c60300 100644 (file)
@@ -17,9 +17,9 @@ package com.android.build.gradle.internal
 
 import com.android.build.gradle.AndroidBasePlugin
 import com.android.builder.AndroidBuilder
+import com.android.builder.VariantConfiguration
 import org.gradle.api.file.FileCollection
 import org.gradle.api.tasks.compile.Compile
-import com.android.builder.VariantConfiguration
 
 /**
  * Represents something that can be packaged into an APK and installed.
@@ -45,6 +45,10 @@ public abstract class ApplicationVariant {
         return configObjects
     }
 
+    List<String> getBuildConfigLines() {
+        return config.buildConfigLines
+    }
+
     abstract String getDescription()
 
     abstract String getDirName()
diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/BuildTypeDsl.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/BuildTypeDsl.groovy
new file mode 100644 (file)
index 0000000..cbb089b
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.build.gradle.internal
+
+import com.android.builder.BuildType
+
+/**
+ * Dsl overlay for BuildType.
+ */
+public class BuildTypeDsl extends BuildType {
+    public BuildTypeDsl(String name) {
+        super(name)
+    }
+
+    public void buildConfig(String... lines) {
+        addBuildConfigLines(Arrays.asList(lines))
+    }
+}
diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/ProductFlavorDsl.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/ProductFlavorDsl.groovy
new file mode 100644 (file)
index 0000000..6dd49e6
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.build.gradle.internal
+
+import com.android.builder.ProductFlavor
+
+/**
+ * Dsl overlay for ProductFlavor.
+ */
+public class ProductFlavorDsl extends ProductFlavor {
+    public ProductFlavorDsl(String name) {
+        super(name)
+    }
+
+    public void buildConfig(String... lines) {
+        addBuildConfigLines(Arrays.asList(lines))
+    }
+}
index 1113949..0d0f3d2 100644 (file)
@@ -20,11 +20,16 @@ android {
         signingStorePassword = "android"
         signingKeyAlias = "androiddebugkey"
         signingKeyPassword = "android"
+        buildConfig "private final static boolean DEFAULT = true;", \
+                    "private final static String FOO = \"foo\";"
     }
 
     buildTypes {
         debug {
             packageNameSuffix = ".debug"
+
+            buildConfig "private final static boolean DEBUG2 = false;"
         }
     }
 
index 6a21080..36785c6 100644 (file)
@@ -21,20 +21,27 @@ android {
         signingStorePassword = "android"
         signingKeyAlias = "androiddebugkey"
         signingKeyPassword = "android"
+
+        buildConfig "private final static boolean DEFAULT = true;", \
+                    "private final static String FOO = \"foo\";"
+
     }
 
     productFlavors {
         f1 {
             packageName = "com.android.tests.flavored.f1"
+            buildConfig "private final static String FLAVOR = \"f1\";"
         }
         f2 {
             packageName = "com.android.tests.flavored.f2"
+            buildConfig "private final static String FLAVOR = \"f2\";"
         }
     }
     
     buildTypes {
         debug {
             packageNameSuffix = ".debug"
+            buildConfig "private final static boolean DEBUG2 = false;"
         }
         staging {
             packageNameSuffix = ".staging"
index 59f68b5..1faee70 100644 (file)
@@ -4,5 +4,5 @@ apply plugin: 'android'
 // A basic Android application split over a library and a main project.
 //
 dependencies {
-    compile project(':lib')
+//    compile project(':lib')
 }