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
359
360
361
362
363
364
365
366
367
368
369
370
|
import java.time.LocalDate
import java.time.format.DateTimeFormatter
plugins {
id 'com.android.tools.java-library'
id 'com.android.tools.kotlin'
id 'com.android.tools.publish'
id 'java-gradle-plugin'
id 'license-report'
id 'com.google.protobuf'
id 'idea'
}
idea.module {
generatedSourceDirs += new File(protobuf.generatedFilesBaseDir)
}
configurations {
provided
includeInJar
includeInJarSources {
attributes {
attribute(DocsType.DOCS_TYPE_ATTRIBUTE, objects.named(DocsType, DocsType.SOURCES))
attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category, Category.DOCUMENTATION))
}
}
}
licenseReport {
ignored = libs.trove4j
}
// Incremental update test support
File classesDir = new File(project.buildDir, "classes/incremental-test")
File baseClasses = new File(classesDir, "base")
File baseInstrumentedClasses = new File(classesDir, "baseInstrumented")
sourceSets {
main {
java.srcDirs += 'src/fromGradle/java'
resources.srcDirs = ['src/main/resources', 'src/fromGradle/resources']
compileClasspath += configurations.provided
}
test {
compileClasspath += files(baseClasses)
runtimeClasspath += files(baseInstrumentedClasses)
}
apiTest {
java.srcDirs += 'src/apiTest/kotlin'
resources.srcDirs += 'src/apiTest/resources'
compileClasspath += test.compileClasspath
runtimeClasspath += test.runtimeClasspath
}
}
task apiTest(type: Test) {
testClassesDirs = sourceSets.apiTest.output.classesDirs
classpath = sourceSets.apiTest.runtimeClasspath
}
check.dependsOn apiTest
publishing {
publications {
withType(MavenPublication) {
artifactId = 'gradle'
}
}
}
/**
* Although this DSL will generated META-INF/gradle-plugins descriptors, we still keep them
* in our sources because AGP is also built with bazel which does not know how to generate plugin
* descriptors.
*/
gradlePlugin {
testSourceSets sourceSets.apiTest
plugins {
comAndroidApplication {
id = "com.android.application"
implementationClass = "com.android.build.gradle.AppPlugin"
}
comAndroidLibrary {
id = "com.android.library"
implementationClass = "com.android.build.gradle.LibraryPlugin"
}
comAndroidDynamicFeature {
id = "com.android.dynamic-feature"
implementationClass = "com.android.build.gradle.DynamicFeaturePlugin"
}
comAndroidAssetPack {
id = "com.android.asset-pack"
implementationClass = "com.android.build.gradle.AssetPackPlugin"
}
comAndroidAssetOnlyBundle {
id = "com.android.asset-pack-bundle"
implementationClass = "com.android.build.gradle.AssetPackBundlePlugin"
}
comAndroidLint {
id = "com.android.lint"
implementationClass = "com.android.build.gradle.LintPlugin"
}
comAndroidTest {
id = "com.android.test"
implementationClass = "com.android.build.gradle.TestPlugin"
}
comAndroidFusedLibrary {
id = "com.android.fused-library"
implementationClass = "com.android.build.gradle.api.FusedLibraryPlugin"
}
comAndroidSdkLibrary {
id = "com.android.privacy-sandbox-sdk"
implementationClass = "com.android.build.gradle.api.PrivacySandboxSdkPlugin"
}
}
}
dependencies {
api project(':base:builder')
api project(':base:builder-model')
// it's optional but we need the dependency to copy the value into the normal plugins.
implementation project(':base:build-system:gradle-settings-api')
implementation libs.com.android.tools.sdkCommon
implementation libs.com.android.tools.sdklib
implementation libs.com.android.tools.repository
implementation libs.com.android.tools.ddms.ddmlib
implementation project(':base:build-system:aapt2-proto')
implementation project(':base:build-system:aaptcompiler')
implementation libs.com.android.tools.analyticsLibrary.crash
implementation libs.com.android.tools.analyticsLibrary.shared
implementation libs.com.android.tools.lint.lintModel
implementation libs.com.android.tools.lint.lintTypedefRemover
api project(':base:gradle-api')
implementation libs.androidx.databinding.databinding.compiler.common
implementation libs.androidx.databinding.databinding.common
implementation libs.com.android.databinding.baseLibrary
implementation project(':base:builder-test-api')
implementation libs.com.android.tools.layoutlib.layoutlibApi
implementation libs.com.android.tools.utp.androidDeviceProviderDdmlibProto
implementation libs.com.android.tools.utp.androidDeviceProviderGradleProto
implementation libs.com.android.tools.utp.androidTestPluginHostAdditionalTestOutputProto
implementation libs.com.android.tools.utp.androidTestPluginHostCoverageProto
implementation libs.com.android.tools.utp.androidTestPluginHostEmulatorControlProto
implementation libs.com.android.tools.utp.androidTestPluginHostLogcatProto
implementation libs.com.android.tools.utp.androidTestPluginHostApkInstallerProto
implementation libs.com.android.tools.utp.androidTestPluginHostRetentionProto
implementation libs.com.android.tools.utp.androidTestPluginResultListenerGradleProto
implementation gradleApi()
implementation libs.kotlin_stdlib
implementation libs.transform_api_deprecated
implementation libs.apache_httpmime
implementation libs.apache_commons_io
implementation libs.asm
implementation libs.asm_analysis
implementation libs.asm_commons
implementation libs.asm_util
implementation libs.bouncycastle_pkix
implementation libs.jaxb_runtime
implementation libs.jopt
implementation libs.bundle_tool
implementation libs.jetifier_core
implementation libs.jetifier_processor
implementation libs.javapoet
implementation libs.protobuf
implementation libs.protobuf_util
implementation libs.gson
implementation libs.grpc_core
implementation libs.grpc_netty
implementation libs.grpc_protobuf
implementation libs.grpc_stub
implementation libs.tink
implementation libs.unified_test_platform
compileOnly libs.kotlin_gradle_plugin
compileOnly libs.jacoco_core
compileOnly libs.jacoco_report
compileOnly libs.dokka_core
// already packaged in (':base:builder')
compileOnly project(':base:profile')
// already packaged later
compileOnly project(':base:build-analyzer:common')
testImplementation libs.junit
testImplementation libs.truth
testImplementation libs.truth_java8_extension
testImplementation libs.kotlin_test
testImplementation libs.mockito_core
testImplementation libs.guava
testImplementation libs.grpc_testing
testImplementation libs.jimfs
testImplementation libs.equalsverifier
testImplementation project(':base:project-test-lib')
testImplementation libs.com.android.tools.testutils
testImplementation 'org.jetbrains:annotations:13.0'
testImplementation libs.bouncycastle_prov
testImplementation libs.jsoup
testImplementation libs.jacoco_core
testImplementation libs.jacoco_report
testImplementation libs.kotlin_gradle_plugin
testImplementation externalTestFixtures.repository
testImplementation testFixtures(project(":base:builder"))
apiTestImplementation libs.com.android.tools.apkparser.apkanalyzer
apiTestImplementation externalTestFixtures.apkanalyzer
testCompileOnly project(':base:profile')
includeInJar(project(':base:build-system:shrinker')) {
transitive = false
}
includeInJarSources(project(':base:build-system:shrinker')) {
transitive = false
}
// mlkit-common
includeInJar(project(':base:mlkit-common')) {
transitive = false
}
includeInJarSources(project(path:':base:mlkit-common')) {
transitive = false
}
includeInJar(project(':base:profgen')) {
transitive = false
}
includeInJarSources(project(':base:profgen')) {
transitive = false
}
includeInJar(project(':base:build-analyzer:common')) {
transitive = false
}
includeInJarSources(project(':base:build-analyzer:common')) {
transitive = false
}
implementation libs.flatbuffers
implementation libs.tensorflow_lite_metadata
provided(project(':base:build-system:shrinker')) {
transitive = false
}
provided(files('../../../../prebuilts/r8/r8.jar'))
}
protobuf {
protoc {
artifact = libs.proto_compiler
}
}
group = 'com.android.tools.build'
version = rootProject.ext.buildVersion
project.ext.pomName = 'Gradle Plug-in for Android'
project.ext.pomDesc = 'Gradle plug-in to build Android applications.'
project.ext.customArtifactId = 'gradle'
test {
environment("CUSTOM_REPO",
new File(rootProject.ext.androidHostOut, "repo").toString()
+ File.pathSeparator
+ rootProject.file("../prebuilts/tools/common/m2/repository/").toString())
testLogging {
events "failed"
}
maxParallelForks = Runtime.runtime.availableProcessors() / 2
exclude "**/GradleCoreBazelSuite*"
maxHeapSize = "2048m"
}
File apiTestsOutDir = new File(rootProject.ext.androidHostOut, "apiTests")
apiTestsOutDir.mkdirs()
clean {
delete apiTestsOutDir
}
apiTest {
maxParallelForks = Runtime.runtime.availableProcessors()
environment("API_TESTS_OUTDIR", apiTestsOutDir.toString())
environment("CUSTOM_REPO",
new File(rootProject.ext.androidHostOut, "repo").toString()
+ File.pathSeparator
+ rootProject.file("../prebuilts/tools/common/m2/repository/").toString())
dependsOn ':publishAndroidGradleLocal'
}
tasks.processResources {
from(rootProject.file("../prebuilts/tools/common/aapt/aapt2_version.properties")) {
into "com/android/build/gradle/internal/res/"
}
}
// Incremental update test support
javadoc {
classpath += configurations.provided
}
// setup annotation processor output directory
File generatedSources = new File(project.buildDir, 'generated/generated')
tasks.compileJava {
doFirst {
generatedSources.mkdirs()
}
options.compilerArgs += ['-s', generatedSources]
outputs.dir(generatedSources)
}
validatePlugins {
// Enable strict mode so we can see more warnings
enableStricterValidation = true
}
// Support for embedding other gradle project classes.
sourceSets.main.compileClasspath += configurations.includeInJar
sourceSets.test.compileClasspath += configurations.includeInJar
sourceSets.test.runtimeClasspath += configurations.includeInJar
tasks.jar {
dependsOn configurations.includeInJar
from {
configurations.includeInJar.collect({zipTree(it)})
}
// Set the version of the plugin in the manifest. This is used by 3rd party plugin (like Kotlin)
manifest.attributes("Plugin-Version": version)
manifest.attributes("Inception-Date": DateTimeFormatter.ISO_LOCAL_DATE.format(LocalDate.now()));
// make sure we use the NOTICE coming from this module as some dependencies are repackaged inside
// the jar file with the "includeInJar" configuration. Such dependencies like 'shrinker' also
// have a NOTICE file.
// We could use 'jar.duplicatesStrategy' = EXCLUDE but it will do this to all files which could
// lead to other problems if we had '.class' duplicates and just picked up the first one.
filesMatching("NOTICE", {
// only pick up NOTICE coming from gradle-core module
if (!it.toString().contains("gradle-core"))
it.exclude()
})
}
tasks.named("kotlinSourcesJar").configure {
it.dependsOn(tasks.named("generateProto"))
}
tasks.sourcesJar {
dependsOn configurations.includeInJarSources
from {
configurations.includeInJarSources.collect({zipTree(it)})
}
}
def updatePseudoApi = tasks.register('updatePseudoApi', JavaExec) {
classpath(sourceSets['test'].output.classesDirs, sourceSets['test'].runtimeClasspath)
mainClass = 'com.android.build.gradle.PseudoApiUpdater'
}
def updateUndecoratedApi = tasks.register('updateUndecoratedApi', JavaExec) {
classpath(sourceSets['test'].output.classesDirs, sourceSets['test'].runtimeClasspath)
mainClass = 'com.android.build.gradle.DecoratedApiChangesUpdater'
}
def updateApi = tasks.register('updateApi') {
dependsOn(updatePseudoApi)
dependsOn(updateUndecoratedApi)
}
|