dexpreopt_bootjars_test.go 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  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. package apex
  15. import (
  16. "fmt"
  17. "path/filepath"
  18. "sort"
  19. "testing"
  20. "android/soong/android"
  21. "android/soong/java"
  22. )
  23. func testDexpreoptBoot(t *testing.T, ruleFile string, expectedInputs, expectedOutputs []string, preferPrebuilt bool) {
  24. bp := `
  25. // Platform.
  26. java_sdk_library {
  27. name: "foo",
  28. srcs: ["a.java"],
  29. api_packages: ["foo"],
  30. }
  31. java_library {
  32. name: "bar",
  33. srcs: ["b.java"],
  34. installable: true,
  35. system_ext_specific: true,
  36. }
  37. dex_import {
  38. name: "baz",
  39. jars: ["a.jar"],
  40. }
  41. platform_bootclasspath {
  42. name: "platform-bootclasspath",
  43. fragments: [
  44. {
  45. apex: "com.android.art",
  46. module: "art-bootclasspath-fragment",
  47. },
  48. ],
  49. }
  50. // Source ART APEX.
  51. java_library {
  52. name: "core-oj",
  53. srcs: ["core-oj.java"],
  54. installable: true,
  55. apex_available: [
  56. "com.android.art",
  57. ],
  58. }
  59. bootclasspath_fragment {
  60. name: "art-bootclasspath-fragment",
  61. image_name: "art",
  62. contents: ["core-oj"],
  63. apex_available: [
  64. "com.android.art",
  65. ],
  66. hidden_api: {
  67. split_packages: ["*"],
  68. },
  69. }
  70. apex_key {
  71. name: "com.android.art.key",
  72. public_key: "com.android.art.avbpubkey",
  73. private_key: "com.android.art.pem",
  74. }
  75. apex {
  76. name: "com.android.art",
  77. key: "com.android.art.key",
  78. bootclasspath_fragments: ["art-bootclasspath-fragment"],
  79. updatable: false,
  80. }
  81. // Prebuilt ART APEX.
  82. java_import {
  83. name: "core-oj",
  84. prefer: %[1]t,
  85. jars: ["core-oj.jar"],
  86. apex_available: [
  87. "com.android.art",
  88. ],
  89. }
  90. prebuilt_bootclasspath_fragment {
  91. name: "art-bootclasspath-fragment",
  92. prefer: %[1]t,
  93. image_name: "art",
  94. contents: ["core-oj"],
  95. hidden_api: {
  96. annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
  97. metadata: "my-bootclasspath-fragment/metadata.csv",
  98. index: "my-bootclasspath-fragment/index.csv",
  99. stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
  100. all_flags: "my-bootclasspath-fragment/all-flags.csv",
  101. },
  102. apex_available: [
  103. "com.android.art",
  104. ],
  105. }
  106. prebuilt_apex {
  107. name: "com.android.art",
  108. prefer: %[1]t,
  109. apex_name: "com.android.art",
  110. src: "com.android.art-arm.apex",
  111. exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
  112. }
  113. `
  114. result := android.GroupFixturePreparers(
  115. java.PrepareForTestWithDexpreopt,
  116. java.PrepareForTestWithJavaSdkLibraryFiles,
  117. java.FixtureWithLastReleaseApis("foo"),
  118. java.FixtureConfigureBootJars("com.android.art:core-oj", "platform:foo", "system_ext:bar", "platform:baz"),
  119. PrepareForTestWithApexBuildComponents,
  120. prepareForTestWithArtApex,
  121. ).RunTestWithBp(t, fmt.Sprintf(bp, preferPrebuilt))
  122. platformBootclasspath := result.ModuleForTests("platform-bootclasspath", "android_common")
  123. rule := platformBootclasspath.Output(ruleFile)
  124. inputs := rule.Implicits.Strings()
  125. sort.Strings(inputs)
  126. sort.Strings(expectedInputs)
  127. outputs := append(android.WritablePaths{rule.Output}, rule.ImplicitOutputs...).Strings()
  128. sort.Strings(outputs)
  129. sort.Strings(expectedOutputs)
  130. android.AssertStringPathsRelativeToTopEquals(t, "inputs", result.Config, expectedInputs, inputs)
  131. android.AssertStringPathsRelativeToTopEquals(t, "outputs", result.Config, expectedOutputs, outputs)
  132. }
  133. func TestDexpreoptBootJarsWithSourceArtApex(t *testing.T) {
  134. ruleFile := "boot.art"
  135. expectedInputs := []string{
  136. "out/soong/dexpreopt_arm64/dex_bootjars_input/core-oj.jar",
  137. "out/soong/dexpreopt_arm64/dex_bootjars_input/foo.jar",
  138. "out/soong/dexpreopt_arm64/dex_bootjars_input/bar.jar",
  139. "out/soong/dexpreopt_arm64/dex_bootjars_input/baz.jar",
  140. "out/soong/dexpreopt_arm64/dex_artjars/boot.prof",
  141. "out/soong/dexpreopt_arm64/dex_bootjars/boot.prof",
  142. }
  143. expectedOutputs := []string{
  144. "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot.invocation",
  145. "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot.art",
  146. "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-foo.art",
  147. "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-bar.art",
  148. "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-baz.art",
  149. "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot.oat",
  150. "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-foo.oat",
  151. "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-bar.oat",
  152. "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-baz.oat",
  153. "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot.vdex",
  154. "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-foo.vdex",
  155. "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-bar.vdex",
  156. "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-baz.vdex",
  157. "out/soong/dexpreopt_arm64/dex_bootjars_unstripped/android/system/framework/arm64/boot.oat",
  158. "out/soong/dexpreopt_arm64/dex_bootjars_unstripped/android/system/framework/arm64/boot-foo.oat",
  159. "out/soong/dexpreopt_arm64/dex_bootjars_unstripped/android/system/framework/arm64/boot-bar.oat",
  160. "out/soong/dexpreopt_arm64/dex_bootjars_unstripped/android/system/framework/arm64/boot-baz.oat",
  161. }
  162. testDexpreoptBoot(t, ruleFile, expectedInputs, expectedOutputs, false)
  163. }
  164. // The only difference is that the ART profile should be deapexed from the prebuilt APEX. Other
  165. // inputs and outputs should be the same as above.
  166. func TestDexpreoptBootJarsWithPrebuiltArtApex(t *testing.T) {
  167. ruleFile := "boot.art"
  168. expectedInputs := []string{
  169. "out/soong/dexpreopt_arm64/dex_bootjars_input/core-oj.jar",
  170. "out/soong/dexpreopt_arm64/dex_bootjars_input/foo.jar",
  171. "out/soong/dexpreopt_arm64/dex_bootjars_input/bar.jar",
  172. "out/soong/dexpreopt_arm64/dex_bootjars_input/baz.jar",
  173. "out/soong/.intermediates/com.android.art.deapexer/android_common/deapexer/etc/boot-image.prof",
  174. "out/soong/dexpreopt_arm64/dex_bootjars/boot.prof",
  175. }
  176. expectedOutputs := []string{
  177. "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot.invocation",
  178. "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot.art",
  179. "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-foo.art",
  180. "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-bar.art",
  181. "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-baz.art",
  182. "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot.oat",
  183. "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-foo.oat",
  184. "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-bar.oat",
  185. "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-baz.oat",
  186. "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot.vdex",
  187. "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-foo.vdex",
  188. "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-bar.vdex",
  189. "out/soong/dexpreopt_arm64/dex_bootjars/android/system/framework/arm64/boot-baz.vdex",
  190. "out/soong/dexpreopt_arm64/dex_bootjars_unstripped/android/system/framework/arm64/boot.oat",
  191. "out/soong/dexpreopt_arm64/dex_bootjars_unstripped/android/system/framework/arm64/boot-foo.oat",
  192. "out/soong/dexpreopt_arm64/dex_bootjars_unstripped/android/system/framework/arm64/boot-bar.oat",
  193. "out/soong/dexpreopt_arm64/dex_bootjars_unstripped/android/system/framework/arm64/boot-baz.oat",
  194. }
  195. testDexpreoptBoot(t, ruleFile, expectedInputs, expectedOutputs, true)
  196. }
  197. // Changes to the boot.zip structure may break the ART APK scanner.
  198. func TestDexpreoptBootZip(t *testing.T) {
  199. ruleFile := "boot.zip"
  200. ctx := android.PathContextForTesting(android.TestArchConfig("", nil, "", nil))
  201. expectedInputs := []string{}
  202. for _, target := range ctx.Config().Targets[android.Android] {
  203. for _, ext := range []string{".art", ".oat", ".vdex"} {
  204. for _, suffix := range []string{"", "-foo", "-bar", "-baz"} {
  205. expectedInputs = append(expectedInputs,
  206. filepath.Join(
  207. "out/soong/dexpreopt_arm64/dex_bootjars",
  208. target.Os.String(),
  209. "system/framework",
  210. target.Arch.ArchType.String(),
  211. "boot"+suffix+ext))
  212. }
  213. }
  214. }
  215. expectedOutputs := []string{
  216. "out/soong/dexpreopt_arm64/dex_bootjars/boot.zip",
  217. }
  218. testDexpreoptBoot(t, ruleFile, expectedInputs, expectedOutputs, false)
  219. }