1 /*
<lambda>null2 * Copyright 2024 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 package androidx.build.testConfiguration
18
19 import androidx.build.AndroidXImplPlugin.Companion.SUPPORTED_BUILD_ABIS
20 import androidx.build.androidXExtension
21 import androidx.build.asFilenamePrefix
22 import androidx.build.dependencyTracker.AffectedModuleDetector
23 import androidx.build.getAppApksFilesDirectory
24 import com.android.build.api.variant.ApkOutputProviders
25 import com.android.build.api.variant.DeviceSpec
26 import com.android.build.api.variant.Variant
27 import java.util.function.Consumer
28 import kotlin.math.max
29 import org.gradle.api.Project
30 import org.gradle.api.file.RegularFile
31 import org.gradle.api.provider.Provider
32
33 @Suppress("UnstableApiUsage") // ApkOutputProviders b/397701480
34 internal fun Project.registerCopyPrivacySandboxMainAppApksTask(
35 variant: Variant,
36 outputProviders: ApkOutputProviders,
37 excludeTestApk: Provider<RegularFile>
38 ): Provider<CopyApksFromOutputProviderTask> =
39 registerCopyApksFromOutputProviderTask(
40 taskName = "CopyPrivacySandboxMainAppApks${variant.name}",
41 variant,
42 outputProviders,
43 excludeTestApk,
44 outputFileNamePrefix = "${path.asFilenamePrefix()}-${variant.name}-sandbox-enabled",
45 outputApkModelFileName = "PrivacySandboxMainAppApksModel${variant.name}.json",
46 deviceSpec = mainSandboxDeviceSpec(variant.minSdk.apiLevel)
47 )
48
49 @Suppress("UnstableApiUsage") // ApkOutputProviders b/397701480
50 internal fun Project.registerCopyPrivacySandboxCompatAppApksTask(
51 variant: Variant,
52 outputProviders: ApkOutputProviders,
53 excludeTestApk: Provider<RegularFile>
54 ): Provider<CopyApksFromOutputProviderTask> =
55 registerCopyApksFromOutputProviderTask(
56 taskName = "CopyPrivacySandboxCompatAppApks${variant.name}",
57 variant,
58 outputProviders,
59 excludeTestApk,
60 outputFileNamePrefix = "${path.asFilenamePrefix()}-${variant.name}-sandbox-compat",
61 outputApkModelFileName = "PrivacySandboxCompatAppApksModel${variant.name}.json",
62 deviceSpec = compatSandboxDeviceSpec(variant.minSdk.apiLevel)
63 )
64
65 internal fun Project.registerCopyAppApkFromArtifactsTask(
66 variant: Variant,
67 configureAction: Consumer<CopyApkFromArtifactsTask> // For lazy task init
68 ): Provider<CopyApkFromArtifactsTask> =
69 tasks.register("CopyAppApk${variant.name}", CopyApkFromArtifactsTask::class.java) { task ->
70 task.appLoader.set(variant.artifacts.getBuiltArtifactsLoader())
71
72 configureAction.accept(task)
73
74 task.outputAppApksModel.set(layout.buildDirectory.file("AppApksModel${variant.name}.json"))
75
76 task.androidTestSourceCode.from(getTestSourceSetsForAndroid(variant))
77 task.enabled = androidXExtension.deviceTests.enabled
78 AffectedModuleDetector.configureTaskGuard(task)
79 }
80
81 @Suppress("UnstableApiUsage") // ApkOutputProviders b/397701480
Projectnull82 private fun Project.registerCopyApksFromOutputProviderTask(
83 taskName: String,
84 variant: Variant,
85 outputProviders: ApkOutputProviders,
86 excludeTestApk: Provider<RegularFile>,
87 outputFileNamePrefix: String,
88 outputApkModelFileName: String,
89 deviceSpec: DeviceSpec
90 ): Provider<CopyApksFromOutputProviderTask> {
91 val copyApksTask =
92 tasks.register(taskName, CopyApksFromOutputProviderTask::class.java) { task ->
93 task.excludeTestApk.set(excludeTestApk)
94
95 task.outputFilenamesPrefix.set(outputFileNamePrefix)
96 task.outputDirectory.set(
97 getAppApksFilesDirectory().map { it.dir("${path.asFilenamePrefix()}-$taskName") }
98 )
99
100 task.outputAppApksModel.set(layout.buildDirectory.file(outputApkModelFileName))
101
102 task.androidTestSourceCode.from(getTestSourceSetsForAndroid(variant))
103 task.enabled = androidXExtension.deviceTests.enabled
104 AffectedModuleDetector.configureTaskGuard(task)
105 }
106
107 outputProviders.provideApkOutputToTask(
108 copyApksTask,
109 CopyApksFromOutputProviderTask::apkOutput,
110 deviceSpec
111 )
112
113 return copyApksTask
114 }
115
116 @Suppress("UnstableApiUsage") // DeviceSpec b/397703661
mainSandboxDeviceSpecnull117 private fun mainSandboxDeviceSpec(minApiLevel: Int): DeviceSpec =
118 DeviceSpec.Builder()
119 .setApiLevel(max(minApiLevel, PRIVACY_SANDBOX_MIN_API_LEVEL))
120 .setSupportsPrivacySandbox(true)
121 .setAbis(SUPPORTED_BUILD_ABIS) // To pass filters in defaultConfig.ndk.abiFilters
122 .build()
123
124 @Suppress("UnstableApiUsage") // DeviceSpec b/397703661
125 private fun compatSandboxDeviceSpec(minApiLevel: Int): DeviceSpec =
126 DeviceSpec.Builder()
127 .setApiLevel(minApiLevel)
128 .setSupportsPrivacySandbox(false)
129 .setAbis(SUPPORTED_BUILD_ABIS) // To pass filters in defaultConfig.ndk.abiFilters
130 .build()
131
132 internal const val PRIVACY_SANDBOX_MIN_API_LEVEL = 34
133