1// Copyright 2019 Google Inc. All rights reserved. 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); 4// you may not use this file except in compliance with the License. 5// You may obtain a copy of the License at 6// 7// http://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, 11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12// See the License for the specific language governing permissions and 13// limitations under the License. 14 15package apex 16 17import ( 18 "fmt" 19 "path/filepath" 20 "sort" 21 "testing" 22 23 "android/soong/android" 24 "android/soong/java" 25) 26 27func testDexpreoptBoot(t *testing.T, ruleFile string, expectedInputs, expectedOutputs []string, preferPrebuilt bool) { 28 bp := ` 29 // Platform. 30 31 java_sdk_library { 32 name: "foo", 33 srcs: ["a.java"], 34 api_packages: ["foo"], 35 } 36 37 java_library { 38 name: "bar", 39 srcs: ["b.java"], 40 installable: true, 41 system_ext_specific: true, 42 } 43 44 dex_import { 45 name: "baz", 46 jars: ["a.jar"], 47 } 48 49 platform_bootclasspath { 50 name: "platform-bootclasspath", 51 fragments: [ 52 { 53 apex: "com.android.art", 54 module: "art-bootclasspath-fragment", 55 }, 56 ], 57 } 58 59 // Source ART APEX. 60 61 java_library { 62 name: "core-oj", 63 srcs: ["core-oj.java"], 64 installable: true, 65 apex_available: [ 66 "com.android.art", 67 ], 68 } 69 70 bootclasspath_fragment { 71 name: "art-bootclasspath-fragment", 72 image_name: "art", 73 contents: ["core-oj"], 74 apex_available: [ 75 "com.android.art", 76 ], 77 hidden_api: { 78 split_packages: ["*"], 79 }, 80 } 81 82 apex_key { 83 name: "com.android.art.key", 84 public_key: "com.android.art.avbpubkey", 85 private_key: "com.android.art.pem", 86 } 87 88 apex { 89 name: "com.android.art", 90 key: "com.android.art.key", 91 bootclasspath_fragments: ["art-bootclasspath-fragment"], 92 updatable: false, 93 } 94 95 // Prebuilt ART APEX. 96 97 java_import { 98 name: "core-oj", 99 prefer: %[1]t, 100 jars: ["core-oj.jar"], 101 apex_available: [ 102 "com.android.art", 103 ], 104 } 105 106 prebuilt_bootclasspath_fragment { 107 name: "art-bootclasspath-fragment", 108 prefer: %[1]t, 109 image_name: "art", 110 contents: ["core-oj"], 111 hidden_api: { 112 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv", 113 metadata: "my-bootclasspath-fragment/metadata.csv", 114 index: "my-bootclasspath-fragment/index.csv", 115 stub_flags: "my-bootclasspath-fragment/stub-flags.csv", 116 all_flags: "my-bootclasspath-fragment/all-flags.csv", 117 }, 118 apex_available: [ 119 "com.android.art", 120 ], 121 } 122 123 prebuilt_apex { 124 name: "com.android.art", 125 prefer: %[1]t, 126 apex_name: "com.android.art", 127 src: "com.android.art-arm.apex", 128 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"], 129 } 130 ` 131 132 result := android.GroupFixturePreparers( 133 java.PrepareForTestWithDexpreopt, 134 java.PrepareForTestWithJavaSdkLibraryFiles, 135 java.FixtureWithLastReleaseApis("foo"), 136 java.FixtureConfigureBootJars("com.android.art:core-oj", "platform:foo", "system_ext:bar", "platform:baz"), 137 PrepareForTestWithApexBuildComponents, 138 prepareForTestWithArtApex, 139 ).RunTestWithBp(t, fmt.Sprintf(bp, preferPrebuilt)) 140 141 platformBootclasspath := result.ModuleForTests("platform-bootclasspath", "android_common") 142 rule := platformBootclasspath.Output(ruleFile) 143 144 inputs := rule.Implicits.Strings() 145 sort.Strings(inputs) 146 sort.Strings(expectedInputs) 147 148 outputs := append(android.WritablePaths{rule.Output}, rule.ImplicitOutputs...).Strings() 149 sort.Strings(outputs) 150 sort.Strings(expectedOutputs) 151 152 android.AssertStringPathsRelativeToTopEquals(t, "inputs", result.Config, expectedInputs, inputs) 153 154 android.AssertStringPathsRelativeToTopEquals(t, "outputs", result.Config, expectedOutputs, outputs) 155} 156 157func TestDexpreoptBootJarsWithSourceArtApex(t *testing.T) { 158 ruleFile := "boot.art" 159 160 expectedInputs := []string{ 161 "out/soong/dexpreopt_arm64/dex_bootjars_input/core-oj.jar", 162 "out/soong/dexpreopt_arm64/dex_bootjars_input/foo.jar", 163 "out/soong/dexpreopt_arm64/dex_bootjars_input/bar.jar", 164 "out/soong/dexpreopt_arm64/dex_bootjars_input/baz.jar", 165 "out/soong/dexpreopt_arm64/dex_artjars/boot.prof", 166 "out/soong/dexpreopt_arm64/dex_bootjars/boot.prof", 167 } 168 169 expectedOutputs := []string{ 170 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot.invocation", 171 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot.art", 172 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-foo.art", 173 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-bar.art", 174 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-baz.art", 175 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot.oat", 176 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-foo.oat", 177 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-bar.oat", 178 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-baz.oat", 179 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot.vdex", 180 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-foo.vdex", 181 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-bar.vdex", 182 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-baz.vdex", 183 "out/soong/dexpreopt_arm64/dex_bootjars_unstripped/android/system/framework/arm64/boot.oat", 184 "out/soong/dexpreopt_arm64/dex_bootjars_unstripped/android/system/framework/arm64/boot-foo.oat", 185 "out/soong/dexpreopt_arm64/dex_bootjars_unstripped/android/system/framework/arm64/boot-bar.oat", 186 "out/soong/dexpreopt_arm64/dex_bootjars_unstripped/android/system/framework/arm64/boot-baz.oat", 187 } 188 189 testDexpreoptBoot(t, ruleFile, expectedInputs, expectedOutputs, false) 190} 191 192// The only difference is that the ART profile should be deapexed from the prebuilt APEX. Other 193// inputs and outputs should be the same as above. 194func TestDexpreoptBootJarsWithPrebuiltArtApex(t *testing.T) { 195 ruleFile := "boot.art" 196 197 expectedInputs := []string{ 198 "out/soong/dexpreopt_arm64/dex_bootjars_input/core-oj.jar", 199 "out/soong/dexpreopt_arm64/dex_bootjars_input/foo.jar", 200 "out/soong/dexpreopt_arm64/dex_bootjars_input/bar.jar", 201 "out/soong/dexpreopt_arm64/dex_bootjars_input/baz.jar", 202 "out/soong/.intermediates/com.android.art.deapexer/android_common/deapexer/etc/boot-image.prof", 203 "out/soong/dexpreopt_arm64/dex_bootjars/boot.prof", 204 } 205 206 expectedOutputs := []string{ 207 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot.invocation", 208 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot.art", 209 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-foo.art", 210 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-bar.art", 211 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-baz.art", 212 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot.oat", 213 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-foo.oat", 214 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-bar.oat", 215 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-baz.oat", 216 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot.vdex", 217 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-foo.vdex", 218 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-bar.vdex", 219 "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-baz.vdex", 220 "out/soong/dexpreopt_arm64/dex_bootjars_unstripped/android/system/framework/arm64/boot.oat", 221 "out/soong/dexpreopt_arm64/dex_bootjars_unstripped/android/system/framework/arm64/boot-foo.oat", 222 "out/soong/dexpreopt_arm64/dex_bootjars_unstripped/android/system/framework/arm64/boot-bar.oat", 223 "out/soong/dexpreopt_arm64/dex_bootjars_unstripped/android/system/framework/arm64/boot-baz.oat", 224 } 225 226 testDexpreoptBoot(t, ruleFile, expectedInputs, expectedOutputs, true) 227} 228 229// Changes to the boot.zip structure may break the ART APK scanner. 230func TestDexpreoptBootZip(t *testing.T) { 231 ruleFile := "boot.zip" 232 233 ctx := android.PathContextForTesting(android.TestArchConfig("", nil, "", nil)) 234 expectedInputs := []string{} 235 for _, target := range ctx.Config().Targets[android.Android] { 236 for _, ext := range []string{".art", ".oat", ".vdex"} { 237 for _, suffix := range []string{"", "-foo", "-bar", "-baz"} { 238 expectedInputs = append(expectedInputs, 239 filepath.Join( 240 "out/soong/dexpreopt_arm64/dex_bootjars", 241 target.Os.String(), 242 "system/framework", 243 target.Arch.ArchType.String(), 244 "boot"+suffix+ext)) 245 } 246 } 247 } 248 249 expectedOutputs := []string{ 250 "out/soong/dexpreopt_arm64/dex_bootjars/boot.zip", 251 } 252 253 testDexpreoptBoot(t, ruleFile, expectedInputs, expectedOutputs, false) 254} 255