blob: 3fe6715d43d03fe33760c1f6749a9451390e3340 [file] [log] [blame]
/*
* 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.SdkConstants
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.SettingsExtension
import com.android.build.api.dsl.Splits
import com.android.build.gradle.internal.KotlinMultiplatformCompileOptionsImpl
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.core.dsl.impl.features.KmpDeviceTestOptionsDslInfoImpl
import com.android.build.gradle.internal.core.dsl.impl.features.KmpUnitTestOptionsDslInfoImpl
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.lint.getLocalCustomLintChecks
import com.android.build.gradle.internal.publishing.AndroidArtifacts
import com.android.build.gradle.internal.publishing.AarOrJarTypeToConsume
import com.android.build.gradle.internal.publishing.getAarOrJarTypeToConsume
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.IntegerOption
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 org.gradle.api.Action
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
internal class KmpGlobalTaskCreationConfigImpl(
project: Project,
private val extension: KotlinMultiplatformAndroidExtensionImpl,
private val settingsExtension: SettingsExtension?,
private val versionedSdkLoaderService: VersionedSdkLoaderService,
bootClasspathConfig: BootClasspathConfigImpl,
compileSdkVersionProvider: () -> String,
buildToolsVersionProvider: () -> Revision,
private val androidJar: Configuration,
override val services: BaseServices,
override val settingsOptions: SettingsOptions
): 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 aarOrJarTypeToConsume: AarOrJarTypeToConsume
get() = getAarOrJarTypeToConsume(services.projectOptions, namespacedAndroidResources)
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 androidTestOptions by lazy(LazyThreadSafetyMode.NONE) {
KmpDeviceTestOptionsDslInfoImpl(extension)
}
override val unitTestOptions by lazy(LazyThreadSafetyMode.NONE) {
KmpUnitTestOptionsDslInfoImpl(extension)
}
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)
}
override val compileOptions: CompileOptions = KotlinMultiplatformCompileOptionsImpl(
extension
)
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 publishConsumerProguardRules: Boolean
get() = extension.optimization.consumerKeepRules.publish
override val testOptionExecutionEnum: com.android.builder.model.TestOptions.Execution? by lazy {
androidTestOptions.execution.toExecutionEnum()
}
override val installationOptions: Installation
get() = extension.androidTestOnDeviceOptions!!.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(androidTestOptions)
override val lintChecks = createCustomLintChecksConfig(project)
override val lintPublish: Configuration = createCustomLintPublishConfig(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 createCustomLintPublishConfig(project: Project): Configuration {
val lintChecks = project.configurations
.maybeCreate(VariantDependencies.CONFIG_NAME_LINTPUBLISH)
lintChecks.isVisible = false
lintChecks.description = "Configuration to publish 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)
}
override val targetDeployApiFromIDE: Int? =
services.projectOptions.get(IntegerOption.IDE_TARGET_DEVICE_API)
override val testCoverage = extension.testCoverage
override val lintOptions: Lint = extension.lint
override val localCustomLintChecks: FileCollection by lazy(LazyThreadSafetyMode.NONE) {
getLocalCustomLintChecks(lintChecks)
}
override val taskNames: GlobalTaskNames = KmpAndroidGlobalTaskNamesImpl
override val avoidTaskRegistration: Boolean = false
// 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() = settingsExtension?.ndkVersion ?: SdkConstants.NDK_DEFAULT_VERSION
override val ndkPath: String?
get() = settingsExtension?.ndkPath
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 legacyLanguageSplitOptions: LanguageSplitOptions
get() = throw IllegalAccessException("Not supported for kmp")
override val versionedNdkHandler: SdkComponentsBuildService.VersionedNdkHandler
get() = throw IllegalAccessException("Not supported for kmp")
override val externalNativeBuild: ExternalNativeBuild
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")
}