1// Copyright (C) 2021 The Android Open Source Project 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 15package sdk 16 17import ( 18 "fmt" 19 "path/filepath" 20 "strings" 21 "testing" 22 23 "android/soong/android" 24 "android/soong/java" 25) 26 27// fixtureAddPlatformBootclasspathForBootclasspathFragment adds a platform_bootclasspath module that 28// references the bootclasspath fragment. 29func fixtureAddPlatformBootclasspathForBootclasspathFragment(apex, fragment string) android.FixturePreparer { 30 return fixtureAddPlatformBootclasspathForBootclasspathFragmentWithExtra(apex, fragment, "") 31} 32 33// fixtureAddPlatformBootclasspathForBootclasspathFragmentWithExtra is the same as above, but also adds extra fragments. 34func fixtureAddPlatformBootclasspathForBootclasspathFragmentWithExtra(apex, fragment, extraFragments string) android.FixturePreparer { 35 return android.GroupFixturePreparers( 36 // Add a platform_bootclasspath module. 37 android.FixtureAddTextFile("frameworks/base/boot/Android.bp", fmt.Sprintf(` 38 platform_bootclasspath { 39 name: "platform-bootclasspath", 40 fragments: [ 41 { 42 apex: "%s", 43 module: "%s", 44 }, 45 %s 46 ], 47 } 48 `, apex, fragment, extraFragments)), 49 android.FixtureAddFile("frameworks/base/boot/boot-profile.txt", nil), 50 android.FixtureAddFile("frameworks/base/boot/boot-image-profile.txt", nil), 51 android.FixtureAddFile("art/build/boot/boot-image-profile.txt", nil), 52 android.FixtureAddFile("build/soong/scripts/check_boot_jars/package_allowed_list.txt", nil), 53 ) 54} 55 56// fixtureAddPrebuiltApexForBootclasspathFragment adds a prebuilt_apex that exports the fragment. 57func fixtureAddPrebuiltApexForBootclasspathFragment(apex, fragment string) android.FixturePreparer { 58 apexFile := fmt.Sprintf("%s.apex", apex) 59 dir := "prebuilts/apex" 60 return android.GroupFixturePreparers( 61 // A preparer to add a prebuilt apex to the test fixture. 62 android.FixtureAddTextFile(filepath.Join(dir, "Android.bp"), fmt.Sprintf(` 63 prebuilt_apex { 64 name: "%s", 65 src: "%s", 66 exported_bootclasspath_fragments: [ 67 "%s", 68 ], 69 } 70 `, apex, apexFile, fragment)), 71 android.FixtureAddFile(filepath.Join(dir, apexFile), nil), 72 ) 73} 74 75func TestSnapshotWithBootclasspathFragment_ImageName(t *testing.T) { 76 result := android.GroupFixturePreparers( 77 prepareForSdkTestWithJava, 78 java.PrepareForTestWithDexpreopt, 79 prepareForSdkTestWithApex, 80 81 // Some additional files needed for the art apex. 82 android.FixtureMergeMockFs(android.MockFS{ 83 "com.android.art.avbpubkey": nil, 84 "com.android.art.pem": nil, 85 "system/sepolicy/apex/com.android.art-file_contexts": nil, 86 }), 87 88 // Add a platform_bootclasspath that depends on the fragment. 89 fixtureAddPlatformBootclasspathForBootclasspathFragmentWithExtra( 90 "com.android.art", "art-bootclasspath-fragment", java.ApexBootJarFragmentsForPlatformBootclasspath), 91 92 java.PrepareForBootImageConfigTest, 93 java.PrepareApexBootJarConfigsAndModules, 94 android.FixtureWithRootAndroidBp(` 95 sdk { 96 name: "mysdk", 97 bootclasspath_fragments: ["art-bootclasspath-fragment"], 98 } 99 100 apex { 101 name: "com.android.art", 102 key: "com.android.art.key", 103 bootclasspath_fragments: [ 104 "art-bootclasspath-fragment", 105 ], 106 updatable: false, 107 } 108 109 bootclasspath_fragment { 110 name: "art-bootclasspath-fragment", 111 image_name: "art", 112 contents: ["core1", "core2"], 113 apex_available: ["com.android.art"], 114 hidden_api: { 115 split_packages: ["*"], 116 }, 117 } 118 119 apex_key { 120 name: "com.android.art.key", 121 public_key: "com.android.art.avbpubkey", 122 private_key: "com.android.art.pem", 123 } 124 125 java_library { 126 name: "core1", 127 srcs: ["Test.java"], 128 system_modules: "none", 129 sdk_version: "none", 130 compile_dex: true, 131 apex_available: ["com.android.art"], 132 } 133 134 java_library { 135 name: "core2", 136 srcs: ["Test.java"], 137 system_modules: "none", 138 sdk_version: "none", 139 compile_dex: true, 140 apex_available: ["com.android.art"], 141 } 142`), 143 ).RunTest(t) 144 145 // A preparer to update the test fixture used when processing an unpackage snapshot. 146 preparerForSnapshot := fixtureAddPrebuiltApexForBootclasspathFragment("com.android.art", "art-bootclasspath-fragment") 147 148 // Check that source on its own configures the bootImageConfig correctly. 149 java.CheckMutatedArtBootImageConfig(t, result, "out/soong/.intermediates/default/java/dex_bootjars/android_common/meta_lic") 150 java.CheckMutatedFrameworkBootImageConfig(t, result, "out/soong/.intermediates/default/java/dex_bootjars/android_common/meta_lic") 151 152 CheckSnapshot(t, result, "mysdk", "", 153 checkAndroidBpContents(` 154// This is auto-generated. DO NOT EDIT. 155 156apex_contributions_defaults { 157 name: "mysdk.contributions", 158 contents: [], 159} 160 161prebuilt_bootclasspath_fragment { 162 name: "art-bootclasspath-fragment", 163 prefer: false, 164 visibility: ["//visibility:public"], 165 apex_available: ["com.android.art"], 166 image_name: "art", 167 contents: [ 168 "core1", 169 "core2", 170 ], 171 hidden_api: { 172 annotation_flags: "hiddenapi/annotation-flags.csv", 173 metadata: "hiddenapi/metadata.csv", 174 index: "hiddenapi/index.csv", 175 signature_patterns: "hiddenapi/signature-patterns.csv", 176 filtered_stub_flags: "hiddenapi/filtered-stub-flags.csv", 177 filtered_flags: "hiddenapi/filtered-flags.csv", 178 }, 179} 180 181java_import { 182 name: "core1", 183 prefer: false, 184 visibility: ["//visibility:public"], 185 apex_available: ["com.android.art"], 186 jars: ["java_boot_libs/snapshot/jars/are/invalid/core1.jar"], 187} 188 189java_import { 190 name: "core2", 191 prefer: false, 192 visibility: ["//visibility:public"], 193 apex_available: ["com.android.art"], 194 jars: ["java_boot_libs/snapshot/jars/are/invalid/core2.jar"], 195} 196 197`), 198 checkAllCopyRules(` 199.intermediates/art-bootclasspath-fragment/android_common/modular-hiddenapi/annotation-flags.csv -> hiddenapi/annotation-flags.csv 200.intermediates/art-bootclasspath-fragment/android_common/modular-hiddenapi/metadata.csv -> hiddenapi/metadata.csv 201.intermediates/art-bootclasspath-fragment/android_common/modular-hiddenapi/index.csv -> hiddenapi/index.csv 202.intermediates/art-bootclasspath-fragment/android_common/modular-hiddenapi/signature-patterns.csv -> hiddenapi/signature-patterns.csv 203.intermediates/art-bootclasspath-fragment/android_common/modular-hiddenapi/filtered-stub-flags.csv -> hiddenapi/filtered-stub-flags.csv 204.intermediates/art-bootclasspath-fragment/android_common/modular-hiddenapi/filtered-flags.csv -> hiddenapi/filtered-flags.csv 205.intermediates/mysdk/common_os/empty -> java_boot_libs/snapshot/jars/are/invalid/core1.jar 206.intermediates/mysdk/common_os/empty -> java_boot_libs/snapshot/jars/are/invalid/core2.jar 207 `), 208 snapshotTestPreparer(checkSnapshotWithoutSource, android.GroupFixturePreparers( 209 preparerForSnapshot, 210 // Flag ART prebuilts 211 android.FixtureMergeMockFs(android.MockFS{ 212 "apex_contributions/Android.bp": []byte(` 213 apex_contributions { 214 name: "prebuilt_art_contributions", 215 contents: ["prebuilt_com.android.art"], 216 api_domain: "com.android.art", 217 } 218 `)}), 219 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ART", "prebuilt_art_contributions"), 220 )), 221 222 // Check the behavior of the snapshot without the source. 223 snapshotTestChecker(checkSnapshotWithoutSource, func(t *testing.T, result *android.TestResult) { 224 // Make sure that the boot jars package check rule includes the dex jars retrieved from the prebuilt apex. 225 checkBootJarsPackageCheckRule(t, result, 226 append( 227 []string{ 228 "out/soong/.intermediates/prebuilts/apex/com.android.art/android_common_com.android.art/deapexer/javalib/core1.jar", 229 "out/soong/.intermediates/prebuilts/apex/com.android.art/android_common_com.android.art/deapexer/javalib/core2.jar", 230 "out/soong/.intermediates/default/java/framework/android_common/aligned/framework.jar", 231 }, 232 java.ApexBootJarDexJarPaths..., 233 )..., 234 ) 235 java.CheckMutatedArtBootImageConfig(t, result, "out/soong/.intermediates/default/java/dex_bootjars/android_common/meta_lic") 236 java.CheckMutatedFrameworkBootImageConfig(t, result, "out/soong/.intermediates/default/java/dex_bootjars/android_common/meta_lic") 237 }), 238 239 snapshotTestPreparer(checkSnapshotWithSourcePreferred, preparerForSnapshot), 240 241 // Check the behavior of the snapshot when the source is preferred. 242 snapshotTestChecker(checkSnapshotWithSourcePreferred, func(t *testing.T, result *android.TestResult) { 243 java.CheckMutatedArtBootImageConfig(t, result, "out/soong/.intermediates/default/java/dex_bootjars/android_common/meta_lic") 244 java.CheckMutatedFrameworkBootImageConfig(t, result, "out/soong/.intermediates/default/java/dex_bootjars/android_common/meta_lic") 245 }), 246 247 snapshotTestPreparer(checkSnapshotPreferredWithSource, preparerForSnapshot), 248 249 // Check the behavior of the snapshot when it is preferred. 250 snapshotTestChecker(checkSnapshotPreferredWithSource, func(t *testing.T, result *android.TestResult) { 251 java.CheckMutatedArtBootImageConfig(t, result, "out/soong/.intermediates/default/java/dex_bootjars/android_common/meta_lic") 252 java.CheckMutatedFrameworkBootImageConfig(t, result, "out/soong/.intermediates/default/java/dex_bootjars/android_common/meta_lic") 253 }), 254 ) 255 256 // Make sure that the boot jars package check rule includes the dex jars created from the source. 257 checkBootJarsPackageCheckRule(t, result, 258 append( 259 []string{ 260 "out/soong/.intermediates/core1/android_common_apex10000/aligned/core1.jar", 261 "out/soong/.intermediates/core2/android_common_apex10000/aligned/core2.jar", 262 "out/soong/.intermediates/default/java/framework/android_common/aligned/framework.jar", 263 }, 264 java.ApexBootJarDexJarPaths..., 265 )..., 266 ) 267} 268 269// checkBootJarsPackageCheckRule checks that the supplied module is an input to the boot jars 270// package check rule. 271func checkBootJarsPackageCheckRule(t *testing.T, result *android.TestResult, expectedModules ...string) { 272 t.Helper() 273 platformBcp := result.ModuleForTests("platform-bootclasspath", "android_common") 274 bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check") 275 command := bootJarsCheckRule.RuleParams.Command 276 expectedCommandArgs := " build/soong/scripts/check_boot_jars/package_allowed_list.txt " + strings.Join(expectedModules, " ") + " &&" 277 android.AssertStringDoesContain(t, "boot jars package check", command, expectedCommandArgs) 278} 279 280func testSnapshotWithBootClasspathFragment_Contents(t *testing.T, sdk string, copyRules string) { 281 result := android.GroupFixturePreparers( 282 prepareForSdkTestWithJava, 283 java.PrepareForTestWithJavaDefaultModules, 284 java.PrepareForTestWithJavaSdkLibraryFiles, 285 java.FixtureWithLastReleaseApis("mysdklibrary", "myothersdklibrary", "mycoreplatform"), 286 java.FixtureConfigureApexBootJars("myapex:mybootlib", "myapex:myothersdklibrary"), 287 prepareForSdkTestWithApex, 288 289 // Add a platform_bootclasspath that depends on the fragment. 290 fixtureAddPlatformBootclasspathForBootclasspathFragment("myapex", "mybootclasspathfragment"), 291 292 android.PrepareForTestWithBuildFlag("RELEASE_HIDDEN_API_EXPORTABLE_STUBS", "true"), 293 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi 294 // file creation. 295 java.FixtureConfigureBootJars("platform:foo"), 296 android.FixtureModifyMockFS(func(fs android.MockFS) { 297 fs["platform/Android.bp"] = []byte(` 298 java_library { 299 name: "foo", 300 srcs: ["Test.java"], 301 compile_dex: true, 302 } 303 `) 304 fs["platform/Test.java"] = nil 305 }), 306 307 android.FixtureWithRootAndroidBp(sdk+` 308 apex { 309 name: "myapex", 310 key: "myapex.key", 311 min_sdk_version: "2", 312 bootclasspath_fragments: ["mybootclasspathfragment"], 313 } 314 315 bootclasspath_fragment { 316 name: "mybootclasspathfragment", 317 apex_available: ["myapex"], 318 contents: [ 319 // This should be automatically added to the sdk_snapshot as a java_boot_libs module. 320 "mybootlib", 321 // This should be automatically added to the sdk_snapshot as a java_sdk_libs module. 322 "myothersdklibrary", 323 ], 324 api: { 325 stub_libs: ["mysdklibrary"], 326 }, 327 core_platform_api: { 328 // This should be automatically added to the sdk_snapshot as a java_sdk_libs module. 329 stub_libs: ["mycoreplatform"], 330 }, 331 hidden_api: { 332 split_packages: ["*"], 333 }, 334 } 335 336 java_library { 337 name: "mybootlib", 338 apex_available: ["myapex"], 339 srcs: ["Test.java"], 340 system_modules: "none", 341 sdk_version: "none", 342 min_sdk_version: "2", 343 compile_dex: true, 344 permitted_packages: ["mybootlib"], 345 } 346 347 java_sdk_library { 348 name: "mysdklibrary", 349 apex_available: ["myapex"], 350 srcs: ["Test.java"], 351 shared_library: false, 352 public: {enabled: true}, 353 min_sdk_version: "2", 354 sdk_version: "current", 355 } 356 357 java_sdk_library { 358 name: "myothersdklibrary", 359 apex_available: ["myapex"], 360 srcs: ["Test.java"], 361 compile_dex: true, 362 public: {enabled: true}, 363 min_sdk_version: "2", 364 permitted_packages: ["myothersdklibrary"], 365 sdk_version: "current", 366 } 367 368 java_sdk_library { 369 name: "mycoreplatform", 370 apex_available: ["myapex"], 371 srcs: ["Test.java"], 372 compile_dex: true, 373 public: {enabled: true}, 374 min_sdk_version: "2", 375 sdk_version: "current", 376 } 377 `), 378 ).RunTest(t) 379 380 // A preparer to update the test fixture used when processing an unpackage snapshot. 381 preparerForSnapshot := fixtureAddPrebuiltApexForBootclasspathFragment("myapex", "mybootclasspathfragment") 382 383 CheckSnapshot(t, result, "mysdk", "", 384 checkAndroidBpContents(` 385// This is auto-generated. DO NOT EDIT. 386 387apex_contributions_defaults { 388 name: "mysdk.contributions", 389 contents: [ 390 "prebuilt_myothersdklibrary", 391 "prebuilt_mysdklibrary", 392 "prebuilt_mycoreplatform", 393 ], 394} 395 396prebuilt_bootclasspath_fragment { 397 name: "mybootclasspathfragment", 398 prefer: false, 399 visibility: ["//visibility:public"], 400 apex_available: ["myapex"], 401 contents: [ 402 "mybootlib", 403 "myothersdklibrary", 404 ], 405 api: { 406 stub_libs: ["mysdklibrary"], 407 }, 408 core_platform_api: { 409 stub_libs: ["mycoreplatform"], 410 }, 411 hidden_api: { 412 annotation_flags: "hiddenapi/annotation-flags.csv", 413 metadata: "hiddenapi/metadata.csv", 414 index: "hiddenapi/index.csv", 415 signature_patterns: "hiddenapi/signature-patterns.csv", 416 filtered_stub_flags: "hiddenapi/filtered-stub-flags.csv", 417 filtered_flags: "hiddenapi/filtered-flags.csv", 418 }, 419} 420 421java_import { 422 name: "mybootlib", 423 prefer: false, 424 visibility: ["//visibility:public"], 425 apex_available: ["myapex"], 426 jars: ["java_boot_libs/snapshot/jars/are/invalid/mybootlib.jar"], 427 min_sdk_version: "2", 428 permitted_packages: ["mybootlib"], 429} 430 431java_sdk_library_import { 432 name: "myothersdklibrary", 433 prefer: false, 434 visibility: ["//visibility:public"], 435 apex_available: ["myapex"], 436 shared_library: true, 437 compile_dex: true, 438 permitted_packages: ["myothersdklibrary"], 439 public: { 440 jars: ["sdk_library/public/myothersdklibrary-stubs.jar"], 441 stub_srcs: ["sdk_library/public/myothersdklibrary_stub_sources"], 442 current_api: "sdk_library/public/myothersdklibrary.txt", 443 removed_api: "sdk_library/public/myothersdklibrary-removed.txt", 444 sdk_version: "current", 445 }, 446} 447 448java_sdk_library_import { 449 name: "mysdklibrary", 450 prefer: false, 451 visibility: ["//visibility:public"], 452 apex_available: ["myapex"], 453 shared_library: false, 454 public: { 455 jars: ["sdk_library/public/mysdklibrary-stubs.jar"], 456 stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"], 457 current_api: "sdk_library/public/mysdklibrary.txt", 458 removed_api: "sdk_library/public/mysdklibrary-removed.txt", 459 sdk_version: "current", 460 }, 461} 462 463java_sdk_library_import { 464 name: "mycoreplatform", 465 prefer: false, 466 visibility: ["//visibility:public"], 467 apex_available: ["myapex"], 468 shared_library: true, 469 compile_dex: true, 470 public: { 471 jars: ["sdk_library/public/mycoreplatform-stubs.jar"], 472 stub_srcs: ["sdk_library/public/mycoreplatform_stub_sources"], 473 current_api: "sdk_library/public/mycoreplatform.txt", 474 removed_api: "sdk_library/public/mycoreplatform-removed.txt", 475 sdk_version: "current", 476 }, 477} 478 `), 479 checkAllCopyRules(copyRules), 480 snapshotTestPreparer(checkSnapshotWithoutSource, preparerForSnapshot), 481 snapshotTestChecker(checkSnapshotWithoutSource, func(t *testing.T, result *android.TestResult) { 482 module := result.ModuleForTests("platform-bootclasspath", "android_common") 483 var rule android.TestingBuildParams 484 rule = module.Output("out/soong/hiddenapi/hiddenapi-flags.csv") 485 java.CheckHiddenAPIRuleInputs(t, "monolithic flags", ` 486 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/annotation-flags-from-classes.csv 487 out/soong/hiddenapi/hiddenapi-stub-flags.txt 488 snapshot/hiddenapi/annotation-flags.csv 489 `, rule) 490 491 rule = module.Output("out/soong/hiddenapi/hiddenapi-unsupported.csv") 492 java.CheckHiddenAPIRuleInputs(t, "monolithic metadata", ` 493 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/metadata-from-classes.csv 494 snapshot/hiddenapi/metadata.csv 495 `, rule) 496 497 rule = module.Output("out/soong/hiddenapi/hiddenapi-index.csv") 498 java.CheckHiddenAPIRuleInputs(t, "monolithic index", ` 499 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv 500 snapshot/hiddenapi/index.csv 501 `, rule) 502 503 rule = module.Output("out/soong/hiddenapi/hiddenapi-flags.csv.valid") 504 android.AssertStringDoesContain(t, "verify-overlaps", rule.RuleParams.Command, " snapshot/hiddenapi/filtered-flags.csv:snapshot/hiddenapi/signature-patterns.csv ") 505 }), 506 snapshotTestPreparer(checkSnapshotWithSourcePreferred, preparerForSnapshot), 507 snapshotTestChecker(checkSnapshotWithSourcePreferred, func(t *testing.T, result *android.TestResult) { 508 module := result.ModuleForTests("platform-bootclasspath", "android_common") 509 rule := module.Output("out/soong/hiddenapi/hiddenapi-flags.csv.valid") 510 android.AssertStringDoesContain(t, "verify-overlaps", rule.RuleParams.Command, " out/soong/.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/filtered-flags.csv:out/soong/.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/signature-patterns.csv ") 511 }), 512 snapshotTestPreparer(checkSnapshotPreferredWithSource, preparerForSnapshot), 513 ) 514} 515 516func TestSnapshotWithBootClasspathFragment_Contents(t *testing.T) { 517 t.Run("added-directly", func(t *testing.T) { 518 testSnapshotWithBootClasspathFragment_Contents(t, ` 519 sdk { 520 name: "mysdk", 521 bootclasspath_fragments: ["mybootclasspathfragment"], 522 java_sdk_libs: [ 523 // This is not strictly needed as it should be automatically added to the sdk_snapshot as 524 // a java_sdk_libs module because it is used in the mybootclasspathfragment's 525 // api.stub_libs property. However, it is specified here to ensure that duplicates are 526 // correctly deduped. 527 "mysdklibrary", 528 ], 529 } 530 `, ` 531.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/annotation-flags.csv -> hiddenapi/annotation-flags.csv 532.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/metadata.csv -> hiddenapi/metadata.csv 533.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/index.csv -> hiddenapi/index.csv 534.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/signature-patterns.csv -> hiddenapi/signature-patterns.csv 535.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/filtered-stub-flags.csv -> hiddenapi/filtered-stub-flags.csv 536.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/filtered-flags.csv -> hiddenapi/filtered-flags.csv 537.intermediates/mysdk/common_os/empty -> java_boot_libs/snapshot/jars/are/invalid/mybootlib.jar 538.intermediates/myothersdklibrary.stubs.exportable/android_common/combined/myothersdklibrary.stubs.exportable.jar -> sdk_library/public/myothersdklibrary-stubs.jar 539.intermediates/myothersdklibrary.stubs.source/android_common/exportable/myothersdklibrary.stubs.source_api.txt -> sdk_library/public/myothersdklibrary.txt 540.intermediates/myothersdklibrary.stubs.source/android_common/exportable/myothersdklibrary.stubs.source_removed.txt -> sdk_library/public/myothersdklibrary-removed.txt 541.intermediates/mysdklibrary.stubs.exportable/android_common/combined/mysdklibrary.stubs.exportable.jar -> sdk_library/public/mysdklibrary-stubs.jar 542.intermediates/mysdklibrary.stubs.source/android_common/exportable/mysdklibrary.stubs.source_api.txt -> sdk_library/public/mysdklibrary.txt 543.intermediates/mysdklibrary.stubs.source/android_common/exportable/mysdklibrary.stubs.source_removed.txt -> sdk_library/public/mysdklibrary-removed.txt 544.intermediates/mycoreplatform.stubs.exportable/android_common/combined/mycoreplatform.stubs.exportable.jar -> sdk_library/public/mycoreplatform-stubs.jar 545.intermediates/mycoreplatform.stubs.source/android_common/exportable/mycoreplatform.stubs.source_api.txt -> sdk_library/public/mycoreplatform.txt 546.intermediates/mycoreplatform.stubs.source/android_common/exportable/mycoreplatform.stubs.source_removed.txt -> sdk_library/public/mycoreplatform-removed.txt 547`) 548 }) 549 550 copyBootclasspathFragmentFromApexVariantRules := ` 551.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/annotation-flags.csv -> hiddenapi/annotation-flags.csv 552.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/metadata.csv -> hiddenapi/metadata.csv 553.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/index.csv -> hiddenapi/index.csv 554.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/signature-patterns.csv -> hiddenapi/signature-patterns.csv 555.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/filtered-stub-flags.csv -> hiddenapi/filtered-stub-flags.csv 556.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/filtered-flags.csv -> hiddenapi/filtered-flags.csv 557.intermediates/mysdk/common_os/empty -> java_boot_libs/snapshot/jars/are/invalid/mybootlib.jar 558.intermediates/myothersdklibrary.stubs.exportable/android_common/combined/myothersdklibrary.stubs.exportable.jar -> sdk_library/public/myothersdklibrary-stubs.jar 559.intermediates/myothersdklibrary.stubs.source/android_common/exportable/myothersdklibrary.stubs.source_api.txt -> sdk_library/public/myothersdklibrary.txt 560.intermediates/myothersdklibrary.stubs.source/android_common/exportable/myothersdklibrary.stubs.source_removed.txt -> sdk_library/public/myothersdklibrary-removed.txt 561.intermediates/mysdklibrary.stubs.exportable/android_common/combined/mysdklibrary.stubs.exportable.jar -> sdk_library/public/mysdklibrary-stubs.jar 562.intermediates/mysdklibrary.stubs.source/android_common/exportable/mysdklibrary.stubs.source_api.txt -> sdk_library/public/mysdklibrary.txt 563.intermediates/mysdklibrary.stubs.source/android_common/exportable/mysdklibrary.stubs.source_removed.txt -> sdk_library/public/mysdklibrary-removed.txt 564.intermediates/mycoreplatform.stubs.exportable/android_common/combined/mycoreplatform.stubs.exportable.jar -> sdk_library/public/mycoreplatform-stubs.jar 565.intermediates/mycoreplatform.stubs.source/android_common/exportable/mycoreplatform.stubs.source_api.txt -> sdk_library/public/mycoreplatform.txt 566.intermediates/mycoreplatform.stubs.source/android_common/exportable/mycoreplatform.stubs.source_removed.txt -> sdk_library/public/mycoreplatform-removed.txt 567` 568 t.Run("added-via-apex", func(t *testing.T) { 569 testSnapshotWithBootClasspathFragment_Contents(t, ` 570 sdk { 571 name: "mysdk", 572 apexes: ["myapex"], 573 } 574 `, copyBootclasspathFragmentFromApexVariantRules) 575 }) 576 577 t.Run("added-directly-and-indirectly", func(t *testing.T) { 578 testSnapshotWithBootClasspathFragment_Contents(t, ` 579 sdk { 580 name: "mysdk", 581 apexes: ["myapex"], 582 // This is not strictly needed as it should be automatically added to the sdk_snapshot as 583 // a bootclasspath_fragments module because it is used in the myapex's 584 // bootclasspath_fragments property. However, it is specified here to ensure that duplicates 585 // are correctly deduped. 586 bootclasspath_fragments: ["mybootclasspathfragment"], 587 java_sdk_libs: [ 588 // This is not strictly needed as it should be automatically added to the sdk_snapshot as 589 // a java_sdk_libs module because it is used in the mybootclasspathfragment's 590 // api.stub_libs property. However, it is specified here to ensure that duplicates are 591 // correctly deduped. 592 "mysdklibrary", 593 ], 594 } 595 `, copyBootclasspathFragmentFromApexVariantRules) 596 }) 597} 598 599// TestSnapshotWithBootClasspathFragment_Fragments makes sure that the fragments property of a 600// bootclasspath_fragment is correctly output to the sdk snapshot. 601func TestSnapshotWithBootClasspathFragment_Fragments(t *testing.T) { 602 result := android.GroupFixturePreparers( 603 prepareForSdkTestWithJava, 604 java.PrepareForTestWithJavaDefaultModules, 605 java.PrepareForTestWithJavaSdkLibraryFiles, 606 java.FixtureWithLastReleaseApis("mysdklibrary", "myothersdklibrary"), 607 java.FixtureConfigureApexBootJars("someapex:mysdklibrary", "myotherapex:myotherlib"), 608 prepareForSdkTestWithApex, 609 610 // Some additional files needed for the myotherapex. 611 android.FixtureMergeMockFs(android.MockFS{ 612 "system/sepolicy/apex/myotherapex-file_contexts": nil, 613 "myotherapex/apex_manifest.json": nil, 614 "myotherapex/Test.java": nil, 615 }), 616 617 android.FixtureAddTextFile("myotherapex/Android.bp", ` 618 apex { 619 name: "myotherapex", 620 key: "myapex.key", 621 min_sdk_version: "2", 622 bootclasspath_fragments: ["myotherbootclasspathfragment"], 623 } 624 625 bootclasspath_fragment { 626 name: "myotherbootclasspathfragment", 627 apex_available: ["myotherapex"], 628 contents: [ 629 "myotherlib", 630 ], 631 hidden_api: { 632 split_packages: ["*"], 633 }, 634 } 635 636 java_library { 637 name: "myotherlib", 638 apex_available: ["myotherapex"], 639 srcs: ["Test.java"], 640 min_sdk_version: "2", 641 permitted_packages: ["myothersdklibrary"], 642 compile_dex: true, 643 sdk_version: "current", 644 } 645 `), 646 647 android.FixtureWithRootAndroidBp(` 648 sdk { 649 name: "mysdk", 650 bootclasspath_fragments: ["mybootclasspathfragment"], 651 } 652 653 bootclasspath_fragment { 654 name: "mybootclasspathfragment", 655 contents: [ 656 "mysdklibrary", 657 ], 658 fragments: [ 659 { 660 apex: "myotherapex", 661 module: "myotherbootclasspathfragment" 662 }, 663 ], 664 hidden_api: { 665 split_packages: ["*"], 666 }, 667 } 668 669 java_sdk_library { 670 name: "mysdklibrary", 671 srcs: ["Test.java"], 672 shared_library: false, 673 public: {enabled: true}, 674 min_sdk_version: "2", 675 sdk_version: "current", 676 } 677 `), 678 ).RunTest(t) 679 680 // A preparer to update the test fixture used when processing an unpackage snapshot. 681 preparerForSnapshot := fixtureAddPrebuiltApexForBootclasspathFragment("myapex", "mybootclasspathfragment") 682 683 CheckSnapshot(t, result, "mysdk", "", 684 checkAndroidBpContents(` 685// This is auto-generated. DO NOT EDIT. 686 687apex_contributions_defaults { 688 name: "mysdk.contributions", 689 contents: ["prebuilt_mysdklibrary"], 690} 691 692prebuilt_bootclasspath_fragment { 693 name: "mybootclasspathfragment", 694 prefer: false, 695 visibility: ["//visibility:public"], 696 apex_available: ["//apex_available:platform"], 697 contents: ["mysdklibrary"], 698 fragments: [ 699 { 700 apex: "myotherapex", 701 module: "myotherbootclasspathfragment", 702 }, 703 ], 704 hidden_api: { 705 annotation_flags: "hiddenapi/annotation-flags.csv", 706 metadata: "hiddenapi/metadata.csv", 707 index: "hiddenapi/index.csv", 708 signature_patterns: "hiddenapi/signature-patterns.csv", 709 filtered_stub_flags: "hiddenapi/filtered-stub-flags.csv", 710 filtered_flags: "hiddenapi/filtered-flags.csv", 711 }, 712} 713 714java_sdk_library_import { 715 name: "mysdklibrary", 716 prefer: false, 717 visibility: ["//visibility:public"], 718 apex_available: ["//apex_available:platform"], 719 shared_library: false, 720 public: { 721 jars: ["sdk_library/public/mysdklibrary-stubs.jar"], 722 stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"], 723 current_api: "sdk_library/public/mysdklibrary.txt", 724 removed_api: "sdk_library/public/mysdklibrary-removed.txt", 725 sdk_version: "current", 726 }, 727} 728 `), 729 snapshotTestPreparer(checkSnapshotWithoutSource, preparerForSnapshot), 730 snapshotTestPreparer(checkSnapshotWithSourcePreferred, preparerForSnapshot), 731 snapshotTestPreparer(checkSnapshotPreferredWithSource, preparerForSnapshot), 732 ) 733} 734 735// Test that bootclasspath_fragment works with sdk. 736func TestBasicSdkWithBootclasspathFragment(t *testing.T) { 737 android.GroupFixturePreparers( 738 prepareForSdkTestWithApex, 739 prepareForSdkTestWithJava, 740 android.FixtureMergeMockFs(android.MockFS{ 741 "java/mybootlib.jar": nil, 742 "hiddenapi/annotation-flags.csv": nil, 743 "hiddenapi/index.csv": nil, 744 "hiddenapi/metadata.csv": nil, 745 "hiddenapi/signature-patterns.csv": nil, 746 "hiddenapi/filtered-stub-flags.csv": nil, 747 "hiddenapi/filtered-flags.csv": nil, 748 }), 749 android.FixtureWithRootAndroidBp(` 750 sdk { 751 name: "mysdk", 752 bootclasspath_fragments: ["mybootclasspathfragment"], 753 } 754 755 bootclasspath_fragment { 756 name: "mybootclasspathfragment", 757 image_name: "art", 758 contents: ["mybootlib"], 759 apex_available: ["myapex"], 760 hidden_api: { 761 split_packages: ["*"], 762 }, 763 } 764 765 java_library { 766 name: "mybootlib", 767 apex_available: ["myapex"], 768 srcs: ["Test.java"], 769 system_modules: "none", 770 sdk_version: "none", 771 min_sdk_version: "1", 772 compile_dex: true, 773 } 774 775 prebuilt_bootclasspath_fragment { 776 name: "mybootclasspathfragment", 777 prefer: false, 778 visibility: ["//visibility:public"], 779 apex_available: [ 780 "myapex", 781 ], 782 image_name: "art", 783 contents: ["mybootlib"], 784 hidden_api: { 785 annotation_flags: "hiddenapi/annotation-flags.csv", 786 metadata: "hiddenapi/metadata.csv", 787 index: "hiddenapi/index.csv", 788 signature_patterns: "hiddenapi/signature-patterns.csv", 789 filtered_stub_flags: "hiddenapi/filtered-stub-flags.csv", 790 filtered_flags: "hiddenapi/filtered-flags.csv", 791 }, 792 } 793 794 java_import { 795 name: "mybootlib", 796 visibility: ["//visibility:public"], 797 apex_available: ["com.android.art"], 798 jars: ["java/mybootlib.jar"], 799 } 800 `), 801 ).RunTest(t) 802} 803 804func TestSnapshotWithBootclasspathFragment_HiddenAPI(t *testing.T) { 805 result := android.GroupFixturePreparers( 806 prepareForSdkTestWithJava, 807 java.PrepareForTestWithJavaDefaultModules, 808 java.PrepareForTestWithJavaSdkLibraryFiles, 809 java.FixtureWithLastReleaseApis("mysdklibrary", "mynewlibrary"), 810 java.FixtureConfigureApexBootJars("myapex:mybootlib", "myapex:mynewlibrary"), 811 prepareForSdkTestWithApex, 812 813 // Add a platform_bootclasspath that depends on the fragment. 814 fixtureAddPlatformBootclasspathForBootclasspathFragment("myapex", "mybootclasspathfragment"), 815 816 android.PrepareForTestWithBuildFlag("RELEASE_HIDDEN_API_EXPORTABLE_STUBS", "true"), 817 818 android.MockFS{ 819 "my-blocked.txt": nil, 820 "my-max-target-o-low-priority.txt": nil, 821 "my-max-target-p.txt": nil, 822 "my-max-target-q.txt": nil, 823 "my-max-target-r-low-priority.txt": nil, 824 "my-removed.txt": nil, 825 "my-unsupported-packages.txt": nil, 826 "my-unsupported.txt": nil, 827 "my-new-max-target-q.txt": nil, 828 }.AddToFixture(), 829 android.FixtureWithRootAndroidBp(` 830 sdk { 831 name: "mysdk", 832 bootclasspath_fragments: ["mybootclasspathfragment"], 833 } 834 835 apex { 836 name: "myapex", 837 key: "myapex.key", 838 min_sdk_version: "1", 839 bootclasspath_fragments: ["mybootclasspathfragment"], 840 } 841 842 bootclasspath_fragment { 843 name: "mybootclasspathfragment", 844 apex_available: ["myapex"], 845 contents: ["mybootlib", "mynewlibrary"], 846 api: { 847 stub_libs: ["mysdklibrary"], 848 }, 849 hidden_api: { 850 unsupported: [ 851 "my-unsupported.txt", 852 ], 853 removed: [ 854 "my-removed.txt", 855 ], 856 max_target_r_low_priority: [ 857 "my-max-target-r-low-priority.txt", 858 ], 859 max_target_q: [ 860 "my-max-target-q.txt", 861 ], 862 max_target_p: [ 863 "my-max-target-p.txt", 864 ], 865 max_target_o_low_priority: [ 866 "my-max-target-o-low-priority.txt", 867 ], 868 blocked: [ 869 "my-blocked.txt", 870 ], 871 unsupported_packages: [ 872 "my-unsupported-packages.txt", 873 ], 874 split_packages: ["sdklibrary"], 875 package_prefixes: ["sdklibrary.all.mine"], 876 single_packages: ["sdklibrary.mine"], 877 }, 878 } 879 880 java_library { 881 name: "mybootlib", 882 apex_available: ["myapex"], 883 srcs: ["Test.java"], 884 system_modules: "none", 885 sdk_version: "none", 886 min_sdk_version: "1", 887 compile_dex: true, 888 permitted_packages: ["mybootlib"], 889 } 890 891 java_sdk_library { 892 name: "mysdklibrary", 893 srcs: ["Test.java"], 894 compile_dex: true, 895 public: {enabled: true}, 896 permitted_packages: ["mysdklibrary"], 897 min_sdk_version: "current", 898 sdk_version: "current", 899 } 900 901 java_sdk_library { 902 name: "mynewlibrary", 903 apex_available: ["myapex"], 904 srcs: ["Test.java"], 905 min_sdk_version: "10", 906 compile_dex: true, 907 public: {enabled: true}, 908 permitted_packages: ["mysdklibrary"], 909 hidden_api: { 910 max_target_q: [ 911 "my-new-max-target-q.txt", 912 ], 913 split_packages: ["sdklibrary", "newlibrary"], 914 package_prefixes: ["newlibrary.all.mine"], 915 single_packages: ["newlibrary.mine"], 916 }, 917 sdk_version: "current", 918 } 919 `), 920 ).RunTest(t) 921 922 // A preparer to update the test fixture used when processing an unpackage snapshot. 923 preparerForSnapshot := fixtureAddPrebuiltApexForBootclasspathFragment("myapex", "mybootclasspathfragment") 924 925 CheckSnapshot(t, result, "mysdk", "", 926 checkAndroidBpContents(` 927// This is auto-generated. DO NOT EDIT. 928 929apex_contributions_defaults { 930 name: "mysdk.contributions", 931 contents: [ 932 "prebuilt_mynewlibrary", 933 "prebuilt_mysdklibrary", 934 ], 935} 936 937prebuilt_bootclasspath_fragment { 938 name: "mybootclasspathfragment", 939 prefer: false, 940 visibility: ["//visibility:public"], 941 apex_available: ["myapex"], 942 contents: [ 943 "mybootlib", 944 "mynewlibrary", 945 ], 946 api: { 947 stub_libs: ["mysdklibrary"], 948 }, 949 hidden_api: { 950 unsupported: ["hiddenapi/my-unsupported.txt"], 951 removed: ["hiddenapi/my-removed.txt"], 952 max_target_r_low_priority: ["hiddenapi/my-max-target-r-low-priority.txt"], 953 max_target_q: [ 954 "hiddenapi/my-max-target-q.txt", 955 "hiddenapi/my-new-max-target-q.txt", 956 ], 957 max_target_p: ["hiddenapi/my-max-target-p.txt"], 958 max_target_o_low_priority: ["hiddenapi/my-max-target-o-low-priority.txt"], 959 blocked: ["hiddenapi/my-blocked.txt"], 960 unsupported_packages: ["hiddenapi/my-unsupported-packages.txt"], 961 annotation_flags: "hiddenapi/annotation-flags.csv", 962 metadata: "hiddenapi/metadata.csv", 963 index: "hiddenapi/index.csv", 964 signature_patterns: "hiddenapi/signature-patterns.csv", 965 filtered_stub_flags: "hiddenapi/filtered-stub-flags.csv", 966 filtered_flags: "hiddenapi/filtered-flags.csv", 967 }, 968} 969 970java_import { 971 name: "mybootlib", 972 prefer: false, 973 visibility: ["//visibility:public"], 974 apex_available: ["myapex"], 975 jars: ["java_boot_libs/snapshot/jars/are/invalid/mybootlib.jar"], 976 min_sdk_version: "1", 977 permitted_packages: ["mybootlib"], 978} 979 980java_sdk_library_import { 981 name: "mynewlibrary", 982 prefer: false, 983 visibility: ["//visibility:public"], 984 apex_available: ["myapex"], 985 shared_library: true, 986 compile_dex: true, 987 permitted_packages: ["mysdklibrary"], 988 public: { 989 jars: ["sdk_library/public/mynewlibrary-stubs.jar"], 990 stub_srcs: ["sdk_library/public/mynewlibrary_stub_sources"], 991 current_api: "sdk_library/public/mynewlibrary.txt", 992 removed_api: "sdk_library/public/mynewlibrary-removed.txt", 993 sdk_version: "current", 994 }, 995} 996 997java_sdk_library_import { 998 name: "mysdklibrary", 999 prefer: false, 1000 visibility: ["//visibility:public"], 1001 apex_available: ["//apex_available:platform"], 1002 shared_library: true, 1003 compile_dex: true, 1004 permitted_packages: ["mysdklibrary"], 1005 public: { 1006 jars: ["sdk_library/public/mysdklibrary-stubs.jar"], 1007 stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"], 1008 current_api: "sdk_library/public/mysdklibrary.txt", 1009 removed_api: "sdk_library/public/mysdklibrary-removed.txt", 1010 sdk_version: "current", 1011 }, 1012} 1013`), 1014 checkAllCopyRules(` 1015my-unsupported.txt -> hiddenapi/my-unsupported.txt 1016my-removed.txt -> hiddenapi/my-removed.txt 1017my-max-target-r-low-priority.txt -> hiddenapi/my-max-target-r-low-priority.txt 1018my-max-target-q.txt -> hiddenapi/my-max-target-q.txt 1019my-new-max-target-q.txt -> hiddenapi/my-new-max-target-q.txt 1020my-max-target-p.txt -> hiddenapi/my-max-target-p.txt 1021my-max-target-o-low-priority.txt -> hiddenapi/my-max-target-o-low-priority.txt 1022my-blocked.txt -> hiddenapi/my-blocked.txt 1023my-unsupported-packages.txt -> hiddenapi/my-unsupported-packages.txt 1024.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/annotation-flags.csv -> hiddenapi/annotation-flags.csv 1025.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/metadata.csv -> hiddenapi/metadata.csv 1026.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/index.csv -> hiddenapi/index.csv 1027.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/signature-patterns.csv -> hiddenapi/signature-patterns.csv 1028.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/filtered-stub-flags.csv -> hiddenapi/filtered-stub-flags.csv 1029.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/filtered-flags.csv -> hiddenapi/filtered-flags.csv 1030.intermediates/mysdk/common_os/empty -> java_boot_libs/snapshot/jars/are/invalid/mybootlib.jar 1031.intermediates/mynewlibrary.stubs.exportable/android_common/combined/mynewlibrary.stubs.exportable.jar -> sdk_library/public/mynewlibrary-stubs.jar 1032.intermediates/mynewlibrary.stubs.source/android_common/exportable/mynewlibrary.stubs.source_api.txt -> sdk_library/public/mynewlibrary.txt 1033.intermediates/mynewlibrary.stubs.source/android_common/exportable/mynewlibrary.stubs.source_removed.txt -> sdk_library/public/mynewlibrary-removed.txt 1034.intermediates/mysdklibrary.stubs.exportable/android_common/combined/mysdklibrary.stubs.exportable.jar -> sdk_library/public/mysdklibrary-stubs.jar 1035.intermediates/mysdklibrary.stubs.source/android_common/exportable/mysdklibrary.stubs.source_api.txt -> sdk_library/public/mysdklibrary.txt 1036.intermediates/mysdklibrary.stubs.source/android_common/exportable/mysdklibrary.stubs.source_removed.txt -> sdk_library/public/mysdklibrary-removed.txt 1037`), 1038 snapshotTestPreparer(checkSnapshotWithoutSource, preparerForSnapshot), 1039 snapshotTestPreparer(checkSnapshotWithSourcePreferred, preparerForSnapshot), 1040 snapshotTestPreparer(checkSnapshotPreferredWithSource, preparerForSnapshot), 1041 ) 1042} 1043 1044func testSnapshotWithBootClasspathFragment_MinSdkVersion(t *testing.T, targetBuildRelease string, 1045 expectedSdkSnapshot string, 1046 expectedCopyRules string, 1047 expectedStubFlagsInputs []string, 1048 suffix string) { 1049 1050 result := android.GroupFixturePreparers( 1051 prepareForSdkTestWithJava, 1052 java.PrepareForTestWithJavaDefaultModules, 1053 java.PrepareForTestWithJavaSdkLibraryFiles, 1054 java.FixtureWithLastReleaseApis("mysdklibrary", "mynewsdklibrary"), 1055 java.FixtureConfigureApexBootJars("myapex:mysdklibrary", "myapex:mynewsdklibrary"), 1056 prepareForSdkTestWithApex, 1057 1058 // Add a platform_bootclasspath that depends on the fragment. 1059 fixtureAddPlatformBootclasspathForBootclasspathFragment("myapex", "mybootclasspathfragment"), 1060 1061 android.FixtureMergeEnv(map[string]string{ 1062 "SOONG_SDK_SNAPSHOT_TARGET_BUILD_RELEASE": targetBuildRelease, 1063 }), 1064 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 1065 variables.Platform_version_active_codenames = []string{"VanillaIceCream"} 1066 }), 1067 1068 android.PrepareForTestWithBuildFlag("RELEASE_HIDDEN_API_EXPORTABLE_STUBS", "true"), 1069 1070 android.FixtureWithRootAndroidBp(` 1071 sdk { 1072 name: "mysdk", 1073 apexes: ["myapex"], 1074 } 1075 1076 apex { 1077 name: "myapex", 1078 key: "myapex.key", 1079 min_sdk_version: "S", 1080 bootclasspath_fragments: ["mybootclasspathfragment"], 1081 } 1082 1083 bootclasspath_fragment { 1084 name: "mybootclasspathfragment", 1085 apex_available: ["myapex"], 1086 contents: [ 1087 "mysdklibrary", 1088 "mynewsdklibrary", 1089 ], 1090 1091 hidden_api: { 1092 split_packages: [], 1093 }, 1094 } 1095 1096 java_sdk_library { 1097 name: "mysdklibrary", 1098 apex_available: ["myapex"], 1099 srcs: ["Test.java"], 1100 shared_library: false, 1101 public: {enabled: true}, 1102 min_sdk_version: "S", 1103 sdk_version: "current", 1104 } 1105 1106 java_sdk_library { 1107 name: "mynewsdklibrary", 1108 apex_available: ["myapex"], 1109 srcs: ["Test.java"], 1110 compile_dex: true, 1111 public: {enabled: true}, 1112 min_sdk_version: "Tiramisu", 1113 permitted_packages: ["mynewsdklibrary"], 1114 sdk_version: "current", 1115 } 1116 `), 1117 ).RunTest(t) 1118 1119 bcpf := result.ModuleForTests("mybootclasspathfragment", "android_common") 1120 rule := bcpf.Output("out/soong/.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi" + suffix + "/stub-flags.csv") 1121 android.AssertPathsRelativeToTopEquals(t, "stub flags inputs", android.SortedUniqueStrings(expectedStubFlagsInputs), android.SortedUniquePaths(rule.Implicits)) 1122 1123 CheckSnapshot(t, result, "mysdk", "", 1124 checkAndroidBpContents(expectedSdkSnapshot), 1125 checkAllCopyRules(expectedCopyRules), 1126 ) 1127} 1128 1129func TestSnapshotWithBootClasspathFragment_MinSdkVersion(t *testing.T) { 1130 t.Run("target S build", func(t *testing.T) { 1131 expectedSnapshot := ` 1132// This is auto-generated. DO NOT EDIT. 1133 1134prebuilt_bootclasspath_fragment { 1135 name: "mybootclasspathfragment", 1136 prefer: false, 1137 visibility: ["//visibility:public"], 1138 apex_available: ["myapex"], 1139 contents: ["mysdklibrary"], 1140 hidden_api: { 1141 annotation_flags: "hiddenapi/annotation-flags.csv", 1142 metadata: "hiddenapi/metadata.csv", 1143 index: "hiddenapi/index.csv", 1144 stub_flags: "hiddenapi/stub-flags.csv", 1145 all_flags: "hiddenapi/all-flags.csv", 1146 }, 1147} 1148 1149java_sdk_library_import { 1150 name: "mysdklibrary", 1151 prefer: false, 1152 visibility: ["//visibility:public"], 1153 apex_available: ["myapex"], 1154 shared_library: false, 1155 public: { 1156 jars: ["sdk_library/public/mysdklibrary-stubs.jar"], 1157 stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"], 1158 current_api: "sdk_library/public/mysdklibrary.txt", 1159 removed_api: "sdk_library/public/mysdklibrary-removed.txt", 1160 sdk_version: "current", 1161 }, 1162} 1163` 1164 expectedCopyRules := ` 1165.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi-for-sdk-snapshot/annotation-flags.csv -> hiddenapi/annotation-flags.csv 1166.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi-for-sdk-snapshot/metadata.csv -> hiddenapi/metadata.csv 1167.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi-for-sdk-snapshot/index.csv -> hiddenapi/index.csv 1168.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi-for-sdk-snapshot/stub-flags.csv -> hiddenapi/stub-flags.csv 1169.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi-for-sdk-snapshot/all-flags.csv -> hiddenapi/all-flags.csv 1170.intermediates/mysdklibrary.stubs.exportable/android_common/combined/mysdklibrary.stubs.exportable.jar -> sdk_library/public/mysdklibrary-stubs.jar 1171.intermediates/mysdklibrary.stubs.source/android_common/exportable/mysdklibrary.stubs.source_api.txt -> sdk_library/public/mysdklibrary.txt 1172.intermediates/mysdklibrary.stubs.source/android_common/exportable/mysdklibrary.stubs.source_removed.txt -> sdk_library/public/mysdklibrary-removed.txt 1173` 1174 1175 // On S the stub flags should only be generated from mysdklibrary as mynewsdklibrary is not part 1176 // of the snapshot. 1177 expectedStubFlagsInputs := []string{ 1178 "out/soong/.intermediates/mysdklibrary.stubs.exportable/android_common/dex/mysdklibrary.stubs.exportable.jar", 1179 "out/soong/.intermediates/mysdklibrary.impl/android_common/aligned/mysdklibrary.jar", 1180 } 1181 1182 testSnapshotWithBootClasspathFragment_MinSdkVersion(t, "S", 1183 expectedSnapshot, expectedCopyRules, expectedStubFlagsInputs, "-for-sdk-snapshot") 1184 }) 1185 1186 t.Run("target-Tiramisu-build", func(t *testing.T) { 1187 expectedSnapshot := ` 1188// This is auto-generated. DO NOT EDIT. 1189 1190prebuilt_bootclasspath_fragment { 1191 name: "mybootclasspathfragment", 1192 prefer: false, 1193 visibility: ["//visibility:public"], 1194 apex_available: ["myapex"], 1195 contents: [ 1196 "mysdklibrary", 1197 "mynewsdklibrary", 1198 ], 1199 hidden_api: { 1200 annotation_flags: "hiddenapi/annotation-flags.csv", 1201 metadata: "hiddenapi/metadata.csv", 1202 index: "hiddenapi/index.csv", 1203 signature_patterns: "hiddenapi/signature-patterns.csv", 1204 filtered_stub_flags: "hiddenapi/filtered-stub-flags.csv", 1205 filtered_flags: "hiddenapi/filtered-flags.csv", 1206 }, 1207} 1208 1209java_sdk_library_import { 1210 name: "mysdklibrary", 1211 prefer: false, 1212 visibility: ["//visibility:public"], 1213 apex_available: ["myapex"], 1214 shared_library: false, 1215 public: { 1216 jars: ["sdk_library/public/mysdklibrary-stubs.jar"], 1217 stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"], 1218 current_api: "sdk_library/public/mysdklibrary.txt", 1219 removed_api: "sdk_library/public/mysdklibrary-removed.txt", 1220 sdk_version: "current", 1221 }, 1222} 1223 1224java_sdk_library_import { 1225 name: "mynewsdklibrary", 1226 prefer: false, 1227 visibility: ["//visibility:public"], 1228 apex_available: ["myapex"], 1229 shared_library: true, 1230 compile_dex: true, 1231 permitted_packages: ["mynewsdklibrary"], 1232 public: { 1233 jars: ["sdk_library/public/mynewsdklibrary-stubs.jar"], 1234 stub_srcs: ["sdk_library/public/mynewsdklibrary_stub_sources"], 1235 current_api: "sdk_library/public/mynewsdklibrary.txt", 1236 removed_api: "sdk_library/public/mynewsdklibrary-removed.txt", 1237 sdk_version: "current", 1238 }, 1239} 1240` 1241 expectedCopyRules := ` 1242.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/annotation-flags.csv -> hiddenapi/annotation-flags.csv 1243.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/metadata.csv -> hiddenapi/metadata.csv 1244.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/index.csv -> hiddenapi/index.csv 1245.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/signature-patterns.csv -> hiddenapi/signature-patterns.csv 1246.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/filtered-stub-flags.csv -> hiddenapi/filtered-stub-flags.csv 1247.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/filtered-flags.csv -> hiddenapi/filtered-flags.csv 1248.intermediates/mysdklibrary.stubs.exportable/android_common/combined/mysdklibrary.stubs.exportable.jar -> sdk_library/public/mysdklibrary-stubs.jar 1249.intermediates/mysdklibrary.stubs.source/android_common/exportable/mysdklibrary.stubs.source_api.txt -> sdk_library/public/mysdklibrary.txt 1250.intermediates/mysdklibrary.stubs.source/android_common/exportable/mysdklibrary.stubs.source_removed.txt -> sdk_library/public/mysdklibrary-removed.txt 1251.intermediates/mynewsdklibrary.stubs.exportable/android_common/combined/mynewsdklibrary.stubs.exportable.jar -> sdk_library/public/mynewsdklibrary-stubs.jar 1252.intermediates/mynewsdklibrary.stubs.source/android_common/exportable/mynewsdklibrary.stubs.source_api.txt -> sdk_library/public/mynewsdklibrary.txt 1253.intermediates/mynewsdklibrary.stubs.source/android_common/exportable/mynewsdklibrary.stubs.source_removed.txt -> sdk_library/public/mynewsdklibrary-removed.txt 1254` 1255 1256 // On tiramisu the stub flags should be generated from both mynewsdklibrary and mysdklibrary as 1257 // they are both part of the snapshot. 1258 expectedStubFlagsInputs := []string{ 1259 "out/soong/.intermediates/mynewsdklibrary.stubs.exportable/android_common/dex/mynewsdklibrary.stubs.exportable.jar", 1260 "out/soong/.intermediates/mynewsdklibrary.impl/android_common/aligned/mynewsdklibrary.jar", 1261 "out/soong/.intermediates/mysdklibrary.stubs.exportable/android_common/dex/mysdklibrary.stubs.exportable.jar", 1262 "out/soong/.intermediates/mysdklibrary.impl/android_common/aligned/mysdklibrary.jar", 1263 } 1264 1265 testSnapshotWithBootClasspathFragment_MinSdkVersion(t, "Tiramisu", 1266 expectedSnapshot, expectedCopyRules, expectedStubFlagsInputs, "") 1267 }) 1268} 1269 1270func TestSnapshotWithEmptyBootClasspathFragment(t *testing.T) { 1271 result := android.GroupFixturePreparers( 1272 prepareForSdkTestWithJava, 1273 java.PrepareForTestWithJavaDefaultModules, 1274 java.PrepareForTestWithJavaSdkLibraryFiles, 1275 java.FixtureWithLastReleaseApis("mysdklibrary", "mynewsdklibrary"), 1276 java.FixtureConfigureApexBootJars("myapex:mysdklibrary", "myapex:mynewsdklibrary"), 1277 prepareForSdkTestWithApex, 1278 // Add a platform_bootclasspath that depends on the fragment. 1279 fixtureAddPlatformBootclasspathForBootclasspathFragment("myapex", "mybootclasspathfragment"), 1280 android.FixtureMergeEnv(map[string]string{ 1281 "SOONG_SDK_SNAPSHOT_TARGET_BUILD_RELEASE": "S", 1282 }), 1283 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 1284 variables.Platform_version_active_codenames = []string{"VanillaIceCream"} 1285 }), 1286 android.FixtureWithRootAndroidBp(` 1287 sdk { 1288 name: "mysdk", 1289 apexes: ["myapex"], 1290 } 1291 apex { 1292 name: "myapex", 1293 key: "myapex.key", 1294 min_sdk_version: "S", 1295 bootclasspath_fragments: ["mybootclasspathfragment"], 1296 } 1297 bootclasspath_fragment { 1298 name: "mybootclasspathfragment", 1299 apex_available: ["myapex"], 1300 contents: ["mysdklibrary", "mynewsdklibrary"], 1301 hidden_api: { 1302 split_packages: [], 1303 }, 1304 } 1305 java_sdk_library { 1306 name: "mysdklibrary", 1307 apex_available: ["myapex"], 1308 srcs: ["Test.java"], 1309 shared_library: false, 1310 public: {enabled: true}, 1311 min_sdk_version: "Tiramisu", 1312 sdk_version: "current", 1313 } 1314 java_sdk_library { 1315 name: "mynewsdklibrary", 1316 apex_available: ["myapex"], 1317 srcs: ["Test.java"], 1318 compile_dex: true, 1319 public: {enabled: true}, 1320 min_sdk_version: "Tiramisu", 1321 permitted_packages: ["mynewsdklibrary"], 1322 sdk_version: "current", 1323 } 1324 `), 1325 ).RunTest(t) 1326 1327 CheckSnapshot(t, result, "mysdk", "", checkAndroidBpContents(`// This is auto-generated. DO NOT EDIT.`)) 1328} 1329