summaryrefslogtreecommitdiff
path: root/build-system/gradle-core/src/test/java/com/android/build/gradle/tasks/BuildAnalyzerTest.kt
blob: 67c79d76e20168d4fabf56078a05a5df559fe174 (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
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
/*
 * 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.tasks

import com.android.build.gradle.internal.coverage.JacocoReportTask
import com.android.build.gradle.internal.lint.AndroidLintAnalysisTask
import com.android.build.gradle.internal.lint.AndroidLintCopyReportTask
import com.android.build.gradle.internal.lint.AndroidLintGlobalTask
import com.android.build.gradle.internal.lint.AndroidLintTask
import com.android.build.gradle.internal.lint.AndroidLintTextOutputTask
import com.android.build.gradle.internal.lint.LintModelWriterTask
import com.android.build.gradle.internal.pipeline.IncrementalTransformTask
import com.android.build.gradle.internal.pipeline.NonIncrementalTransformTask
import com.android.build.gradle.internal.pipeline.StreamBasedTask
import com.android.build.gradle.internal.pipeline.TransformTask
import com.android.build.gradle.internal.res.GenerateApiPublicTxtTask
import com.android.build.gradle.internal.res.GenerateEmptyResourceFilesTask
import com.android.build.gradle.internal.res.GenerateLibraryRFileTask
import com.android.build.gradle.internal.res.LinkAndroidResForBundleTask
import com.android.build.gradle.internal.res.LinkApplicationAndroidResourcesTask
import com.android.build.gradle.internal.res.ParseLibraryResourcesTask
import com.android.build.gradle.internal.res.PrivacySandboxSdkLinkAndroidResourcesTask
import com.android.build.gradle.internal.res.namespaced.CreateNonNamespacedLibraryManifestTask
import com.android.build.gradle.internal.res.namespaced.GenerateNamespacedLibraryRFilesTask
import com.android.build.gradle.internal.res.namespaced.LinkLibraryAndroidResourcesTask
import com.android.build.gradle.internal.res.namespaced.ProcessAndroidAppResourcesTask
import com.android.build.gradle.internal.res.namespaced.StaticLibraryManifestTask
import com.android.build.gradle.internal.tasks.AarMetadataTask
import com.android.build.gradle.internal.tasks.AndroidReportTask
import com.android.build.gradle.internal.tasks.ApkZipPackagingTask
import com.android.build.gradle.internal.tasks.AppClasspathCheckTask
import com.android.build.gradle.internal.tasks.AppMetadataTask
import com.android.build.gradle.internal.tasks.ApplicationIdWriterTask
import com.android.build.gradle.internal.tasks.AssetPackManifestGenerationTask
import com.android.build.gradle.internal.tasks.AssetPackPreBundleTask
import com.android.build.gradle.internal.tasks.BuildAnalyzer
import com.android.build.gradle.internal.tasks.BundleLibraryJavaRes
import com.android.build.gradle.internal.tasks.BundleReportDependenciesTask
import com.android.build.gradle.internal.tasks.BundleToApkTask
import com.android.build.gradle.internal.tasks.BundleToStandaloneApkTask
import com.android.build.gradle.internal.tasks.CheckAarMetadataTask
import com.android.build.gradle.internal.tasks.CheckDuplicateClassesTask
import com.android.build.gradle.internal.tasks.CheckJetifierTask
import com.android.build.gradle.internal.tasks.CheckManifest
import com.android.build.gradle.internal.tasks.CheckMultiApkLibrariesTask
import com.android.build.gradle.internal.tasks.CheckProguardFiles
import com.android.build.gradle.internal.tasks.ClasspathComparisonTask
import com.android.build.gradle.internal.tasks.CompileArtProfileTask
import com.android.build.gradle.internal.tasks.CompressAssetsTask
import com.android.build.gradle.internal.tasks.D8BundleMainDexListTask
import com.android.build.gradle.internal.tasks.DependencyReportTask
import com.android.build.gradle.internal.tasks.DesugarLibKeepRulesMergeTask
import com.android.build.gradle.internal.tasks.DeviceProviderInstrumentTestTask
import com.android.build.gradle.internal.tasks.DeviceSerialTestTask
import com.android.build.gradle.internal.tasks.DexArchiveBuilderTask
import com.android.build.gradle.internal.tasks.DexFileDependenciesTask
import com.android.build.gradle.internal.tasks.DexMergingTask
import com.android.build.gradle.internal.tasks.ExportConsumerProguardFilesTask
import com.android.build.gradle.internal.tasks.ExtractApksTask
import com.android.build.gradle.internal.tasks.ExtractNativeDebugMetadataTask
import com.android.build.gradle.internal.tasks.ExtractProfilerNativeDependenciesTask
import com.android.build.gradle.internal.tasks.ExtractProguardFiles
import com.android.build.gradle.internal.tasks.FeatureDexMergeTask
import com.android.build.gradle.internal.tasks.FinalizeBundleTask
import com.android.build.gradle.internal.tasks.GenerateApkDataTask
import com.android.build.gradle.internal.tasks.GenerateLibraryProguardRulesTask
import com.android.build.gradle.internal.tasks.InstallVariantTask
import com.android.build.gradle.internal.tasks.InstallVariantViaBundleTask
import com.android.build.gradle.internal.tasks.JacocoTask
import com.android.build.gradle.internal.tasks.L8DexDesugarLibTask
import com.android.build.gradle.internal.tasks.LibraryJniLibsTask
import com.android.build.gradle.internal.tasks.LinkManifestForAssetPackTask
import com.android.build.gradle.internal.tasks.LintCompile
import com.android.build.gradle.internal.tasks.LintModelMetadataTask
import com.android.build.gradle.internal.tasks.ListingFileRedirectTask
import com.android.build.gradle.internal.tasks.ManagedDeviceInstrumentationTestResultAggregationTask
import com.android.build.gradle.internal.tasks.ManagedDeviceInstrumentationTestTask
import com.android.build.gradle.internal.tasks.MergeArtProfileTask
import com.android.build.gradle.internal.tasks.MergeConsumerProguardFilesTask
import com.android.build.gradle.internal.tasks.MergeJavaResourceTask
import com.android.build.gradle.internal.tasks.MergeNativeDebugMetadataTask
import com.android.build.gradle.internal.tasks.MergeNativeLibsTask
import com.android.build.gradle.internal.tasks.ModuleMetadataWriterTask
import com.android.build.gradle.internal.tasks.OptimizeResourcesTask
import com.android.build.gradle.internal.tasks.PackageBundleTask
import com.android.build.gradle.internal.tasks.PackageForUnitTest
import com.android.build.gradle.internal.tasks.PackageRenderscriptTask
import com.android.build.gradle.internal.tasks.ParseIntegrityConfigTask
import com.android.build.gradle.internal.tasks.PerModuleBundleTask
import com.android.build.gradle.internal.tasks.PerModuleReportDependenciesTask
import com.android.build.gradle.internal.tasks.PrepareLintJarForPublish
import com.android.build.gradle.internal.tasks.ProcessAssetPackManifestTask
import com.android.build.gradle.internal.tasks.ProcessJavaResTask
import com.android.build.gradle.internal.tasks.ProguardConfigurableTask
import com.android.build.gradle.internal.tasks.R8Task
import com.android.build.gradle.internal.tasks.RecalculateStackFramesTask
import com.android.build.gradle.internal.tasks.SdkDependencyDataGeneratorTask
import com.android.build.gradle.internal.tasks.ShrinkResourcesOldShrinkerTask
import com.android.build.gradle.internal.tasks.SigningConfigVersionsWriterTask
import com.android.build.gradle.internal.tasks.SigningConfigWriterTask
import com.android.build.gradle.internal.tasks.SigningReportTask
import com.android.build.gradle.internal.tasks.SourceSetsTask
import com.android.build.gradle.internal.tasks.StripDebugSymbolsTask
import com.android.build.gradle.internal.tasks.TestServerTask
import com.android.build.gradle.internal.tasks.UninstallTask
import com.android.build.gradle.internal.tasks.UnsafeOutputsTask
import com.android.build.gradle.internal.tasks.ValidateSigningTask
import com.android.build.gradle.internal.tasks.databinding.DataBindingExportFeatureInfoTask
import com.android.build.gradle.internal.tasks.databinding.DataBindingExportFeatureNamespacesTask
import com.android.build.gradle.internal.tasks.databinding.DataBindingGenBaseClassesTask
import com.android.build.gradle.internal.tasks.databinding.DataBindingMergeDependencyArtifactsTask
import com.android.build.gradle.internal.tasks.databinding.DataBindingTriggerTask
import com.android.build.gradle.internal.tasks.featuresplit.FeatureNameWriterTask
import com.android.build.gradle.internal.tasks.featuresplit.FeatureSetMetadataWriterTask
import com.android.build.gradle.internal.tasks.featuresplit.FeatureSplitDeclarationWriterTask
import com.android.build.gradle.internal.tasks.featuresplit.PackagedDependenciesWriterTask
import com.android.build.gradle.internal.tasks.mlkit.GenerateMlModelClass
import com.android.build.gradle.internal.transforms.LegacyShrinkBundleModuleResourcesTask
import com.android.build.gradle.internal.transforms.ShrinkAppBundleResourcesTask
import com.android.build.gradle.internal.transforms.ShrinkResourcesNewShrinkerTask
import com.android.build.gradle.tasks.factory.AndroidUnitTest
import com.android.build.gradle.tasks.sync.AbstractVariantModelTask
import com.android.build.gradle.tasks.sync.AndroidTestVariantModelTask
import com.android.build.gradle.tasks.sync.ApplicationVariantModelTask
import com.android.build.gradle.tasks.sync.DynamicFeatureVariantModelTask
import com.android.build.gradle.tasks.sync.LibraryVariantModelTask
import com.android.build.gradle.tasks.sync.ModuleVariantModelTask
import com.android.build.gradle.tasks.sync.TestModuleVariantModelTask
import com.android.build.gradle.tasks.sync.TestVariantModelTask
import com.android.build.gradle.tasks.sync.UnitTestVariantModelTask
import org.gradle.api.Task
import com.google.common.reflect.ClassPath
import com.google.common.reflect.TypeToken
import com.google.common.truth.Truth.assertThat
import org.junit.Test
import kotlin.test.assertEquals

class BuildAnalyzerTest {

    @Test
    fun `all tasks have build analyzer annotations`() {
        val allTasks = getAllTasks()
        // When annotations for all tasks are added,
        // can just assert missingTasks is empty
        val missingTasks = allTasks.filter {
            !it.isAnnotationPresent(BuildAnalyzer::class.java)
        }
        val tasksWithAnnotations = allTasks.filter {
            it.isAnnotationPresent(BuildAnalyzer::class.java)
        }
        // Make sure a task was not added twice in list
        assertEquals(TASKS_WITH_ANNOTATIONS.toSet().size, TASKS_WITH_ANNOTATIONS.size)
        // Make sure tasks without annotation weren't accidentally added in
        assertThat(missingTasks).containsNoneIn(TASKS_WITH_ANNOTATIONS)
        assertThat(tasksWithAnnotations).containsExactlyElementsIn(TASKS_WITH_ANNOTATIONS)
        assertEquals(allTasks.size,missingTasks.size + TASKS_WITH_ANNOTATIONS.size)
    }

    //  List of tasks which has BuildAnalyzerAnnotation, added manually
    private val TASKS_WITH_ANNOTATIONS = listOf(
            AidlCompile::class.java,
            JavaPreCompileTask::class.java,
            CompileArtProfileTask::class.java,
            LintCompile::class.java,
            CompileLibraryResourcesTask::class.java,
            RenderscriptCompile::class.java,
            ShaderCompile::class.java,
            AndroidReportTask::class.java,
            AndroidUnitTest::class.java,
            DeviceProviderInstrumentTestTask::class.java,
            JacocoReportTask::class.java,
            TestServerTask::class.java,
            GenerateTestConfig::class.java,
            PackageForUnitTest::class.java,
            JacocoTask::class.java,
            ManagedDeviceInstrumentationTestTask::class.java,
            DeviceSerialTestTask::class.java,
            ManagedDeviceInstrumentationTestResultAggregationTask::class.java,
            CheckManifest::class.java,
            CompatibleScreensManifest::class.java,
            InvokeManifestMerger::class.java,
            ProcessApplicationManifest::class.java,
            ProcessLibraryManifest::class.java,
            ProcessTestManifest::class.java,
            StaticLibraryManifestTask::class.java,
            CreateNonNamespacedLibraryManifestTask::class.java,
            ManifestProcessorTask::class.java,
            AssetPackManifestGenerationTask::class.java,
            ProcessAssetPackManifestTask::class.java,
            LinkManifestForAssetPackTask::class.java,
            ProcessManifestForBundleTask::class.java,
            ProcessManifestForMetadataFeatureTask::class.java,
            ProcessManifestForInstantAppTask::class.java,
            ProcessPackagedManifestTask::class.java,
            ProcessMultiApkApplicationManifest::class.java,
            GenerateManifestJarTask::class.java,
            LinkLibraryAndroidResourcesTask::class.java,
            LinkApplicationAndroidResourcesTask::class.java,
            LinkAndroidResForBundleTask::class.java,
            GenerateResValues::class.java,
            MergeResources::class.java,
            VerifyLibraryResourcesTask::class.java,
            ProcessAndroidAppResourcesTask::class.java,
            GenerateLibraryRFileTask::class.java,
            GenerateNamespacedLibraryRFilesTask::class.java,
            LegacyShrinkBundleModuleResourcesTask::class.java,
            ParseLibraryResourcesTask::class.java,
            ExtractDeepLinksTask::class.java,
            ShrinkResourcesOldShrinkerTask::class.java,
            GenerateEmptyResourceFilesTask::class.java,
            OptimizeResourcesTask::class.java,
            ShrinkAppBundleResourcesTask::class.java,
            ShrinkResourcesNewShrinkerTask::class.java,
            PrivacySandboxSdkLinkAndroidResourcesTask::class.java,
            ExternalNativeBuildJsonTask::class.java,
            ExternalNativeBuildTask::class.java,
            ExternalNativeCleanTask::class.java,
            MergeNativeLibsTask::class.java,
            StripDebugSymbolsTask::class.java,
            LibraryJniLibsTask::class.java,
            ExtractNativeDebugMetadataTask::class.java,
            MergeNativeDebugMetadataTask::class.java,
            PrefabPackageTask::class.java,
            PrefabPackageConfigurationTask::class.java,
            ProcessJavaResTask::class.java,
            BundleLibraryJavaRes::class.java,
            MergeJavaResourceTask::class.java,
            JavaDocGenerationTask::class.java,
            JavaDocJarTask::class.java,
            PackageRenderscriptTask::class.java,
            DexMergingTask::class.java,
            DexFileDependenciesTask::class.java,
            DexArchiveBuilderTask::class.java,
            L8DexDesugarLibTask::class.java,
            D8BundleMainDexListTask::class.java,
            FeatureDexMergeTask::class.java,
            PrivacySandboxSdkDexTask::class.java,
            PrivacySandboxSdkMergeDexTask::class.java,
            MergeArtProfileTask::class.java,
            ProcessLibraryArtProfileTask::class.java,
            PrepareLintJarForPublish::class.java,
            LintModelWriterTask::class.java,
            AndroidLintTask::class.java,
            AndroidLintGlobalTask::class.java,
            AndroidLintCopyReportTask::class.java,
            AndroidLintAnalysisTask::class.java,
            LintModelMetadataTask::class.java,
            AndroidLintTextOutputTask::class.java,
            DataBindingTriggerTask::class.java,
            DataBindingGenBaseClassesTask::class.java,
            DataBindingExportFeatureNamespacesTask::class.java,
            DataBindingExportFeatureInfoTask::class.java,
            DataBindingMergeDependencyArtifactsTask::class.java,
            GenerateApkDataTask::class.java,
            FeatureSplitDeclarationWriterTask::class.java,
            ModuleMetadataWriterTask::class.java,
            FeatureSetMetadataWriterTask::class.java,
            ApplicationIdWriterTask::class.java,
            ParseIntegrityConfigTask::class.java,
            FeatureNameWriterTask::class.java,
            SdkDependencyDataGeneratorTask::class.java,
            AarMetadataTask::class.java,
            CheckAarMetadataTask::class.java,
            GenerateApiPublicTxtTask::class.java,
            AppMetadataTask::class.java,
            SigningConfigVersionsWriterTask::class.java,
            ListingFileRedirectTask::class.java,
            ApplicationVariantModelTask::class.java,
            AbstractVariantModelTask::class.java,
            LibraryVariantModelTask::class.java,
            DynamicFeatureVariantModelTask::class.java,
            AndroidTestVariantModelTask::class.java,
            TestVariantModelTask::class.java,
            UnitTestVariantModelTask::class.java,
            ModuleVariantModelTask::class.java,
            TestModuleVariantModelTask::class.java,
            InstallVariantTask::class.java,
            UninstallTask::class.java,
            InstallVariantViaBundleTask::class.java,
            DependencyReportTask::class.java,
            SigningReportTask::class.java,
            SourceSetsTask::class.java,
            PackagedDependenciesWriterTask::class.java,
            AnalyzeDependenciesTask::class.java,
            ClasspathComparisonTask::class.java,
            UnsafeOutputsTask::class.java,
            PackageApplication::class.java,
            ExtractApksTask::class.java,
            BundleToApkTask::class.java,
            BundleToStandaloneApkTask::class.java,
            SigningConfigWriterTask::class.java,
            ApkZipPackagingTask::class.java,
            BundleAar::class.java,
            FusedLibraryBundleAar::class.java,
            PackageBundleTask::class.java,
            PerModuleBundleTask::class.java,
            FinalizeBundleTask::class.java,
            BundleReportDependenciesTask::class.java,
            PerModuleReportDependenciesTask::class.java,
            AssetPackPreBundleTask::class.java,
            PackagePrivacySandboxSdkBundle::class.java,
            ValidateSigningTask::class.java,
            CheckTestedAppObfuscation::class.java,
            CheckMultiApkLibrariesTask::class.java,
            AppClasspathCheckTask::class.java,
            CheckDuplicateClassesTask::class.java,
            CheckJetifierTask::class.java,
            ExtractProguardFiles::class.java,
            CheckProguardFiles::class.java,
            MergeConsumerProguardFilesTask::class.java,
            GenerateLibraryProguardRulesTask::class.java,
            ProguardConfigurableTask::class.java,
            ExportConsumerProguardFilesTask::class.java,
            R8Task::class.java,
            CompressAssetsTask::class.java,
            GenerateBuildConfig::class.java,
            GenerateMlModelClass::class.java,
            PrivacySandboxSdkManifestGeneratorTask::class.java,
            ExtractAnnotations::class.java,
            MergeSourceSetFolders::class.java,
            StreamBasedTask::class.java,
            TransformTask::class.java,
            RecalculateStackFramesTask::class.java,
            ExtractProfilerNativeDependenciesTask::class.java,
            TransformClassesWithAsmTask::class.java,
            DesugarLibKeepRulesMergeTask::class.java,
            FusedLibraryClassesRewriteTask::class.java,
            IncrementalTransformTask::class.java,
            NonIncrementalTransformTask::class.java,
    ) as List<Class<*>>

    private fun getAllTasks(): List<Class<*>> {
        val classPath = ClassPath.from(this.javaClass.classLoader)
        val taskInterface = TypeToken.of(Task::class.java)
        return classPath
                .getTopLevelClassesRecursive("com.android.build")
                .map{
                    classInfo -> classInfo.load() as Class<*>
                }
                .filter{
                    TypeToken.of(it).getTypes().contains(taskInterface)
                }
    }
}