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