summaryrefslogtreecommitdiff
path: root/build-system/gradle-core/src/main/java/com/android/build/gradle/internal/tasks/factory/KmpGlobalTaskCreationConfigImpl.kt
blob: 499aef0990ceafd8370d16a605358187a419f61c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
/*
 * Copyright (C) 2022 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.tasks.factory

import com.android.Version
import com.android.build.api.artifact.impl.ArtifactsImpl
import com.android.build.api.dsl.Bundle
import com.android.build.api.dsl.CompileOptions
import com.android.build.api.dsl.ComposeOptions
import com.android.build.api.dsl.DataBinding
import com.android.build.api.dsl.ExternalNativeBuild
import com.android.build.api.dsl.Installation
import com.android.build.api.dsl.Lint
import com.android.build.api.dsl.Prefab
import com.android.build.api.dsl.Splits
import com.android.build.api.dsl.TestCoverage
import com.android.build.api.dsl.TestOptions
import com.android.build.gradle.internal.SdkComponentsBuildService
import com.android.build.gradle.internal.attribution.BuildAnalyzerIssueReporter
import com.android.build.gradle.internal.core.SettingsOptions
import com.android.build.gradle.internal.dependency.VariantDependencies
import com.android.build.gradle.internal.dsl.KotlinMultiplatformAndroidExtensionImpl
import com.android.build.gradle.internal.dsl.LanguageSplitOptions
import com.android.build.gradle.internal.instrumentation.ASM_API_VERSION_FOR_INSTRUMENTATION
import com.android.build.gradle.internal.publishing.AndroidArtifacts
import com.android.build.gradle.internal.scope.InternalArtifactType
import com.android.build.gradle.internal.services.BaseServices
import com.android.build.gradle.internal.services.FakeDependencyJarBuildService
import com.android.build.gradle.internal.services.VersionedSdkLoaderService
import com.android.build.gradle.internal.services.getBuildService
import com.android.build.gradle.internal.tasks.factory.GlobalTaskCreationConfigImpl.Companion.toExecutionEnum
import com.android.build.gradle.internal.testing.ManagedDeviceRegistry
import com.android.build.gradle.options.BooleanOption
import com.android.build.gradle.options.StringOption
import com.android.builder.core.LibraryRequest
import com.android.builder.testing.api.DeviceProvider
import com.android.builder.testing.api.TestServer
import com.android.repository.Revision
import com.google.common.base.Charsets
import org.gradle.api.Action
import org.gradle.api.JavaVersion
import org.gradle.api.Project
import org.gradle.api.artifacts.Configuration
import org.gradle.api.attributes.AttributeContainer
import org.gradle.api.file.Directory
import org.gradle.api.file.FileCollection
import org.gradle.api.provider.Provider

class KmpGlobalTaskCreationConfigImpl(
    project: Project,
    private val extension: KotlinMultiplatformAndroidExtensionImpl,
    private val versionedSdkLoaderService: VersionedSdkLoaderService,
    bootClasspathConfig: BootClasspathConfigImpl,
    compileSdkVersionProvider: () -> String,
    buildToolsVersionProvider: () -> Revision,
    private val androidJar: Configuration,
    override val services: BaseServices
): GlobalTaskCreationConfig, BootClasspathConfig by bootClasspathConfig {

    init {
        bootClasspathConfig.androidJar = androidJar
    }

    override val compileSdkHashString: String by lazy {
        compileSdkVersionProvider.invoke()
    }
    override val buildToolsRevision: Revision by lazy {
        buildToolsVersionProvider.invoke()
    }
    override val versionedSdkLoader: Provider<SdkComponentsBuildService.VersionedSdkLoader>
        get() = versionedSdkLoaderService.versionedSdkLoader

    override val asmApiVersion = ASM_API_VERSION_FOR_INSTRUMENTATION

    override val createdBy: String = "Android Gradle ${Version.ANDROID_GRADLE_PLUGIN_VERSION}"

    override val globalArtifacts: ArtifactsImpl = ArtifactsImpl(project, "global")

    override val namespacedAndroidResources: Boolean
        get() = false

    override val platformAttrs: FileCollection by lazy {
        val attributes =
            Action { container: AttributeContainer ->
                container.attribute(
                    AndroidArtifacts.ARTIFACT_TYPE,
                    AndroidArtifacts.TYPE_PLATFORM_ATTR
                )
            }
        androidJar
            .incoming
            .artifactView { config -> config.attributes(attributes) }
            .artifacts
            .artifactFiles
    }

    override val testOptions: TestOptions
        get() = extension.testOptions
    override val libraryRequests: Collection<LibraryRequest>
        get() = extension.libraryRequests

    override val buildAnalyzerIssueReporter: BuildAnalyzerIssueReporter? =
        services.projectOptions.get(StringOption.IDE_ATTRIBUTION_FILE_LOCATION)?.let {
            BuildAnalyzerIssueReporter(services.projectOptions, services.buildServiceRegistry)
        }

    // TODO(b/267309622): Get this from kotlin plugin
    override val compileOptions: CompileOptions
        get() = object: CompileOptions {
            override var sourceCompatibility = JavaVersion.VERSION_11

            override fun sourceCompatibility(sourceCompatibility: Any) {
                throw IllegalAccessException("Not supported for kmp")
            }

            override var targetCompatibility: JavaVersion
                get() = JavaVersion.VERSION_1_8
                set(value) {}

            override fun targetCompatibility(targetCompatibility: Any) {
                throw IllegalAccessException("Not supported for kmp")
            }

            override var encoding: String
                get() = Charsets.UTF_8.name()
                set(value) {}
            override var isCoreLibraryDesugaringEnabled: Boolean
                get() = false
                set(value) {}
        }

    override val manifestArtifactType: InternalArtifactType<Directory>
        get() = if (services.projectOptions[BooleanOption.IDE_DEPLOY_AS_INSTANT_APP])
            InternalArtifactType.INSTANT_APP_MANIFEST
        else
            InternalArtifactType.PACKAGED_MANIFESTS

    override val testOptionExecutionEnum: com.android.builder.model.TestOptions.Execution? by lazy {
        testOptions.execution.toExecutionEnum()
    }

    override val installationOptions: Installation
        get() = extension.installation

    override val deviceProviders: List<DeviceProvider>
        get() = emptyList()

    override val testServers: List<TestServer>
        get() = emptyList()

    override val productFlavorCount: Int
        get() = 0
    override val productFlavorDimensionCount: Int
        get() = 0

    override val managedDeviceRegistry = ManagedDeviceRegistry(testOptions)
    override val lintChecks = createCustomLintChecksConfig(project)
    override val fakeDependency = createFakeDependencyConfig(project)

    private fun createCustomLintChecksConfig(project: Project): Configuration {
        val lintChecks = project.configurations.maybeCreate(VariantDependencies.CONFIG_NAME_LINTCHECKS)
        lintChecks.isVisible = false
        lintChecks.description = "Configuration to apply external lint check jar"
        lintChecks.isCanBeConsumed = false
        return lintChecks
    }

    private fun createFakeDependencyConfig(project: Project): Configuration {
        val fakeJarService = getBuildService(
            project.gradle.sharedServices,
            FakeDependencyJarBuildService::class.java,
        ).get()

        val fakeDependency = project.dependencies.create(project.files(fakeJarService.lazyCachedFakeJar))
        return project.configurations.detachedConfiguration(fakeDependency)
    }

    // Unsupported properties
    // TODO: Refactor the parent interface so that we don't have to override these values to avoid
    //  accidental calls.
    override val ndkVersion: String?
        get() = null
    override val ndkPath: String?
        get() = null
    override val aidlPackagedList: Collection<String>?
        get() = null
    override val compileOptionsIncremental: Boolean?
        get() = null
    override val resourcePrefix: String?
        get() = null
    override val hasNoBuildTypeMinified: Boolean
        get() = true
    override val hasDynamicFeatures: Boolean
        get() = false
    override val assetPacks: Set<String>
        get() = emptySet()
    override val dynamicFeatures: Set<String>
        get() = emptySet()
    override val prefab: Set<Prefab>
        get() = emptySet()
    override val prefabOrEmpty: Set<Prefab>
        get() = emptySet()

    override val splits: Splits
        get() = throw IllegalAccessException("Not supported for kmp")
    override val testCoverage: TestCoverage
        get() = throw IllegalAccessException("Not supported for kmp")
    override val legacyLanguageSplitOptions: LanguageSplitOptions
        get() = throw IllegalAccessException("Not supported for kmp")
    override val localCustomLintChecks: FileCollection
        get() = throw IllegalAccessException("Not supported for kmp")
    override val versionedNdkHandler: SdkComponentsBuildService.VersionedNdkHandler
        get() = throw IllegalAccessException("Not supported for kmp")
    override val lintPublish: Configuration
        get() = throw IllegalAccessException("Not supported for kmp")
    override val settingsOptions: SettingsOptions
        get() = throw IllegalAccessException("Not supported for kmp")
    override val externalNativeBuild: ExternalNativeBuild
        get() = throw IllegalAccessException("Not supported for kmp")
    override val lintOptions: Lint
        get() = throw IllegalAccessException("Not supported for kmp")
    override val bundleOptions: Bundle
        get() = throw IllegalAccessException("Not supported for kmp")
    override val composeOptions: ComposeOptions
        get() = throw IllegalAccessException("Not supported for kmp")
    override val dataBinding: DataBinding
        get() = throw IllegalAccessException("Not supported for kmp")
}