Decorate PackagingOptions

Bug: 140406102
Test: existing
Change-Id: I07a3de4cea7347143cd314aaee44b4892fa8b6b3
diff --git a/build-system/gradle-core/src/main/java/com/android/build/api/variant/impl/JniLibsApkPackagingImpl.kt b/build-system/gradle-core/src/main/java/com/android/build/api/variant/impl/JniLibsApkPackagingImpl.kt
index 093f231..fe07342 100644
--- a/build-system/gradle-core/src/main/java/com/android/build/api/variant/impl/JniLibsApkPackagingImpl.kt
+++ b/build-system/gradle-core/src/main/java/com/android/build/api/variant/impl/JniLibsApkPackagingImpl.kt
@@ -16,13 +16,13 @@
 
 package com.android.build.api.variant.impl
 
+import com.android.build.api.dsl.PackagingOptions
 import com.android.build.api.variant.JniLibsApkPackaging
 import com.android.build.gradle.internal.services.VariantPropertiesApiServices
 import com.android.sdklib.AndroidVersion.VersionCodes.M
-import org.gradle.api.provider.Provider
 
 class JniLibsApkPackagingImpl(
-    dslPackagingOptions: com.android.build.gradle.internal.dsl.PackagingOptions,
+    dslPackagingOptions: PackagingOptions,
     variantPropertiesApiServices: VariantPropertiesApiServices,
     minSdk: Int
 ) : JniLibsPackagingImpl(dslPackagingOptions, variantPropertiesApiServices),
diff --git a/build-system/gradle-core/src/main/java/com/android/build/api/variant/impl/JniLibsPackagingImpl.kt b/build-system/gradle-core/src/main/java/com/android/build/api/variant/impl/JniLibsPackagingImpl.kt
index aea9441..34f03f3 100644
--- a/build-system/gradle-core/src/main/java/com/android/build/api/variant/impl/JniLibsPackagingImpl.kt
+++ b/build-system/gradle-core/src/main/java/com/android/build/api/variant/impl/JniLibsPackagingImpl.kt
@@ -16,40 +16,31 @@
 
 package com.android.build.api.variant.impl
 
+import com.android.build.api.dsl.PackagingOptions
 import com.android.build.api.variant.JniLibsPackaging
 import com.android.build.gradle.internal.packaging.defaultExcludes
 import com.android.build.gradle.internal.services.VariantPropertiesApiServices
-import java.util.concurrent.Callable
 
 open class JniLibsPackagingImpl(
-    dslPackagingOptions: com.android.build.gradle.internal.dsl.PackagingOptions,
+    dslPackagingOptions: PackagingOptions,
     variantPropertiesApiServices: VariantPropertiesApiServices
 ) : JniLibsPackaging {
 
     override val excludes =
-        variantPropertiesApiServices.setPropertyOf(
-            String::class.java,
-            Callable<Collection<String>> {
-                // subtract defaultExcludes because its patterns are specific to java resources.
-                dslPackagingOptions.excludes
-                    .minus(defaultExcludes)
-                    .union(dslPackagingOptions.jniLibs.excludes)
-            }
-        )
+        variantPropertiesApiServices.setPropertyOf(String::class.java) {
+            // subtract defaultExcludes because its patterns are specific to java resources.
+            dslPackagingOptions.excludes
+                .minus(defaultExcludes)
+                .union(dslPackagingOptions.jniLibs.excludes)
+        }
 
     override val pickFirsts =
-        variantPropertiesApiServices.setPropertyOf(
-            String::class.java,
-            Callable<Collection<String>> {
-                dslPackagingOptions.pickFirsts.union(dslPackagingOptions.jniLibs.pickFirsts)
-            }
-        )
+        variantPropertiesApiServices.setPropertyOf(String::class.java) {
+            dslPackagingOptions.pickFirsts.union(dslPackagingOptions.jniLibs.pickFirsts)
+        }
 
     override val keepDebugSymbols =
-        variantPropertiesApiServices.setPropertyOf(
-            String::class.java,
-            Callable<Collection<String>> {
-                dslPackagingOptions.doNotStrip.union(dslPackagingOptions.jniLibs.keepDebugSymbols)
-            }
-        )
+        variantPropertiesApiServices.setPropertyOf(String::class.java) {
+            dslPackagingOptions.doNotStrip.union(dslPackagingOptions.jniLibs.keepDebugSymbols)
+        }
 }
diff --git a/build-system/gradle-core/src/main/java/com/android/build/api/variant/impl/ResourcesApkPackagingImpl.kt b/build-system/gradle-core/src/main/java/com/android/build/api/variant/impl/ResourcesApkPackagingImpl.kt
index dba333c..10fb84f 100644
--- a/build-system/gradle-core/src/main/java/com/android/build/api/variant/impl/ResourcesApkPackagingImpl.kt
+++ b/build-system/gradle-core/src/main/java/com/android/build/api/variant/impl/ResourcesApkPackagingImpl.kt
@@ -16,22 +16,19 @@
 
 package com.android.build.api.variant.impl
 
+import com.android.build.api.dsl.PackagingOptions
 import com.android.build.gradle.internal.services.VariantPropertiesApiServices
-import java.util.concurrent.Callable
 
 class ResourcesApkPackagingImpl(
-    dslPackagingOptions: com.android.build.gradle.internal.dsl.PackagingOptions,
+    dslPackagingOptions: PackagingOptions,
     variantPropertiesApiServices: VariantPropertiesApiServices
 ) : ResourcesPackagingImpl(dslPackagingOptions, variantPropertiesApiServices) {
 
     override val excludes =
-        variantPropertiesApiServices.setPropertyOf(
-            String::class.java,
-            Callable<Collection<String>> {
-                // exclude .kotlin_module files from APKs (b/152898926)
-                getBaseExcludes().plus("/META-INF/*.kotlin_module")
-            }
-        )
+        variantPropertiesApiServices.setPropertyOf(String::class.java) {
+            // exclude .kotlin_module files from APKs (b/152898926)
+            getBaseExcludes().plus("/META-INF/*.kotlin_module")
+        }
 }
 
 
diff --git a/build-system/gradle-core/src/main/java/com/android/build/api/variant/impl/ResourcesPackagingImpl.kt b/build-system/gradle-core/src/main/java/com/android/build/api/variant/impl/ResourcesPackagingImpl.kt
index d9048ea..a08898f 100644
--- a/build-system/gradle-core/src/main/java/com/android/build/api/variant/impl/ResourcesPackagingImpl.kt
+++ b/build-system/gradle-core/src/main/java/com/android/build/api/variant/impl/ResourcesPackagingImpl.kt
@@ -16,45 +16,36 @@
 
 package com.android.build.api.variant.impl
 
+import com.android.build.api.dsl.PackagingOptions
 import com.android.build.api.variant.ResourcesPackaging
 import com.android.build.gradle.internal.packaging.defaultExcludes
 import com.android.build.gradle.internal.packaging.defaultMerges
 import com.android.build.gradle.internal.services.VariantPropertiesApiServices
-import java.util.concurrent.Callable
 
 open class ResourcesPackagingImpl(
-    private val dslPackagingOptions: com.android.build.gradle.internal.dsl.PackagingOptions,
+    private val dslPackagingOptions: PackagingOptions,
     variantPropertiesApiServices: VariantPropertiesApiServices
 ) : ResourcesPackaging {
 
     override val excludes =
-        variantPropertiesApiServices.setPropertyOf(
-            String::class.java,
-            Callable<Collection<String>> { getBaseExcludes() }
-        )
+        variantPropertiesApiServices.setPropertyOf(String::class.java) { getBaseExcludes() }
 
     override val pickFirsts =
-        variantPropertiesApiServices.setPropertyOf(
-            String::class.java,
-            Callable<Collection<String>> {
-                dslPackagingOptions.pickFirsts.union(dslPackagingOptions.resources.pickFirsts)
-            }
-        )
+        variantPropertiesApiServices.setPropertyOf(String::class.java) {
+            dslPackagingOptions.pickFirsts.union(dslPackagingOptions.resources.pickFirsts)
+        }
 
     override val merges =
-        variantPropertiesApiServices.setPropertyOf(
-            String::class.java,
+        variantPropertiesApiServices.setPropertyOf(String::class.java) {
             // the union of dslPackagingOptions.merges and dslPackagingOptions.resources.merges,
             // minus the default patterns removed from either of them.
-            Callable<Collection<String>> {
-                dslPackagingOptions.merges
-                    .union(dslPackagingOptions.resources.merges)
-                    .minus(
-                        defaultMerges.subtract(dslPackagingOptions.merges)
-                            .union(defaultMerges.subtract(dslPackagingOptions.resources.merges))
-                    )
-            }
-        )
+            dslPackagingOptions.merges
+                .union(dslPackagingOptions.resources.merges)
+                .minus(
+                    defaultMerges.subtract(dslPackagingOptions.merges)
+                        .union(defaultMerges.subtract(dslPackagingOptions.resources.merges))
+                )
+        }
 
     // the union of dslPackagingOptions.excludes and dslPackagingOptions.resources.excludes, minus
     // the default patterns removed from either of them.
diff --git a/build-system/gradle-core/src/main/java/com/android/build/gradle/internal/dsl/CommonExtensionImpl.kt b/build-system/gradle-core/src/main/java/com/android/build/gradle/internal/dsl/CommonExtensionImpl.kt
index aba440a..e8493c5 100644
--- a/build-system/gradle-core/src/main/java/com/android/build/gradle/internal/dsl/CommonExtensionImpl.kt
+++ b/build-system/gradle-core/src/main/java/com/android/build/gradle/internal/dsl/CommonExtensionImpl.kt
@@ -222,13 +222,6 @@
         action.invoke(lintOptions)
     }
 
-    override val packagingOptions: PackagingOptions =
-        dslServices.newInstance(PackagingOptions::class.java, dslServices)
-
-    override fun packagingOptions(action: com.android.build.api.dsl.PackagingOptions.() -> Unit) {
-        action.invoke(packagingOptions)
-    }
-
     override fun productFlavors(action: Action<NamedDomainObjectContainer<ProductFlavor>>) {
         action.execute(productFlavors as NamedDomainObjectContainer<ProductFlavor>)
     }
diff --git a/build-system/gradle-core/src/main/java/com/android/build/gradle/internal/dsl/DexPackagingOptionsImpl.kt b/build-system/gradle-core/src/main/java/com/android/build/gradle/internal/dsl/DexPackagingOptionsImpl.kt
deleted file mode 100644
index 3ea38bb..0000000
--- a/build-system/gradle-core/src/main/java/com/android/build/gradle/internal/dsl/DexPackagingOptionsImpl.kt
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2020 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.dsl
-
-import com.android.build.api.dsl.DexPackagingOptions
-
-open class DexPackagingOptionsImpl : DexPackagingOptions {
-    override var useLegacyPackaging: Boolean? = null
-}
diff --git a/build-system/gradle-core/src/main/java/com/android/build/gradle/internal/dsl/JniLibsPackagingOptionsImpl.kt b/build-system/gradle-core/src/main/java/com/android/build/gradle/internal/dsl/JniLibsPackagingOptionsImpl.kt
index 551d520..60afeae 100644
--- a/build-system/gradle-core/src/main/java/com/android/build/gradle/internal/dsl/JniLibsPackagingOptionsImpl.kt
+++ b/build-system/gradle-core/src/main/java/com/android/build/gradle/internal/dsl/JniLibsPackagingOptionsImpl.kt
@@ -18,34 +18,13 @@
 
 import com.android.build.api.dsl.JniLibsPackagingOptions
 
-open class JniLibsPackagingOptionsImpl : JniLibsPackagingOptions {
-
-    override var useLegacyPackaging: Boolean? = null
-
-    override val excludes: MutableSet<String> = mutableSetOf()
-
+abstract class JniLibsPackagingOptionsImpl : JniLibsPackagingOptions {
     // support excludes += 'foo' syntax in groovy
-    fun setExcludes(patterns: Set<String>) {
-        val newExcludes = patterns.toList()
-        excludes.clear()
-        excludes.addAll(newExcludes)
-    }
-
-    override val pickFirsts: MutableSet<String> = mutableSetOf()
+    abstract fun setExcludes(patterns: Set<String>)
 
     // support pickFirsts += 'foo' syntax in groovy
-    fun setPickFirsts(patterns: Set<String>) {
-        val newPickFirsts = patterns.toList()
-        pickFirsts.clear()
-        pickFirsts.addAll(newPickFirsts)
-    }
-
-    override val keepDebugSymbols: MutableSet<String> = mutableSetOf()
+    abstract fun setPickFirsts(patterns: Set<String>)
 
     // support keepDebugSymbols += 'foo' syntax in groovy
-    fun setKeepDebugSymbols(patterns: Set<String>) {
-        val newKeepDebugSymbols = patterns.toList()
-        keepDebugSymbols.clear()
-        keepDebugSymbols.addAll(newKeepDebugSymbols)
-    }
+    abstract fun setKeepDebugSymbols(patterns: Set<String>)
 }
diff --git a/build-system/gradle-core/src/main/java/com/android/build/gradle/internal/dsl/PackagingOptions.kt b/build-system/gradle-core/src/main/java/com/android/build/gradle/internal/dsl/PackagingOptions.kt
index 9a8f59f..9ac4b01 100644
--- a/build-system/gradle-core/src/main/java/com/android/build/gradle/internal/dsl/PackagingOptions.kt
+++ b/build-system/gradle-core/src/main/java/com/android/build/gradle/internal/dsl/PackagingOptions.kt
@@ -19,9 +19,9 @@
 import com.android.build.api.dsl.DexPackagingOptions
 import com.android.build.api.dsl.JniLibsPackagingOptions
 import com.android.build.api.dsl.ResourcesPackagingOptions
+import com.android.build.gradle.internal.dsl.decorator.annotation.WithLazyInitialization
 import com.android.build.gradle.internal.packaging.defaultExcludes
 import com.android.build.gradle.internal.packaging.defaultMerges
-import com.android.build.gradle.internal.services.DslServices
 import org.gradle.api.Action
 import javax.inject.Inject
 
@@ -142,88 +142,37 @@
  * }
  * </pre>
  */
-open class PackagingOptions @Inject constructor(dslServices: DslServices) :
+abstract class PackagingOptions
+@Inject @WithLazyInitialization("lazyInit") constructor() :
     com.android.builder.model.PackagingOptions,
     com.android.build.api.dsl.PackagingOptions {
 
-    override val excludes: MutableSet<String> = defaultExcludes.toMutableSet()
-
-    fun setExcludes(patterns: Set<String>) {
-        val newExcludes = patterns.toList()
-        excludes.clear()
-        excludes.addAll(newExcludes)
+    protected fun lazyInit() {
+        setExcludes(defaultExcludes)
+        setMerges(defaultMerges)
     }
 
+    abstract fun setExcludes(patterns: Set<String>)
+
     override fun exclude(pattern: String) {
         excludes.add(pattern);
     }
 
-    override val pickFirsts: MutableSet<String> = mutableSetOf()
-
-    fun setPickFirsts(patterns: Set<String>) {
-        val newPickFirsts = patterns.toList()
-        pickFirsts.clear()
-        pickFirsts.addAll(newPickFirsts)
-    }
+    abstract fun setPickFirsts(patterns: Set<String>)
 
     override fun pickFirst(pattern: String) {
         pickFirsts.add(pattern);
     }
 
-    override val merges: MutableSet<String> = defaultMerges.toMutableSet()
-
-    fun setMerges(patterns: Set<String>) {
-        val newMerges = patterns.toList()
-        merges.clear()
-        merges.addAll(newMerges)
-    }
+    abstract fun setMerges(patterns: Set<String>)
 
     override fun merge(pattern: String) {
         merges.add(pattern);
     }
 
-    override val doNotStrip: MutableSet<String> = mutableSetOf()
-
-    fun setDoNotStrip(patterns: Set<String>) {
-        val newDoNotStrip = patterns.toList()
-        doNotStrip.clear()
-        doNotStrip.addAll(newDoNotStrip)
-    }
+    abstract fun setDoNotStrip(patterns: Set<String>)
 
     override fun doNotStrip(pattern: String) {
         doNotStrip.add(pattern);
     }
-
-    override val dex: DexPackagingOptions =
-        dslServices.newInstance(DexPackagingOptionsImpl::class.java)
-
-    override fun dex(action: DexPackagingOptions.() -> Unit) {
-        action.invoke(dex)
-    }
-
-    fun dex(action: Action<DexPackagingOptions>) {
-        action.execute(dex)
-    }
-
-    override val jniLibs: JniLibsPackagingOptions =
-        dslServices.newInstance(JniLibsPackagingOptionsImpl::class.java)
-
-    override fun jniLibs(action: JniLibsPackagingOptions.() -> Unit) {
-        action.invoke(jniLibs)
-    }
-
-    fun jniLibs(action: Action<JniLibsPackagingOptions>) {
-        action.execute(jniLibs)
-    }
-
-    override val resources: ResourcesPackagingOptions =
-        dslServices.newInstance(ResourcesPackagingOptionsImpl::class.java)
-
-    override fun resources(action: ResourcesPackagingOptions.() -> Unit) {
-        action.invoke(resources)
-    }
-
-    fun resources(action: Action<ResourcesPackagingOptions>) {
-        action.execute(resources)
-    }
 }
diff --git a/build-system/gradle-core/src/main/java/com/android/build/gradle/internal/dsl/ResourcesPackagingOptionsImpl.kt b/build-system/gradle-core/src/main/java/com/android/build/gradle/internal/dsl/ResourcesPackagingOptionsImpl.kt
index d6acc67..6ed6c02 100644
--- a/build-system/gradle-core/src/main/java/com/android/build/gradle/internal/dsl/ResourcesPackagingOptionsImpl.kt
+++ b/build-system/gradle-core/src/main/java/com/android/build/gradle/internal/dsl/ResourcesPackagingOptionsImpl.kt
@@ -17,35 +17,25 @@
 package com.android.build.gradle.internal.dsl
 
 import com.android.build.api.dsl.ResourcesPackagingOptions
+import com.android.build.gradle.internal.dsl.decorator.annotation.WithLazyInitialization
 import com.android.build.gradle.internal.packaging.defaultExcludes
 import com.android.build.gradle.internal.packaging.defaultMerges
+import javax.inject.Inject
 
-open class ResourcesPackagingOptionsImpl : ResourcesPackagingOptions {
+abstract class ResourcesPackagingOptionsImpl
+@Inject @WithLazyInitialization("lazyInit") constructor() : ResourcesPackagingOptions {
 
-    override val excludes: MutableSet<String> = defaultExcludes.toMutableSet()
+    protected fun lazyInit() {
+        setExcludes(defaultExcludes)
+        setMerges(defaultMerges)
+    }
 
     // support excludes += 'foo' syntax in groovy
-    fun setExcludes(patterns: Set<String>) {
-        val newExcludes = patterns.toList()
-        excludes.clear()
-        excludes.addAll(newExcludes)
-    }
-
-    override val pickFirsts: MutableSet<String> = mutableSetOf()
+    abstract fun setExcludes(patterns: Set<String>)
 
     // support pickFirsts += 'foo' syntax in groovy
-    fun setPickFirsts(patterns: Set<String>) {
-        val newPickFirsts = patterns.toList()
-        pickFirsts.clear()
-        pickFirsts.addAll(newPickFirsts)
-    }
-
-    override val merges: MutableSet<String> = defaultMerges.toMutableSet()
+    abstract fun setPickFirsts(patterns: Set<String>)
 
     // support merges += 'foo' syntax in groovy
-    fun setMerges(patterns: Set<String>) {
-        val newMerges = patterns.toList()
-        merges.clear()
-        merges.addAll(newMerges)
-    }
+    abstract fun setMerges(patterns: Set<String>)
 }
diff --git a/build-system/gradle-core/src/main/java/com/android/build/gradle/internal/dsl/decorator/AndroidPluginDslDecorator.kt b/build-system/gradle-core/src/main/java/com/android/build/gradle/internal/dsl/decorator/AndroidPluginDslDecorator.kt
index 9ceac16..2c673ac 100644
--- a/build-system/gradle-core/src/main/java/com/android/build/gradle/internal/dsl/decorator/AndroidPluginDslDecorator.kt
+++ b/build-system/gradle-core/src/main/java/com/android/build/gradle/internal/dsl/decorator/AndroidPluginDslDecorator.kt
@@ -27,6 +27,10 @@
 import com.android.build.api.dsl.BundleTexture
 import com.android.build.api.dsl.LibraryPublishing
 import com.android.build.api.dsl.CompileOptions
+import com.android.build.api.dsl.DexPackagingOptions
+import com.android.build.api.dsl.JniLibsPackagingOptions
+import com.android.build.api.dsl.PackagingOptions
+import com.android.build.api.dsl.ResourcesPackagingOptions
 import com.android.build.api.dsl.SigningConfig
 import com.android.build.gradle.internal.dsl.AaptOptions
 import com.android.build.gradle.internal.dsl.ApplicationPublishingImpl
@@ -36,7 +40,9 @@
 import com.android.build.gradle.internal.dsl.BundleOptionsDeviceTier
 import com.android.build.gradle.internal.dsl.BundleOptionsLanguage
 import com.android.build.gradle.internal.dsl.BundleOptionsTexture
+import com.android.build.gradle.internal.dsl.JniLibsPackagingOptionsImpl
 import com.android.build.gradle.internal.dsl.LibraryPublishingImpl
+import com.android.build.gradle.internal.dsl.ResourcesPackagingOptionsImpl
 import org.gradle.api.JavaVersion
 
 /** The list of all the supported property types for the production AGP */
@@ -45,10 +51,14 @@
     SupportedPropertyType.Var.Boolean,
     SupportedPropertyType.Var.NullableBoolean,
     SupportedPropertyType.Var.Int,
+
     SupportedPropertyType.Var.Enum(JavaVersion::class.java),
+
     SupportedPropertyType.Collection.List,
     SupportedPropertyType.Collection.Set,
+
     SupportedPropertyType.Block(AndroidResources::class.java, AaptOptions::class.java),
+    SupportedPropertyType.Block(ApplicationPublishing::class.java, ApplicationPublishingImpl::class.java),
     SupportedPropertyType.Block(AssetPackBundleExtension::class.java),
     SupportedPropertyType.Block(Bundle::class.java, BundleOptions::class.java),
     SupportedPropertyType.Block(BundleAbi::class.java, BundleOptionsAbi::class.java),
@@ -57,9 +67,12 @@
     SupportedPropertyType.Block(BundleLanguage::class.java, BundleOptionsLanguage::class.java),
     SupportedPropertyType.Block(BundleTexture::class.java, BundleOptionsTexture::class.java),
     SupportedPropertyType.Block(CompileOptions::class.java, com.android.build.gradle.internal.CompileOptions::class.java),
+    SupportedPropertyType.Block(DexPackagingOptions::class.java),
+    SupportedPropertyType.Block(JniLibsPackagingOptions::class.java, JniLibsPackagingOptionsImpl::class.java),
+    SupportedPropertyType.Block(LibraryPublishing::class.java, LibraryPublishingImpl::class.java),
+    SupportedPropertyType.Block(PackagingOptions::class.java, com.android.build.gradle.internal.dsl.PackagingOptions::class.java),
+    SupportedPropertyType.Block(ResourcesPackagingOptions::class.java, ResourcesPackagingOptionsImpl::class.java),
     SupportedPropertyType.Block(SigningConfig::class.java),
-    SupportedPropertyType.Block(ApplicationPublishing::class.java, ApplicationPublishingImpl::class.java),
-    SupportedPropertyType.Block(LibraryPublishing::class.java, LibraryPublishingImpl::class.java)
 )
 
 /**
diff --git a/build-system/gradle-core/src/test/java/com/android/build/api/variant/impl/JniLibsApkPackagingOptionsImplTest.kt b/build-system/gradle-core/src/test/java/com/android/build/api/variant/impl/JniLibsApkPackagingOptionsImplTest.kt
index dab628d..3455f18 100644
--- a/build-system/gradle-core/src/test/java/com/android/build/api/variant/impl/JniLibsApkPackagingOptionsImplTest.kt
+++ b/build-system/gradle-core/src/test/java/com/android/build/api/variant/impl/JniLibsApkPackagingOptionsImplTest.kt
@@ -16,7 +16,8 @@
 
 package com.android.build.api.variant.impl
 
-import com.android.build.gradle.internal.dsl.PackagingOptions
+import com.android.build.api.dsl.PackagingOptions
+import com.android.build.gradle.internal.dsl.decorator.androidPluginDslDecorator
 import com.android.build.gradle.internal.services.DslServices
 import com.android.build.gradle.internal.services.createDslServices
 import com.android.build.gradle.internal.services.createProjectServices
@@ -34,9 +35,16 @@
     private val dslServices: DslServices = createDslServices(projectServices)
     private val variantPropertiesApiServices = createVariantPropertiesApiServices(projectServices)
 
+    interface PackagingOptionsWrapper {
+        val packagingOptions: PackagingOptions
+    }
+
     @Before
     fun setUp() {
-        dslPackagingOptions = PackagingOptions(dslServices)
+        dslPackagingOptions = androidPluginDslDecorator.decorate(PackagingOptionsWrapper::class.java)
+            .getDeclaredConstructor(DslServices::class.java)
+            .newInstance(dslServices)
+            .packagingOptions
     }
 
     @Test
diff --git a/build-system/gradle-core/src/test/java/com/android/build/api/variant/impl/JniLibsPackagingImplTest.kt b/build-system/gradle-core/src/test/java/com/android/build/api/variant/impl/JniLibsPackagingImplTest.kt
index 48d5489..1f39368 100644
--- a/build-system/gradle-core/src/test/java/com/android/build/api/variant/impl/JniLibsPackagingImplTest.kt
+++ b/build-system/gradle-core/src/test/java/com/android/build/api/variant/impl/JniLibsPackagingImplTest.kt
@@ -16,7 +16,8 @@
 
 package com.android.build.api.variant.impl
 
-import com.android.build.gradle.internal.dsl.PackagingOptions
+import com.android.build.api.dsl.PackagingOptions
+import com.android.build.gradle.internal.dsl.decorator.androidPluginDslDecorator
 import com.android.build.gradle.internal.services.DslServices
 import com.android.build.gradle.internal.services.createDslServices
 import com.android.build.gradle.internal.services.createProjectServices
@@ -33,9 +34,16 @@
     private val dslServices: DslServices = createDslServices(projectServices)
     private val variantPropertiesApiServices = createVariantPropertiesApiServices(projectServices)
 
+    interface PackagingOptionsWrapper {
+        val packagingOptions: PackagingOptions
+    }
+
     @Before
     fun setUp() {
-        dslPackagingOptions = PackagingOptions(dslServices)
+        dslPackagingOptions = androidPluginDslDecorator.decorate(PackagingOptionsWrapper::class.java)
+            .getDeclaredConstructor(DslServices::class.java)
+            .newInstance(dslServices)
+            .packagingOptions
     }
 
     @Test
diff --git a/build-system/gradle-core/src/test/java/com/android/build/api/variant/impl/ResourcesApkPackagingOptionsImplTest.kt b/build-system/gradle-core/src/test/java/com/android/build/api/variant/impl/ResourcesApkPackagingOptionsImplTest.kt
index a4f01a3..a575596 100644
--- a/build-system/gradle-core/src/test/java/com/android/build/api/variant/impl/ResourcesApkPackagingOptionsImplTest.kt
+++ b/build-system/gradle-core/src/test/java/com/android/build/api/variant/impl/ResourcesApkPackagingOptionsImplTest.kt
@@ -16,7 +16,8 @@
 
 package com.android.build.api.variant.impl
 
-import com.android.build.gradle.internal.dsl.PackagingOptions
+import com.android.build.api.dsl.PackagingOptions
+import com.android.build.gradle.internal.dsl.decorator.androidPluginDslDecorator
 import com.android.build.gradle.internal.packaging.defaultExcludes
 import com.android.build.gradle.internal.services.DslServices
 import com.android.build.gradle.internal.services.createDslServices
@@ -34,9 +35,16 @@
     private val dslServices: DslServices = createDslServices(projectServices)
     private val variantPropertiesApiServices = createVariantPropertiesApiServices(projectServices)
 
+    interface PackagingOptionsWrapper {
+        val packagingOptions: PackagingOptions
+    }
+
     @Before
     fun setUp() {
-        dslPackagingOptions = PackagingOptions(dslServices)
+        dslPackagingOptions = androidPluginDslDecorator.decorate(PackagingOptionsWrapper::class.java)
+            .getDeclaredConstructor(DslServices::class.java)
+            .newInstance(dslServices)
+            .packagingOptions
     }
 
     @Test
diff --git a/build-system/gradle-core/src/test/java/com/android/build/api/variant/impl/ResourcesPackagingImplTest.kt b/build-system/gradle-core/src/test/java/com/android/build/api/variant/impl/ResourcesPackagingImplTest.kt
index 5f61191..c93349b 100644
--- a/build-system/gradle-core/src/test/java/com/android/build/api/variant/impl/ResourcesPackagingImplTest.kt
+++ b/build-system/gradle-core/src/test/java/com/android/build/api/variant/impl/ResourcesPackagingImplTest.kt
@@ -16,7 +16,8 @@
 
 package com.android.build.api.variant.impl
 
-import com.android.build.gradle.internal.dsl.PackagingOptions
+import com.android.build.api.dsl.PackagingOptions
+import com.android.build.gradle.internal.dsl.decorator.androidPluginDslDecorator
 import com.android.build.gradle.internal.packaging.defaultExcludes
 import com.android.build.gradle.internal.packaging.defaultMerges
 import com.android.build.gradle.internal.services.DslServices
@@ -35,9 +36,16 @@
     private val dslServices: DslServices = createDslServices(projectServices)
     private val variantPropertiesApiServices = createVariantPropertiesApiServices(projectServices)
 
+    interface PackagingOptionsWrapper {
+        val packagingOptions: PackagingOptions
+    }
+
     @Before
     fun setUp() {
-        dslPackagingOptions = PackagingOptions(dslServices)
+        dslPackagingOptions = androidPluginDslDecorator.decorate(PackagingOptionsWrapper::class.java)
+            .getDeclaredConstructor(DslServices::class.java)
+            .newInstance(dslServices)
+            .packagingOptions
     }
 
     @Test
diff --git a/build-system/gradle-core/src/test/java/com/android/build/gradle/internal/dsl/PackagingOptionsTest.kt b/build-system/gradle-core/src/test/java/com/android/build/gradle/internal/dsl/PackagingOptionsTest.kt
index ccd40bd..50222eb 100644
--- a/build-system/gradle-core/src/test/java/com/android/build/gradle/internal/dsl/PackagingOptionsTest.kt
+++ b/build-system/gradle-core/src/test/java/com/android/build/gradle/internal/dsl/PackagingOptionsTest.kt
@@ -16,6 +16,7 @@
 package com.android.build.gradle.internal.dsl
 
 import com.android.build.api.dsl.PackagingOptions
+import com.android.build.gradle.internal.dsl.decorator.androidPluginDslDecorator
 import com.android.build.gradle.internal.services.DslServices
 import com.android.build.gradle.internal.services.createDslServices
 import com.google.common.collect.Sets
@@ -29,9 +30,16 @@
     private lateinit var packagingOptions: PackagingOptions
     private val dslServices: DslServices = createDslServices()
 
+    interface PackagingOptionsWrapper {
+        val packagingOptions: PackagingOptions
+    }
+
     @Before
     fun init() {
-        packagingOptions = PackagingOptions(dslServices)
+        packagingOptions  = androidPluginDslDecorator.decorate(PackagingOptionsWrapper::class.java)
+            .getDeclaredConstructor(DslServices::class.java)
+            .newInstance(dslServices)
+            .packagingOptions
     }
 
     @Test
diff --git a/build-system/gradle-core/src/test/resources/com/android/build/gradle/pseudo-api.txt b/build-system/gradle-core/src/test/resources/com/android/build/gradle/pseudo-api.txt
index eeaeb36..15d32b8 100644
--- a/build-system/gradle-core/src/test/resources/com/android/build/gradle/pseudo-api.txt
+++ b/build-system/gradle-core/src/test/resources/com/android/build/gradle/pseudo-api.txt
@@ -1540,24 +1540,11 @@
 com.android.build.gradle.internal.dsl.NdkOptions.setStl: void (java.lang.String)
 com.android.build.gradle.internal.dsl.NdkOptions.setcFlags: void (java.lang.String)
 com.android.build.gradle.internal.dsl.PackagingOptions implements com.android.builder.model.PackagingOptions, com.android.build.api.dsl.PackagingOptions
-com.android.build.gradle.internal.dsl.PackagingOptions.<init>: com.android.build.gradle.internal.dsl.PackagingOptions (com.android.build.gradle.internal.services.DslServices)
-com.android.build.gradle.internal.dsl.PackagingOptions.dex: void (kotlin.jvm.functions.Function1<? super com.android.build.api.dsl.DexPackagingOptions, kotlin.Unit>)
-com.android.build.gradle.internal.dsl.PackagingOptions.dex: void (org.gradle.api.Action<com.android.build.api.dsl.DexPackagingOptions>)
+com.android.build.gradle.internal.dsl.PackagingOptions.<init>: com.android.build.gradle.internal.dsl.PackagingOptions ()
 com.android.build.gradle.internal.dsl.PackagingOptions.doNotStrip: void (java.lang.String)
 com.android.build.gradle.internal.dsl.PackagingOptions.exclude: void (java.lang.String)
-com.android.build.gradle.internal.dsl.PackagingOptions.getDex: com.android.build.api.dsl.DexPackagingOptions ()
-com.android.build.gradle.internal.dsl.PackagingOptions.getDoNotStrip: java.util.Set<java.lang.String> ()
-com.android.build.gradle.internal.dsl.PackagingOptions.getExcludes: java.util.Set<java.lang.String> ()
-com.android.build.gradle.internal.dsl.PackagingOptions.getJniLibs: com.android.build.api.dsl.JniLibsPackagingOptions ()
-com.android.build.gradle.internal.dsl.PackagingOptions.getMerges: java.util.Set<java.lang.String> ()
-com.android.build.gradle.internal.dsl.PackagingOptions.getPickFirsts: java.util.Set<java.lang.String> ()
-com.android.build.gradle.internal.dsl.PackagingOptions.getResources: com.android.build.api.dsl.ResourcesPackagingOptions ()
-com.android.build.gradle.internal.dsl.PackagingOptions.jniLibs: void (kotlin.jvm.functions.Function1<? super com.android.build.api.dsl.JniLibsPackagingOptions, kotlin.Unit>)
-com.android.build.gradle.internal.dsl.PackagingOptions.jniLibs: void (org.gradle.api.Action<com.android.build.api.dsl.JniLibsPackagingOptions>)
 com.android.build.gradle.internal.dsl.PackagingOptions.merge: void (java.lang.String)
 com.android.build.gradle.internal.dsl.PackagingOptions.pickFirst: void (java.lang.String)
-com.android.build.gradle.internal.dsl.PackagingOptions.resources: void (kotlin.jvm.functions.Function1<? super com.android.build.api.dsl.ResourcesPackagingOptions, kotlin.Unit>)
-com.android.build.gradle.internal.dsl.PackagingOptions.resources: void (org.gradle.api.Action<com.android.build.api.dsl.ResourcesPackagingOptions>)
 com.android.build.gradle.internal.dsl.PackagingOptions.setDoNotStrip: void (java.util.Set<java.lang.String>)
 com.android.build.gradle.internal.dsl.PackagingOptions.setExcludes: void (java.util.Set<java.lang.String>)
 com.android.build.gradle.internal.dsl.PackagingOptions.setMerges: void (java.util.Set<java.lang.String>)