blob: 4feade8ca5aa66a369740dbb0a15d5333680fa81 [file] [log] [blame]
Colin Cross76228672019-02-25 16:40:34 -08001// Copyright 2019 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
Jiakai Zhangb95998b2023-05-11 16:39:27 +010015package apex
Colin Cross76228672019-02-25 16:40:34 -080016
17import (
Jiakai Zhangc08c1622023-05-10 18:38:34 +010018 "fmt"
Colin Cross76228672019-02-25 16:40:34 -080019 "path/filepath"
Colin Cross76228672019-02-25 16:40:34 -080020 "sort"
21 "testing"
22
23 "android/soong/android"
Jiakai Zhangb95998b2023-05-11 16:39:27 +010024 "android/soong/java"
Colin Cross76228672019-02-25 16:40:34 -080025)
26
Jiakai Zhangc08c1622023-05-10 18:38:34 +010027func testDexpreoptBoot(t *testing.T, ruleFile string, expectedInputs, expectedOutputs []string, preferPrebuilt bool) {
Colin Cross76228672019-02-25 16:40:34 -080028 bp := `
Jiakai Zhangc08c1622023-05-10 18:38:34 +010029 // Platform.
30
Colin Cross76228672019-02-25 16:40:34 -080031 java_sdk_library {
32 name: "foo",
33 srcs: ["a.java"],
34 api_packages: ["foo"],
35 }
36
37 java_library {
38 name: "bar",
39 srcs: ["b.java"],
40 installable: true,
Ulya Trafimoviche736e132021-04-09 17:41:24 +010041 system_ext_specific: true,
Colin Cross76228672019-02-25 16:40:34 -080042 }
Colin Cross42be7612019-02-21 18:12:14 -080043
44 dex_import {
45 name: "baz",
46 jars: ["a.jar"],
47 }
Paul Duffin2fc82ad2021-04-29 23:36:12 +010048
49 platform_bootclasspath {
50 name: "platform-bootclasspath",
Jiakai Zhangc08c1622023-05-10 18:38:34 +010051 fragments: [
52 {
53 apex: "com.android.art",
54 module: "art-bootclasspath-fragment",
55 },
56 ],
57 }
58
59 // Source ART APEX.
60
61 java_library {
62 name: "core-oj",
63 srcs: ["core-oj.java"],
64 installable: true,
65 apex_available: [
66 "com.android.art",
67 ],
68 }
69
70 bootclasspath_fragment {
71 name: "art-bootclasspath-fragment",
72 image_name: "art",
73 contents: ["core-oj"],
74 apex_available: [
75 "com.android.art",
76 ],
77 hidden_api: {
78 split_packages: ["*"],
79 },
80 }
81
82 apex_key {
83 name: "com.android.art.key",
84 public_key: "com.android.art.avbpubkey",
85 private_key: "com.android.art.pem",
86 }
87
88 apex {
89 name: "com.android.art",
90 key: "com.android.art.key",
91 bootclasspath_fragments: ["art-bootclasspath-fragment"],
92 updatable: false,
93 }
94
95 // Prebuilt ART APEX.
96
97 java_import {
98 name: "core-oj",
99 prefer: %[1]t,
100 jars: ["core-oj.jar"],
101 apex_available: [
102 "com.android.art",
103 ],
104 }
105
106 prebuilt_bootclasspath_fragment {
107 name: "art-bootclasspath-fragment",
108 prefer: %[1]t,
109 image_name: "art",
110 contents: ["core-oj"],
111 hidden_api: {
112 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
113 metadata: "my-bootclasspath-fragment/metadata.csv",
114 index: "my-bootclasspath-fragment/index.csv",
115 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
116 all_flags: "my-bootclasspath-fragment/all-flags.csv",
117 },
118 apex_available: [
119 "com.android.art",
120 ],
121 }
122
123 prebuilt_apex {
124 name: "com.android.art",
125 prefer: %[1]t,
126 apex_name: "com.android.art",
127 src: "com.android.art-arm.apex",
128 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Paul Duffin2fc82ad2021-04-29 23:36:12 +0100129 }
Spandan Das52c01a12024-09-20 01:09:48 +0000130
131 apex_contributions {
132 name: "prebuilt_art_contributions",
133 contents: ["prebuilt_com.android.art"],
134 api_domain: "com.android.art",
135 }
Colin Cross76228672019-02-25 16:40:34 -0800136 `
137
Spandan Das52c01a12024-09-20 01:09:48 +0000138 fixture := android.GroupFixturePreparers(
Jiakai Zhangb95998b2023-05-11 16:39:27 +0100139 java.PrepareForTestWithDexpreopt,
140 java.PrepareForTestWithJavaSdkLibraryFiles,
141 java.FixtureWithLastReleaseApis("foo"),
Jiakai Zhangc08c1622023-05-10 18:38:34 +0100142 java.FixtureConfigureBootJars("com.android.art:core-oj", "platform:foo", "system_ext:bar", "platform:baz"),
143 PrepareForTestWithApexBuildComponents,
144 prepareForTestWithArtApex,
Spandan Das52c01a12024-09-20 01:09:48 +0000145 )
146 if preferPrebuilt {
147 fixture = android.GroupFixturePreparers(
148 fixture,
149 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ART", "prebuilt_art_contributions"),
150 )
151 }
152 result := fixture.RunTestWithBp(t, fmt.Sprintf(bp, preferPrebuilt))
Colin Cross76228672019-02-25 16:40:34 -0800153
Jiakai Zhangcb13b5d2023-07-13 11:03:38 +0100154 dexBootJars := result.ModuleForTests("dex_bootjars", "android_common")
155 rule := dexBootJars.Output(ruleFile)
Colin Cross76228672019-02-25 16:40:34 -0800156
Ulya Trafimovich86d9e3a2020-05-19 11:15:44 +0100157 inputs := rule.Implicits.Strings()
158 sort.Strings(inputs)
159 sort.Strings(expectedInputs)
160
161 outputs := append(android.WritablePaths{rule.Output}, rule.ImplicitOutputs...).Strings()
162 sort.Strings(outputs)
163 sort.Strings(expectedOutputs)
164
Paul Duffin67d485e2021-03-22 16:24:19 +0000165 android.AssertStringPathsRelativeToTopEquals(t, "inputs", result.Config, expectedInputs, inputs)
Ulya Trafimovich86d9e3a2020-05-19 11:15:44 +0100166
Paul Duffin67d485e2021-03-22 16:24:19 +0000167 android.AssertStringPathsRelativeToTopEquals(t, "outputs", result.Config, expectedOutputs, outputs)
Ulya Trafimovich86d9e3a2020-05-19 11:15:44 +0100168}
169
Jiakai Zhangc08c1622023-05-10 18:38:34 +0100170func TestDexpreoptBootJarsWithSourceArtApex(t *testing.T) {
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100171 ruleFile := "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot.art"
Colin Cross76228672019-02-25 16:40:34 -0800172
173 expectedInputs := []string{
Jiakai Zhangc08c1622023-05-10 18:38:34 +0100174 "out/soong/dexpreopt_arm64/dex_bootjars_input/core-oj.jar",
175 "out/soong/dexpreopt_arm64/dex_bootjars_input/foo.jar",
176 "out/soong/dexpreopt_arm64/dex_bootjars_input/bar.jar",
177 "out/soong/dexpreopt_arm64/dex_bootjars_input/baz.jar",
Jiakai Zhangcb13b5d2023-07-13 11:03:38 +0100178 "out/soong/.intermediates/art-bootclasspath-fragment/android_common_apex10000/art-bootclasspath-fragment/boot.prof",
179 "out/soong/.intermediates/default/java/dex_bootjars/android_common/boot/boot.prof",
Jiakai Zhang7d292222024-01-18 17:27:42 +0000180 "out/soong/dexpreopt/uffd_gc_flag.txt",
Colin Cross76228672019-02-25 16:40:34 -0800181 }
182
Colin Cross76228672019-02-25 16:40:34 -0800183 expectedOutputs := []string{
Jiakai Zhangc08c1622023-05-10 18:38:34 +0100184 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot.invocation",
185 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot.art",
186 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-foo.art",
187 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-bar.art",
188 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-baz.art",
189 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot.oat",
190 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-foo.oat",
191 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-bar.oat",
192 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-baz.oat",
193 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot.vdex",
194 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-foo.vdex",
195 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-bar.vdex",
196 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-baz.vdex",
197 "out/soong/dexpreopt_arm64/dex_bootjars_unstripped/android/system/framework/arm64/boot.oat",
198 "out/soong/dexpreopt_arm64/dex_bootjars_unstripped/android/system/framework/arm64/boot-foo.oat",
199 "out/soong/dexpreopt_arm64/dex_bootjars_unstripped/android/system/framework/arm64/boot-bar.oat",
200 "out/soong/dexpreopt_arm64/dex_bootjars_unstripped/android/system/framework/arm64/boot-baz.oat",
Colin Cross76228672019-02-25 16:40:34 -0800201 }
202
Jiakai Zhangc08c1622023-05-10 18:38:34 +0100203 testDexpreoptBoot(t, ruleFile, expectedInputs, expectedOutputs, false)
204}
205
206// The only difference is that the ART profile should be deapexed from the prebuilt APEX. Other
207// inputs and outputs should be the same as above.
208func TestDexpreoptBootJarsWithPrebuiltArtApex(t *testing.T) {
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100209 ruleFile := "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot.art"
Jiakai Zhangc08c1622023-05-10 18:38:34 +0100210
211 expectedInputs := []string{
212 "out/soong/dexpreopt_arm64/dex_bootjars_input/core-oj.jar",
213 "out/soong/dexpreopt_arm64/dex_bootjars_input/foo.jar",
214 "out/soong/dexpreopt_arm64/dex_bootjars_input/bar.jar",
215 "out/soong/dexpreopt_arm64/dex_bootjars_input/baz.jar",
Spandan Das52c01a12024-09-20 01:09:48 +0000216 "out/soong/.intermediates/prebuilt_com.android.art/android_common_com.android.art/deapexer/etc/boot-image.prof",
Jiakai Zhangcb13b5d2023-07-13 11:03:38 +0100217 "out/soong/.intermediates/default/java/dex_bootjars/android_common/boot/boot.prof",
Jiakai Zhang7d292222024-01-18 17:27:42 +0000218 "out/soong/dexpreopt/uffd_gc_flag.txt",
Jiakai Zhangc08c1622023-05-10 18:38:34 +0100219 }
220
221 expectedOutputs := []string{
222 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot.invocation",
223 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot.art",
224 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-foo.art",
225 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-bar.art",
226 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-baz.art",
227 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot.oat",
228 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-foo.oat",
229 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-bar.oat",
230 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-baz.oat",
231 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot.vdex",
232 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-foo.vdex",
233 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-bar.vdex",
234 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-baz.vdex",
235 "out/soong/dexpreopt_arm64/dex_bootjars_unstripped/android/system/framework/arm64/boot.oat",
236 "out/soong/dexpreopt_arm64/dex_bootjars_unstripped/android/system/framework/arm64/boot-foo.oat",
237 "out/soong/dexpreopt_arm64/dex_bootjars_unstripped/android/system/framework/arm64/boot-bar.oat",
238 "out/soong/dexpreopt_arm64/dex_bootjars_unstripped/android/system/framework/arm64/boot-baz.oat",
239 }
240
241 testDexpreoptBoot(t, ruleFile, expectedInputs, expectedOutputs, true)
Ulya Trafimovich86d9e3a2020-05-19 11:15:44 +0100242}
243
244// Changes to the boot.zip structure may break the ART APK scanner.
245func TestDexpreoptBootZip(t *testing.T) {
246 ruleFile := "boot.zip"
247
Paul Duffin67d485e2021-03-22 16:24:19 +0000248 ctx := android.PathContextForTesting(android.TestArchConfig("", nil, "", nil))
Ulya Trafimovich5006d8d2020-05-20 13:47:13 +0100249 expectedInputs := []string{}
Ulya Trafimovich9ab49332020-06-10 15:44:25 +0100250 for _, target := range ctx.Config().Targets[android.Android] {
Ulya Trafimovich5006d8d2020-05-20 13:47:13 +0100251 for _, ext := range []string{".art", ".oat", ".vdex"} {
Jiakai Zhangc08c1622023-05-10 18:38:34 +0100252 for _, suffix := range []string{"", "-foo", "-bar", "-baz"} {
Ulya Trafimovich5006d8d2020-05-20 13:47:13 +0100253 expectedInputs = append(expectedInputs,
Jiakai Zhangc08c1622023-05-10 18:38:34 +0100254 filepath.Join(
255 "out/soong/dexpreopt_arm64/dex_bootjars",
256 target.Os.String(),
257 "system/framework",
258 target.Arch.ArchType.String(),
259 "boot"+suffix+ext))
Ulya Trafimovich5006d8d2020-05-20 13:47:13 +0100260 }
261 }
Colin Cross76228672019-02-25 16:40:34 -0800262 }
263
Ulya Trafimovich86d9e3a2020-05-19 11:15:44 +0100264 expectedOutputs := []string{
Jiakai Zhangc08c1622023-05-10 18:38:34 +0100265 "out/soong/dexpreopt_arm64/dex_bootjars/boot.zip",
Colin Cross76228672019-02-25 16:40:34 -0800266 }
Ulya Trafimovich86d9e3a2020-05-19 11:15:44 +0100267
Jiakai Zhangc08c1622023-05-10 18:38:34 +0100268 testDexpreoptBoot(t, ruleFile, expectedInputs, expectedOutputs, false)
Colin Cross76228672019-02-25 16:40:34 -0800269}
Spandan Dasda739a32023-12-13 00:06:32 +0000270
271// Multiple ART apexes might exist in the tree.
272// The profile should correspond to the apex selected using release build flags
273func TestDexpreoptProfileWithMultiplePrebuiltArtApexes(t *testing.T) {
274 ruleFile := "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot.art"
275 bp := `
276 // Platform.
277
278 platform_bootclasspath {
279 name: "platform-bootclasspath",
280 fragments: [
281 {
282 apex: "com.android.art",
283 module: "art-bootclasspath-fragment",
284 },
285 ],
286 }
287
288 // Source ART APEX.
289
290 java_library {
291 name: "core-oj",
292 srcs: ["core-oj.java"],
293 installable: true,
294 apex_available: [
295 "com.android.art",
296 ],
297 }
298
299 bootclasspath_fragment {
300 name: "art-bootclasspath-fragment",
301 image_name: "art",
302 contents: ["core-oj"],
303 apex_available: [
304 "com.android.art",
305 ],
306 hidden_api: {
307 split_packages: ["*"],
308 },
309 }
310
311 apex_key {
312 name: "com.android.art.key",
313 public_key: "com.android.art.avbpubkey",
314 private_key: "com.android.art.pem",
315 }
316
317 apex {
318 name: "com.android.art",
319 key: "com.android.art.key",
320 bootclasspath_fragments: ["art-bootclasspath-fragment"],
321 updatable: false,
322 }
323
324 // Prebuilt ART APEX.
325
Spandan Das5be63332023-12-13 00:06:32 +0000326 java_import {
327 name: "core-oj",
328 jars: ["core-oj.jar"],
329 apex_available: [
330 "com.android.art",
331 ],
332 }
333
Spandan Dasda739a32023-12-13 00:06:32 +0000334 prebuilt_bootclasspath_fragment {
335 name: "art-bootclasspath-fragment",
336 image_name: "art",
Spandan Das5be63332023-12-13 00:06:32 +0000337 contents: ["core-oj"],
Spandan Dasda739a32023-12-13 00:06:32 +0000338 hidden_api: {
339 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
340 metadata: "my-bootclasspath-fragment/metadata.csv",
341 index: "my-bootclasspath-fragment/index.csv",
342 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
343 all_flags: "my-bootclasspath-fragment/all-flags.csv",
344 },
345 apex_available: [
346 "com.android.art",
347 ],
348 }
349
350 prebuilt_apex {
351 name: "com.android.art",
352 apex_name: "com.android.art",
353 src: "com.android.art-arm.apex",
354 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
355 }
356
357 // Another Prebuilt ART APEX
358 prebuilt_apex {
359 name: "com.android.art.v2",
360 apex_name: "com.android.art", // Used to determine the API domain
361 src: "com.android.art-arm.apex",
362 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
363 }
364
365 // APEX contribution modules
366
367 apex_contributions {
368 name: "art.source.contributions",
369 api_domain: "com.android.art",
370 contents: ["com.android.art"],
371 }
372
373 apex_contributions {
374 name: "art.prebuilt.contributions",
375 api_domain: "com.android.art",
376 contents: ["prebuilt_com.android.art"],
377 }
378
379 apex_contributions {
380 name: "art.prebuilt.v2.contributions",
381 api_domain: "com.android.art",
382 contents: ["com.android.art.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
383 }
384
385 `
386
387 testCases := []struct {
388 desc string
389 selectedArtApexContributions string
390 expectedProfile string
391 }{
392 {
393 desc: "Source apex com.android.art is selected, profile should come from source java library",
394 selectedArtApexContributions: "art.source.contributions",
395 expectedProfile: "out/soong/.intermediates/art-bootclasspath-fragment/android_common_apex10000/art-bootclasspath-fragment/boot.prof",
396 },
397 {
398 desc: "Prebuilt apex prebuilt_com.android.art is selected, profile should come from .prof deapexed from the prebuilt",
399 selectedArtApexContributions: "art.prebuilt.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +0000400 expectedProfile: "out/soong/.intermediates/prebuilt_com.android.art/android_common_com.android.art/deapexer/etc/boot-image.prof",
Spandan Dasda739a32023-12-13 00:06:32 +0000401 },
402 {
403 desc: "Prebuilt apex prebuilt_com.android.art.v2 is selected, profile should come from .prof deapexed from the prebuilt",
404 selectedArtApexContributions: "art.prebuilt.v2.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +0000405 expectedProfile: "out/soong/.intermediates/com.android.art.v2/android_common_com.android.art/deapexer/etc/boot-image.prof",
Spandan Dasda739a32023-12-13 00:06:32 +0000406 },
407 }
408 for _, tc := range testCases {
409 result := android.GroupFixturePreparers(
410 java.PrepareForTestWithDexpreopt,
411 java.PrepareForTestWithJavaSdkLibraryFiles,
412 java.FixtureConfigureBootJars("com.android.art:core-oj"),
413 PrepareForTestWithApexBuildComponents,
414 prepareForTestWithArtApex,
Colin Crossa66b4632024-08-08 15:50:47 -0700415 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ART", tc.selectedArtApexContributions),
Spandan Dasda739a32023-12-13 00:06:32 +0000416 ).RunTestWithBp(t, bp)
417
418 dexBootJars := result.ModuleForTests("dex_bootjars", "android_common")
419 rule := dexBootJars.Output(ruleFile)
420
421 inputs := rule.Implicits.Strings()
422 android.AssertStringListContains(t, tc.desc, inputs, tc.expectedProfile)
423 }
424}
Spandan Das8a2c56c2024-08-26 22:59:55 +0000425
426// Check that dexpreopt works with Google mainline prebuilts even in workspaces where source is missing
427func TestDexpreoptWithMainlinePrebuiltNoSource(t *testing.T) {
428 bp := `
429 // Platform.
430
431 platform_bootclasspath {
432 name: "platform-bootclasspath",
433 fragments: [
434 {
435 apex: "com.android.art",
436 module: "art-bootclasspath-fragment",
437 },
438 ],
439 }
440
441 // Source AOSP ART apex
442 java_library {
443 name: "core-oj",
444 srcs: ["core-oj.java"],
445 installable: true,
446 apex_available: [
447 "com.android.art",
448 ],
449 }
450
451 bootclasspath_fragment {
452 name: "art-bootclasspath-fragment",
453 image_name: "art",
454 contents: ["core-oj"],
455 apex_available: [
456 "com.android.art",
457 ],
458 hidden_api: {
459 split_packages: ["*"],
460 },
461 }
462
463 apex_key {
464 name: "com.android.art.key",
465 public_key: "com.android.art.avbpubkey",
466 private_key: "com.android.art.pem",
467 }
468
469 apex {
470 name: "com.android.art",
471 key: "com.android.art.key",
472 bootclasspath_fragments: ["art-bootclasspath-fragment"],
473 updatable: false,
474 }
475
476
477 // Prebuilt Google ART APEX.
478
479 java_import {
480 name: "core-oj",
481 jars: ["core-oj.jar"],
482 apex_available: [
483 "com.android.art",
484 ],
485 }
486
487 prebuilt_bootclasspath_fragment {
488 name: "art-bootclasspath-fragment",
489 image_name: "art",
490 contents: ["core-oj"],
491 hidden_api: {
492 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
493 metadata: "my-bootclasspath-fragment/metadata.csv",
494 index: "my-bootclasspath-fragment/index.csv",
495 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
496 all_flags: "my-bootclasspath-fragment/all-flags.csv",
497 },
498 apex_available: [
499 "com.android.art",
500 ],
501 }
502
503 prebuilt_apex {
504 name: "com.google.android.art",
505 apex_name: "com.android.art",
506 src: "com.android.art-arm.apex",
507 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
508 }
509
510 apex_contributions {
511 name: "art.prebuilt.contributions",
512 api_domain: "com.android.art",
513 contents: ["prebuilt_com.google.android.art"],
514 }
515 `
516 res := android.GroupFixturePreparers(
517 java.PrepareForTestWithDexpreopt,
518 java.PrepareForTestWithJavaSdkLibraryFiles,
519 java.FixtureConfigureBootJars("com.android.art:core-oj"),
520 PrepareForTestWithApexBuildComponents,
521 prepareForTestWithArtApex,
522 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ART", "art.prebuilt.contributions"),
523 ).RunTestWithBp(t, bp)
524 if !java.CheckModuleHasDependency(t, res.TestContext, "dex_bootjars", "android_common", "prebuilt_com.google.android.art") {
525 t.Errorf("Expected dexpreopt to use prebuilt apex")
526 }
527}