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