blob: 987cb69050a80e0765ec0e4741b8d7ca4941ff4b [file] [log] [blame]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001// Copyright 2018 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 (
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +090018 "fmt"
Jooyung Han39edb6c2019-11-06 16:53:07 +090019 "path"
Paul Duffin37856732021-02-26 14:24:15 +000020 "path/filepath"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070021 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010022 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090023 "sort"
Jiyong Parkd4a3a132021-03-17 20:21:35 +090024 "strconv"
Jiyong Park25fc6a92018-11-18 18:02:45 +090025 "strings"
26 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090027
Yu Liueae7b362023-11-16 17:05:47 -080028 "android/soong/aconfig/codegen"
Jooyung Han20348752023-12-05 15:23:56 +090029
Kiyoung Kim487689e2022-07-26 09:48:22 +090030 "github.com/google/blueprint"
Jiyong Parkda6eb592018-12-19 17:12:36 +090031 "github.com/google/blueprint/proptools"
32
33 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080034 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090035 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000036 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070037 prebuilt_etc "android/soong/etc"
Colin Crossbd3a16b2023-04-25 11:30:51 -070038 "android/soong/filesystem"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090039 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090040 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070041 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090042)
43
Jooyung Hand3639552019-08-09 12:57:43 +090044// names returns name list from white space separated string
45func names(s string) (ns []string) {
46 for _, n := range strings.Split(s, " ") {
47 if len(n) > 0 {
48 ns = append(ns, n)
49 }
50 }
51 return
52}
53
Paul Duffin40b62572021-03-20 11:39:01 +000054func testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) {
Jooyung Han344d5432019-08-23 11:17:39 +090055 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010056 android.GroupFixturePreparers(
57 prepareForApexTest,
58 android.GroupFixturePreparers(preparers...),
59 ).
Paul Duffine05480a2021-03-08 15:07:14 +000060 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
Paul Duffin40b62572021-03-20 11:39:01 +000061 RunTestWithBp(t, bp)
Jooyung Han5c998b92019-06-27 11:30:33 +090062}
63
Paul Duffin40b62572021-03-20 11:39:01 +000064func testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090065 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010066
67 optionalBpPreparer := android.NullFixturePreparer
Paul Duffin40b62572021-03-20 11:39:01 +000068 if bp != "" {
Paul Duffin284165a2021-03-29 01:50:31 +010069 optionalBpPreparer = android.FixtureWithRootAndroidBp(bp)
Paul Duffin40b62572021-03-20 11:39:01 +000070 }
Paul Duffin284165a2021-03-29 01:50:31 +010071
72 result := android.GroupFixturePreparers(
73 prepareForApexTest,
74 android.GroupFixturePreparers(preparers...),
75 optionalBpPreparer,
76 ).RunTest(t)
77
Paul Duffine05480a2021-03-08 15:07:14 +000078 return result.TestContext
Jooyung Han5c998b92019-06-27 11:30:33 +090079}
80
Paul Duffin810f33d2021-03-09 14:12:32 +000081func withFiles(files android.MockFS) android.FixturePreparer {
82 return files.AddToFixture()
Jooyung Han344d5432019-08-23 11:17:39 +090083}
84
Paul Duffin810f33d2021-03-09 14:12:32 +000085func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
86 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
87 variables.ManifestPackageNameOverrides = specs
88 })
Jooyung Han35155c42020-02-06 17:33:20 +090089}
90
Albert Martineefabcf2022-03-21 20:11:16 +000091func withApexGlobalMinSdkVersionOverride(minSdkOverride *string) android.FixturePreparer {
92 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
93 variables.ApexGlobalMinSdkVersionOverride = minSdkOverride
94 })
95}
96
Paul Duffin810f33d2021-03-09 14:12:32 +000097var withBinder32bit = android.FixtureModifyProductVariables(
98 func(variables android.FixtureProductVariables) {
99 variables.Binder32bit = proptools.BoolPtr(true)
100 },
101)
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900102
Paul Duffin810f33d2021-03-09 14:12:32 +0000103var withUnbundledBuild = android.FixtureModifyProductVariables(
104 func(variables android.FixtureProductVariables) {
105 variables.Unbundled_build = proptools.BoolPtr(true)
106 },
107)
Jiyong Park7cd10e32020-01-14 09:22:18 +0900108
Paul Duffin284165a2021-03-29 01:50:31 +0100109// Legacy preparer used for running tests within the apex package.
110//
111// This includes everything that was needed to run any test in the apex package prior to the
112// introduction of the test fixtures. Tests that are being converted to use fixtures directly
113// rather than through the testApex...() methods should avoid using this and instead use the
114// various preparers directly, using android.GroupFixturePreparers(...) to group them when
115// necessary.
116//
117// deprecated
118var prepareForApexTest = android.GroupFixturePreparers(
Paul Duffin37aad602021-03-08 09:47:16 +0000119 // General preparers in alphabetical order as test infrastructure will enforce correct
120 // registration order.
121 android.PrepareForTestWithAndroidBuildComponents,
122 bpf.PrepareForTestWithBpf,
123 cc.PrepareForTestWithCcBuildComponents,
Jiakai Zhangb95998b2023-05-11 16:39:27 +0100124 java.PrepareForTestWithDexpreopt,
Paul Duffin37aad602021-03-08 09:47:16 +0000125 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
126 rust.PrepareForTestWithRustDefaultModules,
127 sh.PrepareForTestWithShBuildComponents,
Yu Liueae7b362023-11-16 17:05:47 -0800128 codegen.PrepareForTestWithAconfigBuildComponents,
Paul Duffin37aad602021-03-08 09:47:16 +0000129
130 PrepareForTestWithApexBuildComponents,
131
132 // Additional apex test specific preparers.
133 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
134 filegroup {
135 name: "myapex-file_contexts",
136 srcs: [
137 "apex/myapex-file_contexts",
138 ],
139 }
140 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000141 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000142 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000143 "a.java": nil,
144 "PrebuiltAppFoo.apk": nil,
145 "PrebuiltAppFooPriv.apk": nil,
146 "apex_manifest.json": nil,
147 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000148 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
149 "system/sepolicy/apex/myapex2-file_contexts": nil,
150 "system/sepolicy/apex/otherapex-file_contexts": nil,
151 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
152 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Crossabc0dab2022-04-07 17:39:21 -0700153 "mylib.cpp": nil,
154 "mytest.cpp": nil,
155 "mytest1.cpp": nil,
156 "mytest2.cpp": nil,
157 "mytest3.cpp": nil,
158 "myprebuilt": nil,
159 "my_include": nil,
160 "foo/bar/MyClass.java": nil,
161 "prebuilt.jar": nil,
162 "prebuilt.so": nil,
163 "vendor/foo/devkeys/test.x509.pem": nil,
164 "vendor/foo/devkeys/test.pk8": nil,
165 "testkey.x509.pem": nil,
166 "testkey.pk8": nil,
167 "testkey.override.x509.pem": nil,
168 "testkey.override.pk8": nil,
169 "vendor/foo/devkeys/testkey.avbpubkey": nil,
170 "vendor/foo/devkeys/testkey.pem": nil,
171 "NOTICE": nil,
172 "custom_notice": nil,
173 "custom_notice_for_static_lib": nil,
174 "testkey2.avbpubkey": nil,
175 "testkey2.pem": nil,
176 "myapex-arm64.apex": nil,
177 "myapex-arm.apex": nil,
178 "myapex.apks": nil,
179 "frameworks/base/api/current.txt": nil,
180 "framework/aidl/a.aidl": nil,
181 "dummy.txt": nil,
182 "baz": nil,
183 "bar/baz": nil,
184 "testdata/baz": nil,
185 "AppSet.apks": nil,
186 "foo.rs": nil,
187 "libfoo.jar": nil,
188 "libbar.jar": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000189 },
190 ),
191
192 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
Paul Duffin37aad602021-03-08 09:47:16 +0000193 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
194 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
195 variables.Platform_sdk_codename = proptools.StringPtr("Q")
196 variables.Platform_sdk_final = proptools.BoolPtr(false)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000197 // "Tiramisu" needs to be in the next line for compatibility with soong code,
198 // not because of these tests specifically (it's not used by the tests)
199 variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000200 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
Paul Duffin37aad602021-03-08 09:47:16 +0000201 }),
202)
203
Paul Duffin52bfaa42021-03-23 23:40:12 +0000204var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
205 "system/sepolicy/apex/myapex-file_contexts": nil,
206})
207
Colin Crossb614cd42024-10-11 12:52:21 -0700208var prepareForTestWithOtherapex = android.FixtureMergeMockFs(android.MockFS{
209 "system/sepolicy/apex/otherapex-file_contexts": nil,
210})
211
Jooyung Han643adc42020-02-27 13:50:06 +0900212// ensure that 'result' equals 'expected'
213func ensureEquals(t *testing.T, result string, expected string) {
214 t.Helper()
215 if result != expected {
216 t.Errorf("%q != %q", expected, result)
217 }
218}
219
Jiyong Park25fc6a92018-11-18 18:02:45 +0900220// ensure that 'result' contains 'expected'
221func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900222 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900223 if !strings.Contains(result, expected) {
224 t.Errorf("%q is not found in %q", expected, result)
225 }
226}
227
Liz Kammer5bd365f2020-05-27 15:15:11 -0700228// ensure that 'result' contains 'expected' exactly one time
229func ensureContainsOnce(t *testing.T, result string, expected string) {
230 t.Helper()
231 count := strings.Count(result, expected)
232 if count != 1 {
233 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
234 }
235}
236
Jiyong Park25fc6a92018-11-18 18:02:45 +0900237// ensures that 'result' does not contain 'notExpected'
238func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900239 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900240 if strings.Contains(result, notExpected) {
241 t.Errorf("%q is found in %q", notExpected, result)
242 }
243}
244
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700245func ensureMatches(t *testing.T, result string, expectedRex string) {
Jooyung Hana3fddf42024-09-03 13:22:21 +0900246 t.Helper()
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700247 ok, err := regexp.MatchString(expectedRex, result)
248 if err != nil {
249 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
250 return
251 }
252 if !ok {
253 t.Errorf("%s does not match regular expession %s", result, expectedRex)
254 }
255}
256
Jooyung Hana3fddf42024-09-03 13:22:21 +0900257func ensureListContainsMatch(t *testing.T, result []string, expectedRex string) {
258 t.Helper()
259 p := regexp.MustCompile(expectedRex)
260 if android.IndexListPred(func(s string) bool { return p.MatchString(s) }, result) == -1 {
261 t.Errorf("%q is not found in %v", expectedRex, result)
262 }
263}
264
Jiyong Park25fc6a92018-11-18 18:02:45 +0900265func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900266 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900267 if !android.InList(expected, result) {
268 t.Errorf("%q is not found in %v", expected, result)
269 }
270}
271
272func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900273 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900274 if android.InList(notExpected, result) {
275 t.Errorf("%q is found in %v", notExpected, result)
276 }
277}
278
Jooyung Hane1633032019-08-01 17:41:43 +0900279func ensureListEmpty(t *testing.T, result []string) {
280 t.Helper()
281 if len(result) > 0 {
282 t.Errorf("%q is expected to be empty", result)
283 }
284}
285
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000286func ensureListNotEmpty(t *testing.T, result []string) {
287 t.Helper()
288 if len(result) == 0 {
289 t.Errorf("%q is expected to be not empty", result)
290 }
291}
292
Jiyong Park25fc6a92018-11-18 18:02:45 +0900293// Minimal test
294func TestBasicApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700295 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800296 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900297 apex_defaults {
298 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900299 manifest: ":myapex.manifest",
300 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900301 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900302 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900303 native_shared_libs: [
304 "mylib",
305 "libfoo.ffi",
306 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900307 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800308 multilib: {
309 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900310 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800311 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900312 },
Jiyong Park77acec62020-06-01 21:39:15 +0900313 java_libs: [
314 "myjar",
315 "myjar_dex",
316 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000317 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900318 }
319
Jiyong Park30ca9372019-02-07 16:27:23 +0900320 apex {
321 name: "myapex",
322 defaults: ["myapex-defaults"],
323 }
324
Jiyong Park25fc6a92018-11-18 18:02:45 +0900325 apex_key {
326 name: "myapex.key",
327 public_key: "testkey.avbpubkey",
328 private_key: "testkey.pem",
329 }
330
Jiyong Park809bb722019-02-13 21:33:49 +0900331 filegroup {
332 name: "myapex.manifest",
333 srcs: ["apex_manifest.json"],
334 }
335
336 filegroup {
337 name: "myapex.androidmanifest",
338 srcs: ["AndroidManifest.xml"],
339 }
340
Jiyong Park25fc6a92018-11-18 18:02:45 +0900341 cc_library {
342 name: "mylib",
343 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900344 shared_libs: [
345 "mylib2",
346 "libbar.ffi",
347 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900348 system_shared_libs: [],
349 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000350 // TODO: remove //apex_available:platform
351 apex_available: [
352 "//apex_available:platform",
353 "myapex",
354 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900355 }
356
Alex Light3d673592019-01-18 14:37:31 -0800357 cc_binary {
358 name: "foo",
359 srcs: ["mylib.cpp"],
360 compile_multilib: "both",
361 multilib: {
362 lib32: {
363 suffix: "32",
364 },
365 lib64: {
366 suffix: "64",
367 },
368 },
369 symlinks: ["foo_link_"],
370 symlink_preferred_arch: true,
371 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800372 stl: "none",
Jooyung Han40b79172024-08-16 16:00:33 +0900373 apex_available: [ "myapex" ],
Yifan Hongd22a84a2020-07-28 17:37:46 -0700374 }
375
Jiyong Park99644e92020-11-17 22:21:02 +0900376 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000377 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900378 srcs: ["foo.rs"],
379 rlibs: ["libfoo.rlib.rust"],
Colin Cross49f1a8f2024-10-23 13:04:15 -0700380 rustlibs: ["libfoo.transitive.dylib.rust"],
Jiyong Park99644e92020-11-17 22:21:02 +0900381 apex_available: ["myapex"],
382 }
383
384 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000385 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900386 srcs: ["foo.rs"],
387 crate_name: "foo",
388 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900389 shared_libs: ["libfoo.shared_from_rust"],
390 }
391
392 cc_library_shared {
393 name: "libfoo.shared_from_rust",
394 srcs: ["mylib.cpp"],
395 system_shared_libs: [],
396 stl: "none",
397 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900398 }
399
400 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000401 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900402 srcs: ["foo.rs"],
403 crate_name: "foo",
404 apex_available: ["myapex"],
405 }
406
Colin Cross49f1a8f2024-10-23 13:04:15 -0700407 rust_library_dylib {
408 name: "libfoo.transitive.dylib.rust",
409 srcs: ["foo.rs"],
410 crate_name: "foo",
411 apex_available: ["myapex"],
412 }
413
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900414 rust_ffi_shared {
415 name: "libfoo.ffi",
416 srcs: ["foo.rs"],
417 crate_name: "foo",
418 apex_available: ["myapex"],
419 }
420
421 rust_ffi_shared {
422 name: "libbar.ffi",
423 srcs: ["foo.rs"],
424 crate_name: "bar",
425 apex_available: ["myapex"],
426 }
427
Paul Duffindddd5462020-04-07 15:25:44 +0100428 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900429 name: "mylib2",
430 srcs: ["mylib.cpp"],
431 system_shared_libs: [],
432 stl: "none",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900433 static_libs: ["libstatic"],
434 // TODO: remove //apex_available:platform
435 apex_available: [
436 "//apex_available:platform",
437 "myapex",
438 ],
439 }
440
Paul Duffindddd5462020-04-07 15:25:44 +0100441 cc_prebuilt_library_shared {
442 name: "mylib2",
443 srcs: ["prebuilt.so"],
444 // TODO: remove //apex_available:platform
445 apex_available: [
446 "//apex_available:platform",
447 "myapex",
448 ],
Colin Cross49f1a8f2024-10-23 13:04:15 -0700449 }
Paul Duffindddd5462020-04-07 15:25:44 +0100450
Jiyong Park9918e1a2020-03-17 19:16:40 +0900451 cc_library_static {
452 name: "libstatic",
453 srcs: ["mylib.cpp"],
454 system_shared_libs: [],
455 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000456 // TODO: remove //apex_available:platform
457 apex_available: [
458 "//apex_available:platform",
459 "myapex",
460 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900461 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900462
463 java_library {
464 name: "myjar",
465 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900466 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900467 sdk_version: "none",
468 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900469 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900470 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000471 // TODO: remove //apex_available:platform
472 apex_available: [
473 "//apex_available:platform",
474 "myapex",
475 ],
Colin Crosse4f34882024-11-14 12:26:00 -0800476 compile_dex: true,
Jiyong Park7f7766d2019-07-25 22:02:35 +0900477 }
478
Jiyong Park77acec62020-06-01 21:39:15 +0900479 dex_import {
480 name: "myjar_dex",
481 jars: ["prebuilt.jar"],
482 apex_available: [
483 "//apex_available:platform",
484 "myapex",
485 ],
486 }
487
Jiyong Park7f7766d2019-07-25 22:02:35 +0900488 java_library {
489 name: "myotherjar",
490 srcs: ["foo/bar/MyClass.java"],
491 sdk_version: "none",
492 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900493 // TODO: remove //apex_available:platform
494 apex_available: [
495 "//apex_available:platform",
496 "myapex",
497 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900498 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900499
500 java_library {
501 name: "mysharedjar",
502 srcs: ["foo/bar/MyClass.java"],
503 sdk_version: "none",
504 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900505 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900506 `)
507
Jooyung Hana0503a52023-08-23 13:12:50 +0900508 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900509
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900510 // Make sure that Android.mk is created
Jooyung Hana0503a52023-08-23 13:12:50 +0900511 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700512 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900513 var builder strings.Builder
514 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
515
516 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +0000517 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900518 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
519
Jiyong Park42cca6c2019-04-01 11:15:50 +0900520 optFlags := apexRule.Args["opt_flags"]
521 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700522 // Ensure that the NOTICE output is being packaged as an asset.
Jooyung Hana0503a52023-08-23 13:12:50 +0900523 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900524
Jiyong Park25fc6a92018-11-18 18:02:45 +0900525 copyCmds := apexRule.Args["copy_commands"]
526
527 // Ensure that main rule creates an output
528 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
529
530 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700531 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
532 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
533 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900534 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900535 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900536
537 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700538 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
539 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900540 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
541 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Colin Cross49f1a8f2024-10-23 13:04:15 -0700542 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.transitive.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900543 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900544 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900545
546 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800547 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
548 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900549 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900550 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900551 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Colin Cross49f1a8f2024-10-23 13:04:15 -0700552 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.transitive.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900553 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
554 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900555 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900556 // .. but not for java libs
557 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900558 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800559
Colin Cross7113d202019-11-20 16:39:12 -0800560 // Ensure that the platform variant ends with _shared or _common
561 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
562 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900563 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
564 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900565 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
566
567 // Ensure that dynamic dependency to java libs are not included
568 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800569
570 // Ensure that all symlinks are present.
571 found_foo_link_64 := false
572 found_foo := false
573 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900574 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800575 if strings.HasSuffix(cmd, "bin/foo") {
576 found_foo = true
577 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
578 found_foo_link_64 = true
579 }
580 }
581 }
582 good := found_foo && found_foo_link_64
583 if !good {
584 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
585 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900586
Colin Crossf61d03d2023-11-02 16:56:39 -0700587 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
588 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100589 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100590 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
591 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
592 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100593
Colin Crossf61d03d2023-11-02 16:56:39 -0700594 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
595 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100596 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100597 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
598 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
599 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800600}
601
Jooyung Hanf21c7972019-12-16 22:32:06 +0900602func TestDefaults(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700603 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800604 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900605 apex_defaults {
606 name: "myapex-defaults",
607 key: "myapex.key",
608 prebuilts: ["myetc"],
609 native_shared_libs: ["mylib"],
610 java_libs: ["myjar"],
611 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900612 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800613 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000614 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900615 }
616
617 prebuilt_etc {
618 name: "myetc",
619 src: "myprebuilt",
620 }
621
622 apex {
623 name: "myapex",
624 defaults: ["myapex-defaults"],
625 }
626
627 apex_key {
628 name: "myapex.key",
629 public_key: "testkey.avbpubkey",
630 private_key: "testkey.pem",
631 }
632
633 cc_library {
634 name: "mylib",
635 system_shared_libs: [],
636 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000637 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900638 }
639
640 java_library {
641 name: "myjar",
642 srcs: ["foo/bar/MyClass.java"],
643 sdk_version: "none",
644 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000645 apex_available: [ "myapex" ],
Colin Crosse4f34882024-11-14 12:26:00 -0800646 compile_dex: true,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900647 }
648
649 android_app {
650 name: "AppFoo",
651 srcs: ["foo/bar/MyClass.java"],
652 sdk_version: "none",
653 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000654 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900655 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900656
657 runtime_resource_overlay {
658 name: "rro",
659 theme: "blue",
660 }
661
markchien2f59ec92020-09-02 16:23:38 +0800662 bpf {
663 name: "bpf",
664 srcs: ["bpf.c", "bpf2.c"],
665 }
666
Ken Chenfad7f9d2021-11-10 22:02:57 +0800667 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800668 name: "netdTest",
669 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800670 sub_dir: "netd",
671 }
672
Jooyung Hanf21c7972019-12-16 22:32:06 +0900673 `)
Jooyung Hana0503a52023-08-23 13:12:50 +0900674 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900675 "etc/myetc",
676 "javalib/myjar.jar",
677 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000678 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900679 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800680 "etc/bpf/bpf.o",
681 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800682 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900683 })
684}
685
Jooyung Han01a3ee22019-11-02 02:52:25 +0900686func TestApexManifest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700687 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800688 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900689 apex {
690 name: "myapex",
691 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000692 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900693 }
694
695 apex_key {
696 name: "myapex.key",
697 public_key: "testkey.avbpubkey",
698 private_key: "testkey.pem",
699 }
700 `)
701
Jooyung Hana0503a52023-08-23 13:12:50 +0900702 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +0900703 args := module.Rule("apexRule").Args
704 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
705 t.Error("manifest should be apex_manifest.pb, but " + manifest)
706 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900707}
708
Liz Kammer4854a7d2021-05-27 14:28:27 -0400709func TestApexManifestMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700710 t.Parallel()
Liz Kammer4854a7d2021-05-27 14:28:27 -0400711 ctx := testApex(t, `
712 apex_defaults {
713 name: "my_defaults",
714 key: "myapex.key",
715 product_specific: true,
716 file_contexts: ":my-file-contexts",
717 updatable: false,
718 }
719 apex {
720 name: "myapex_30",
721 min_sdk_version: "30",
722 defaults: ["my_defaults"],
723 }
724
725 apex {
726 name: "myapex_current",
727 min_sdk_version: "current",
728 defaults: ["my_defaults"],
729 }
730
731 apex {
732 name: "myapex_none",
733 defaults: ["my_defaults"],
734 }
735
736 apex_key {
737 name: "myapex.key",
738 public_key: "testkey.avbpubkey",
739 private_key: "testkey.pem",
740 }
741
742 filegroup {
743 name: "my-file-contexts",
744 srcs: ["product_specific_file_contexts"],
745 }
746 `, withFiles(map[string][]byte{
747 "product_specific_file_contexts": nil,
748 }), android.FixtureModifyProductVariables(
749 func(variables android.FixtureProductVariables) {
750 variables.Unbundled_build = proptools.BoolPtr(true)
751 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
752 }), android.FixtureMergeEnv(map[string]string{
753 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
754 }))
755
756 testCases := []struct {
757 module string
758 minSdkVersion string
759 }{
760 {
761 module: "myapex_30",
762 minSdkVersion: "30",
763 },
764 {
765 module: "myapex_current",
766 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
767 },
768 {
769 module: "myapex_none",
770 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
771 },
772 }
773 for _, tc := range testCases {
Jooyung Hana0503a52023-08-23 13:12:50 +0900774 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
Liz Kammer4854a7d2021-05-27 14:28:27 -0400775 args := module.Rule("apexRule").Args
776 optFlags := args["opt_flags"]
777 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
778 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
779 }
780 }
781}
782
Jihoon Kang842b9992024-02-08 01:41:51 +0000783func TestApexWithDessertSha(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700784 t.Parallel()
Jihoon Kang842b9992024-02-08 01:41:51 +0000785 ctx := testApex(t, `
786 apex_defaults {
787 name: "my_defaults",
788 key: "myapex.key",
789 product_specific: true,
790 file_contexts: ":my-file-contexts",
791 updatable: false,
792 }
793 apex {
794 name: "myapex_30",
795 min_sdk_version: "30",
796 defaults: ["my_defaults"],
797 }
798
799 apex {
800 name: "myapex_current",
801 min_sdk_version: "current",
802 defaults: ["my_defaults"],
803 }
804
805 apex {
806 name: "myapex_none",
807 defaults: ["my_defaults"],
808 }
809
810 apex_key {
811 name: "myapex.key",
812 public_key: "testkey.avbpubkey",
813 private_key: "testkey.pem",
814 }
815
816 filegroup {
817 name: "my-file-contexts",
818 srcs: ["product_specific_file_contexts"],
819 }
820 `, withFiles(map[string][]byte{
821 "product_specific_file_contexts": nil,
822 }), android.FixtureModifyProductVariables(
823 func(variables android.FixtureProductVariables) {
824 variables.Unbundled_build = proptools.BoolPtr(true)
825 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
826 }), android.FixtureMergeEnv(map[string]string{
827 "UNBUNDLED_BUILD_TARGET_SDK_WITH_DESSERT_SHA": "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
828 }))
829
830 testCases := []struct {
831 module string
832 minSdkVersion string
833 }{
834 {
835 module: "myapex_30",
836 minSdkVersion: "30",
837 },
838 {
839 module: "myapex_current",
840 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
841 },
842 {
843 module: "myapex_none",
844 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
845 },
846 }
847 for _, tc := range testCases {
848 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
849 args := module.Rule("apexRule").Args
850 optFlags := args["opt_flags"]
851 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
852 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
853 }
854 }
855}
856
Jooyung Hanaf730952023-02-28 14:13:38 +0900857func TestFileContexts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700858 t.Parallel()
Jooyung Hanbe953902023-05-31 16:42:16 +0900859 for _, vendor := range []bool{true, false} {
Jooyung Hanaf730952023-02-28 14:13:38 +0900860 prop := ""
Jooyung Hanbe953902023-05-31 16:42:16 +0900861 if vendor {
862 prop = "vendor: true,\n"
Jooyung Hanaf730952023-02-28 14:13:38 +0900863 }
864 ctx := testApex(t, `
865 apex {
866 name: "myapex",
867 key: "myapex.key",
Jooyung Hanaf730952023-02-28 14:13:38 +0900868 updatable: false,
Jooyung Hanaf730952023-02-28 14:13:38 +0900869 `+prop+`
870 }
871
872 apex_key {
873 name: "myapex.key",
874 public_key: "testkey.avbpubkey",
875 private_key: "testkey.pem",
876 }
Jooyung Hanbe953902023-05-31 16:42:16 +0900877 `)
Jooyung Hanaf730952023-02-28 14:13:38 +0900878
Jooyung Hana0503a52023-08-23 13:12:50 +0900879 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("file_contexts")
Jooyung Hanbe953902023-05-31 16:42:16 +0900880 if vendor {
881 android.AssertStringDoesContain(t, "should force-label as vendor_apex_metadata_file",
882 rule.RuleParams.Command,
883 "apex_manifest\\\\.pb u:object_r:vendor_apex_metadata_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900884 } else {
Jooyung Hanbe953902023-05-31 16:42:16 +0900885 android.AssertStringDoesContain(t, "should force-label as system_file",
886 rule.RuleParams.Command,
887 "apex_manifest\\\\.pb u:object_r:system_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900888 }
889 }
890}
891
Jiyong Park25fc6a92018-11-18 18:02:45 +0900892func TestApexWithStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700893 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800894 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900895 apex {
896 name: "myapex",
897 key: "myapex.key",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +0000898 native_shared_libs: [
899 "mylib",
900 "mylib3",
901 "libmylib3_rs",
902 ],
Jiyong Park105dc322021-06-11 17:22:09 +0900903 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000904 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900905 }
906
907 apex_key {
908 name: "myapex.key",
909 public_key: "testkey.avbpubkey",
910 private_key: "testkey.pem",
911 }
912
913 cc_library {
914 name: "mylib",
915 srcs: ["mylib.cpp"],
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +0000916 shared_libs: [
917 "mylib2",
918 "mylib3#impl",
919 "libmylib2_rs",
920 "libmylib3_rs#impl",
921 "my_prebuilt_platform_lib",
922 "my_prebuilt_platform_stub_only_lib",
923 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900924 system_shared_libs: [],
925 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000926 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900927 }
928
929 cc_library {
930 name: "mylib2",
931 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900932 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900933 system_shared_libs: [],
934 stl: "none",
935 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +0000936 symbol_file: "mylib2.map.txt",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900937 versions: ["1", "2", "3"],
938 },
939 }
940
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +0000941 rust_ffi {
942 name: "libmylib2_rs",
943 crate_name: "mylib2",
944 srcs: ["mylib.rs"],
945 stubs: {
946 symbol_file: "mylib2.map.txt",
947 versions: ["1", "2", "3"],
948 },
949 }
950
Jiyong Park25fc6a92018-11-18 18:02:45 +0900951 cc_library {
952 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900953 srcs: ["mylib.cpp"],
954 shared_libs: ["mylib4"],
955 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900956 stl: "none",
957 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +0000958 symbol_file: "mylib3.map.txt",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900959 versions: ["10", "11", "12"],
960 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000961 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900962 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900963
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +0000964 rust_ffi {
965 name: "libmylib3_rs",
966 crate_name: "mylib3",
967 srcs: ["mylib.rs"],
968 shared_libs: ["mylib4.from_rust"],
969 stubs: {
970 symbol_file: "mylib3.map.txt",
971 versions: ["10", "11", "12"],
972 },
973 apex_available: [ "myapex" ],
974 }
975
Jiyong Park28d395a2018-12-07 22:42:47 +0900976 cc_library {
977 name: "mylib4",
978 srcs: ["mylib.cpp"],
979 system_shared_libs: [],
980 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000981 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900982 }
Jiyong Park105dc322021-06-11 17:22:09 +0900983
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +0000984 cc_library {
985 name: "mylib4.from_rust",
986 srcs: ["mylib.cpp"],
987 system_shared_libs: [],
988 stl: "none",
989 apex_available: [ "myapex" ],
990 }
991
Spandan Das357ffcc2024-07-24 18:07:48 +0000992 cc_prebuilt_library_shared {
993 name: "my_prebuilt_platform_lib",
994 stubs: {
995 symbol_file: "my_prebuilt_platform_lib.map.txt",
996 versions: ["1", "2", "3"],
997 },
998 srcs: ["foo.so"],
999 }
1000
1001 // Similar to my_prebuilt_platform_lib, but this library only provides stubs, i.e. srcs is empty
1002 cc_prebuilt_library_shared {
1003 name: "my_prebuilt_platform_stub_only_lib",
1004 stubs: {
1005 symbol_file: "my_prebuilt_platform_stub_only_lib.map.txt",
1006 versions: ["1", "2", "3"],
1007 }
1008 }
1009
Jiyong Park105dc322021-06-11 17:22:09 +09001010 rust_binary {
1011 name: "foo.rust",
1012 srcs: ["foo.rs"],
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001013 shared_libs: [
1014 "libfoo.shared_from_rust",
1015 "libfoo_rs.shared_from_rust",
1016 ],
Jiyong Park105dc322021-06-11 17:22:09 +09001017 prefer_rlib: true,
1018 apex_available: ["myapex"],
1019 }
1020
1021 cc_library_shared {
1022 name: "libfoo.shared_from_rust",
1023 srcs: ["mylib.cpp"],
1024 system_shared_libs: [],
1025 stl: "none",
1026 stubs: {
1027 versions: ["10", "11", "12"],
1028 },
1029 }
1030
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001031 rust_ffi {
1032 name: "libfoo_rs.shared_from_rust",
1033 crate_name: "foo_rs",
1034 srcs: ["mylib.rs"],
1035 stubs: {
1036 versions: ["10", "11", "12"],
1037 },
1038 }
1039
Jiyong Park25fc6a92018-11-18 18:02:45 +09001040 `)
1041
Jooyung Hana0503a52023-08-23 13:12:50 +09001042 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001043 copyCmds := apexRule.Args["copy_commands"]
1044
1045 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -08001046 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001047
1048 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -08001049 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001050 ensureNotContains(t, copyCmds, "image.apex/lib64/libmylib2_rs.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001051
1052 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -08001053 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001054 ensureContains(t, copyCmds, "image.apex/lib64/libmylib3_rs.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001055
Colin Crossaede88c2020-08-11 12:17:01 -07001056 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001057
1058 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001059 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001060 ensureContains(t, mylibLdFlags, "libmylib2_rs/android_arm64_armv8-a_shared_current/unstripped/libmylib2_rs.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001061 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +09001062 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001063 ensureNotContains(t, mylibLdFlags, "libmylib2_rs/android_arm64_armv8-a_shared/unstripped/libmylib2_rs.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001064
Colin Crossea91a172024-11-05 16:14:05 -08001065 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because the dependency is added with mylib3#impl)
Colin Crossaede88c2020-08-11 12:17:01 -07001066 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001067 ensureContains(t, mylibLdFlags, "libmylib3_rs/android_arm64_armv8-a_shared_apex10000/unstripped/libmylib3_rs.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001068 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -07001069 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001070 ensureNotContains(t, mylibLdFlags, "libmylib3_rs/android_arm64_armv8-a_shared_12/unstripped/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +09001071
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001072 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
1073 // is replaced by sharing of "cFlags" in cc/builder.go.
1074 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
1075 // module variable representing "cflags". So it was not detected by ensureNotContains.
1076 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
1077 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
1078 // including the original cflags's "-include mylib.h".
1079 //
Jiyong Park64379952018-12-13 18:37:29 +09001080 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001081 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1082 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +09001083
Jiyong Park85cc35a2022-07-17 11:30:47 +09001084 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1085 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001086 ensureContains(t, ctx.ModuleForTests("libmylib2_rs", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
Jiyong Park85cc35a2022-07-17 11:30:47 +09001087 // Ensure that genstub for apex-provided lib is invoked with --apex
1088 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001089 ensureContains(t, ctx.ModuleForTests("libmylib3_rs", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +09001090
Jooyung Hana0503a52023-08-23 13:12:50 +09001091 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +09001092 "lib64/mylib.so",
1093 "lib64/mylib3.so",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001094 "lib64/libmylib3_rs.so",
Jooyung Han671f1ce2019-12-17 12:47:13 +09001095 "lib64/mylib4.so",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001096 "lib64/mylib4.from_rust.so",
Jiyong Park105dc322021-06-11 17:22:09 +09001097 "bin/foo.rust",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001098
1099 "lib64/libstd.dylib.so", // implicit rust ffi dep
Jooyung Han671f1ce2019-12-17 12:47:13 +09001100 })
Jiyong Park105dc322021-06-11 17:22:09 +09001101
1102 // Ensure that stub dependency from a rust module is not included
1103 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001104 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo_rs.shared_from_rust.so")
Jiyong Park105dc322021-06-11 17:22:09 +09001105 // The rust module is linked to the stub cc library
Colin Cross004bd3f2023-10-02 11:39:17 -07001106 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +09001107 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001108 ensureContains(t, rustDeps, "libfoo_rs.shared_from_rust/android_arm64_armv8-a_shared_current/unstripped/libfoo_rs.shared_from_rust.so")
Jiyong Park105dc322021-06-11 17:22:09 +09001109 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001110 ensureNotContains(t, rustDeps, "libfoo_rs.shared_from_rust/android_arm64_armv8-a_shared/unstripped/libfoo_rs.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +09001111
Jooyung Hana0503a52023-08-23 13:12:50 +09001112 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jiyong Park34d5c332022-02-24 18:02:44 +09001113 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001114 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo_rs.shared_from_rust.so")
Spandan Das357ffcc2024-07-24 18:07:48 +00001115
1116 // Ensure that mylib is linking with the latest version of stubs for my_prebuilt_platform_lib
1117 ensureContains(t, mylibLdFlags, "my_prebuilt_platform_lib/android_arm64_armv8-a_shared_current/my_prebuilt_platform_lib.so")
1118 // ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib
1119 ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_lib.so")
1120 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1121 ensureContains(t, ctx.ModuleForTests("my_prebuilt_platform_lib", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
1122
1123 // Ensure that mylib is linking with the latest version of stubs for my_prebuilt_platform_lib
1124 ensureContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared_current/my_prebuilt_platform_stub_only_lib.so")
1125 // ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib
1126 ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_stub_only_lib.so")
1127 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1128 ensureContains(t, ctx.ModuleForTests("my_prebuilt_platform_stub_only_lib", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001129}
1130
Jooyung Han20348752023-12-05 15:23:56 +09001131func TestApexShouldNotEmbedStubVariant(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001132 t.Parallel()
Jooyung Han20348752023-12-05 15:23:56 +09001133 testApexError(t, `module "myapex" .*: native_shared_libs: "libbar" is a stub`, `
1134 apex {
1135 name: "myapex",
1136 key: "myapex.key",
1137 vendor: true,
1138 updatable: false,
1139 native_shared_libs: ["libbar"], // should not add an LLNDK stub in a vendor apex
1140 }
1141
1142 apex_key {
1143 name: "myapex.key",
1144 public_key: "testkey.avbpubkey",
1145 private_key: "testkey.pem",
1146 }
1147
1148 cc_library {
1149 name: "libbar",
1150 srcs: ["mylib.cpp"],
1151 llndk: {
1152 symbol_file: "libbar.map.txt",
1153 }
1154 }
1155 `)
1156}
1157
Jiyong Park1bc84122021-06-22 20:23:05 +09001158func TestApexCanUsePrivateApis(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001159 t.Parallel()
Jiyong Park1bc84122021-06-22 20:23:05 +09001160 ctx := testApex(t, `
1161 apex {
1162 name: "myapex",
1163 key: "myapex.key",
1164 native_shared_libs: ["mylib"],
1165 binaries: ["foo.rust"],
1166 updatable: false,
1167 platform_apis: true,
1168 }
1169
1170 apex_key {
1171 name: "myapex.key",
1172 public_key: "testkey.avbpubkey",
1173 private_key: "testkey.pem",
1174 }
1175
1176 cc_library {
1177 name: "mylib",
1178 srcs: ["mylib.cpp"],
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001179 shared_libs: [
1180 "mylib2",
1181 "libmylib2_rust"
1182 ],
Jiyong Park1bc84122021-06-22 20:23:05 +09001183 system_shared_libs: [],
1184 stl: "none",
1185 apex_available: [ "myapex" ],
1186 }
1187
1188 cc_library {
1189 name: "mylib2",
1190 srcs: ["mylib.cpp"],
1191 cflags: ["-include mylib.h"],
1192 system_shared_libs: [],
1193 stl: "none",
1194 stubs: {
1195 versions: ["1", "2", "3"],
1196 },
1197 }
1198
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001199 rust_ffi {
1200 name: "libmylib2_rust",
1201 crate_name: "mylib2_rust",
1202 srcs: ["mylib.rs"],
1203 stubs: {
1204 versions: ["1", "2", "3"],
1205 },
1206 }
1207
Jiyong Park1bc84122021-06-22 20:23:05 +09001208 rust_binary {
1209 name: "foo.rust",
1210 srcs: ["foo.rs"],
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001211 shared_libs: [
1212 "libfoo.shared_from_rust",
1213 "libmylib_rust.shared_from_rust"
1214 ],
Jiyong Park1bc84122021-06-22 20:23:05 +09001215 prefer_rlib: true,
1216 apex_available: ["myapex"],
1217 }
1218
1219 cc_library_shared {
1220 name: "libfoo.shared_from_rust",
1221 srcs: ["mylib.cpp"],
1222 system_shared_libs: [],
1223 stl: "none",
1224 stubs: {
1225 versions: ["10", "11", "12"],
1226 },
1227 }
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001228 rust_ffi {
1229 name: "libmylib_rust.shared_from_rust",
1230 crate_name: "mylib_rust",
1231 srcs: ["mylib.rs"],
1232 stubs: {
1233 versions: ["1", "2", "3"],
1234 },
1235 }
1236
Jiyong Park1bc84122021-06-22 20:23:05 +09001237 `)
1238
Jooyung Hana0503a52023-08-23 13:12:50 +09001239 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park1bc84122021-06-22 20:23:05 +09001240 copyCmds := apexRule.Args["copy_commands"]
1241
1242 // Ensure that indirect stubs dep is not included
1243 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001244 ensureNotContains(t, copyCmds, "image.apex/lib64/libmylib_rust.so")
1245 ensureNotContains(t, copyCmds, "image.apex/lib64/libmylib_rust.shared_from_rust.so")
Jiyong Park1bc84122021-06-22 20:23:05 +09001246 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1247
1248 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1249 // of the platform_apis: true)
Colin Cross1115b4b2025-01-21 15:38:58 -08001250 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000_p").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001251 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1252 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001253 ensureNotContains(t, mylibLdFlags, "libmylib2_rust/android_arm64_armv8-a_shared_current/unstripped/libmylib2_rust.so")
1254 ensureContains(t, mylibLdFlags, "libmylib2_rust/android_arm64_armv8-a_shared/unstripped/libmylib2_rust.so")
Colin Cross1115b4b2025-01-21 15:38:58 -08001255 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000_p").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001256 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1257 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001258 ensureNotContains(t, rustDeps, "libmylib_rust.shared_from_rust/android_arm64_armv8-a_shared_current/unstripped/libmylib_rust.shared_from_rust.so")
1259 ensureContains(t, rustDeps, "libmylib_rust.shared_from_rust/android_arm64_armv8-a_shared/unstripped/libmylib_rust.shared_from_rust.so")
Jiyong Park1bc84122021-06-22 20:23:05 +09001260}
1261
Colin Cross7812fd32020-09-25 12:35:10 -07001262func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1263 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001264 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001265 apex {
1266 name: "myapex",
1267 key: "myapex.key",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001268 native_shared_libs: [
1269 "mylib",
1270 "mylib3",
1271 "libmylib3_rust",
1272 ],
Colin Cross7812fd32020-09-25 12:35:10 -07001273 min_sdk_version: "29",
1274 }
1275
1276 apex_key {
1277 name: "myapex.key",
1278 public_key: "testkey.avbpubkey",
1279 private_key: "testkey.pem",
1280 }
1281
1282 cc_library {
1283 name: "mylib",
1284 srcs: ["mylib.cpp"],
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001285 shared_libs: [
1286 "mylib2",
1287 "mylib3#impl",
1288 "libmylib2_rust",
1289 "libmylib3_rust#impl",
1290 ],
Colin Cross7812fd32020-09-25 12:35:10 -07001291 system_shared_libs: [],
1292 stl: "none",
1293 apex_available: [ "myapex" ],
1294 min_sdk_version: "28",
1295 }
1296
1297 cc_library {
1298 name: "mylib2",
1299 srcs: ["mylib.cpp"],
1300 cflags: ["-include mylib.h"],
1301 system_shared_libs: [],
1302 stl: "none",
1303 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +00001304 symbol_file: "mylib2.map.txt",
Colin Cross7812fd32020-09-25 12:35:10 -07001305 versions: ["28", "29", "30", "current"],
1306 },
1307 min_sdk_version: "28",
1308 }
1309
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001310 rust_ffi {
1311 name: "libmylib2_rust",
1312 crate_name: "mylib2_rust",
1313 srcs: ["mylib.rs"],
1314 stubs: {
1315 symbol_file: "mylib2.map.txt",
1316 versions: ["28", "29", "30", "current"],
1317 },
1318 min_sdk_version: "28",
1319 }
1320
Colin Cross7812fd32020-09-25 12:35:10 -07001321 cc_library {
1322 name: "mylib3",
1323 srcs: ["mylib.cpp"],
1324 shared_libs: ["mylib4"],
1325 system_shared_libs: [],
1326 stl: "none",
1327 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +00001328 symbol_file: "mylib3.map.txt",
Colin Cross7812fd32020-09-25 12:35:10 -07001329 versions: ["28", "29", "30", "current"],
1330 },
1331 apex_available: [ "myapex" ],
1332 min_sdk_version: "28",
1333 }
1334
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001335 rust_ffi {
1336 name: "libmylib3_rust",
1337 crate_name: "mylib3_rust",
1338 srcs: ["mylib.rs"],
1339 shared_libs: ["libmylib4.from_rust"],
1340 stubs: {
1341 symbol_file: "mylib3.map.txt",
1342 versions: ["28", "29", "30", "current"],
1343 },
1344 apex_available: [ "myapex" ],
1345 min_sdk_version: "28",
1346 }
1347
Colin Cross7812fd32020-09-25 12:35:10 -07001348 cc_library {
1349 name: "mylib4",
1350 srcs: ["mylib.cpp"],
1351 system_shared_libs: [],
1352 stl: "none",
1353 apex_available: [ "myapex" ],
1354 min_sdk_version: "28",
1355 }
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001356
1357 rust_ffi {
1358 name: "libmylib4.from_rust",
1359 crate_name: "mylib4",
1360 srcs: ["mylib.rs"],
1361 apex_available: [ "myapex" ],
1362 min_sdk_version: "28",
1363 }
Colin Cross7812fd32020-09-25 12:35:10 -07001364 `)
1365
Jooyung Hana0503a52023-08-23 13:12:50 +09001366 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Colin Cross7812fd32020-09-25 12:35:10 -07001367 copyCmds := apexRule.Args["copy_commands"]
1368
1369 // Ensure that direct non-stubs dep is always included
1370 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001371 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1372 ensureContains(t, copyCmds, "image.apex/lib64/libmylib3_rust.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001373
1374 // Ensure that indirect stubs dep is not included
1375 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001376 ensureNotContains(t, copyCmds, "image.apex/lib64/libmylib2_rust.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001377
1378 // Ensure that direct stubs dep is included
1379 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1380
1381 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1382
Jiyong Park55549df2021-02-26 23:57:23 +09001383 // Ensure that mylib is linking with the latest version of stub for mylib2
1384 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001385 ensureContains(t, mylibLdFlags, "libmylib2_rust/android_arm64_armv8-a_shared_current/unstripped/libmylib2_rust.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001386 // ... and not linking to the non-stub (impl) variant of mylib2
1387 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001388 ensureNotContains(t, mylibLdFlags, "libmylib2_rust/android_arm64_armv8-a_shared/unstripped/libmylib2_rust.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001389
Colin Crossea91a172024-11-05 16:14:05 -08001390 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because the dependency is added with mylib3#impl)
Colin Cross7812fd32020-09-25 12:35:10 -07001391 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001392 ensureContains(t, mylibLdFlags, "libmylib3_rust/android_arm64_armv8-a_shared_apex29/unstripped/libmylib3_rust.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001393 // .. and not linking to the stubs variant of mylib3
1394 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001395 ensureNotContains(t, mylibLdFlags, "libmylib3_rust/android_arm64_armv8-a_shared_29/unstripped/libmylib3_rust.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001396
1397 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001398 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001399 ensureNotContains(t, mylib2Cflags, "-include ")
1400
Jiyong Park85cc35a2022-07-17 11:30:47 +09001401 // Ensure that genstub is invoked with --systemapi
1402 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001403 ensureContains(t, ctx.ModuleForTests("libmylib2_rust", "android_arm64_armv8-a_shared_29").Rule("cc.genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001404
Jooyung Hana0503a52023-08-23 13:12:50 +09001405 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Colin Cross7812fd32020-09-25 12:35:10 -07001406 "lib64/mylib.so",
1407 "lib64/mylib3.so",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001408 "lib64/libmylib3_rust.so",
Colin Cross7812fd32020-09-25 12:35:10 -07001409 "lib64/mylib4.so",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001410 "lib64/libmylib4.from_rust.so",
1411
1412 "lib64/libstd.dylib.so", // by the implicit dependency from foo.rust
Colin Cross7812fd32020-09-25 12:35:10 -07001413 })
1414}
1415
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001416func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1417 t.Parallel()
1418 // myapex (Z)
1419 // mylib -----------------.
1420 // |
1421 // otherapex (29) |
1422 // libstub's versions: 29 Z current
1423 // |
1424 // <platform> |
1425 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001426 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001427 apex {
1428 name: "myapex",
1429 key: "myapex.key",
1430 native_shared_libs: ["mylib"],
1431 min_sdk_version: "Z", // non-final
1432 }
1433
1434 cc_library {
1435 name: "mylib",
1436 srcs: ["mylib.cpp"],
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001437 shared_libs: [
1438 "libstub",
1439 "libstub_rust",
1440 ],
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001441 apex_available: ["myapex"],
1442 min_sdk_version: "Z",
1443 }
1444
1445 apex_key {
1446 name: "myapex.key",
1447 public_key: "testkey.avbpubkey",
1448 private_key: "testkey.pem",
1449 }
1450
1451 apex {
1452 name: "otherapex",
1453 key: "myapex.key",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001454 native_shared_libs: [
1455 "libstub",
1456 "libstub_rust",
1457 ],
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001458 min_sdk_version: "29",
1459 }
1460
1461 cc_library {
1462 name: "libstub",
1463 srcs: ["mylib.cpp"],
1464 stubs: {
1465 versions: ["29", "Z", "current"],
1466 },
1467 apex_available: ["otherapex"],
1468 min_sdk_version: "29",
1469 }
1470
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001471 rust_ffi {
1472 name: "libstub_rust",
1473 crate_name: "stub_rust",
1474 srcs: ["mylib.rs"],
1475 stubs: {
1476 versions: ["29", "Z", "current"],
1477 },
1478 apex_available: ["otherapex"],
1479 min_sdk_version: "29",
1480 }
1481
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001482 // platform module depending on libstub from otherapex should use the latest stub("current")
1483 cc_library {
1484 name: "libplatform",
1485 srcs: ["mylib.cpp"],
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001486 shared_libs: [
1487 "libstub",
1488 "libstub_rust",
1489 ],
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001490 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001491 `,
1492 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1493 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1494 variables.Platform_sdk_final = proptools.BoolPtr(false)
1495 variables.Platform_version_active_codenames = []string{"Z"}
1496 }),
1497 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001498
Jiyong Park55549df2021-02-26 23:57:23 +09001499 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001500 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001501 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001502 // rust stubs do not emit -D__LIBFOO_API__ flags as this is deprecated behavior for cc stubs
1503
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001504 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001505 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001506 ensureContains(t, mylibLdflags, "libstub_rust/android_arm64_armv8-a_shared_current/unstripped/libstub_rust.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001507
1508 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1509 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1510 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001511 // rust stubs do not emit -D__LIBFOO_API__ flags as this is deprecated behavior for cc stubs
1512
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001513 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1514 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001515 ensureContains(t, libplatformLdflags, "libstub_rust/android_arm64_armv8-a_shared_current/unstripped/libstub_rust.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001516}
1517
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001518func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001519 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001520 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001521 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001522 name: "myapex2",
1523 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001524 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001525 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001526 }
1527
1528 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001529 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001530 public_key: "testkey.avbpubkey",
1531 private_key: "testkey.pem",
1532 }
1533
1534 cc_library {
1535 name: "mylib",
1536 srcs: ["mylib.cpp"],
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001537 shared_libs: [
1538 "libfoo#10",
1539 "libfoo_rust#10"
1540 ],
Jiyong Park678c8812020-02-07 17:25:49 +09001541 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001542 system_shared_libs: [],
1543 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001544 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001545 }
1546
1547 cc_library {
1548 name: "libfoo",
1549 srcs: ["mylib.cpp"],
1550 shared_libs: ["libbar"],
1551 system_shared_libs: [],
1552 stl: "none",
1553 stubs: {
1554 versions: ["10", "20", "30"],
1555 },
1556 }
1557
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001558 rust_ffi {
1559 name: "libfoo_rust",
1560 crate_name: "foo_rust",
1561 srcs: ["mylib.cpp"],
1562 shared_libs: ["libbar.from_rust"],
1563 stubs: {
1564 versions: ["10", "20", "30"],
1565 },
1566 }
1567
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001568 cc_library {
1569 name: "libbar",
1570 srcs: ["mylib.cpp"],
1571 system_shared_libs: [],
1572 stl: "none",
1573 }
1574
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001575 cc_library {
1576 name: "libbar.from_rust",
1577 srcs: ["mylib.cpp"],
1578 system_shared_libs: [],
1579 stl: "none",
1580 }
1581
Jiyong Park678c8812020-02-07 17:25:49 +09001582 cc_library_static {
1583 name: "libbaz",
1584 srcs: ["mylib.cpp"],
1585 system_shared_libs: [],
1586 stl: "none",
1587 apex_available: [ "myapex2" ],
1588 }
1589
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001590 `)
1591
Jooyung Hana0503a52023-08-23 13:12:50 +09001592 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001593 copyCmds := apexRule.Args["copy_commands"]
1594
1595 // Ensure that direct non-stubs dep is always included
1596 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1597
1598 // Ensure that indirect stubs dep is not included
1599 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001600 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo_rust.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001601
1602 // Ensure that dependency of stubs is not included
1603 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001604 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.from_rust.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001605
Colin Crossaede88c2020-08-11 12:17:01 -07001606 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001607
1608 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001609 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001610 ensureContains(t, mylibLdFlags, "libfoo_rust/android_arm64_armv8-a_shared_10/unstripped/libfoo_rust.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001611 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001612 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001613 ensureNotContains(t, mylibLdFlags, "libfoo_rust/android_arm64_armv8-a_shared/unstripped/libfoo_rust.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001614
Jiyong Park3ff16992019-12-27 14:11:47 +09001615 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001616 libFooRustStubsLdFlags := ctx.ModuleForTests("libfoo_rust", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001617
1618 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1619 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001620 ensureNotContains(t, libFooRustStubsLdFlags, "libbar.from_rust.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001621
Colin Crossf61d03d2023-11-02 16:56:39 -07001622 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1623 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001624 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001625
Colin Crossf61d03d2023-11-02 16:56:39 -07001626 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1627 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001628 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001629}
1630
Jooyung Hand3639552019-08-09 12:57:43 +09001631func TestApexWithRuntimeLibsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001632 t.Parallel()
Jooyung Hand3639552019-08-09 12:57:43 +09001633 /*
1634 myapex
1635 |
1636 v (runtime_libs)
1637 mylib ------+------> libfoo [provides stub]
1638 |
1639 `------> libbar
1640 */
Colin Cross1c460562021-02-16 17:55:47 -08001641 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001642 apex {
1643 name: "myapex",
1644 key: "myapex.key",
1645 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001646 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001647 }
1648
1649 apex_key {
1650 name: "myapex.key",
1651 public_key: "testkey.avbpubkey",
1652 private_key: "testkey.pem",
1653 }
1654
1655 cc_library {
1656 name: "mylib",
1657 srcs: ["mylib.cpp"],
Liz Kammer5f108fa2023-05-11 14:33:17 -04001658 static_libs: ["libstatic"],
1659 shared_libs: ["libshared"],
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001660 runtime_libs: [
1661 "libfoo",
1662 "libbar",
1663 "libfoo_rs",
1664 ],
Jooyung Hand3639552019-08-09 12:57:43 +09001665 system_shared_libs: [],
1666 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001667 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001668 }
1669
1670 cc_library {
1671 name: "libfoo",
1672 srcs: ["mylib.cpp"],
1673 system_shared_libs: [],
1674 stl: "none",
1675 stubs: {
1676 versions: ["10", "20", "30"],
1677 },
1678 }
1679
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001680 rust_ffi {
1681 name: "libfoo_rs",
1682 crate_name: "foo_rs",
1683 srcs: ["mylib.rs"],
1684 stubs: {
1685 versions: ["10", "20", "30"],
1686 },
1687 }
1688
Jooyung Hand3639552019-08-09 12:57:43 +09001689 cc_library {
1690 name: "libbar",
1691 srcs: ["mylib.cpp"],
1692 system_shared_libs: [],
1693 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001694 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001695 }
1696
Liz Kammer5f108fa2023-05-11 14:33:17 -04001697 cc_library {
1698 name: "libstatic",
1699 srcs: ["mylib.cpp"],
1700 system_shared_libs: [],
1701 stl: "none",
1702 apex_available: [ "myapex" ],
1703 runtime_libs: ["libstatic_to_runtime"],
1704 }
1705
1706 cc_library {
1707 name: "libshared",
1708 srcs: ["mylib.cpp"],
1709 system_shared_libs: [],
1710 stl: "none",
1711 apex_available: [ "myapex" ],
1712 runtime_libs: ["libshared_to_runtime"],
1713 }
1714
1715 cc_library {
1716 name: "libstatic_to_runtime",
1717 srcs: ["mylib.cpp"],
1718 system_shared_libs: [],
1719 stl: "none",
1720 apex_available: [ "myapex" ],
1721 }
1722
1723 cc_library {
1724 name: "libshared_to_runtime",
1725 srcs: ["mylib.cpp"],
1726 system_shared_libs: [],
1727 stl: "none",
1728 apex_available: [ "myapex" ],
1729 }
Jooyung Hand3639552019-08-09 12:57:43 +09001730 `)
1731
Jooyung Hana0503a52023-08-23 13:12:50 +09001732 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001733 copyCmds := apexRule.Args["copy_commands"]
1734
1735 // Ensure that direct non-stubs dep is always included
1736 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1737
1738 // Ensure that indirect stubs dep is not included
1739 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001740 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo_rs.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001741
1742 // Ensure that runtime_libs dep in included
1743 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
Liz Kammer5f108fa2023-05-11 14:33:17 -04001744 ensureContains(t, copyCmds, "image.apex/lib64/libshared.so")
1745 ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so")
1746
1747 ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001748
Jooyung Hana0503a52023-08-23 13:12:50 +09001749 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001750 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1751 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001752 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo_rs.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001753}
1754
Paul Duffina02cae32021-03-09 01:44:06 +00001755var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1756 cc.PrepareForTestWithCcBuildComponents,
1757 PrepareForTestWithApexBuildComponents,
1758 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001759 apex {
1760 name: "com.android.runtime",
1761 key: "com.android.runtime.key",
1762 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001763 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001764 }
1765
1766 apex_key {
1767 name: "com.android.runtime.key",
1768 public_key: "testkey.avbpubkey",
1769 private_key: "testkey.pem",
1770 }
Paul Duffina02cae32021-03-09 01:44:06 +00001771 `),
1772 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1773)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001774
Paul Duffina02cae32021-03-09 01:44:06 +00001775func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001776 t.Parallel()
Paul Duffin70d3bee2021-03-21 11:26:05 +00001777 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001778 cc_library {
1779 name: "libc",
1780 no_libcrt: true,
1781 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001782 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001783 stl: "none",
1784 system_shared_libs: [],
1785 stubs: { versions: ["1"] },
1786 apex_available: ["com.android.runtime"],
1787
1788 sanitize: {
1789 hwaddress: true,
1790 }
1791 }
1792
1793 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001794 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001795 no_libcrt: true,
1796 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001797 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001798 stl: "none",
1799 system_shared_libs: [],
1800 srcs: [""],
1801 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001802 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001803
1804 sanitize: {
1805 never: true,
1806 },
Spandan Das4de7b492023-05-05 21:13:01 +00001807 apex_available: [
1808 "//apex_available:anyapex",
1809 "//apex_available:platform",
1810 ],
Paul Duffina02cae32021-03-09 01:44:06 +00001811 } `)
1812 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001813
Jooyung Hana0503a52023-08-23 13:12:50 +09001814 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001815 "lib64/bionic/libc.so",
1816 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1817 })
1818
Colin Cross4c4c1be2022-02-10 11:41:18 -08001819 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001820
1821 installed := hwasan.Description("install libclang_rt.hwasan")
1822 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1823
1824 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1825 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1826 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1827}
1828
1829func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001830 t.Parallel()
Paul Duffin70d3bee2021-03-21 11:26:05 +00001831 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001832 prepareForTestOfRuntimeApexWithHwasan,
1833 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1834 variables.SanitizeDevice = []string{"hwaddress"}
1835 }),
1836 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001837 cc_library {
1838 name: "libc",
1839 no_libcrt: true,
1840 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001841 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001842 stl: "none",
1843 system_shared_libs: [],
1844 stubs: { versions: ["1"] },
1845 apex_available: ["com.android.runtime"],
1846 }
1847
1848 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001849 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001850 no_libcrt: true,
1851 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001852 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001853 stl: "none",
1854 system_shared_libs: [],
1855 srcs: [""],
1856 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001857 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001858
1859 sanitize: {
1860 never: true,
1861 },
Spandan Das4de7b492023-05-05 21:13:01 +00001862 apex_available: [
1863 "//apex_available:anyapex",
1864 "//apex_available:platform",
1865 ],
Jooyung Han8ce8db92020-05-15 19:05:05 +09001866 }
Paul Duffina02cae32021-03-09 01:44:06 +00001867 `)
1868 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001869
Jooyung Hana0503a52023-08-23 13:12:50 +09001870 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001871 "lib64/bionic/libc.so",
1872 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1873 })
1874
Colin Cross4c4c1be2022-02-10 11:41:18 -08001875 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001876
1877 installed := hwasan.Description("install libclang_rt.hwasan")
1878 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1879
1880 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1881 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1882 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1883}
1884
Jooyung Han61b66e92020-03-21 14:21:46 +00001885func TestApexDependsOnLLNDKTransitively(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001886 t.Parallel()
Jooyung Han61b66e92020-03-21 14:21:46 +00001887 testcases := []struct {
1888 name string
1889 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001890 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001891 shouldLink string
1892 shouldNotLink []string
1893 }{
1894 {
Jiyong Park55549df2021-02-26 23:57:23 +09001895 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001896 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001897 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001898 shouldLink: "current",
1899 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001900 },
1901 {
Jiyong Park55549df2021-02-26 23:57:23 +09001902 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001903 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001904 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001905 shouldLink: "current",
1906 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001907 },
1908 }
1909 for _, tc := range testcases {
1910 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001911 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001912 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001913 apex {
1914 name: "myapex",
1915 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001916 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001917 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001918 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001919 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001920
Jooyung Han61b66e92020-03-21 14:21:46 +00001921 apex_key {
1922 name: "myapex.key",
1923 public_key: "testkey.avbpubkey",
1924 private_key: "testkey.pem",
1925 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001926
Jooyung Han61b66e92020-03-21 14:21:46 +00001927 cc_library {
1928 name: "mylib",
1929 srcs: ["mylib.cpp"],
1930 vendor_available: true,
1931 shared_libs: ["libbar"],
1932 system_shared_libs: [],
1933 stl: "none",
1934 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001935 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001936 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001937
Jooyung Han61b66e92020-03-21 14:21:46 +00001938 cc_library {
1939 name: "libbar",
1940 srcs: ["mylib.cpp"],
1941 system_shared_libs: [],
1942 stl: "none",
1943 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001944 llndk: {
1945 symbol_file: "libbar.map.txt",
1946 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001947 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001948 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001949 withUnbundledBuild,
1950 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001951
Jooyung Han61b66e92020-03-21 14:21:46 +00001952 // Ensure that LLNDK dep is not included
Jooyung Hana0503a52023-08-23 13:12:50 +09001953 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han61b66e92020-03-21 14:21:46 +00001954 "lib64/mylib.so",
1955 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001956
Jooyung Han61b66e92020-03-21 14:21:46 +00001957 // Ensure that LLNDK dep is required
Jooyung Hana0503a52023-08-23 13:12:50 +09001958 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han61b66e92020-03-21 14:21:46 +00001959 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1960 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001961
Steven Moreland2c4000c2021-04-27 02:08:49 +00001962 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1963 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001964 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001965 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001966 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001967
Steven Moreland2c4000c2021-04-27 02:08:49 +00001968 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001969 ver := tc.shouldLink
1970 if tc.shouldLink == "current" {
1971 ver = strconv.Itoa(android.FutureApiLevelInt)
1972 }
1973 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001974 })
1975 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001976}
1977
Jiyong Park25fc6a92018-11-18 18:02:45 +09001978func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001979 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001980 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001981 apex {
1982 name: "myapex",
1983 key: "myapex.key",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001984 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm", "libmylib_rs"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001985 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001986 }
1987
1988 apex_key {
1989 name: "myapex.key",
1990 public_key: "testkey.avbpubkey",
1991 private_key: "testkey.pem",
1992 }
1993
1994 cc_library {
1995 name: "mylib",
1996 srcs: ["mylib.cpp"],
Colin Crossea91a172024-11-05 16:14:05 -08001997 system_shared_libs: ["libc"],
1998 shared_libs: ["libdl#27", "libm#impl"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001999 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002000 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09002001 }
2002
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002003 rust_ffi {
2004 name: "libmylib_rs",
2005 crate_name: "mylib_rs",
2006 shared_libs: ["libvers#27", "libm#impl"],
2007 srcs: ["mylib.rs"],
2008 apex_available: [ "myapex" ],
2009 }
2010
Jiyong Park25fc6a92018-11-18 18:02:45 +09002011 cc_library_shared {
2012 name: "mylib_shared",
2013 srcs: ["mylib.cpp"],
2014 shared_libs: ["libdl#27"],
2015 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002016 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09002017 }
2018
2019 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09002020 name: "libBootstrap",
2021 srcs: ["mylib.cpp"],
2022 stl: "none",
2023 bootstrap: true,
2024 }
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002025
2026 rust_ffi {
2027 name: "libbootstrap_rs",
2028 srcs: ["mylib.cpp"],
2029 crate_name: "bootstrap_rs",
2030 bootstrap: true,
2031 }
2032
2033 cc_library {
2034 name: "libvers",
2035 srcs: ["mylib.cpp"],
2036 stl: "none",
2037 stubs: { versions: ["27","30"] },
2038 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09002039 `)
2040
Jooyung Hana0503a52023-08-23 13:12:50 +09002041 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002042 copyCmds := apexRule.Args["copy_commands"]
2043
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002044 // Ensure that mylib, libmylib_rs, libm, libdl, libstd.dylib.so (from Rust) are included.
Alex Light5098a612018-11-29 17:12:15 -08002045 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002046 ensureContains(t, copyCmds, "image.apex/lib64/libmylib_rs.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09002047 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
2048 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002049 ensureContains(t, copyCmds, "image.apex/lib64/libstd.dylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002050
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002051 // Ensure that libc and liblog (from Rust) is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09002052 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002053 ensureNotContains(t, copyCmds, "image.apex/lib64/liblog.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002054
Colin Crossaede88c2020-08-11 12:17:01 -07002055 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002056 mylibRsFlags := ctx.ModuleForTests("libmylib_rs", "android_arm64_armv8-a_shared_apex10000").Rule("rustc").Args["linkFlags"]
Colin Crossaede88c2020-08-11 12:17:01 -07002057 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
2058 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09002059
2060 // For dependency to libc
2061 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002062 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002063 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09002064 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002065 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002066 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
2067 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002068
2069 // For dependency to libm
2070 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07002071 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002072 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09002073 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002074 // ... and is not compiling with the stub
2075 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
2076 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
2077
2078 // For dependency to libdl
2079 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09002080 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002081 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09002082 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
2083 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002084 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07002085 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002086 // ... Cflags from stub is correctly exported to mylib
2087 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
2088 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09002089
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002090 // Rust checks
2091 // For dependency to libc, liblog
2092 // Ensure that libmylib_rs is linking with the latest versions of stubs
2093 ensureContains(t, mylibRsFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
2094 ensureContains(t, mylibRsFlags, "liblog/android_arm64_armv8-a_shared_current/liblog.so")
2095 // ... and not linking to the non-stub (impl) variants
2096 ensureNotContains(t, mylibRsFlags, "libc/android_arm64_armv8-a_shared/libc.so")
2097 ensureNotContains(t, mylibRsFlags, "liblog/android_arm64_armv8-a_shared/liblog.so")
2098
2099 // For libm dependency (explicit)
2100 // Ensure that mylib is linking with the non-stub (impl) variant
2101 ensureContains(t, mylibRsFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
2102 // ... and not linking to the stub variant
2103 ensureNotContains(t, mylibRsFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
2104
2105 // For dependency to libvers
2106 // (We do not use libdl#27 as Rust links the system libs implicitly and does
2107 // not currently have a system_shared_libs equivalent to prevent this)
2108 // Ensure that mylib is linking with the specified version of stubs
2109 ensureContains(t, mylibRsFlags, "libvers/android_arm64_armv8-a_shared_27/libvers.so")
2110 // ... and not linking to the other versions of stubs
2111 ensureNotContains(t, mylibRsFlags, "libvers/android_arm64_armv8-a_shared_30/libvers.so")
2112 // ... and not linking to the non-stub (impl) variant
2113 ensureNotContains(t, mylibRsFlags, "libvers/android_arm64_armv8-a_shared_apex10000/libvers.so")
2114
Jiyong Parkb0788572018-12-20 22:10:17 +09002115 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08002116 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
2117 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
2118 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
2119 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002120
2121 // Ensure that libbootstrap_rs is depending on the platform variant of bionic libs
2122 libRsFlags := ctx.ModuleForTests("libbootstrap_rs", "android_arm64_armv8-a_shared").Rule("rustc").Args["linkFlags"]
2123 ensureContains(t, libRsFlags, "libc/android_arm64_armv8-a_shared/libc.so")
2124 ensureContains(t, libRsFlags, "libm/android_arm64_armv8-a_shared/libm.so")
2125 ensureContains(t, libRsFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002126}
Jiyong Park7c2ee712018-12-07 00:42:25 +09002127
Jooyung Han749dc692020-04-15 11:03:39 +09002128func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002129 t.Parallel()
Jiyong Park55549df2021-02-26 23:57:23 +09002130 // there are three links between liba --> libz.
2131 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09002132 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09002133 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08002134 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002135 apex {
2136 name: "myapex",
2137 key: "myapex.key",
2138 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09002139 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002140 }
2141
2142 apex {
2143 name: "otherapex",
2144 key: "myapex.key",
2145 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09002146 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09002147 }
2148
2149 apex_key {
2150 name: "myapex.key",
2151 public_key: "testkey.avbpubkey",
2152 private_key: "testkey.pem",
2153 }
2154
2155 cc_library {
2156 name: "libx",
2157 shared_libs: ["liba"],
2158 system_shared_libs: [],
2159 stl: "none",
2160 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002161 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002162 }
2163
2164 cc_library {
2165 name: "liby",
2166 shared_libs: ["liba"],
2167 system_shared_libs: [],
2168 stl: "none",
2169 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002170 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002171 }
2172
2173 cc_library {
2174 name: "liba",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002175 shared_libs: ["libz", "libz_rs"],
Jooyung Han03b51852020-02-26 22:45:42 +09002176 system_shared_libs: [],
2177 stl: "none",
2178 apex_available: [
2179 "//apex_available:anyapex",
2180 "//apex_available:platform",
2181 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002182 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002183 }
2184
2185 cc_library {
2186 name: "libz",
2187 system_shared_libs: [],
2188 stl: "none",
2189 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09002190 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09002191 },
2192 }
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002193
2194 rust_ffi {
2195 name: "libz_rs",
2196 crate_name: "z_rs",
2197 srcs: ["foo.rs"],
2198 stubs: {
2199 versions: ["28", "30"],
2200 },
2201 }
Jooyung Han749dc692020-04-15 11:03:39 +09002202 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002203
2204 expectLink := func(from, from_variant, to, to_variant string) {
2205 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2206 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2207 }
2208 expectNoLink := func(from, from_variant, to, to_variant string) {
2209 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2210 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2211 }
2212 // platform liba is linked to non-stub version
2213 expectLink("liba", "shared", "libz", "shared")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002214 expectLink("liba", "shared", "unstripped/libz_rs", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002215 // liba in myapex is linked to current
2216 expectLink("liba", "shared_apex29", "libz", "shared_current")
2217 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09002218 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07002219 expectNoLink("liba", "shared_apex29", "libz", "shared")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002220 expectLink("liba", "shared_apex29", "unstripped/libz_rs", "shared_current")
2221 expectNoLink("liba", "shared_apex29", "unstripped/libz_rs", "shared_30")
2222 expectNoLink("liba", "shared_apex29", "unstripped/libz_rs", "shared_28")
2223 expectNoLink("liba", "shared_apex29", "unstripped/libz_rs", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002224 // liba in otherapex is linked to current
2225 expectLink("liba", "shared_apex30", "libz", "shared_current")
2226 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07002227 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
2228 expectNoLink("liba", "shared_apex30", "libz", "shared")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002229 expectLink("liba", "shared_apex30", "unstripped/libz_rs", "shared_current")
2230 expectNoLink("liba", "shared_apex30", "unstripped/libz_rs", "shared_30")
2231 expectNoLink("liba", "shared_apex30", "unstripped/libz_rs", "shared_28")
2232 expectNoLink("liba", "shared_apex30", "unstripped/libz_rs", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09002233}
2234
Jooyung Hanaed150d2020-04-02 01:41:41 +09002235func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002236 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002237 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09002238 apex {
2239 name: "myapex",
2240 key: "myapex.key",
2241 native_shared_libs: ["libx"],
2242 min_sdk_version: "R",
2243 }
2244
2245 apex_key {
2246 name: "myapex.key",
2247 public_key: "testkey.avbpubkey",
2248 private_key: "testkey.pem",
2249 }
2250
2251 cc_library {
2252 name: "libx",
2253 shared_libs: ["libz"],
2254 system_shared_libs: [],
2255 stl: "none",
2256 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002257 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09002258 }
2259
2260 cc_library {
2261 name: "libz",
2262 system_shared_libs: [],
2263 stl: "none",
2264 stubs: {
2265 versions: ["29", "R"],
2266 },
2267 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002268 `,
2269 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2270 variables.Platform_version_active_codenames = []string{"R"}
2271 }),
2272 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09002273
2274 expectLink := func(from, from_variant, to, to_variant string) {
2275 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2276 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2277 }
2278 expectNoLink := func(from, from_variant, to, to_variant string) {
2279 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2280 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2281 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002282 expectLink("libx", "shared_apex10000", "libz", "shared_current")
2283 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07002284 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
2285 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09002286}
2287
Jooyung Han4c4da062021-06-23 10:23:16 +09002288func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002289 t.Parallel()
Jooyung Han4c4da062021-06-23 10:23:16 +09002290 testApex(t, `
2291 apex {
2292 name: "myapex",
2293 key: "myapex.key",
2294 java_libs: ["libx"],
2295 min_sdk_version: "S",
2296 }
2297
2298 apex_key {
2299 name: "myapex.key",
2300 public_key: "testkey.avbpubkey",
2301 private_key: "testkey.pem",
2302 }
2303
2304 java_library {
2305 name: "libx",
2306 srcs: ["a.java"],
2307 apex_available: [ "myapex" ],
2308 sdk_version: "current",
2309 min_sdk_version: "S", // should be okay
Colin Crosse4f34882024-11-14 12:26:00 -08002310 compile_dex: true,
Jooyung Han4c4da062021-06-23 10:23:16 +09002311 }
2312 `,
2313 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2314 variables.Platform_version_active_codenames = []string{"S"}
2315 variables.Platform_sdk_codename = proptools.StringPtr("S")
2316 }),
2317 )
2318}
2319
Jooyung Han749dc692020-04-15 11:03:39 +09002320func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002321 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002322 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002323 apex {
2324 name: "myapex",
2325 key: "myapex.key",
2326 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002327 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002328 }
2329
2330 apex_key {
2331 name: "myapex.key",
2332 public_key: "testkey.avbpubkey",
2333 private_key: "testkey.pem",
2334 }
2335
2336 cc_library {
2337 name: "libx",
2338 shared_libs: ["libz"],
2339 system_shared_libs: [],
2340 stl: "none",
2341 apex_available: [ "myapex" ],
2342 }
2343
2344 cc_library {
2345 name: "libz",
2346 system_shared_libs: [],
2347 stl: "none",
2348 stubs: {
2349 versions: ["1", "2"],
2350 },
2351 }
2352 `)
2353
2354 expectLink := func(from, from_variant, to, to_variant string) {
2355 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2356 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2357 }
2358 expectNoLink := func(from, from_variant, to, to_variant string) {
2359 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2360 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2361 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002362 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002363 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002364 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07002365 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09002366}
2367
Jooyung Handfc864c2023-03-20 18:19:07 +09002368func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002369 t.Parallel()
Jiyong Park5df7bd32021-08-25 16:18:46 +09002370 ctx := testApex(t, `
2371 apex {
2372 name: "myapex",
2373 key: "myapex.key",
2374 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09002375 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002376 vendor: true,
2377 min_sdk_version: "29",
2378 }
2379
2380 apex_key {
2381 name: "myapex.key",
2382 public_key: "testkey.avbpubkey",
2383 private_key: "testkey.pem",
2384 }
2385
2386 cc_library {
2387 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09002388 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09002389 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002390 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09002391 shared_libs: ["libbar"],
2392 }
2393
2394 cc_library {
2395 name: "libbar",
2396 stubs: { versions: ["29", "30"] },
2397 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09002398 }
2399 `)
2400
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002401 vendorVariant := "android_vendor_arm64_armv8-a"
Jiyong Park5df7bd32021-08-25 16:18:46 +09002402
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002403 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29")
Jooyung Handfc864c2023-03-20 18:19:07 +09002404
2405 // Ensure that mylib links with "current" LLNDK
2406 libFlags := names(mylib.Rule("ld").Args["libFlags"])
Jooyung Han5e8994e2024-03-12 14:12:12 +09002407 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared/libbar.so")
Jooyung Handfc864c2023-03-20 18:19:07 +09002408
2409 // Ensure that mylib is targeting 29
2410 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
2411 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
2412
2413 // Ensure that the correct variant of crtbegin_so is used.
2414 crtBegin := mylib.Rule("ld").Args["crtBegin"]
2415 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09002416
2417 // Ensure that the crtbegin_so used by the APEX is targeting 29
2418 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
2419 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
2420}
2421
Chan Wang54956a62025-01-14 18:04:39 +00002422func TestTrackAllowedDepsForAndroidApex(t *testing.T) {
2423 t.Parallel()
2424 ctx := testApex(t, `
2425 apex {
2426 name: "com.android.myapex",
2427 key: "myapex.key",
2428 updatable: true,
2429 native_shared_libs: [
2430 "mylib",
2431 "yourlib",
2432 ],
2433 min_sdk_version: "29",
2434 }
2435
2436 apex {
2437 name: "myapex2",
2438 key: "myapex.key",
2439 updatable: false,
2440 native_shared_libs: ["yourlib"],
2441 }
2442
2443 apex_key {
2444 name: "myapex.key",
2445 public_key: "testkey.avbpubkey",
2446 private_key: "testkey.pem",
2447 }
2448
2449 cc_library {
2450 name: "mylib",
2451 srcs: ["mylib.cpp"],
2452 shared_libs: ["libbar", "libbar_rs"],
2453 min_sdk_version: "29",
2454 apex_available: ["com.android.myapex"],
2455 }
2456
2457 cc_library {
2458 name: "libbar",
2459 stubs: { versions: ["29", "30"] },
2460 }
2461
2462 rust_ffi {
2463 name: "libbar_rs",
2464 crate_name: "bar_rs",
2465 srcs: ["bar.rs"],
2466 stubs: { versions: ["29", "30"] },
2467 }
2468
2469 cc_library {
2470 name: "yourlib",
2471 srcs: ["mylib.cpp"],
2472 min_sdk_version: "29",
2473 apex_available: ["com.android.myapex", "myapex2", "//apex_available:platform"],
2474 }
2475 `, withFiles(android.MockFS{
2476 "packages/modules/common/build/allowed_deps.txt": nil,
2477 }),
2478 android.FixtureMergeMockFs(android.MockFS{
2479 "system/sepolicy/apex/com.android.myapex-file_contexts": nil,
2480 }))
2481
2482 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2483 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2484 android.AssertStringListContains(t, "updatable com.android.myapex should generate depsinfo file", inputs,
2485 "out/soong/.intermediates/com.android.myapex/android_common_com.android.myapex/depsinfo/flatlist.txt")
2486 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
2487 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
2488
2489 myapex := ctx.ModuleForTests("com.android.myapex", "android_common_com.android.myapex")
2490 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2491 myapex.Output("depsinfo/flatlist.txt")), "\n")
2492 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2493 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2494 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2495 flatlist, "libbar_rs(minSdkVersion:(no version)) (external)")
2496 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2497 flatlist, "mylib:(minSdkVersion:29)")
2498 android.AssertStringListContains(t, "track platform-available lib",
2499 flatlist, "yourlib(minSdkVersion:29)")
2500}
2501
2502func TestNotTrackAllowedDepsForNonAndroidApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002503 t.Parallel()
Jooyung Han4495f842023-04-25 16:39:59 +09002504 ctx := testApex(t, `
2505 apex {
2506 name: "myapex",
2507 key: "myapex.key",
2508 updatable: true,
2509 native_shared_libs: [
2510 "mylib",
2511 "yourlib",
2512 ],
2513 min_sdk_version: "29",
2514 }
2515
2516 apex {
2517 name: "myapex2",
2518 key: "myapex.key",
2519 updatable: false,
2520 native_shared_libs: ["yourlib"],
2521 }
2522
2523 apex_key {
2524 name: "myapex.key",
2525 public_key: "testkey.avbpubkey",
2526 private_key: "testkey.pem",
2527 }
2528
2529 cc_library {
2530 name: "mylib",
2531 srcs: ["mylib.cpp"],
Chan Wang54956a62025-01-14 18:04:39 +00002532 shared_libs: ["libbar"],
Jooyung Han4495f842023-04-25 16:39:59 +09002533 min_sdk_version: "29",
2534 apex_available: ["myapex"],
2535 }
2536
2537 cc_library {
2538 name: "libbar",
2539 stubs: { versions: ["29", "30"] },
2540 }
2541
2542 cc_library {
2543 name: "yourlib",
2544 srcs: ["mylib.cpp"],
2545 min_sdk_version: "29",
2546 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2547 }
2548 `, withFiles(android.MockFS{
2549 "packages/modules/common/build/allowed_deps.txt": nil,
2550 }))
2551
2552 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2553 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
Chan Wang54956a62025-01-14 18:04:39 +00002554 android.AssertStringListDoesNotContain(t, "updatable myapex should generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002555 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002556 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002557 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002558}
2559
2560func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002561 t.Parallel()
Jooyung Han4495f842023-04-25 16:39:59 +09002562 ctx := testApex(t, `
2563 apex {
Chan Wang54956a62025-01-14 18:04:39 +00002564 name: "com.android.myapex",
Jooyung Han4495f842023-04-25 16:39:59 +09002565 key: "myapex.key",
2566 updatable: true,
2567 min_sdk_version: "29",
2568 }
2569
2570 apex_key {
2571 name: "myapex.key",
2572 public_key: "testkey.avbpubkey",
2573 private_key: "testkey.pem",
2574 }
Chan Wang54956a62025-01-14 18:04:39 +00002575 `,
2576 android.FixtureMergeMockFs(android.MockFS{
2577 "system/sepolicy/apex/com.android.myapex-file_contexts": nil,
2578 }))
Jooyung Han4495f842023-04-25 16:39:59 +09002579 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2580 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2581 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2582 }
2583}
2584
Jooyung Han03b51852020-02-26 22:45:42 +09002585func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002586 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002587 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002588 apex {
2589 name: "myapex",
2590 key: "myapex.key",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002591 native_shared_libs: ["libx", "libx_rs"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002592 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002593 }
2594
2595 apex_key {
2596 name: "myapex.key",
2597 public_key: "testkey.avbpubkey",
2598 private_key: "testkey.pem",
2599 }
2600
2601 cc_library {
2602 name: "libx",
2603 system_shared_libs: [],
2604 stl: "none",
2605 apex_available: [ "myapex" ],
2606 stubs: {
2607 versions: ["1", "2"],
2608 },
2609 }
2610
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002611 rust_ffi {
2612 name: "libx_rs",
2613 crate_name: "x_rs",
2614 srcs: ["x.rs"],
2615 apex_available: [ "myapex" ],
2616 stubs: {
2617 versions: ["1", "2"],
2618 },
2619 }
2620
Jooyung Han03b51852020-02-26 22:45:42 +09002621 cc_library {
2622 name: "libz",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002623 shared_libs: ["libx", "libx_rs",],
Jooyung Han03b51852020-02-26 22:45:42 +09002624 system_shared_libs: [],
2625 stl: "none",
2626 }
2627 `)
2628
2629 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002630 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002631 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2632 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2633 }
2634 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002635 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002636 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2637 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2638 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002639 expectLink("libz", "shared", "libx", "shared_current")
2640 expectNoLink("libz", "shared", "libx", "shared_2")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002641 expectLink("libz", "shared", "unstripped/libx_rs", "shared_current")
2642 expectNoLink("libz", "shared", "unstripped/libx_rs", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002643 expectNoLink("libz", "shared", "libz", "shared_1")
2644 expectNoLink("libz", "shared", "libz", "shared")
2645}
2646
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002647var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2648 func(variables android.FixtureProductVariables) {
2649 variables.SanitizeDevice = []string{"hwaddress"}
2650 },
2651)
2652
Jooyung Han75568392020-03-20 04:29:24 +09002653func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002654 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002655 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002656 apex {
2657 name: "myapex",
2658 key: "myapex.key",
2659 native_shared_libs: ["libx"],
2660 min_sdk_version: "29",
2661 }
2662
2663 apex_key {
2664 name: "myapex.key",
2665 public_key: "testkey.avbpubkey",
2666 private_key: "testkey.pem",
2667 }
2668
2669 cc_library {
2670 name: "libx",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002671 shared_libs: ["libbar", "libbar_rs"],
Jooyung Han03b51852020-02-26 22:45:42 +09002672 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002673 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002674 }
2675
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002676 rust_ffi {
2677 name: "libbar_rs",
2678 crate_name: "bar_rs",
2679 srcs: ["bar.rs"],
2680 stubs: { versions: ["29", "30"] },
2681 }
2682
Jooyung Han03b51852020-02-26 22:45:42 +09002683 cc_library {
2684 name: "libbar",
2685 stubs: {
2686 versions: ["29", "30"],
2687 },
2688 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002689 `,
2690 prepareForTestWithSantitizeHwaddress,
2691 )
Jooyung Han03b51852020-02-26 22:45:42 +09002692 expectLink := func(from, from_variant, to, to_variant string) {
2693 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2694 libFlags := ld.Args["libFlags"]
2695 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2696 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002697 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002698 expectLink("libx", "shared_hwasan_apex29", "unstripped/libbar_rs", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002699}
2700
Jooyung Han75568392020-03-20 04:29:24 +09002701func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002702 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002703 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002704 apex {
2705 name: "myapex",
2706 key: "myapex.key",
2707 native_shared_libs: ["libx"],
2708 min_sdk_version: "29",
2709 }
2710
2711 apex_key {
2712 name: "myapex.key",
2713 public_key: "testkey.avbpubkey",
2714 private_key: "testkey.pem",
2715 }
2716
2717 cc_library {
2718 name: "libx",
2719 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002720 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002721 }
Jooyung Han75568392020-03-20 04:29:24 +09002722 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002723
2724 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002725 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002726 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002727 // note that platform variant is not.
2728 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002729 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002730}
2731
Jooyung Han749dc692020-04-15 11:03:39 +09002732func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002733 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002734 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002735 apex {
2736 name: "myapex",
2737 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002738 native_shared_libs: ["mylib"],
2739 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002740 }
2741
2742 apex_key {
2743 name: "myapex.key",
2744 public_key: "testkey.avbpubkey",
2745 private_key: "testkey.pem",
2746 }
Jooyung Han749dc692020-04-15 11:03:39 +09002747
2748 cc_library {
2749 name: "mylib",
2750 srcs: ["mylib.cpp"],
2751 system_shared_libs: [],
2752 stl: "none",
2753 apex_available: [
2754 "myapex",
2755 ],
2756 min_sdk_version: "30",
2757 }
2758 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002759
2760 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2761 apex {
2762 name: "myapex",
2763 key: "myapex.key",
2764 native_shared_libs: ["libfoo.ffi"],
2765 min_sdk_version: "29",
2766 }
2767
2768 apex_key {
2769 name: "myapex.key",
2770 public_key: "testkey.avbpubkey",
2771 private_key: "testkey.pem",
2772 }
2773
2774 rust_ffi_shared {
2775 name: "libfoo.ffi",
2776 srcs: ["foo.rs"],
2777 crate_name: "foo",
2778 apex_available: [
2779 "myapex",
2780 ],
2781 min_sdk_version: "30",
2782 }
2783 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002784
2785 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2786 apex {
2787 name: "myapex",
2788 key: "myapex.key",
2789 java_libs: ["libfoo"],
2790 min_sdk_version: "29",
2791 }
2792
2793 apex_key {
2794 name: "myapex.key",
2795 public_key: "testkey.avbpubkey",
2796 private_key: "testkey.pem",
2797 }
2798
2799 java_import {
2800 name: "libfoo",
2801 jars: ["libfoo.jar"],
2802 apex_available: [
2803 "myapex",
2804 ],
2805 min_sdk_version: "30",
Colin Crosse4f34882024-11-14 12:26:00 -08002806 compile_dex: true,
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002807 }
2808 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002809
2810 // Skip check for modules compiling against core API surface
2811 testApex(t, `
2812 apex {
2813 name: "myapex",
2814 key: "myapex.key",
2815 java_libs: ["libfoo"],
2816 min_sdk_version: "29",
2817 }
2818
2819 apex_key {
2820 name: "myapex.key",
2821 public_key: "testkey.avbpubkey",
2822 private_key: "testkey.pem",
2823 }
2824
2825 java_library {
2826 name: "libfoo",
2827 srcs: ["Foo.java"],
2828 apex_available: [
2829 "myapex",
2830 ],
2831 // Compile against core API surface
2832 sdk_version: "core_current",
2833 min_sdk_version: "30",
Colin Crosse4f34882024-11-14 12:26:00 -08002834 compile_dex: true,
Spandan Das7fa982c2023-02-24 18:38:56 +00002835 }
2836 `)
2837
Jooyung Han749dc692020-04-15 11:03:39 +09002838}
2839
2840func TestApexMinSdkVersion_Okay(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002841 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002842 testApex(t, `
2843 apex {
2844 name: "myapex",
2845 key: "myapex.key",
2846 native_shared_libs: ["libfoo"],
2847 java_libs: ["libbar"],
2848 min_sdk_version: "29",
2849 }
2850
2851 apex_key {
2852 name: "myapex.key",
2853 public_key: "testkey.avbpubkey",
2854 private_key: "testkey.pem",
2855 }
2856
2857 cc_library {
2858 name: "libfoo",
2859 srcs: ["mylib.cpp"],
2860 shared_libs: ["libfoo_dep"],
2861 apex_available: ["myapex"],
2862 min_sdk_version: "29",
2863 }
2864
2865 cc_library {
2866 name: "libfoo_dep",
2867 srcs: ["mylib.cpp"],
2868 apex_available: ["myapex"],
2869 min_sdk_version: "29",
2870 }
2871
2872 java_library {
2873 name: "libbar",
2874 sdk_version: "current",
2875 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002876 static_libs: [
2877 "libbar_dep",
2878 "libbar_import_dep",
2879 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002880 apex_available: ["myapex"],
2881 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -08002882 compile_dex: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002883 }
2884
2885 java_library {
2886 name: "libbar_dep",
2887 sdk_version: "current",
2888 srcs: ["a.java"],
2889 apex_available: ["myapex"],
2890 min_sdk_version: "29",
2891 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002892
2893 java_import {
2894 name: "libbar_import_dep",
2895 jars: ["libbar.jar"],
2896 apex_available: ["myapex"],
2897 min_sdk_version: "29",
2898 }
Jooyung Han03b51852020-02-26 22:45:42 +09002899 `)
2900}
2901
Colin Cross8ca61c12022-10-06 21:00:14 -07002902func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002903 t.Parallel()
Colin Cross8ca61c12022-10-06 21:00:14 -07002904 // Tests that an apex dependency with min_sdk_version higher than the
2905 // min_sdk_version of the apex is allowed as long as the dependency's
2906 // min_sdk_version is less than or equal to the api level that the
2907 // architecture was introduced in. In this case, arm64 didn't exist
2908 // until api level 21, so the arm64 code will never need to run on
2909 // an api level 20 device, even if other architectures of the apex
2910 // will.
2911 testApex(t, `
2912 apex {
2913 name: "myapex",
2914 key: "myapex.key",
2915 native_shared_libs: ["libfoo"],
2916 min_sdk_version: "20",
2917 }
2918
2919 apex_key {
2920 name: "myapex.key",
2921 public_key: "testkey.avbpubkey",
2922 private_key: "testkey.pem",
2923 }
2924
2925 cc_library {
2926 name: "libfoo",
2927 srcs: ["mylib.cpp"],
2928 apex_available: ["myapex"],
2929 min_sdk_version: "21",
2930 stl: "none",
2931 }
2932 `)
2933}
2934
Artur Satayev8cf899a2020-04-15 17:29:42 +01002935func TestJavaStableSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002936 t.Parallel()
Artur Satayev8cf899a2020-04-15 17:29:42 +01002937 testCases := []struct {
2938 name string
2939 expectedError string
2940 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002941 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002942 }{
2943 {
2944 name: "Non-updatable apex with non-stable dep",
2945 bp: `
2946 apex {
2947 name: "myapex",
2948 java_libs: ["myjar"],
2949 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002950 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002951 }
2952 apex_key {
2953 name: "myapex.key",
2954 public_key: "testkey.avbpubkey",
2955 private_key: "testkey.pem",
2956 }
2957 java_library {
2958 name: "myjar",
2959 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002960 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002961 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08002962 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002963 }
2964 `,
2965 },
2966 {
2967 name: "Updatable apex with stable dep",
2968 bp: `
2969 apex {
2970 name: "myapex",
2971 java_libs: ["myjar"],
2972 key: "myapex.key",
2973 updatable: true,
2974 min_sdk_version: "29",
2975 }
2976 apex_key {
2977 name: "myapex.key",
2978 public_key: "testkey.avbpubkey",
2979 private_key: "testkey.pem",
2980 }
2981 java_library {
2982 name: "myjar",
2983 srcs: ["foo/bar/MyClass.java"],
2984 sdk_version: "current",
2985 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002986 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -08002987 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002988 }
2989 `,
2990 },
2991 {
2992 name: "Updatable apex with non-stable dep",
2993 expectedError: "cannot depend on \"myjar\"",
2994 bp: `
2995 apex {
2996 name: "myapex",
2997 java_libs: ["myjar"],
2998 key: "myapex.key",
2999 updatable: true,
3000 }
3001 apex_key {
3002 name: "myapex.key",
3003 public_key: "testkey.avbpubkey",
3004 private_key: "testkey.pem",
3005 }
3006 java_library {
3007 name: "myjar",
3008 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00003009 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01003010 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08003011 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01003012 }
3013 `,
3014 },
3015 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00003016 name: "Updatable apex with non-stable legacy core platform dep",
3017 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
3018 bp: `
3019 apex {
3020 name: "myapex",
3021 java_libs: ["myjar-uses-legacy"],
3022 key: "myapex.key",
3023 updatable: true,
3024 }
3025 apex_key {
3026 name: "myapex.key",
3027 public_key: "testkey.avbpubkey",
3028 private_key: "testkey.pem",
3029 }
3030 java_library {
3031 name: "myjar-uses-legacy",
3032 srcs: ["foo/bar/MyClass.java"],
3033 sdk_version: "core_platform",
3034 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08003035 compile_dex: true,
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00003036 }
3037 `,
3038 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
3039 },
3040 {
Paul Duffin043f5e72021-03-05 00:00:01 +00003041 name: "Updatable apex with non-stable transitive dep",
3042 // This is not actually detecting that the transitive dependency is unstable, rather it is
3043 // detecting that the transitive dependency is building against a wider API surface than the
3044 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09003045 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01003046 bp: `
3047 apex {
3048 name: "myapex",
3049 java_libs: ["myjar"],
3050 key: "myapex.key",
3051 updatable: true,
3052 }
3053 apex_key {
3054 name: "myapex.key",
3055 public_key: "testkey.avbpubkey",
3056 private_key: "testkey.pem",
3057 }
3058 java_library {
3059 name: "myjar",
3060 srcs: ["foo/bar/MyClass.java"],
3061 sdk_version: "current",
3062 apex_available: ["myapex"],
3063 static_libs: ["transitive-jar"],
Colin Crosse4f34882024-11-14 12:26:00 -08003064 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01003065 }
3066 java_library {
3067 name: "transitive-jar",
3068 srcs: ["foo/bar/MyClass.java"],
3069 sdk_version: "core_platform",
3070 apex_available: ["myapex"],
3071 }
3072 `,
3073 },
3074 }
3075
3076 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00003077 if test.name != "Updatable apex with non-stable legacy core platform dep" {
3078 continue
3079 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01003080 t.Run(test.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003081 t.Parallel()
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00003082 errorHandler := android.FixtureExpectsNoErrors
3083 if test.expectedError != "" {
3084 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01003085 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00003086 android.GroupFixturePreparers(
3087 java.PrepareForTestWithJavaDefaultModules,
3088 PrepareForTestWithApexBuildComponents,
3089 prepareForTestWithMyapex,
3090 android.OptionalFixturePreparer(test.preparer),
3091 ).
3092 ExtendWithErrorHandler(errorHandler).
3093 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01003094 })
3095 }
3096}
3097
Jooyung Han749dc692020-04-15 11:03:39 +09003098func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
3099 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
3100 apex {
3101 name: "myapex",
3102 key: "myapex.key",
3103 native_shared_libs: ["mylib"],
3104 min_sdk_version: "29",
3105 }
3106
3107 apex_key {
3108 name: "myapex.key",
3109 public_key: "testkey.avbpubkey",
3110 private_key: "testkey.pem",
3111 }
3112
3113 cc_library {
3114 name: "mylib",
3115 srcs: ["mylib.cpp"],
3116 shared_libs: ["mylib2"],
3117 system_shared_libs: [],
3118 stl: "none",
3119 apex_available: [
3120 "myapex",
3121 ],
3122 min_sdk_version: "29",
3123 }
3124
3125 // indirect part of the apex
3126 cc_library {
3127 name: "mylib2",
3128 srcs: ["mylib.cpp"],
3129 system_shared_libs: [],
3130 stl: "none",
3131 apex_available: [
3132 "myapex",
3133 ],
3134 min_sdk_version: "30",
3135 }
3136 `)
3137}
3138
3139func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003140 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09003141 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
3142 apex {
3143 name: "myapex",
3144 key: "myapex.key",
3145 apps: ["AppFoo"],
3146 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00003147 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09003148 }
3149
3150 apex_key {
3151 name: "myapex.key",
3152 public_key: "testkey.avbpubkey",
3153 private_key: "testkey.pem",
3154 }
3155
3156 android_app {
3157 name: "AppFoo",
3158 srcs: ["foo/bar/MyClass.java"],
3159 sdk_version: "current",
3160 min_sdk_version: "29",
3161 system_modules: "none",
3162 stl: "none",
3163 static_libs: ["bar"],
3164 apex_available: [ "myapex" ],
3165 }
3166
3167 java_library {
3168 name: "bar",
3169 sdk_version: "current",
3170 srcs: ["a.java"],
3171 apex_available: [ "myapex" ],
3172 }
3173 `)
3174}
3175
3176func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003177 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003178 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09003179 apex {
3180 name: "myapex",
3181 key: "myapex.key",
3182 native_shared_libs: ["mylib"],
3183 min_sdk_version: "29",
3184 }
3185
3186 apex_key {
3187 name: "myapex.key",
3188 public_key: "testkey.avbpubkey",
3189 private_key: "testkey.pem",
3190 }
3191
Colin Crossea91a172024-11-05 16:14:05 -08003192 // mylib will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09003193 cc_library {
3194 name: "mylib",
3195 srcs: ["mylib.cpp"],
3196 shared_libs: ["mylib2"],
3197 system_shared_libs: [],
3198 stl: "none",
3199 apex_available: ["myapex", "otherapex"],
3200 min_sdk_version: "29",
3201 }
3202
3203 cc_library {
3204 name: "mylib2",
3205 srcs: ["mylib.cpp"],
3206 system_shared_libs: [],
3207 stl: "none",
3208 apex_available: ["otherapex"],
3209 stubs: { versions: ["29", "30"] },
3210 min_sdk_version: "30",
3211 }
3212
3213 apex {
3214 name: "otherapex",
3215 key: "myapex.key",
3216 native_shared_libs: ["mylib", "mylib2"],
3217 min_sdk_version: "30",
3218 }
3219 `)
3220 expectLink := func(from, from_variant, to, to_variant string) {
3221 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
3222 libFlags := ld.Args["libFlags"]
3223 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
3224 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09003225 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossea91a172024-11-05 16:14:05 -08003226 expectLink("mylib", "shared_apex30", "mylib2", "shared_current")
Jooyung Han749dc692020-04-15 11:03:39 +09003227}
3228
Jooyung Haned124c32021-01-26 11:43:46 +09003229func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003230 t.Parallel()
Paul Duffin0a49fdc2021-03-08 11:28:25 +00003231 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
3232 func(variables android.FixtureProductVariables) {
3233 variables.Platform_sdk_codename = proptools.StringPtr("S")
3234 variables.Platform_version_active_codenames = []string{"S"}
3235 },
3236 )
Jooyung Haned124c32021-01-26 11:43:46 +09003237 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
3238 apex {
3239 name: "myapex",
3240 key: "myapex.key",
3241 native_shared_libs: ["libfoo"],
3242 min_sdk_version: "S",
3243 }
3244 apex_key {
3245 name: "myapex.key",
3246 public_key: "testkey.avbpubkey",
3247 private_key: "testkey.pem",
3248 }
3249 cc_library {
3250 name: "libfoo",
3251 shared_libs: ["libbar"],
3252 apex_available: ["myapex"],
3253 min_sdk_version: "29",
3254 }
3255 cc_library {
3256 name: "libbar",
3257 apex_available: ["myapex"],
3258 }
3259 `, withSAsActiveCodeNames)
3260}
3261
3262func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003263 t.Parallel()
Paul Duffin0a49fdc2021-03-08 11:28:25 +00003264 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3265 variables.Platform_sdk_codename = proptools.StringPtr("S")
3266 variables.Platform_version_active_codenames = []string{"S", "T"}
3267 })
Colin Cross1c460562021-02-16 17:55:47 -08003268 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09003269 apex {
3270 name: "myapex",
3271 key: "myapex.key",
3272 native_shared_libs: ["libfoo"],
3273 min_sdk_version: "S",
3274 }
3275 apex_key {
3276 name: "myapex.key",
3277 public_key: "testkey.avbpubkey",
3278 private_key: "testkey.pem",
3279 }
3280 cc_library {
3281 name: "libfoo",
3282 shared_libs: ["libbar"],
3283 apex_available: ["myapex"],
3284 min_sdk_version: "S",
3285 }
3286 cc_library {
3287 name: "libbar",
3288 stubs: {
3289 symbol_file: "libbar.map.txt",
3290 versions: ["30", "S", "T"],
3291 },
3292 }
3293 `, withSAsActiveCodeNames)
3294
Jiyong Parkd4a3a132021-03-17 20:21:35 +09003295 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09003296 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
3297 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09003298 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09003299}
3300
Jiyong Park7c2ee712018-12-07 00:42:25 +09003301func TestFilesInSubDir(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003302 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003303 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09003304 apex {
3305 name: "myapex",
3306 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003307 native_shared_libs: ["mylib"],
Jooyung Han4ed512b2023-08-11 16:30:04 +09003308 binaries: ["mybin", "mybin.rust"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09003309 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003310 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003311 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09003312 }
3313
3314 apex_key {
3315 name: "myapex.key",
3316 public_key: "testkey.avbpubkey",
3317 private_key: "testkey.pem",
3318 }
3319
3320 prebuilt_etc {
3321 name: "myetc",
3322 src: "myprebuilt",
3323 sub_dir: "foo/bar",
3324 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003325
3326 cc_library {
3327 name: "mylib",
3328 srcs: ["mylib.cpp"],
3329 relative_install_path: "foo/bar",
3330 system_shared_libs: [],
3331 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003332 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003333 }
3334
3335 cc_binary {
3336 name: "mybin",
3337 srcs: ["mylib.cpp"],
3338 relative_install_path: "foo/bar",
3339 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003340 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003341 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003342 }
Jooyung Han4ed512b2023-08-11 16:30:04 +09003343
3344 rust_binary {
3345 name: "mybin.rust",
3346 srcs: ["foo.rs"],
3347 relative_install_path: "rust_subdir",
3348 apex_available: [ "myapex" ],
3349 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09003350 `)
3351
Jooyung Hana0503a52023-08-23 13:12:50 +09003352 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09003353 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09003354
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003355 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09003356 ensureContains(t, cmd, "/etc ")
3357 ensureContains(t, cmd, "/etc/foo ")
3358 ensureContains(t, cmd, "/etc/foo/bar ")
3359 ensureContains(t, cmd, "/lib64 ")
3360 ensureContains(t, cmd, "/lib64/foo ")
3361 ensureContains(t, cmd, "/lib64/foo/bar ")
3362 ensureContains(t, cmd, "/lib ")
3363 ensureContains(t, cmd, "/lib/foo ")
3364 ensureContains(t, cmd, "/lib/foo/bar ")
3365 ensureContains(t, cmd, "/bin ")
3366 ensureContains(t, cmd, "/bin/foo ")
3367 ensureContains(t, cmd, "/bin/foo/bar ")
Jooyung Han4ed512b2023-08-11 16:30:04 +09003368 ensureContains(t, cmd, "/bin/rust_subdir ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09003369}
Jiyong Parkda6eb592018-12-19 17:12:36 +09003370
Jooyung Han35155c42020-02-06 17:33:20 +09003371func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003372 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003373 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09003374 apex {
3375 name: "myapex",
3376 key: "myapex.key",
3377 multilib: {
3378 both: {
3379 native_shared_libs: ["mylib"],
3380 binaries: ["mybin"],
3381 },
3382 },
3383 compile_multilib: "both",
3384 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003385 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09003386 }
3387
3388 apex_key {
3389 name: "myapex.key",
3390 public_key: "testkey.avbpubkey",
3391 private_key: "testkey.pem",
3392 }
3393
3394 cc_library {
3395 name: "mylib",
3396 relative_install_path: "foo/bar",
3397 system_shared_libs: [],
3398 stl: "none",
3399 apex_available: [ "myapex" ],
3400 native_bridge_supported: true,
3401 }
3402
3403 cc_binary {
3404 name: "mybin",
3405 relative_install_path: "foo/bar",
3406 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09003407 stl: "none",
3408 apex_available: [ "myapex" ],
3409 native_bridge_supported: true,
3410 compile_multilib: "both", // default is "first" for binary
3411 multilib: {
3412 lib64: {
3413 suffix: "64",
3414 },
3415 },
3416 }
Spandan Das45e40012024-12-02 22:45:48 +00003417 `, android.PrepareForNativeBridgeEnabled)
Jooyung Hana0503a52023-08-23 13:12:50 +09003418 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han35155c42020-02-06 17:33:20 +09003419 "bin/foo/bar/mybin",
3420 "bin/foo/bar/mybin64",
3421 "bin/arm/foo/bar/mybin",
3422 "bin/arm64/foo/bar/mybin64",
3423 "lib/foo/bar/mylib.so",
3424 "lib/arm/foo/bar/mylib.so",
3425 "lib64/foo/bar/mylib.so",
3426 "lib64/arm64/foo/bar/mylib.so",
3427 })
3428}
3429
Jooyung Han85d61762020-06-24 23:50:26 +09003430func TestVendorApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003431 t.Parallel()
Colin Crossc68db4b2021-11-11 18:59:15 -08003432 result := android.GroupFixturePreparers(
3433 prepareForApexTest,
3434 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
3435 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09003436 apex {
3437 name: "myapex",
3438 key: "myapex.key",
3439 binaries: ["mybin"],
3440 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003441 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09003442 }
3443 apex_key {
3444 name: "myapex.key",
3445 public_key: "testkey.avbpubkey",
3446 private_key: "testkey.pem",
3447 }
3448 cc_binary {
3449 name: "mybin",
3450 vendor: true,
3451 shared_libs: ["libfoo"],
3452 }
3453 cc_library {
3454 name: "libfoo",
3455 proprietary: true,
3456 }
3457 `)
3458
Jooyung Hana0503a52023-08-23 13:12:50 +09003459 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09003460 "bin/mybin",
3461 "lib64/libfoo.so",
3462 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
3463 "lib64/libc++.so",
3464 })
3465
Jooyung Hana0503a52023-08-23 13:12:50 +09003466 apexBundle := result.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossc68db4b2021-11-11 18:59:15 -08003467 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09003468 name := apexBundle.BaseModuleName()
3469 prefix := "TARGET_"
3470 var builder strings.Builder
3471 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08003472 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01003473 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01003474 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003475
Jooyung Hana0503a52023-08-23 13:12:50 +09003476 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003477 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3478 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09003479}
3480
Justin Yun13decfb2021-03-08 19:25:55 +09003481func TestProductVariant(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003482 t.Parallel()
Justin Yun13decfb2021-03-08 19:25:55 +09003483 ctx := testApex(t, `
3484 apex {
3485 name: "myapex",
3486 key: "myapex.key",
3487 updatable: false,
3488 product_specific: true,
3489 binaries: ["foo"],
3490 }
3491
3492 apex_key {
3493 name: "myapex.key",
3494 public_key: "testkey.avbpubkey",
3495 private_key: "testkey.pem",
3496 }
3497
3498 cc_binary {
3499 name: "foo",
3500 product_available: true,
3501 apex_available: ["myapex"],
3502 srcs: ["foo.cpp"],
3503 }
Justin Yunaf1fde42023-09-27 16:22:10 +09003504 `)
Justin Yun13decfb2021-03-08 19:25:55 +09003505
3506 cflags := strings.Fields(
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003507 ctx.ModuleForTests("foo", "android_product_arm64_armv8-a_apex10000").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003508 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3509 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3510 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3511 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3512}
3513
Jooyung Han8e5685d2020-09-21 11:02:57 +09003514func TestApex_withPrebuiltFirmware(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003515 t.Parallel()
Jooyung Han8e5685d2020-09-21 11:02:57 +09003516 testCases := []struct {
3517 name string
3518 additionalProp string
3519 }{
3520 {"system apex with prebuilt_firmware", ""},
3521 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3522 }
3523 for _, tc := range testCases {
3524 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003525 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003526 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003527 apex {
3528 name: "myapex",
3529 key: "myapex.key",
3530 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003531 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003532 `+tc.additionalProp+`
3533 }
3534 apex_key {
3535 name: "myapex.key",
3536 public_key: "testkey.avbpubkey",
3537 private_key: "testkey.pem",
3538 }
3539 prebuilt_firmware {
3540 name: "myfirmware",
3541 src: "myfirmware.bin",
3542 filename_from_src: true,
3543 `+tc.additionalProp+`
3544 }
3545 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09003546 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han8e5685d2020-09-21 11:02:57 +09003547 "etc/firmware/myfirmware.bin",
3548 })
3549 })
3550 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003551}
3552
Jooyung Hanefb184e2020-06-25 17:14:25 +09003553func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003554 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003555 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003556 apex {
3557 name: "myapex",
3558 key: "myapex.key",
3559 vendor: true,
3560 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003561 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003562 }
3563
3564 apex_key {
3565 name: "myapex.key",
3566 public_key: "testkey.avbpubkey",
3567 private_key: "testkey.pem",
3568 }
3569
3570 cc_library {
3571 name: "mylib",
3572 vendor_available: true,
3573 }
3574 `)
3575
Jooyung Hana0503a52023-08-23 13:12:50 +09003576 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003577 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003578 name := apexBundle.BaseModuleName()
3579 prefix := "TARGET_"
3580 var builder strings.Builder
3581 data.Custom(&builder, name, prefix, "", data)
3582 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09003583 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++.vendor.myapex:64 mylib.vendor.myapex:64 libc.vendor libm.vendor libdl.vendor\n")
Jooyung Hanefb184e2020-06-25 17:14:25 +09003584}
3585
Jooyung Han2ed99d02020-06-24 23:26:26 +09003586func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003587 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003588 apex {
3589 name: "myapex",
3590 key: "myapex.key",
3591 vintf_fragments: ["fragment.xml"],
3592 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003593 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003594 }
3595 apex_key {
3596 name: "myapex.key",
3597 public_key: "testkey.avbpubkey",
3598 private_key: "testkey.pem",
3599 }
3600 cc_binary {
3601 name: "mybin",
3602 }
3603 `)
3604
Jooyung Hana0503a52023-08-23 13:12:50 +09003605 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003606 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003607 name := apexBundle.BaseModuleName()
3608 prefix := "TARGET_"
3609 var builder strings.Builder
3610 data.Custom(&builder, name, prefix, "", data)
3611 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003612 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003613 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003614}
3615
Jiyong Park16e91a02018-12-20 18:18:08 +09003616func TestStaticLinking(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003617 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003618 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003619 apex {
3620 name: "myapex",
3621 key: "myapex.key",
3622 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003623 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003624 }
3625
3626 apex_key {
3627 name: "myapex.key",
3628 public_key: "testkey.avbpubkey",
3629 private_key: "testkey.pem",
3630 }
3631
3632 cc_library {
3633 name: "mylib",
3634 srcs: ["mylib.cpp"],
3635 system_shared_libs: [],
3636 stl: "none",
3637 stubs: {
3638 versions: ["1", "2", "3"],
3639 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003640 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003641 }
3642
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00003643 rust_ffi {
3644 name: "libmylib_rs",
3645 crate_name: "mylib_rs",
3646 srcs: ["mylib.rs"],
3647 stubs: {
3648 versions: ["1", "2", "3"],
3649 },
3650 apex_available: ["myapex"],
3651 }
3652
Jiyong Park16e91a02018-12-20 18:18:08 +09003653 cc_binary {
3654 name: "not_in_apex",
3655 srcs: ["mylib.cpp"],
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00003656 static_libs: ["mylib", "libmylib_rs"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003657 static_executable: true,
3658 system_shared_libs: [],
3659 stl: "none",
3660 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003661 `)
3662
Colin Cross7113d202019-11-20 16:39:12 -08003663 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003664
3665 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003666 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00003667 ensureContains(t, ldFlags, "generated_rust_staticlib/librustlibs.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003668}
Jiyong Park9335a262018-12-24 11:31:58 +09003669
3670func TestKeys(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003671 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003672 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003673 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003674 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003675 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003676 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003677 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003678 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003679 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003680 }
3681
3682 cc_library {
3683 name: "mylib",
3684 srcs: ["mylib.cpp"],
3685 system_shared_libs: [],
3686 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003687 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003688 }
3689
3690 apex_key {
3691 name: "myapex.key",
3692 public_key: "testkey.avbpubkey",
3693 private_key: "testkey.pem",
3694 }
3695
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003696 android_app_certificate {
3697 name: "myapex.certificate",
3698 certificate: "testkey",
3699 }
3700
3701 android_app_certificate {
3702 name: "myapex.certificate.override",
3703 certificate: "testkey.override",
3704 }
3705
Jiyong Park9335a262018-12-24 11:31:58 +09003706 `)
3707
3708 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003709 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003710
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003711 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3712 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003713 "vendor/foo/devkeys/testkey.avbpubkey")
3714 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003715 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3716 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003717 "vendor/foo/devkeys/testkey.pem")
3718 }
3719
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003720 // check the APK certs. It should be overridden to myapex.certificate.override
Jooyung Hana0503a52023-08-23 13:12:50 +09003721 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003722 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003723 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003724 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003725 }
3726}
Jiyong Park58e364a2019-01-19 19:24:06 +09003727
Jooyung Hanf121a652019-12-17 14:30:11 +09003728func TestCertificate(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003729 t.Parallel()
Jooyung Hanf121a652019-12-17 14:30:11 +09003730 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003731 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003732 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003733 apex {
3734 name: "myapex",
3735 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003736 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003737 }
3738 apex_key {
3739 name: "myapex.key",
3740 public_key: "testkey.avbpubkey",
3741 private_key: "testkey.pem",
3742 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003743 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003744 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3745 if actual := rule.Args["certificates"]; actual != expected {
3746 t.Errorf("certificates should be %q, not %q", expected, actual)
3747 }
3748 })
3749 t.Run("override when unspecified", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003750 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003751 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003752 apex {
3753 name: "myapex_keytest",
3754 key: "myapex.key",
3755 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003756 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003757 }
3758 apex_key {
3759 name: "myapex.key",
3760 public_key: "testkey.avbpubkey",
3761 private_key: "testkey.pem",
3762 }
3763 android_app_certificate {
3764 name: "myapex.certificate.override",
3765 certificate: "testkey.override",
3766 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003767 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003768 expected := "testkey.override.x509.pem testkey.override.pk8"
3769 if actual := rule.Args["certificates"]; actual != expected {
3770 t.Errorf("certificates should be %q, not %q", expected, actual)
3771 }
3772 })
3773 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003774 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003775 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003776 apex {
3777 name: "myapex",
3778 key: "myapex.key",
3779 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003780 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003781 }
3782 apex_key {
3783 name: "myapex.key",
3784 public_key: "testkey.avbpubkey",
3785 private_key: "testkey.pem",
3786 }
3787 android_app_certificate {
3788 name: "myapex.certificate",
3789 certificate: "testkey",
3790 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003791 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003792 expected := "testkey.x509.pem testkey.pk8"
3793 if actual := rule.Args["certificates"]; actual != expected {
3794 t.Errorf("certificates should be %q, not %q", expected, actual)
3795 }
3796 })
3797 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003798 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003799 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003800 apex {
3801 name: "myapex_keytest",
3802 key: "myapex.key",
3803 file_contexts: ":myapex-file_contexts",
3804 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003805 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003806 }
3807 apex_key {
3808 name: "myapex.key",
3809 public_key: "testkey.avbpubkey",
3810 private_key: "testkey.pem",
3811 }
3812 android_app_certificate {
3813 name: "myapex.certificate.override",
3814 certificate: "testkey.override",
3815 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003816 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003817 expected := "testkey.override.x509.pem testkey.override.pk8"
3818 if actual := rule.Args["certificates"]; actual != expected {
3819 t.Errorf("certificates should be %q, not %q", expected, actual)
3820 }
3821 })
3822 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003823 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003824 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003825 apex {
3826 name: "myapex",
3827 key: "myapex.key",
3828 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003829 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003830 }
3831 apex_key {
3832 name: "myapex.key",
3833 public_key: "testkey.avbpubkey",
3834 private_key: "testkey.pem",
Spandan Das7701d5f2024-12-17 17:52:26 +00003835 }`,
3836 android.MockFS{
3837 "vendor/foo/devkeys/testkey.x509.pem": nil,
3838 }.AddToFixture(),
3839 )
Jooyung Hana0503a52023-08-23 13:12:50 +09003840 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003841 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3842 if actual := rule.Args["certificates"]; actual != expected {
3843 t.Errorf("certificates should be %q, not %q", expected, actual)
3844 }
3845 })
3846 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003847 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003848 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003849 apex {
3850 name: "myapex_keytest",
3851 key: "myapex.key",
3852 file_contexts: ":myapex-file_contexts",
3853 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003854 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003855 }
3856 apex_key {
3857 name: "myapex.key",
3858 public_key: "testkey.avbpubkey",
3859 private_key: "testkey.pem",
3860 }
3861 android_app_certificate {
3862 name: "myapex.certificate.override",
3863 certificate: "testkey.override",
3864 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003865 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003866 expected := "testkey.override.x509.pem testkey.override.pk8"
3867 if actual := rule.Args["certificates"]; actual != expected {
3868 t.Errorf("certificates should be %q, not %q", expected, actual)
3869 }
3870 })
3871}
3872
Jiyong Park58e364a2019-01-19 19:24:06 +09003873func TestMacro(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003874 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003875 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003876 apex {
3877 name: "myapex",
3878 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003879 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003880 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003881 }
3882
3883 apex {
3884 name: "otherapex",
3885 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003886 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003887 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003888 }
3889
3890 apex_key {
3891 name: "myapex.key",
3892 public_key: "testkey.avbpubkey",
3893 private_key: "testkey.pem",
3894 }
3895
3896 cc_library {
3897 name: "mylib",
3898 srcs: ["mylib.cpp"],
3899 system_shared_libs: [],
3900 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003901 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003902 "myapex",
3903 "otherapex",
3904 ],
Jooyung Han24282772020-03-21 23:20:55 +09003905 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003906 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003907 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003908 cc_library {
3909 name: "mylib2",
3910 srcs: ["mylib.cpp"],
3911 system_shared_libs: [],
3912 stl: "none",
3913 apex_available: [
3914 "myapex",
3915 "otherapex",
3916 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003917 static_libs: ["mylib3"],
3918 recovery_available: true,
3919 min_sdk_version: "29",
3920 }
3921 cc_library {
3922 name: "mylib3",
3923 srcs: ["mylib.cpp"],
3924 system_shared_libs: [],
3925 stl: "none",
3926 apex_available: [
3927 "myapex",
3928 "otherapex",
3929 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003930 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003931 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003932 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003933 `)
3934
Jooyung Hanc87a0592020-03-02 17:44:33 +09003935 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003936 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003937 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003938
Vinh Tranf9754732023-01-19 22:41:46 -05003939 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003940 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003941 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003942
Vinh Tranf9754732023-01-19 22:41:46 -05003943 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003944 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003945 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003946
Colin Crossaede88c2020-08-11 12:17:01 -07003947 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3948 // each variant defines additional macros to distinguish which apex variant it is built for
3949
3950 // non-APEX variant does not have __ANDROID_APEX__ defined
3951 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3952 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3953
Vinh Tranf9754732023-01-19 22:41:46 -05003954 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003955 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3956 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003957
Jooyung Hanc87a0592020-03-02 17:44:33 +09003958 // non-APEX variant does not have __ANDROID_APEX__ defined
3959 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3960 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3961
Vinh Tranf9754732023-01-19 22:41:46 -05003962 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003963 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003964 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003965}
Jiyong Park7e636d02019-01-28 16:16:54 +09003966
3967func TestHeaderLibsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003968 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003969 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003970 apex {
3971 name: "myapex",
3972 key: "myapex.key",
3973 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003974 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003975 }
3976
3977 apex_key {
3978 name: "myapex.key",
3979 public_key: "testkey.avbpubkey",
3980 private_key: "testkey.pem",
3981 }
3982
3983 cc_library_headers {
3984 name: "mylib_headers",
3985 export_include_dirs: ["my_include"],
3986 system_shared_libs: [],
3987 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003988 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003989 }
3990
3991 cc_library {
3992 name: "mylib",
3993 srcs: ["mylib.cpp"],
3994 system_shared_libs: [],
3995 stl: "none",
3996 header_libs: ["mylib_headers"],
3997 export_header_lib_headers: ["mylib_headers"],
3998 stubs: {
3999 versions: ["1", "2", "3"],
4000 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004001 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09004002 }
4003
4004 cc_library {
4005 name: "otherlib",
4006 srcs: ["mylib.cpp"],
4007 system_shared_libs: [],
4008 stl: "none",
4009 shared_libs: ["mylib"],
4010 }
4011 `)
4012
Colin Cross7113d202019-11-20 16:39:12 -08004013 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09004014
4015 // Ensure that the include path of the header lib is exported to 'otherlib'
4016 ensureContains(t, cFlags, "-Imy_include")
4017}
Alex Light9670d332019-01-29 18:07:33 -08004018
Jiyong Park7cd10e32020-01-14 09:22:18 +09004019type fileInApex struct {
4020 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00004021 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09004022 isLink bool
4023}
4024
Jooyung Han1724d582022-12-21 10:17:44 +09004025func (f fileInApex) String() string {
4026 return f.src + ":" + f.path
4027}
4028
4029func (f fileInApex) match(expectation string) bool {
4030 parts := strings.Split(expectation, ":")
4031 if len(parts) == 1 {
4032 match, _ := path.Match(parts[0], f.path)
4033 return match
4034 }
4035 if len(parts) == 2 {
4036 matchSrc, _ := path.Match(parts[0], f.src)
4037 matchDst, _ := path.Match(parts[1], f.path)
4038 return matchSrc && matchDst
4039 }
4040 panic("invalid expected file specification: " + expectation)
4041}
4042
Jooyung Hana57af4a2020-01-23 05:36:59 +00004043func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09004044 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09004045 module := ctx.ModuleForTests(moduleName, variant)
4046 apexRule := module.MaybeRule("apexRule")
4047 apexDir := "/image.apex/"
Jooyung Han31c470b2019-10-18 16:26:59 +09004048 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09004049 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09004050 for _, cmd := range strings.Split(copyCmds, "&&") {
4051 cmd = strings.TrimSpace(cmd)
4052 if cmd == "" {
4053 continue
4054 }
4055 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00004056 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09004057 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09004058 switch terms[0] {
4059 case "mkdir":
4060 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09004061 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09004062 t.Fatal("copyCmds contains invalid cp command", cmd)
4063 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09004064 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00004065 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09004066 isLink = false
4067 case "ln":
4068 if len(terms) != 3 && len(terms) != 4 {
4069 // ln LINK TARGET or ln -s LINK TARGET
4070 t.Fatal("copyCmds contains invalid ln command", cmd)
4071 }
4072 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00004073 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09004074 isLink = true
4075 default:
4076 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
4077 }
4078 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09004079 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09004080 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09004081 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09004082 }
Jooyung Han1724d582022-12-21 10:17:44 +09004083 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00004084 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09004085 }
4086 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09004087 return ret
4088}
4089
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08004090func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00004091 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09004092 var failed bool
4093 var surplus []string
4094 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08004095 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09004096 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08004097 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09004098 if file.match(expected) {
4099 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09004100 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09004101 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09004102 }
4103 }
Jooyung Han1724d582022-12-21 10:17:44 +09004104 if !matchFound {
4105 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09004106 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09004107 }
Jooyung Han31c470b2019-10-18 16:26:59 +09004108
Jooyung Han31c470b2019-10-18 16:26:59 +09004109 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09004110 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09004111 t.Log("surplus files", surplus)
4112 failed = true
4113 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004114
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08004115 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09004116 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08004117 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09004118 if !filesMatched[expected] {
4119 missing = append(missing, expected)
4120 }
4121 }
4122 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09004123 t.Log("missing files", missing)
4124 failed = true
4125 }
4126 if failed {
4127 t.Fail()
4128 }
4129}
4130
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08004131func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
4132 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
4133}
4134
4135func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
Spandan Das52c01a12024-09-20 01:09:48 +00004136 deapexer := ctx.ModuleForTests(moduleName, variant).Description("deapex")
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08004137 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
4138 if deapexer.Output != nil {
4139 outputs = append(outputs, deapexer.Output.String())
4140 }
4141 for _, output := range deapexer.ImplicitOutputs {
4142 outputs = append(outputs, output.String())
4143 }
4144 actualFiles := make([]fileInApex, 0, len(outputs))
4145 for _, output := range outputs {
4146 dir := "/deapexer/"
4147 pos := strings.LastIndex(output, dir)
4148 if pos == -1 {
4149 t.Fatal("Unknown deapexer output ", output)
4150 }
4151 path := output[pos+len(dir):]
4152 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
4153 }
4154 assertFileListEquals(t, files, actualFiles)
4155}
4156
Jooyung Han39edb6c2019-11-06 16:53:07 +09004157func vndkLibrariesTxtFiles(vers ...string) (result string) {
4158 for _, v := range vers {
Kiyoung Kim973cb6f2024-04-29 14:14:53 +09004159 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Justin Yund5784122023-10-25 13:25:32 +09004160 result += `
Jooyung Han39edb6c2019-11-06 16:53:07 +09004161 prebuilt_etc {
4162 name: "` + txt + `.libraries.` + v + `.txt",
4163 src: "dummy.txt",
4164 }
4165 `
Jooyung Han39edb6c2019-11-06 16:53:07 +09004166 }
4167 }
4168 return
4169}
4170
Jooyung Han344d5432019-08-23 11:17:39 +09004171func TestVndkApexVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004172 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004173 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09004174 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004175 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09004176 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004177 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004178 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004179 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09004180 }
4181
4182 apex_key {
4183 name: "myapex.key",
4184 public_key: "testkey.avbpubkey",
4185 private_key: "testkey.pem",
4186 }
4187
Jooyung Han31c470b2019-10-18 16:26:59 +09004188 vndk_prebuilt_shared {
4189 name: "libvndk27",
4190 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09004191 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004192 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004193 vndk: {
4194 enabled: true,
4195 },
Jooyung Han31c470b2019-10-18 16:26:59 +09004196 target_arch: "arm64",
4197 arch: {
4198 arm: {
4199 srcs: ["libvndk27_arm.so"],
4200 },
4201 arm64: {
4202 srcs: ["libvndk27_arm64.so"],
4203 },
4204 },
Colin Cross2807f002021-03-02 10:15:29 -08004205 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09004206 }
4207
4208 vndk_prebuilt_shared {
4209 name: "libvndk27",
4210 version: "27",
4211 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004212 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004213 vndk: {
4214 enabled: true,
4215 },
Jooyung Han31c470b2019-10-18 16:26:59 +09004216 target_arch: "x86_64",
4217 arch: {
4218 x86: {
4219 srcs: ["libvndk27_x86.so"],
4220 },
4221 x86_64: {
4222 srcs: ["libvndk27_x86_64.so"],
4223 },
4224 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09004225 }
4226 `+vndkLibrariesTxtFiles("27"),
4227 withFiles(map[string][]byte{
4228 "libvndk27_arm.so": nil,
4229 "libvndk27_arm64.so": nil,
4230 "libvndk27_x86.so": nil,
4231 "libvndk27_x86_64.so": nil,
4232 }))
Jooyung Han344d5432019-08-23 11:17:39 +09004233
Jooyung Hana0503a52023-08-23 13:12:50 +09004234 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004235 "lib/libvndk27_arm.so",
4236 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004237 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004238 })
Jooyung Han344d5432019-08-23 11:17:39 +09004239}
4240
Jooyung Han90eee022019-10-01 20:02:42 +09004241func TestVndkApexNameRule(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004242 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004243 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09004244 apex_vndk {
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004245 name: "com.android.vndk.v29",
Jooyung Han90eee022019-10-01 20:02:42 +09004246 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004247 file_contexts: ":myapex-file_contexts",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004248 vndk_version: "29",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004249 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004250 }
4251 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004252 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09004253 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004254 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09004255 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004256 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004257 }
4258 apex_key {
4259 name: "myapex.key",
4260 public_key: "testkey.avbpubkey",
4261 private_key: "testkey.pem",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004262 }`+vndkLibrariesTxtFiles("28", "29"))
Jooyung Han90eee022019-10-01 20:02:42 +09004263
4264 assertApexName := func(expected, moduleName string) {
Jooyung Hana0503a52023-08-23 13:12:50 +09004265 module := ctx.ModuleForTests(moduleName, "android_common")
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09004266 apexManifestRule := module.Rule("apexManifestRule")
4267 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004268 }
4269
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004270 assertApexName("com.android.vndk.v29", "com.android.vndk.v29")
Colin Cross2807f002021-03-02 10:15:29 -08004271 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004272}
4273
Jooyung Han344d5432019-08-23 11:17:39 +09004274func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004275 t.Parallel()
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004276 testApexError(t, `module "com.android.vndk.v30" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004277 apex_vndk {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004278 name: "com.android.vndk.v30",
4279 key: "com.android.vndk.v30.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004280 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004281 native_bridge_supported: true,
4282 }
4283
4284 apex_key {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004285 name: "com.android.vndk.v30.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004286 public_key: "testkey.avbpubkey",
4287 private_key: "testkey.pem",
4288 }
4289
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004290 vndk_prebuilt_shared {
Jooyung Han344d5432019-08-23 11:17:39 +09004291 name: "libvndk",
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004292 version: "30",
4293 target_arch: "arm",
Jooyung Han344d5432019-08-23 11:17:39 +09004294 srcs: ["mylib.cpp"],
4295 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004296 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004297 native_bridge_supported: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004298 vndk: {
4299 enabled: true,
4300 },
Jooyung Han344d5432019-08-23 11:17:39 +09004301 }
4302 `)
4303}
4304
Jooyung Han31c470b2019-10-18 16:26:59 +09004305func TestVndkApexWithBinder32(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004306 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004307 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09004308 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004309 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004310 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004311 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004312 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004313 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004314 }
4315
4316 apex_key {
4317 name: "myapex.key",
4318 public_key: "testkey.avbpubkey",
4319 private_key: "testkey.pem",
4320 }
4321
4322 vndk_prebuilt_shared {
4323 name: "libvndk27",
4324 version: "27",
4325 target_arch: "arm",
4326 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004327 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004328 vndk: {
4329 enabled: true,
4330 },
4331 arch: {
4332 arm: {
4333 srcs: ["libvndk27.so"],
4334 }
4335 },
4336 }
4337
4338 vndk_prebuilt_shared {
4339 name: "libvndk27",
4340 version: "27",
4341 target_arch: "arm",
4342 binder32bit: true,
4343 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004344 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004345 vndk: {
4346 enabled: true,
4347 },
4348 arch: {
4349 arm: {
4350 srcs: ["libvndk27binder32.so"],
4351 }
4352 },
Colin Cross2807f002021-03-02 10:15:29 -08004353 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004354 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004355 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004356 withFiles(map[string][]byte{
4357 "libvndk27.so": nil,
4358 "libvndk27binder32.so": nil,
4359 }),
4360 withBinder32bit,
Cole Faust69788792024-10-10 11:00:36 -07004361 android.FixtureModifyConfig(func(config android.Config) {
4362 target := android.Target{
4363 Os: android.Android,
4364 Arch: android.Arch{
4365 ArchType: android.Arm,
4366 ArchVariant: "armv7-a-neon",
4367 Abi: []string{"armeabi-v7a"},
4368 },
4369 NativeBridge: android.NativeBridgeDisabled,
4370 NativeBridgeHostArchName: "",
4371 NativeBridgeRelativePath: "",
4372 }
4373 config.Targets[android.Android] = []android.Target{target}
4374 config.AndroidFirstDeviceTarget = target
Jooyung Han31c470b2019-10-18 16:26:59 +09004375 }),
4376 )
4377
Jooyung Hana0503a52023-08-23 13:12:50 +09004378 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004379 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004380 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004381 })
4382}
4383
Jooyung Hane1633032019-08-01 17:41:43 +09004384func TestDependenciesInApexManifest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004385 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004386 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004387 apex {
4388 name: "myapex_nodep",
4389 key: "myapex.key",
4390 native_shared_libs: ["lib_nodep"],
4391 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004392 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004393 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004394 }
4395
4396 apex {
4397 name: "myapex_dep",
4398 key: "myapex.key",
4399 native_shared_libs: ["lib_dep"],
4400 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004401 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004402 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004403 }
4404
4405 apex {
4406 name: "myapex_provider",
4407 key: "myapex.key",
4408 native_shared_libs: ["libfoo"],
4409 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004410 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004411 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004412 }
4413
4414 apex {
4415 name: "myapex_selfcontained",
4416 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004417 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004418 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004419 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004420 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004421 }
4422
4423 apex_key {
4424 name: "myapex.key",
4425 public_key: "testkey.avbpubkey",
4426 private_key: "testkey.pem",
4427 }
4428
4429 cc_library {
4430 name: "lib_nodep",
4431 srcs: ["mylib.cpp"],
4432 system_shared_libs: [],
4433 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004434 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004435 }
4436
4437 cc_library {
4438 name: "lib_dep",
4439 srcs: ["mylib.cpp"],
4440 shared_libs: ["libfoo"],
4441 system_shared_libs: [],
4442 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004443 apex_available: [
4444 "myapex_dep",
4445 "myapex_provider",
4446 "myapex_selfcontained",
4447 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004448 }
4449
4450 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004451 name: "lib_dep_on_bar",
4452 srcs: ["mylib.cpp"],
4453 shared_libs: ["libbar"],
4454 system_shared_libs: [],
4455 stl: "none",
4456 apex_available: [
4457 "myapex_selfcontained",
4458 ],
4459 }
4460
4461
4462 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004463 name: "libfoo",
4464 srcs: ["mytest.cpp"],
4465 stubs: {
4466 versions: ["1"],
4467 },
4468 system_shared_libs: [],
4469 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004470 apex_available: [
4471 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004472 ],
4473 }
4474
4475 cc_library {
4476 name: "libbar",
4477 srcs: ["mytest.cpp"],
4478 stubs: {
4479 versions: ["1"],
4480 },
4481 system_shared_libs: [],
4482 stl: "none",
4483 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004484 "myapex_selfcontained",
4485 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004486 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004487
Jooyung Hane1633032019-08-01 17:41:43 +09004488 `)
4489
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004490 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004491 var provideNativeLibs, requireNativeLibs []string
4492
Jooyung Hana0503a52023-08-23 13:12:50 +09004493 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004494 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4495 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004496 ensureListEmpty(t, provideNativeLibs)
4497 ensureListEmpty(t, requireNativeLibs)
4498
Jooyung Hana0503a52023-08-23 13:12:50 +09004499 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004500 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4501 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004502 ensureListEmpty(t, provideNativeLibs)
4503 ensureListContains(t, requireNativeLibs, "libfoo.so")
4504
Jooyung Hana0503a52023-08-23 13:12:50 +09004505 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004506 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4507 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004508 ensureListContains(t, provideNativeLibs, "libfoo.so")
4509 ensureListEmpty(t, requireNativeLibs)
4510
Jooyung Hana0503a52023-08-23 13:12:50 +09004511 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004512 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4513 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004514 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004515 ensureListEmpty(t, requireNativeLibs)
4516}
4517
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004518func TestOverrideApexManifestDefaultVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004519 t.Parallel()
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004520 ctx := testApex(t, `
4521 apex {
4522 name: "myapex",
4523 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004524 native_shared_libs: ["mylib"],
4525 updatable: false,
4526 }
4527
4528 apex_key {
4529 name: "myapex.key",
4530 public_key: "testkey.avbpubkey",
4531 private_key: "testkey.pem",
4532 }
4533
4534 cc_library {
4535 name: "mylib",
4536 srcs: ["mylib.cpp"],
4537 system_shared_libs: [],
4538 stl: "none",
4539 apex_available: [
4540 "//apex_available:platform",
4541 "myapex",
4542 ],
4543 }
4544 `, android.FixtureMergeEnv(map[string]string{
4545 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4546 }))
4547
Jooyung Hana0503a52023-08-23 13:12:50 +09004548 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004549 apexManifestRule := module.Rule("apexManifestRule")
4550 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4551}
4552
Vinh Tran8f5310f2022-10-07 18:16:47 -04004553func TestCompileMultilibProp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004554 t.Parallel()
Vinh Tran8f5310f2022-10-07 18:16:47 -04004555 testCases := []struct {
4556 compileMultiLibProp string
4557 containedLibs []string
4558 notContainedLibs []string
4559 }{
4560 {
4561 containedLibs: []string{
4562 "image.apex/lib64/mylib.so",
4563 "image.apex/lib/mylib.so",
4564 },
4565 compileMultiLibProp: `compile_multilib: "both",`,
4566 },
4567 {
4568 containedLibs: []string{"image.apex/lib64/mylib.so"},
4569 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4570 compileMultiLibProp: `compile_multilib: "first",`,
4571 },
4572 {
4573 containedLibs: []string{"image.apex/lib64/mylib.so"},
4574 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4575 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4576 },
4577 {
4578 containedLibs: []string{"image.apex/lib64/mylib.so"},
4579 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4580 compileMultiLibProp: `compile_multilib: "64",`,
4581 },
4582 {
4583 containedLibs: []string{"image.apex/lib/mylib.so"},
4584 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4585 compileMultiLibProp: `compile_multilib: "32",`,
4586 },
4587 }
4588 for _, testCase := range testCases {
4589 ctx := testApex(t, fmt.Sprintf(`
4590 apex {
4591 name: "myapex",
4592 key: "myapex.key",
4593 %s
4594 native_shared_libs: ["mylib"],
4595 updatable: false,
4596 }
4597 apex_key {
4598 name: "myapex.key",
4599 public_key: "testkey.avbpubkey",
4600 private_key: "testkey.pem",
4601 }
4602 cc_library {
4603 name: "mylib",
4604 srcs: ["mylib.cpp"],
4605 apex_available: [
4606 "//apex_available:platform",
4607 "myapex",
4608 ],
4609 }
4610 `, testCase.compileMultiLibProp),
4611 )
Jooyung Hana0503a52023-08-23 13:12:50 +09004612 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Vinh Tran8f5310f2022-10-07 18:16:47 -04004613 apexRule := module.Rule("apexRule")
4614 copyCmds := apexRule.Args["copy_commands"]
4615 for _, containedLib := range testCase.containedLibs {
4616 ensureContains(t, copyCmds, containedLib)
4617 }
4618 for _, notContainedLib := range testCase.notContainedLibs {
4619 ensureNotContains(t, copyCmds, notContainedLib)
4620 }
4621 }
4622}
4623
Alex Light0851b882019-02-07 13:20:53 -08004624func TestNonTestApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004625 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004626 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004627 apex {
4628 name: "myapex",
4629 key: "myapex.key",
4630 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004631 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004632 }
4633
4634 apex_key {
4635 name: "myapex.key",
4636 public_key: "testkey.avbpubkey",
4637 private_key: "testkey.pem",
4638 }
4639
4640 cc_library {
4641 name: "mylib_common",
4642 srcs: ["mylib.cpp"],
4643 system_shared_libs: [],
4644 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004645 apex_available: [
4646 "//apex_available:platform",
4647 "myapex",
4648 ],
Alex Light0851b882019-02-07 13:20:53 -08004649 }
4650 `)
4651
Jooyung Hana0503a52023-08-23 13:12:50 +09004652 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004653 apexRule := module.Rule("apexRule")
4654 copyCmds := apexRule.Args["copy_commands"]
4655
4656 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4657 t.Log("Apex was a test apex!")
4658 t.Fail()
4659 }
4660 // Ensure that main rule creates an output
4661 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4662
4663 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004664 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004665
4666 // Ensure that both direct and indirect deps are copied into apex
4667 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4668
Colin Cross7113d202019-11-20 16:39:12 -08004669 // Ensure that the platform variant ends with _shared
4670 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004671
Colin Cross56a83212020-09-15 18:30:11 -07004672 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004673 t.Log("Found mylib_common not in any apex!")
4674 t.Fail()
4675 }
4676}
4677
4678func TestTestApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004679 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004680 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004681 apex_test {
4682 name: "myapex",
4683 key: "myapex.key",
4684 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004685 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004686 }
4687
4688 apex_key {
4689 name: "myapex.key",
4690 public_key: "testkey.avbpubkey",
4691 private_key: "testkey.pem",
4692 }
4693
4694 cc_library {
4695 name: "mylib_common_test",
4696 srcs: ["mylib.cpp"],
4697 system_shared_libs: [],
4698 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004699 // TODO: remove //apex_available:platform
4700 apex_available: [
4701 "//apex_available:platform",
4702 "myapex",
4703 ],
Alex Light0851b882019-02-07 13:20:53 -08004704 }
4705 `)
4706
Jooyung Hana0503a52023-08-23 13:12:50 +09004707 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004708 apexRule := module.Rule("apexRule")
4709 copyCmds := apexRule.Args["copy_commands"]
4710
4711 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4712 t.Log("Apex was not a test apex!")
4713 t.Fail()
4714 }
4715 // Ensure that main rule creates an output
4716 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4717
4718 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004719 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004720
4721 // Ensure that both direct and indirect deps are copied into apex
4722 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4723
Colin Cross7113d202019-11-20 16:39:12 -08004724 // Ensure that the platform variant ends with _shared
4725 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004726}
4727
Jooyung Han85707de2023-12-01 14:21:13 +09004728func TestLibzVendorIsntStable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004729 t.Parallel()
Jooyung Han85707de2023-12-01 14:21:13 +09004730 ctx := testApex(t, `
4731 apex {
4732 name: "myapex",
4733 key: "myapex.key",
4734 updatable: false,
4735 binaries: ["mybin"],
4736 }
4737 apex {
4738 name: "myvendorapex",
4739 key: "myapex.key",
4740 file_contexts: "myvendorapex_file_contexts",
4741 vendor: true,
4742 updatable: false,
4743 binaries: ["mybin"],
4744 }
4745 apex_key {
4746 name: "myapex.key",
4747 public_key: "testkey.avbpubkey",
4748 private_key: "testkey.pem",
4749 }
4750 cc_binary {
4751 name: "mybin",
4752 vendor_available: true,
4753 system_shared_libs: [],
4754 stl: "none",
4755 shared_libs: ["libz"],
4756 apex_available: ["//apex_available:anyapex"],
4757 }
4758 cc_library {
4759 name: "libz",
4760 vendor_available: true,
4761 system_shared_libs: [],
4762 stl: "none",
4763 stubs: {
4764 versions: ["28", "30"],
4765 },
4766 target: {
4767 vendor: {
4768 no_stubs: true,
4769 },
4770 },
4771 }
4772 `, withFiles(map[string][]byte{
4773 "myvendorapex_file_contexts": nil,
4774 }))
4775
4776 // libz provides stubs for core variant.
4777 {
4778 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
4779 "bin/mybin",
4780 })
4781 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
4782 android.AssertStringEquals(t, "should require libz", apexManifestRule.Args["requireNativeLibs"], "libz.so")
4783 }
4784 // libz doesn't provide stubs for vendor variant.
4785 {
4786 ensureExactContents(t, ctx, "myvendorapex", "android_common_myvendorapex", []string{
4787 "bin/mybin",
4788 "lib64/libz.so",
4789 })
4790 apexManifestRule := ctx.ModuleForTests("myvendorapex", "android_common_myvendorapex").Rule("apexManifestRule")
4791 android.AssertStringEquals(t, "should not require libz", apexManifestRule.Args["requireNativeLibs"], "")
4792 }
4793}
4794
Alex Light9670d332019-01-29 18:07:33 -08004795func TestApexWithTarget(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004796 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004797 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004798 apex {
4799 name: "myapex",
4800 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004801 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004802 multilib: {
4803 first: {
4804 native_shared_libs: ["mylib_common"],
4805 }
4806 },
4807 target: {
4808 android: {
4809 multilib: {
4810 first: {
4811 native_shared_libs: ["mylib"],
4812 }
4813 }
4814 },
4815 host: {
4816 multilib: {
4817 first: {
4818 native_shared_libs: ["mylib2"],
4819 }
4820 }
4821 }
4822 }
4823 }
4824
4825 apex_key {
4826 name: "myapex.key",
4827 public_key: "testkey.avbpubkey",
4828 private_key: "testkey.pem",
4829 }
4830
4831 cc_library {
4832 name: "mylib",
4833 srcs: ["mylib.cpp"],
4834 system_shared_libs: [],
4835 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004836 // TODO: remove //apex_available:platform
4837 apex_available: [
4838 "//apex_available:platform",
4839 "myapex",
4840 ],
Alex Light9670d332019-01-29 18:07:33 -08004841 }
4842
4843 cc_library {
4844 name: "mylib_common",
4845 srcs: ["mylib.cpp"],
4846 system_shared_libs: [],
4847 stl: "none",
4848 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004849 // TODO: remove //apex_available:platform
4850 apex_available: [
4851 "//apex_available:platform",
4852 "myapex",
4853 ],
Alex Light9670d332019-01-29 18:07:33 -08004854 }
4855
4856 cc_library {
4857 name: "mylib2",
4858 srcs: ["mylib.cpp"],
4859 system_shared_libs: [],
4860 stl: "none",
4861 compile_multilib: "first",
4862 }
4863 `)
4864
Jooyung Hana0503a52023-08-23 13:12:50 +09004865 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004866 copyCmds := apexRule.Args["copy_commands"]
4867
4868 // Ensure that main rule creates an output
4869 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4870
4871 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004872 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4873 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4874 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004875
4876 // Ensure that both direct and indirect deps are copied into apex
4877 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4878 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4879 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4880
Colin Cross7113d202019-11-20 16:39:12 -08004881 // Ensure that the platform variant ends with _shared
4882 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4883 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4884 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004885}
Jiyong Park04480cf2019-02-06 00:16:29 +09004886
Jiyong Park59140302020-12-14 18:44:04 +09004887func TestApexWithArch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004888 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004889 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004890 apex {
4891 name: "myapex",
4892 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004893 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004894 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004895 arch: {
4896 arm64: {
4897 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004898 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004899 },
4900 x86_64: {
4901 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004902 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004903 },
4904 }
4905 }
4906
4907 apex_key {
4908 name: "myapex.key",
4909 public_key: "testkey.avbpubkey",
4910 private_key: "testkey.pem",
4911 }
4912
4913 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004914 name: "mylib.generic",
4915 srcs: ["mylib.cpp"],
4916 system_shared_libs: [],
4917 stl: "none",
4918 // TODO: remove //apex_available:platform
4919 apex_available: [
4920 "//apex_available:platform",
4921 "myapex",
4922 ],
4923 }
4924
4925 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004926 name: "mylib.arm64",
4927 srcs: ["mylib.cpp"],
4928 system_shared_libs: [],
4929 stl: "none",
4930 // TODO: remove //apex_available:platform
4931 apex_available: [
4932 "//apex_available:platform",
4933 "myapex",
4934 ],
4935 }
4936
4937 cc_library {
4938 name: "mylib.x64",
4939 srcs: ["mylib.cpp"],
4940 system_shared_libs: [],
4941 stl: "none",
4942 // TODO: remove //apex_available:platform
4943 apex_available: [
4944 "//apex_available:platform",
4945 "myapex",
4946 ],
4947 }
4948 `)
4949
Jooyung Hana0503a52023-08-23 13:12:50 +09004950 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park59140302020-12-14 18:44:04 +09004951 copyCmds := apexRule.Args["copy_commands"]
4952
4953 // Ensure that apex variant is created for the direct dep
4954 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004955 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004956 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4957
4958 // Ensure that both direct and indirect deps are copied into apex
4959 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4960 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4961}
4962
Jiyong Park04480cf2019-02-06 00:16:29 +09004963func TestApexWithShBinary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004964 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004965 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004966 apex {
4967 name: "myapex",
4968 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004969 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004970 updatable: false,
Riya Thakur654461c2024-02-27 07:21:05 +00004971 compile_multilib: "both",
Jiyong Park04480cf2019-02-06 00:16:29 +09004972 }
4973
4974 apex_key {
4975 name: "myapex.key",
4976 public_key: "testkey.avbpubkey",
4977 private_key: "testkey.pem",
4978 }
4979
4980 sh_binary {
4981 name: "myscript",
4982 src: "mylib.cpp",
4983 filename: "myscript.sh",
4984 sub_dir: "script",
4985 }
4986 `)
4987
Jooyung Hana0503a52023-08-23 13:12:50 +09004988 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004989 copyCmds := apexRule.Args["copy_commands"]
4990
4991 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4992}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004993
Jooyung Han91df2082019-11-20 01:49:42 +09004994func TestApexInVariousPartition(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004995 t.Parallel()
Jooyung Han91df2082019-11-20 01:49:42 +09004996 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004997 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09004998 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004999 {"", "system"},
5000 {"product_specific: true", "product"},
5001 {"soc_specific: true", "vendor"},
5002 {"proprietary: true", "vendor"},
5003 {"vendor: true", "vendor"},
5004 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09005005 }
5006 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09005007 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005008 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005009 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09005010 apex {
5011 name: "myapex",
5012 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005013 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09005014 `+tc.propName+`
5015 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005016
Jooyung Han91df2082019-11-20 01:49:42 +09005017 apex_key {
5018 name: "myapex.key",
5019 public_key: "testkey.avbpubkey",
5020 private_key: "testkey.pem",
5021 }
5022 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005023
Jooyung Hana0503a52023-08-23 13:12:50 +09005024 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Cole Faust6b7075f2024-12-17 10:42:42 -08005025 expected := "out/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01005026 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09005027 if actual != expected {
5028 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
5029 }
Jooyung Han91df2082019-11-20 01:49:42 +09005030 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005031 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005032}
Jiyong Park67882562019-03-21 01:11:21 +09005033
Jooyung Han580eb4f2020-06-24 19:33:06 +09005034func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005035 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005036 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005037 apex {
5038 name: "myapex",
5039 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005040 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005041 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005042
Jooyung Han580eb4f2020-06-24 19:33:06 +09005043 apex_key {
5044 name: "myapex.key",
5045 public_key: "testkey.avbpubkey",
5046 private_key: "testkey.pem",
5047 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005048 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09005049 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005050 rule := module.Output("file_contexts")
5051 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
5052}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005053
Jooyung Han580eb4f2020-06-24 19:33:06 +09005054func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005055 t.Parallel()
Jooyung Han54aca7b2019-11-20 02:26:02 +09005056 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005057 apex {
5058 name: "myapex",
5059 key: "myapex.key",
5060 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005061 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005062 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005063
Jooyung Han580eb4f2020-06-24 19:33:06 +09005064 apex_key {
5065 name: "myapex.key",
5066 public_key: "testkey.avbpubkey",
5067 private_key: "testkey.pem",
5068 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005069 `, withFiles(map[string][]byte{
5070 "my_own_file_contexts": nil,
5071 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09005072}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005073
Jooyung Han580eb4f2020-06-24 19:33:06 +09005074func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005075 t.Parallel()
Jooyung Han54aca7b2019-11-20 02:26:02 +09005076 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005077 apex {
5078 name: "myapex",
5079 key: "myapex.key",
5080 product_specific: true,
5081 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005082 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005083 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005084
Jooyung Han580eb4f2020-06-24 19:33:06 +09005085 apex_key {
5086 name: "myapex.key",
5087 public_key: "testkey.avbpubkey",
5088 private_key: "testkey.pem",
5089 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005090 `)
5091
Colin Cross1c460562021-02-16 17:55:47 -08005092 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005093 apex {
5094 name: "myapex",
5095 key: "myapex.key",
5096 product_specific: true,
5097 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005098 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005099 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005100
Jooyung Han580eb4f2020-06-24 19:33:06 +09005101 apex_key {
5102 name: "myapex.key",
5103 public_key: "testkey.avbpubkey",
5104 private_key: "testkey.pem",
5105 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005106 `, withFiles(map[string][]byte{
5107 "product_specific_file_contexts": nil,
5108 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09005109 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005110 rule := module.Output("file_contexts")
5111 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
5112}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005113
Jooyung Han580eb4f2020-06-24 19:33:06 +09005114func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005115 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005116 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005117 apex {
5118 name: "myapex",
5119 key: "myapex.key",
5120 product_specific: true,
5121 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005122 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005123 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005124
Jooyung Han580eb4f2020-06-24 19:33:06 +09005125 apex_key {
5126 name: "myapex.key",
5127 public_key: "testkey.avbpubkey",
5128 private_key: "testkey.pem",
5129 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005130
Jooyung Han580eb4f2020-06-24 19:33:06 +09005131 filegroup {
5132 name: "my-file-contexts",
5133 srcs: ["product_specific_file_contexts"],
5134 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005135 `, withFiles(map[string][]byte{
5136 "product_specific_file_contexts": nil,
5137 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09005138 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005139 rule := module.Output("file_contexts")
5140 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09005141}
5142
Jiyong Park67882562019-03-21 01:11:21 +09005143func TestApexKeyFromOtherModule(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005144 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005145 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09005146 apex_key {
5147 name: "myapex.key",
5148 public_key: ":my.avbpubkey",
5149 private_key: ":my.pem",
5150 product_specific: true,
5151 }
5152
5153 filegroup {
5154 name: "my.avbpubkey",
5155 srcs: ["testkey2.avbpubkey"],
5156 }
5157
5158 filegroup {
5159 name: "my.pem",
5160 srcs: ["testkey2.pem"],
5161 }
5162 `)
5163
5164 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
5165 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005166 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005167 if actual_pubkey != expected_pubkey {
5168 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
5169 }
5170 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005171 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005172 if actual_privkey != expected_privkey {
5173 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
5174 }
5175}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005176
5177func TestPrebuilt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005178 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005179 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005180 prebuilt_apex {
5181 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09005182 arch: {
5183 arm64: {
5184 src: "myapex-arm64.apex",
5185 },
5186 arm: {
5187 src: "myapex-arm.apex",
5188 },
5189 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005190 }
5191 `)
5192
Wei Li340ee8e2022-03-18 17:33:24 -07005193 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5194 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005195
Jiyong Parkc95714e2019-03-29 14:23:10 +09005196 expectedInput := "myapex-arm64.apex"
5197 if prebuilt.inputApex.String() != expectedInput {
5198 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
5199 }
Wei Li340ee8e2022-03-18 17:33:24 -07005200 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
5201 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
5202 rule := testingModule.Rule("genProvenanceMetaData")
5203 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
5204 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5205 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5206 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08005207
5208 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
5209 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005210}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005211
Paul Duffinc0609c62021-03-01 17:27:16 +00005212func TestPrebuiltMissingSrc(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005213 t.Parallel()
Paul Duffin6717d882021-06-15 19:09:41 +01005214 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00005215 prebuilt_apex {
5216 name: "myapex",
5217 }
5218 `)
5219}
5220
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005221func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005222 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005223 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005224 prebuilt_apex {
5225 name: "myapex",
5226 src: "myapex-arm.apex",
5227 filename: "notmyapex.apex",
5228 }
5229 `)
5230
Wei Li340ee8e2022-03-18 17:33:24 -07005231 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5232 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005233
5234 expected := "notmyapex.apex"
5235 if p.installFilename != expected {
5236 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
5237 }
Wei Li340ee8e2022-03-18 17:33:24 -07005238 rule := testingModule.Rule("genProvenanceMetaData")
5239 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5240 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5241 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5242 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005243}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005244
Samiul Islam7c02e262021-09-08 17:48:28 +01005245func TestApexSetFilenameOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005246 t.Parallel()
Samiul Islam7c02e262021-09-08 17:48:28 +01005247 testApex(t, `
5248 apex_set {
5249 name: "com.company.android.myapex",
5250 apex_name: "com.android.myapex",
5251 set: "company-myapex.apks",
5252 filename: "com.company.android.myapex.apex"
5253 }
5254 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5255
5256 testApex(t, `
5257 apex_set {
5258 name: "com.company.android.myapex",
5259 apex_name: "com.android.myapex",
5260 set: "company-myapex.apks",
5261 filename: "com.company.android.myapex.capex"
5262 }
5263 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5264
5265 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
5266 apex_set {
5267 name: "com.company.android.myapex",
5268 apex_name: "com.android.myapex",
5269 set: "company-myapex.apks",
5270 filename: "some-random-suffix"
5271 }
5272 `)
5273}
5274
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005275func TestPrebuiltOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005276 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005277 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005278 prebuilt_apex {
5279 name: "myapex.prebuilt",
5280 src: "myapex-arm.apex",
5281 overrides: [
5282 "myapex",
5283 ],
5284 }
5285 `)
5286
Wei Li340ee8e2022-03-18 17:33:24 -07005287 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5288 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005289
5290 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005291 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005292 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005293 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005294 }
Wei Li340ee8e2022-03-18 17:33:24 -07005295 rule := testingModule.Rule("genProvenanceMetaData")
5296 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5297 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5298 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5299 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005300}
5301
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005302func TestPrebuiltApexName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005303 t.Parallel()
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005304 testApex(t, `
5305 prebuilt_apex {
5306 name: "com.company.android.myapex",
5307 apex_name: "com.android.myapex",
5308 src: "company-myapex-arm.apex",
5309 }
5310 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5311
5312 testApex(t, `
5313 apex_set {
5314 name: "com.company.android.myapex",
5315 apex_name: "com.android.myapex",
5316 set: "company-myapex.apks",
5317 }
5318 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5319}
5320
5321func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005322 t.Parallel()
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005323 _ = android.GroupFixturePreparers(
5324 java.PrepareForTestWithJavaDefaultModules,
5325 PrepareForTestWithApexBuildComponents,
5326 android.FixtureWithRootAndroidBp(`
5327 platform_bootclasspath {
5328 name: "platform-bootclasspath",
5329 fragments: [
5330 {
5331 apex: "com.android.art",
5332 module: "art-bootclasspath-fragment",
5333 },
5334 ],
5335 }
5336
5337 prebuilt_apex {
5338 name: "com.company.android.art",
5339 apex_name: "com.android.art",
5340 src: "com.company.android.art-arm.apex",
5341 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5342 }
5343
5344 prebuilt_bootclasspath_fragment {
5345 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005346 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005347 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005348 hidden_api: {
5349 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5350 metadata: "my-bootclasspath-fragment/metadata.csv",
5351 index: "my-bootclasspath-fragment/index.csv",
5352 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5353 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5354 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005355 }
5356
5357 java_import {
5358 name: "core-oj",
5359 jars: ["prebuilt.jar"],
5360 }
5361 `),
5362 ).RunTest(t)
5363}
5364
Spandan Das59a4a2b2024-01-09 21:35:56 +00005365// A minimal context object for use with DexJarBuildPath
5366type moduleErrorfTestCtx struct {
5367}
5368
5369func (ctx moduleErrorfTestCtx) ModuleErrorf(format string, args ...interface{}) {
5370}
5371
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005372func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005373 t.Parallel()
Paul Duffinb6f53c02021-05-14 07:52:42 +01005374 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005375 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005376 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5377 // is disabled.
5378 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
Spandan Das81fe4d12024-05-15 18:43:47 +00005379
5380 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
5381 // file creation.
5382 java.FixtureConfigureBootJars("platform:foo"),
5383 android.FixtureModifyMockFS(func(fs android.MockFS) {
5384 fs["platform/Android.bp"] = []byte(`
5385 java_library {
5386 name: "foo",
5387 srcs: ["Test.java"],
5388 compile_dex: true,
5389 }
5390 `)
5391 fs["platform/Test.java"] = nil
5392 }),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005393 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005394
Paul Duffin40a3f652021-07-19 13:11:24 +01005395 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005396 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005397 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005398 var rule android.TestingBuildParams
5399
5400 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5401 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005402 }
5403
Paul Duffin40a3f652021-07-19 13:11:24 +01005404 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5405 t.Helper()
5406 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5407 var rule android.TestingBuildParams
5408
5409 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5410 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5411 }
5412
Paul Duffin89f570a2021-06-16 01:42:33 +01005413 fragment := java.ApexVariantReference{
5414 Apex: proptools.StringPtr("myapex"),
5415 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5416 }
5417
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005418 t.Run("prebuilt only", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005419 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005420 bp := `
5421 prebuilt_apex {
5422 name: "myapex",
5423 arch: {
5424 arm64: {
5425 src: "myapex-arm64.apex",
5426 },
5427 arm: {
5428 src: "myapex-arm.apex",
5429 },
5430 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005431 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5432 }
5433
5434 prebuilt_bootclasspath_fragment {
5435 name: "my-bootclasspath-fragment",
5436 contents: ["libfoo", "libbar"],
5437 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005438 hidden_api: {
5439 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5440 metadata: "my-bootclasspath-fragment/metadata.csv",
5441 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005442 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5443 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5444 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005445 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005446 }
5447
Spandan Das52c01a12024-09-20 01:09:48 +00005448 java_sdk_library_import {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005449 name: "libfoo",
Spandan Das52c01a12024-09-20 01:09:48 +00005450 public: {
5451 jars: ["libfoo.jar"],
5452 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005453 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005454 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005455 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005456 }
Paul Duffin37856732021-02-26 14:24:15 +00005457
5458 java_sdk_library_import {
5459 name: "libbar",
5460 public: {
5461 jars: ["libbar.jar"],
5462 },
5463 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005464 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005465 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005466 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005467 `
5468
Paul Duffin89f570a2021-06-16 01:42:33 +01005469 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005470
Paul Duffin537ea3d2021-05-14 10:38:00 +01005471 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005472 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005473 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005474 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005475 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Colin Crosse5c7d7c2024-12-18 17:08:07 -08005476 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_com.android.art/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005477 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005478 })
5479
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005480 t.Run("apex_set only", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005481 t.Parallel()
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005482 bp := `
5483 apex_set {
5484 name: "myapex",
5485 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005486 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005487 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5488 }
5489
Paul Duffin89f570a2021-06-16 01:42:33 +01005490 prebuilt_bootclasspath_fragment {
5491 name: "my-bootclasspath-fragment",
5492 contents: ["libfoo", "libbar"],
5493 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005494 hidden_api: {
5495 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5496 metadata: "my-bootclasspath-fragment/metadata.csv",
5497 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005498 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5499 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5500 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005501 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005502 }
5503
Liz Kammer2dc72442023-04-20 10:10:48 -04005504 prebuilt_systemserverclasspath_fragment {
5505 name: "my-systemserverclasspath-fragment",
5506 contents: ["libbaz"],
5507 apex_available: ["myapex"],
5508 }
5509
Spandan Das52c01a12024-09-20 01:09:48 +00005510 java_sdk_library_import {
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005511 name: "libfoo",
Spandan Das52c01a12024-09-20 01:09:48 +00005512 public: {
5513 jars: ["libfoo.jar"],
5514 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005515 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005516 shared_library: false,
5517 permitted_packages: ["libfoo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005518 }
5519
Spandan Das52c01a12024-09-20 01:09:48 +00005520
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005521 java_sdk_library_import {
5522 name: "libbar",
5523 public: {
5524 jars: ["libbar.jar"],
5525 },
5526 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005527 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005528 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005529 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005530
5531 java_sdk_library_import {
5532 name: "libbaz",
5533 public: {
5534 jars: ["libbaz.jar"],
5535 },
5536 apex_available: ["myapex"],
5537 shared_library: false,
5538 permitted_packages: ["baz"],
5539 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005540 `
5541
Paul Duffin89f570a2021-06-16 01:42:33 +01005542 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005543
Paul Duffin537ea3d2021-05-14 10:38:00 +01005544 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005545 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005546 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005547 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005548 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Colin Crosse5c7d7c2024-12-18 17:08:07 -08005549 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_com.android.art/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005550 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005551
5552 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5553
5554 overrideNames := []string{
Spandan Dasa8e2d612024-07-26 19:24:27 +00005555 "",
Liz Kammer2dc72442023-04-20 10:10:48 -04005556 "myjavalib.myapex",
5557 "libfoo.myapex",
5558 "libbar.myapex",
5559 "libbaz.myapex",
5560 }
5561 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5562 for i, e := range mkEntries {
5563 g := e.OverrideName
5564 if w := overrideNames[i]; w != g {
5565 t.Errorf("Expected override name %q, got %q", w, g)
5566 }
5567 }
5568
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005569 })
5570
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005571 t.Run("prebuilt with source library preferred", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005572 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005573 bp := `
5574 prebuilt_apex {
5575 name: "myapex",
5576 arch: {
5577 arm64: {
5578 src: "myapex-arm64.apex",
5579 },
5580 arm: {
5581 src: "myapex-arm.apex",
5582 },
5583 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005584 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5585 }
5586
5587 prebuilt_bootclasspath_fragment {
5588 name: "my-bootclasspath-fragment",
5589 contents: ["libfoo", "libbar"],
5590 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005591 hidden_api: {
5592 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5593 metadata: "my-bootclasspath-fragment/metadata.csv",
5594 index: "my-bootclasspath-fragment/index.csv",
5595 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5596 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5597 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005598 }
5599
5600 java_import {
5601 name: "libfoo",
5602 jars: ["libfoo.jar"],
5603 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005604 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005605 }
5606
5607 java_library {
5608 name: "libfoo",
5609 srcs: ["foo/bar/MyClass.java"],
5610 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005611 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005612 }
Paul Duffin37856732021-02-26 14:24:15 +00005613
5614 java_sdk_library_import {
5615 name: "libbar",
5616 public: {
5617 jars: ["libbar.jar"],
5618 },
5619 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005620 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005621 }
5622
5623 java_sdk_library {
5624 name: "libbar",
5625 srcs: ["foo/bar/MyClass.java"],
5626 unsafe_ignore_missing_latest_api: true,
5627 apex_available: ["myapex"],
5628 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005629 `
5630
5631 // In this test the source (java_library) libfoo is active since the
5632 // prebuilt (java_import) defaults to prefer:false. However the
5633 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5634 // find the dex boot jar in it. We either need to disable the source libfoo
5635 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005636 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005637 // dexbootjar check is skipped if AllowMissingDependencies is true
5638 preparerAllowMissingDeps := android.GroupFixturePreparers(
5639 preparer,
5640 android.PrepareForTestWithAllowMissingDependencies,
5641 )
5642 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005643 })
5644
5645 t.Run("prebuilt library preferred with source", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005646 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005647 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005648 apex {
5649 name: "myapex",
5650 key: "myapex.key",
5651 updatable: false,
5652 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5653 }
5654
5655 apex_key {
5656 name: "myapex.key",
5657 public_key: "testkey.avbpubkey",
5658 private_key: "testkey.pem",
5659 }
5660
5661 bootclasspath_fragment {
5662 name: "my-bootclasspath-fragment",
5663 contents: ["libfoo", "libbar"],
5664 apex_available: ["myapex"],
5665 hidden_api: {
5666 split_packages: ["*"],
5667 },
5668 }
5669
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005670 prebuilt_apex {
5671 name: "myapex",
5672 arch: {
5673 arm64: {
5674 src: "myapex-arm64.apex",
5675 },
5676 arm: {
5677 src: "myapex-arm.apex",
5678 },
5679 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005680 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5681 }
5682
5683 prebuilt_bootclasspath_fragment {
5684 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005685 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005686 contents: ["libfoo", "libbar"],
5687 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005688 hidden_api: {
5689 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5690 metadata: "my-bootclasspath-fragment/metadata.csv",
5691 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005692 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5693 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5694 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005695 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005696 }
5697
Spandan Das52c01a12024-09-20 01:09:48 +00005698 java_sdk_library_import {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005699 name: "libfoo",
5700 prefer: true,
Spandan Das52c01a12024-09-20 01:09:48 +00005701 public: {
5702 jars: ["libfoo.jar"],
5703 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005704 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005705 shared_library: false,
5706 permitted_packages: ["libfoo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005707 }
5708
5709 java_library {
5710 name: "libfoo",
5711 srcs: ["foo/bar/MyClass.java"],
5712 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005713 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005714 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005715 }
Paul Duffin37856732021-02-26 14:24:15 +00005716
5717 java_sdk_library_import {
5718 name: "libbar",
5719 prefer: true,
5720 public: {
5721 jars: ["libbar.jar"],
5722 },
5723 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005724 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005725 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005726 }
5727
5728 java_sdk_library {
5729 name: "libbar",
5730 srcs: ["foo/bar/MyClass.java"],
5731 unsafe_ignore_missing_latest_api: true,
5732 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005733 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005734 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005735 `
5736
Paul Duffin89f570a2021-06-16 01:42:33 +01005737 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005738
Paul Duffin537ea3d2021-05-14 10:38:00 +01005739 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005740 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005741 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005742 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005743 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Colin Crosse5c7d7c2024-12-18 17:08:07 -08005744 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_com.android.art/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005745 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005746 })
5747
5748 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005749 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005750 bp := `
5751 apex {
5752 name: "myapex",
5753 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005754 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005755 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005756 }
5757
5758 apex_key {
5759 name: "myapex.key",
5760 public_key: "testkey.avbpubkey",
5761 private_key: "testkey.pem",
5762 }
5763
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005764 bootclasspath_fragment {
5765 name: "my-bootclasspath-fragment",
5766 contents: ["libfoo", "libbar"],
5767 apex_available: ["myapex"],
5768 hidden_api: {
5769 split_packages: ["*"],
5770 },
5771 }
5772
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005773 prebuilt_apex {
5774 name: "myapex",
5775 arch: {
5776 arm64: {
5777 src: "myapex-arm64.apex",
5778 },
5779 arm: {
5780 src: "myapex-arm.apex",
5781 },
5782 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005783 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5784 }
5785
5786 prebuilt_bootclasspath_fragment {
5787 name: "my-bootclasspath-fragment",
5788 contents: ["libfoo", "libbar"],
5789 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005790 hidden_api: {
5791 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5792 metadata: "my-bootclasspath-fragment/metadata.csv",
5793 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005794 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5795 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5796 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005797 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005798 }
5799
5800 java_import {
5801 name: "libfoo",
5802 jars: ["libfoo.jar"],
5803 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005804 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005805 }
5806
5807 java_library {
5808 name: "libfoo",
5809 srcs: ["foo/bar/MyClass.java"],
5810 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005811 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005812 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005813 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005814 }
Paul Duffin37856732021-02-26 14:24:15 +00005815
5816 java_sdk_library_import {
5817 name: "libbar",
5818 public: {
5819 jars: ["libbar.jar"],
5820 },
5821 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005822 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005823 }
5824
5825 java_sdk_library {
5826 name: "libbar",
5827 srcs: ["foo/bar/MyClass.java"],
5828 unsafe_ignore_missing_latest_api: true,
5829 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005830 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005831 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005832 sdk_version: "core_current",
Paul Duffin37856732021-02-26 14:24:15 +00005833 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005834 `
5835
Paul Duffin89f570a2021-06-16 01:42:33 +01005836 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005837
Paul Duffin537ea3d2021-05-14 10:38:00 +01005838 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005839 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005840 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5841 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005842 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
Colin Crosse5c7d7c2024-12-18 17:08:07 -08005843 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_com.android.art/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005844 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005845 })
5846
5847 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005848 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005849 bp := `
5850 apex {
5851 name: "myapex",
5852 enabled: false,
5853 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005854 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005855 }
5856
5857 apex_key {
5858 name: "myapex.key",
5859 public_key: "testkey.avbpubkey",
5860 private_key: "testkey.pem",
5861 }
5862
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005863 bootclasspath_fragment {
5864 name: "my-bootclasspath-fragment",
5865 enabled: false,
5866 contents: ["libfoo", "libbar"],
5867 apex_available: ["myapex"],
5868 hidden_api: {
5869 split_packages: ["*"],
5870 },
5871 }
5872
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005873 prebuilt_apex {
5874 name: "myapex",
5875 arch: {
5876 arm64: {
5877 src: "myapex-arm64.apex",
5878 },
5879 arm: {
5880 src: "myapex-arm.apex",
5881 },
5882 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005883 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5884 }
5885
5886 prebuilt_bootclasspath_fragment {
5887 name: "my-bootclasspath-fragment",
5888 contents: ["libfoo", "libbar"],
5889 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005890 hidden_api: {
5891 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5892 metadata: "my-bootclasspath-fragment/metadata.csv",
5893 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005894 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5895 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5896 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005897 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005898 }
5899
5900 java_import {
5901 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005902 jars: ["libfoo.jar"],
5903 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005904 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005905 }
5906
5907 java_library {
5908 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005909 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005910 srcs: ["foo/bar/MyClass.java"],
5911 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005912 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005913 }
Paul Duffin37856732021-02-26 14:24:15 +00005914
5915 java_sdk_library_import {
5916 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00005917 public: {
5918 jars: ["libbar.jar"],
5919 },
5920 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005921 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005922 permitted_packages: ["bar"],
Jihoon Kanga6d0aa82024-09-24 00:34:49 +00005923 prefer: true,
Paul Duffin37856732021-02-26 14:24:15 +00005924 }
5925
5926 java_sdk_library {
5927 name: "libbar",
5928 srcs: ["foo/bar/MyClass.java"],
5929 unsafe_ignore_missing_latest_api: true,
5930 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005931 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005932 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005933 `
Cole Fausta963b942024-04-11 17:43:00 -07005934 // This test disables libbar, which causes the ComponentDepsMutator to add
5935 // deps on libbar.stubs and other sub-modules that don't exist. We can
5936 // enable AllowMissingDependencies to work around that, but enabling that
5937 // causes extra checks for missing source files to dex_bootjars, so add those
5938 // to the mock fs as well.
5939 preparer2 := android.GroupFixturePreparers(
5940 preparer,
5941 android.PrepareForTestWithAllowMissingDependencies,
5942 android.FixtureMergeMockFs(map[string][]byte{
5943 "build/soong/scripts/check_boot_jars/package_allowed_list.txt": nil,
Colin Cross99939e92024-10-01 16:02:46 -07005944 "frameworks/base/boot/boot-profile.txt": nil,
Cole Fausta963b942024-04-11 17:43:00 -07005945 }),
5946 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005947
Cole Fausta963b942024-04-11 17:43:00 -07005948 ctx := testDexpreoptWithApexes(t, bp, "", preparer2, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005949
Paul Duffin537ea3d2021-05-14 10:38:00 +01005950 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005951 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005952 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005953 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005954 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Colin Crosse5c7d7c2024-12-18 17:08:07 -08005955 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_com.android.art/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005956 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005957 })
Spandan Das3a392012024-01-17 18:26:27 +00005958
Spandan Dasf2c10572024-02-27 04:49:52 +00005959 t.Run("Co-existing unflagged apexes should create a duplicate module error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005960 t.Parallel()
Spandan Das3a392012024-01-17 18:26:27 +00005961 bp := `
5962 // Source
5963 apex {
5964 name: "myapex",
5965 enabled: false,
5966 key: "myapex.key",
5967 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5968 }
5969
5970 apex_key {
5971 name: "myapex.key",
5972 public_key: "testkey.avbpubkey",
5973 private_key: "testkey.pem",
5974 }
5975
5976 // Prebuilt
5977 prebuilt_apex {
5978 name: "myapex.v1",
5979 source_apex_name: "myapex",
5980 arch: {
5981 arm64: {
5982 src: "myapex-arm64.apex",
5983 },
5984 arm: {
5985 src: "myapex-arm.apex",
5986 },
5987 },
5988 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5989 prefer: true,
5990 }
5991 prebuilt_apex {
5992 name: "myapex.v2",
5993 source_apex_name: "myapex",
5994 arch: {
5995 arm64: {
5996 src: "myapex-arm64.apex",
5997 },
5998 arm: {
5999 src: "myapex-arm.apex",
6000 },
6001 },
6002 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
6003 prefer: true,
6004 }
6005
6006 prebuilt_bootclasspath_fragment {
6007 name: "my-bootclasspath-fragment",
6008 contents: ["libfoo", "libbar"],
6009 apex_available: ["myapex"],
6010 hidden_api: {
6011 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
6012 metadata: "my-bootclasspath-fragment/metadata.csv",
6013 index: "my-bootclasspath-fragment/index.csv",
6014 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
6015 all_flags: "my-bootclasspath-fragment/all-flags.csv",
6016 },
6017 prefer: true,
6018 }
6019
6020 java_import {
6021 name: "libfoo",
6022 jars: ["libfoo.jar"],
6023 apex_available: ["myapex"],
6024 prefer: true,
6025 }
6026 java_import {
6027 name: "libbar",
6028 jars: ["libbar.jar"],
6029 apex_available: ["myapex"],
6030 prefer: true,
6031 }
6032 `
6033
Spandan Dasf2c10572024-02-27 04:49:52 +00006034 testDexpreoptWithApexes(t, bp, "Multiple prebuilt modules prebuilt_myapex.v1 and prebuilt_myapex.v2 have been marked as preferred for this source module", preparer, fragment)
Spandan Das3a392012024-01-17 18:26:27 +00006035 })
6036
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006037}
6038
Roland Levillain630846d2019-06-26 12:48:34 +01006039func TestApexWithTests(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006040 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006041 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01006042 apex_test {
6043 name: "myapex",
6044 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006045 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01006046 tests: [
6047 "mytest",
6048 ],
6049 }
6050
6051 apex_key {
6052 name: "myapex.key",
6053 public_key: "testkey.avbpubkey",
6054 private_key: "testkey.pem",
6055 }
6056
Liz Kammer1c14a212020-05-12 15:26:55 -07006057 filegroup {
6058 name: "fg",
6059 srcs: [
6060 "baz",
6061 "bar/baz"
6062 ],
6063 }
6064
Roland Levillain630846d2019-06-26 12:48:34 +01006065 cc_test {
6066 name: "mytest",
6067 gtest: false,
6068 srcs: ["mytest.cpp"],
6069 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006070 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01006071 system_shared_libs: [],
Roland Levillain630846d2019-06-26 12:48:34 +01006072 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07006073 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01006074 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01006075
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006076 cc_library {
6077 name: "mylib",
6078 srcs: ["mylib.cpp"],
6079 system_shared_libs: [],
6080 stl: "none",
6081 }
6082
Liz Kammer5bd365f2020-05-27 15:15:11 -07006083 filegroup {
6084 name: "fg2",
6085 srcs: [
6086 "testdata/baz"
6087 ],
6088 }
Roland Levillain630846d2019-06-26 12:48:34 +01006089 `)
6090
Jooyung Hana0503a52023-08-23 13:12:50 +09006091 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01006092 copyCmds := apexRule.Args["copy_commands"]
6093
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006094 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01006095 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006096 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01006097
Liz Kammer1c14a212020-05-12 15:26:55 -07006098 //Ensure that test data are copied into apex.
6099 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
6100 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
6101
Roland Levillainf89cd092019-07-29 16:22:59 +01006102 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09006103 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006104 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07006105 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01006106 prefix := "TARGET_"
6107 var builder strings.Builder
6108 data.Custom(&builder, name, prefix, "", data)
6109 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006110 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01006111 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01006112}
6113
Jooyung Hand48f3c32019-08-23 11:18:57 +09006114func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006115 t.Parallel()
Jooyung Hand48f3c32019-08-23 11:18:57 +09006116 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
6117 apex {
6118 name: "myapex",
6119 key: "myapex.key",
6120 native_shared_libs: ["libfoo"],
6121 }
6122
6123 apex_key {
6124 name: "myapex.key",
6125 public_key: "testkey.avbpubkey",
6126 private_key: "testkey.pem",
6127 }
6128
6129 cc_library {
6130 name: "libfoo",
6131 stl: "none",
6132 system_shared_libs: [],
6133 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006134 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006135 }
6136 `)
6137 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
6138 apex {
6139 name: "myapex",
6140 key: "myapex.key",
6141 java_libs: ["myjar"],
6142 }
6143
6144 apex_key {
6145 name: "myapex.key",
6146 public_key: "testkey.avbpubkey",
6147 private_key: "testkey.pem",
6148 }
6149
6150 java_library {
6151 name: "myjar",
6152 srcs: ["foo/bar/MyClass.java"],
6153 sdk_version: "none",
6154 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09006155 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006156 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08006157 compile_dex: true,
Jooyung Hand48f3c32019-08-23 11:18:57 +09006158 }
6159 `)
6160}
6161
Bill Peckhama41a6962021-01-11 10:58:54 -08006162func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006163 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08006164 apex {
6165 name: "myapex",
6166 key: "myapex.key",
6167 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006168 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08006169 }
6170
6171 apex_key {
6172 name: "myapex.key",
6173 public_key: "testkey.avbpubkey",
6174 private_key: "testkey.pem",
6175 }
6176
6177 java_import {
6178 name: "myjavaimport",
6179 apex_available: ["myapex"],
6180 jars: ["my.jar"],
6181 compile_dex: true,
6182 }
6183 `)
6184
Jooyung Hana0503a52023-08-23 13:12:50 +09006185 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08006186 apexRule := module.Rule("apexRule")
6187 copyCmds := apexRule.Args["copy_commands"]
6188 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
6189}
6190
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006191func TestApexWithApps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006192 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006193 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006194 apex {
6195 name: "myapex",
6196 key: "myapex.key",
6197 apps: [
6198 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09006199 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006200 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006201 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006202 }
6203
6204 apex_key {
6205 name: "myapex.key",
6206 public_key: "testkey.avbpubkey",
6207 private_key: "testkey.pem",
6208 }
6209
6210 android_app {
6211 name: "AppFoo",
6212 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006213 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006214 system_modules: "none",
Jiyong Park970c5242024-05-17 22:58:54 +00006215 use_embedded_native_libs: true,
Jiyong Park8be103b2019-11-08 15:53:48 +09006216 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08006217 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006218 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006219 }
Jiyong Parkf7487312019-10-17 12:54:30 +09006220
6221 android_app {
6222 name: "AppFooPriv",
6223 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006224 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09006225 system_modules: "none",
6226 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04006227 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08006228 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006229 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09006230 }
Jiyong Park8be103b2019-11-08 15:53:48 +09006231
6232 cc_library_shared {
6233 name: "libjni",
6234 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006235 shared_libs: ["libfoo"],
6236 stl: "none",
6237 system_shared_libs: [],
6238 apex_available: [ "myapex" ],
6239 sdk_version: "current",
6240 }
6241
6242 cc_library_shared {
6243 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09006244 stl: "none",
6245 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09006246 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006247 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006248 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006249 `)
6250
Jooyung Hana0503a52023-08-23 13:12:50 +09006251 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006252 apexRule := module.Rule("apexRule")
6253 copyCmds := apexRule.Args["copy_commands"]
6254
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006255 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6256 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006257 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006258
Colin Crossaede88c2020-08-11 12:17:01 -07006259 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006260 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006261 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006262 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006263 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006264 // JNI libraries including transitive deps are
6265 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006266 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006267 // ... embedded inside APK (jnilibs.zip)
6268 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6269 // ... and not directly inside the APEX
6270 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6271 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006272
6273 apexBundle := module.Module().(*apexBundle)
6274 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6275 var builder strings.Builder
6276 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6277 androidMk := builder.String()
6278 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6279 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6280 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6281 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6282 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6283 ensureContains(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := privapp_allowlist_com.android.AppFooPriv.xml:$(PRODUCT_OUT)/apex/myapex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Dario Frenicde2a032019-10-27 00:29:22 +01006284}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006285
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006286func TestApexWithAppImportBuildId(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006287 t.Parallel()
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006288 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6289 for _, id := range invalidBuildIds {
6290 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6291 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6292 variables.BuildId = proptools.StringPtr(id)
6293 })
6294 testApexError(t, message, `apex {
6295 name: "myapex",
6296 key: "myapex.key",
6297 apps: ["AppFooPrebuilt"],
6298 updatable: false,
6299 }
6300
6301 apex_key {
6302 name: "myapex.key",
6303 public_key: "testkey.avbpubkey",
6304 private_key: "testkey.pem",
6305 }
6306
6307 android_app_import {
6308 name: "AppFooPrebuilt",
6309 apk: "PrebuiltAppFoo.apk",
6310 presigned: true,
6311 apex_available: ["myapex"],
6312 }
6313 `, fixture)
6314 }
6315}
6316
Dario Frenicde2a032019-10-27 00:29:22 +01006317func TestApexWithAppImports(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006318 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006319 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006320 apex {
6321 name: "myapex",
6322 key: "myapex.key",
6323 apps: [
6324 "AppFooPrebuilt",
6325 "AppFooPrivPrebuilt",
6326 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006327 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006328 }
6329
6330 apex_key {
6331 name: "myapex.key",
6332 public_key: "testkey.avbpubkey",
6333 private_key: "testkey.pem",
6334 }
6335
6336 android_app_import {
6337 name: "AppFooPrebuilt",
6338 apk: "PrebuiltAppFoo.apk",
6339 presigned: true,
6340 dex_preopt: {
6341 enabled: false,
6342 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006343 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006344 }
6345
6346 android_app_import {
6347 name: "AppFooPrivPrebuilt",
6348 apk: "PrebuiltAppFooPriv.apk",
6349 privileged: true,
6350 presigned: true,
6351 dex_preopt: {
6352 enabled: false,
6353 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006354 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006355 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006356 }
6357 `)
6358
Jooyung Hana0503a52023-08-23 13:12:50 +09006359 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01006360 apexRule := module.Rule("apexRule")
6361 copyCmds := apexRule.Args["copy_commands"]
6362
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006363 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6364 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006365}
6366
6367func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006368 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006369 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006370 apex {
6371 name: "myapex",
6372 key: "myapex.key",
6373 apps: [
6374 "AppFoo",
6375 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006376 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006377 }
6378
6379 apex_key {
6380 name: "myapex.key",
6381 public_key: "testkey.avbpubkey",
6382 private_key: "testkey.pem",
6383 }
6384
6385 android_app {
6386 name: "AppFoo",
6387 srcs: ["foo/bar/MyClass.java"],
6388 sdk_version: "none",
6389 system_modules: "none",
6390 apex_available: [ "myapex" ],
6391 }
6392
6393 android_app_import {
6394 name: "AppFoo",
6395 apk: "AppFooPrebuilt.apk",
6396 filename: "AppFooPrebuilt.apk",
6397 presigned: true,
6398 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006399 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006400 }
6401 `, withFiles(map[string][]byte{
6402 "AppFooPrebuilt.apk": nil,
6403 }))
6404
Jooyung Hana0503a52023-08-23 13:12:50 +09006405 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006406 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006407 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006408}
6409
Dario Freni6f3937c2019-12-20 22:58:03 +00006410func TestApexWithTestHelperApp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006411 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006412 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006413 apex {
6414 name: "myapex",
6415 key: "myapex.key",
6416 apps: [
6417 "TesterHelpAppFoo",
6418 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006419 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006420 }
6421
6422 apex_key {
6423 name: "myapex.key",
6424 public_key: "testkey.avbpubkey",
6425 private_key: "testkey.pem",
6426 }
6427
6428 android_test_helper_app {
6429 name: "TesterHelpAppFoo",
6430 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006431 apex_available: [ "myapex" ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00006432 sdk_version: "test_current",
Dario Freni6f3937c2019-12-20 22:58:03 +00006433 }
6434
6435 `)
6436
Jooyung Hana0503a52023-08-23 13:12:50 +09006437 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00006438 apexRule := module.Rule("apexRule")
6439 copyCmds := apexRule.Args["copy_commands"]
6440
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006441 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006442}
6443
Jooyung Han18020ea2019-11-13 10:50:48 +09006444func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006445 t.Parallel()
Jooyung Han18020ea2019-11-13 10:50:48 +09006446 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006447 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006448 apex {
6449 name: "myapex",
6450 key: "myapex.key",
6451 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006452 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006453 }
6454
6455 apex_key {
6456 name: "myapex.key",
6457 public_key: "testkey.avbpubkey",
6458 private_key: "testkey.pem",
6459 }
6460
6461 apex {
6462 name: "otherapex",
6463 key: "myapex.key",
6464 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006465 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006466 }
6467
6468 cc_defaults {
6469 name: "libfoo-defaults",
6470 apex_available: ["otherapex"],
6471 }
6472
6473 cc_library {
6474 name: "libfoo",
6475 defaults: ["libfoo-defaults"],
6476 stl: "none",
6477 system_shared_libs: [],
6478 }`)
6479}
6480
Paul Duffine52e66f2020-03-30 17:54:29 +01006481func TestApexAvailable_DirectDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006482 t.Parallel()
Jiyong Park127b40b2019-09-30 16:04:35 +09006483 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006484 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006485 apex {
6486 name: "myapex",
6487 key: "myapex.key",
6488 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006489 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006490 }
6491
6492 apex_key {
6493 name: "myapex.key",
6494 public_key: "testkey.avbpubkey",
6495 private_key: "testkey.pem",
6496 }
6497
6498 apex {
6499 name: "otherapex",
6500 key: "otherapex.key",
6501 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006502 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006503 }
6504
6505 apex_key {
6506 name: "otherapex.key",
6507 public_key: "testkey.avbpubkey",
6508 private_key: "testkey.pem",
6509 }
6510
6511 cc_library {
6512 name: "libfoo",
6513 stl: "none",
6514 system_shared_libs: [],
6515 apex_available: ["otherapex"],
6516 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006517
6518 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6519 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6520 testApex(t, `
6521 apex {
6522 name: "com.sdv.myapex",
6523 key: "myapex.key",
6524 native_shared_libs: ["libfoo"],
6525 updatable: false,
6526 product_specific: true,
6527 }
6528
6529 apex_key {
6530 name: "myapex.key",
6531 public_key: "testkey.avbpubkey",
6532 private_key: "testkey.pem",
6533 }
6534
6535 apex {
6536 name: "com.any.otherapex",
6537 key: "otherapex.key",
6538 native_shared_libs: ["libfoo"],
6539 updatable: false,
6540 }
6541
6542 apex_key {
6543 name: "otherapex.key",
6544 public_key: "testkey.avbpubkey",
6545 private_key: "testkey.pem",
6546 }
6547
6548 cc_library {
6549 name: "libfoo",
6550 stl: "none",
6551 system_shared_libs: [],
6552 apex_available: ["com.any.otherapex"],
6553 product_specific: true,
6554 }`,
6555 android.FixtureMergeMockFs(android.MockFS{
6556 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6557 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6558 }))
6559
6560 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6561 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
6562 apex {
6563 name: "com.sdv.myapex",
6564 key: "myapex.key",
6565 native_shared_libs: ["libfoo"],
6566 updatable: false,
6567 }
6568
6569 apex_key {
6570 name: "myapex.key",
6571 public_key: "testkey.avbpubkey",
6572 private_key: "testkey.pem",
6573 }
6574
6575 apex {
6576 name: "com.any.otherapex",
6577 key: "otherapex.key",
6578 native_shared_libs: ["libfoo"],
6579 updatable: false,
6580 }
6581
6582 apex_key {
6583 name: "otherapex.key",
6584 public_key: "testkey.avbpubkey",
6585 private_key: "testkey.pem",
6586 }
6587
6588 cc_library {
6589 name: "libfoo",
6590 stl: "none",
6591 system_shared_libs: [],
6592 apex_available: ["com.any.otherapex"],
6593 }`,
6594 android.FixtureMergeMockFs(android.MockFS{
6595 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6596 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6597 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006598}
Jiyong Park127b40b2019-09-30 16:04:35 +09006599
Paul Duffine52e66f2020-03-30 17:54:29 +01006600func TestApexAvailable_IndirectDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006601 t.Parallel()
Jooyung Han5e9013b2020-03-10 06:23:13 +09006602 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006603 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006604.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006605.*-> libfoo.*link:shared.*
Yu Liub73c3a62024-12-10 00:58:06 +00006606.*via tag cc\.dependencyTag.*
6607.*-> libfoo.*link:static.*
Colin Cross6e511a92020-07-27 21:26:48 -07006608.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006609.*-> libbar.*link:shared.*
Yu Liub73c3a62024-12-10 00:58:06 +00006610.*via tag cc\.dependencyTag.*
6611.*-> libbar.*link:static.*
Colin Cross6e511a92020-07-27 21:26:48 -07006612.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Yu Liub73c3a62024-12-10 00:58:06 +00006613.*-> libbaz.*link:shared.*
6614.*via tag cc\.dependencyTag.*
6615.*-> libbaz.*link:static.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006616 apex {
6617 name: "myapex",
6618 key: "myapex.key",
6619 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006620 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006621 }
6622
6623 apex_key {
6624 name: "myapex.key",
6625 public_key: "testkey.avbpubkey",
6626 private_key: "testkey.pem",
6627 }
6628
Jiyong Park127b40b2019-09-30 16:04:35 +09006629 cc_library {
6630 name: "libfoo",
6631 stl: "none",
6632 shared_libs: ["libbar"],
6633 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006634 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006635 }
6636
6637 cc_library {
6638 name: "libbar",
6639 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006640 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006641 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006642 apex_available: ["myapex"],
6643 }
6644
6645 cc_library {
6646 name: "libbaz",
6647 stl: "none",
6648 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006649 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006650
6651 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6652 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6653 testApex(t, `
6654 apex {
6655 name: "com.sdv.myapex",
6656 key: "myapex.key",
6657 native_shared_libs: ["libfoo"],
6658 updatable: false,
6659 product_specific: true,
6660 }
6661
6662 apex_key {
6663 name: "myapex.key",
6664 public_key: "testkey.avbpubkey",
6665 private_key: "testkey.pem",
6666 }
6667
6668 cc_library {
6669 name: "libfoo",
6670 stl: "none",
6671 shared_libs: ["libbar"],
6672 system_shared_libs: [],
6673 apex_available: ["com.sdv.myapex"],
6674 product_specific: true,
6675 }
6676
6677 cc_library {
6678 name: "libbar",
6679 stl: "none",
6680 shared_libs: ["libbaz"],
6681 system_shared_libs: [],
6682 apex_available: ["com.sdv.myapex"],
6683 product_specific: true,
6684 }
6685
6686 cc_library {
6687 name: "libbaz",
6688 stl: "none",
6689 system_shared_libs: [],
6690 product_specific: true,
6691 }`,
6692 android.FixtureMergeMockFs(android.MockFS{
6693 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6694 }))
6695
6696 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6697 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.`, `
6698 apex {
6699 name: "com.sdv.myapex",
6700 key: "myapex.key",
6701 native_shared_libs: ["libfoo"],
6702 updatable: false,
6703 }
6704
6705 apex_key {
6706 name: "myapex.key",
6707 public_key: "testkey.avbpubkey",
6708 private_key: "testkey.pem",
6709 }
6710
6711 cc_library {
6712 name: "libfoo",
6713 stl: "none",
6714 shared_libs: ["libbar"],
6715 system_shared_libs: [],
6716 apex_available: ["com.sdv.myapex"],
6717 }
6718
6719 cc_library {
6720 name: "libbar",
6721 stl: "none",
6722 shared_libs: ["libbaz"],
6723 system_shared_libs: [],
6724 apex_available: ["com.sdv.myapex"],
6725 }
6726
6727 cc_library {
6728 name: "libbaz",
6729 stl: "none",
6730 system_shared_libs: [],
6731 }`,
6732 android.FixtureMergeMockFs(android.MockFS{
6733 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6734 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006735}
Jiyong Park127b40b2019-09-30 16:04:35 +09006736
Liz Kammer5f108fa2023-05-11 14:33:17 -04006737func TestApexAvailable_IndirectStaticDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006738 t.Parallel()
Liz Kammer5f108fa2023-05-11 14:33:17 -04006739 testApex(t, `
6740 apex {
6741 name: "myapex",
6742 key: "myapex.key",
6743 native_shared_libs: ["libfoo"],
6744 updatable: false,
6745 }
6746
6747 apex_key {
6748 name: "myapex.key",
6749 public_key: "testkey.avbpubkey",
6750 private_key: "testkey.pem",
6751 }
6752
6753 cc_library {
6754 name: "libfoo",
6755 stl: "none",
6756 static_libs: ["libbar"],
6757 system_shared_libs: [],
6758 apex_available: ["myapex"],
6759 }
6760
6761 cc_library {
6762 name: "libbar",
6763 stl: "none",
6764 shared_libs: ["libbaz"],
6765 system_shared_libs: [],
6766 apex_available: ["myapex"],
6767 }
6768
6769 cc_library {
6770 name: "libbaz",
6771 stl: "none",
6772 system_shared_libs: [],
6773 }`)
6774
6775 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6776 apex {
6777 name: "myapex",
6778 key: "myapex.key",
6779 native_shared_libs: ["libfoo"],
6780 updatable: false,
6781 }
6782
6783 apex_key {
6784 name: "myapex.key",
6785 public_key: "testkey.avbpubkey",
6786 private_key: "testkey.pem",
6787 }
6788
6789 cc_library {
6790 name: "libfoo",
6791 stl: "none",
6792 static_libs: ["libbar"],
6793 system_shared_libs: [],
6794 apex_available: ["myapex"],
6795 }
6796
6797 cc_library {
6798 name: "libbar",
6799 stl: "none",
6800 system_shared_libs: [],
6801 }`)
6802}
6803
Paul Duffine52e66f2020-03-30 17:54:29 +01006804func TestApexAvailable_InvalidApexName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006805 t.Parallel()
Jiyong Park127b40b2019-09-30 16:04:35 +09006806 testApexError(t, "\"otherapex\" is not a valid module name", `
6807 apex {
6808 name: "myapex",
6809 key: "myapex.key",
6810 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006811 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006812 }
6813
6814 apex_key {
6815 name: "myapex.key",
6816 public_key: "testkey.avbpubkey",
6817 private_key: "testkey.pem",
6818 }
6819
6820 cc_library {
6821 name: "libfoo",
6822 stl: "none",
6823 system_shared_libs: [],
6824 apex_available: ["otherapex"],
6825 }`)
6826
Paul Duffine52e66f2020-03-30 17:54:29 +01006827 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006828 apex {
6829 name: "myapex",
6830 key: "myapex.key",
6831 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006832 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006833 }
6834
6835 apex_key {
6836 name: "myapex.key",
6837 public_key: "testkey.avbpubkey",
6838 private_key: "testkey.pem",
6839 }
6840
6841 cc_library {
6842 name: "libfoo",
6843 stl: "none",
6844 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006845 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006846 apex_available: ["myapex"],
6847 }
6848
6849 cc_library {
6850 name: "libbar",
6851 stl: "none",
6852 system_shared_libs: [],
6853 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006854 }
6855
6856 cc_library {
6857 name: "libbaz",
6858 stl: "none",
6859 system_shared_libs: [],
6860 stubs: {
6861 versions: ["10", "20", "30"],
6862 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006863 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006864}
Jiyong Park127b40b2019-09-30 16:04:35 +09006865
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006866func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006867 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006868 t.Run("negative variant_version produces error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006869 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006870 testApexError(t, "expected an integer between 0-9; got -1", `
6871 apex {
6872 name: "myapex",
6873 key: "myapex.key",
6874 apex_available_name: "com.android.foo",
6875 variant_version: "-1",
6876 updatable: false,
6877 }
6878 apex_key {
6879 name: "myapex.key",
6880 public_key: "testkey.avbpubkey",
6881 private_key: "testkey.pem",
6882 }
6883 `)
6884 })
6885
6886 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006887 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006888 testApexError(t, "expected an integer between 0-9; got 10", `
6889 apex {
6890 name: "myapex",
6891 key: "myapex.key",
6892 apex_available_name: "com.android.foo",
6893 variant_version: "10",
6894 updatable: false,
6895 }
6896 apex_key {
6897 name: "myapex.key",
6898 public_key: "testkey.avbpubkey",
6899 private_key: "testkey.pem",
6900 }
6901 `)
6902 })
6903}
6904
6905func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006906 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006907 context := android.GroupFixturePreparers(
6908 android.PrepareForIntegrationTestWithAndroid,
6909 PrepareForTestWithApexBuildComponents,
6910 android.FixtureMergeMockFs(android.MockFS{
6911 "system/sepolicy/apex/foo-file_contexts": nil,
6912 "system/sepolicy/apex/bar-file_contexts": nil,
6913 }),
6914 )
6915 result := context.RunTestWithBp(t, `
6916 apex {
6917 name: "foo",
6918 key: "myapex.key",
6919 apex_available_name: "com.android.foo",
6920 variant_version: "0",
6921 updatable: false,
6922 }
6923 apex {
6924 name: "bar",
6925 key: "myapex.key",
6926 apex_available_name: "com.android.foo",
6927 variant_version: "3",
6928 updatable: false,
6929 }
6930 apex_key {
6931 name: "myapex.key",
6932 public_key: "testkey.avbpubkey",
6933 private_key: "testkey.pem",
6934 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006935 override_apex {
6936 name: "myoverrideapex",
6937 base: "bar",
6938 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006939 `)
6940
Jooyung Hana0503a52023-08-23 13:12:50 +09006941 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +00006942 fooExpectedDefaultVersion := testDefaultUpdatableModuleVersion
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006943 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6944 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6945 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6946 }
6947
Jooyung Hana0503a52023-08-23 13:12:50 +09006948 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +00006949 defaultVersionInt, _ := strconv.Atoi(testDefaultUpdatableModuleVersion)
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006950 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6951 barActualDefaultVersion := barManifestRule.Args["default_version"]
6952 if barActualDefaultVersion != barExpectedDefaultVersion {
6953 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6954 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006955
Spandan Das50801e22024-05-13 18:29:45 +00006956 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_myoverrideapex").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04006957 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6958 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6959 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6960 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006961}
6962
Sam Delmericoca816532023-06-02 14:09:50 -04006963func TestApexAvailable_ApexAvailableName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006964 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006965 t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006966 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006967 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6968 apex {
6969 name: "myapex_sminus",
6970 key: "myapex.key",
6971 apps: ["AppFoo"],
6972 apex_available_name: "myapex",
6973 updatable: false,
6974 }
6975 apex {
6976 name: "myapex",
6977 key: "myapex.key",
6978 apps: ["AppFoo"],
6979 updatable: false,
6980 }
6981 apex_key {
6982 name: "myapex.key",
6983 public_key: "testkey.avbpubkey",
6984 private_key: "testkey.pem",
6985 }
6986 android_app {
6987 name: "AppFoo",
6988 srcs: ["foo/bar/MyClass.java"],
6989 sdk_version: "none",
6990 system_modules: "none",
6991 apex_available: [ "myapex_sminus" ],
6992 }`,
6993 android.FixtureMergeMockFs(android.MockFS{
6994 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6995 }),
6996 )
6997 })
6998
6999 t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007000 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04007001 testApex(t, `
7002 apex {
7003 name: "myapex_sminus",
7004 key: "myapex.key",
7005 apps: ["AppFoo"],
7006 apex_available_name: "myapex",
7007 updatable: false,
7008 }
7009 apex {
7010 name: "myapex",
7011 key: "myapex.key",
7012 apps: ["AppFoo"],
7013 updatable: false,
7014 }
7015 apex_key {
7016 name: "myapex.key",
7017 public_key: "testkey.avbpubkey",
7018 private_key: "testkey.pem",
7019 }
7020 android_app {
7021 name: "AppFoo",
7022 srcs: ["foo/bar/MyClass.java"],
7023 sdk_version: "none",
7024 system_modules: "none",
7025 apex_available: [ "myapex" ],
7026 }`,
7027 android.FixtureMergeMockFs(android.MockFS{
7028 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
7029 }),
7030 )
7031 })
7032
7033 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007034 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04007035 testApex(t, `
7036 override_apex {
7037 name: "myoverrideapex_sminus",
7038 base: "myapex_sminus",
7039 key: "myapex.key",
7040 apps: ["AppFooOverride"],
7041 }
7042 override_apex {
7043 name: "myoverrideapex",
7044 base: "myapex",
7045 key: "myapex.key",
7046 apps: ["AppFooOverride"],
7047 }
7048 apex {
7049 name: "myapex_sminus",
7050 key: "myapex.key",
7051 apps: ["AppFoo"],
7052 apex_available_name: "myapex",
7053 updatable: false,
7054 }
7055 apex {
7056 name: "myapex",
7057 key: "myapex.key",
7058 apps: ["AppFoo"],
7059 updatable: false,
7060 }
7061 apex_key {
7062 name: "myapex.key",
7063 public_key: "testkey.avbpubkey",
7064 private_key: "testkey.pem",
7065 }
7066 android_app {
7067 name: "AppFooOverride",
7068 srcs: ["foo/bar/MyClass.java"],
7069 sdk_version: "none",
7070 system_modules: "none",
7071 apex_available: [ "myapex" ],
7072 }
7073 android_app {
7074 name: "AppFoo",
7075 srcs: ["foo/bar/MyClass.java"],
7076 sdk_version: "none",
7077 system_modules: "none",
7078 apex_available: [ "myapex" ],
7079 }`,
7080 android.FixtureMergeMockFs(android.MockFS{
7081 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
7082 }),
7083 )
7084 })
7085}
7086
7087func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007088 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04007089 context := android.GroupFixturePreparers(
7090 android.PrepareForIntegrationTestWithAndroid,
7091 PrepareForTestWithApexBuildComponents,
7092 java.PrepareForTestWithDexpreopt,
7093 android.FixtureMergeMockFs(android.MockFS{
7094 "system/sepolicy/apex/myapex-file_contexts": nil,
7095 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
7096 }),
7097 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7098 variables.BuildId = proptools.StringPtr("buildid")
7099 }),
7100 )
7101 context.RunTestWithBp(t, `
7102 override_apex {
7103 name: "myoverrideapex_sminus",
7104 base: "myapex_sminus",
7105 }
7106 override_apex {
7107 name: "myoverrideapex",
7108 base: "myapex",
7109 }
7110 apex {
7111 name: "myapex",
7112 key: "myapex.key",
7113 apps: ["AppFoo"],
7114 updatable: false,
7115 }
7116 apex {
7117 name: "myapex_sminus",
7118 apex_available_name: "myapex",
7119 key: "myapex.key",
7120 apps: ["AppFoo_sminus"],
7121 updatable: false,
7122 }
7123 apex_key {
7124 name: "myapex.key",
7125 public_key: "testkey.avbpubkey",
7126 private_key: "testkey.pem",
7127 }
7128 android_app {
7129 name: "AppFoo",
7130 srcs: ["foo/bar/MyClass.java"],
7131 sdk_version: "none",
7132 system_modules: "none",
7133 apex_available: [ "myapex" ],
7134 }
7135 android_app {
7136 name: "AppFoo_sminus",
7137 srcs: ["foo/bar/MyClass.java"],
7138 sdk_version: "none",
7139 min_sdk_version: "29",
7140 system_modules: "none",
7141 apex_available: [ "myapex" ],
7142 }`)
7143}
7144
Jiyong Park89e850a2020-04-07 16:37:39 +09007145func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007146 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007147 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09007148 apex {
7149 name: "myapex",
7150 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09007151 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007152 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09007153 }
7154
7155 apex_key {
7156 name: "myapex.key",
7157 public_key: "testkey.avbpubkey",
7158 private_key: "testkey.pem",
7159 }
7160
7161 cc_library {
7162 name: "libfoo",
7163 stl: "none",
7164 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09007165 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09007166 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09007167 }
7168
7169 cc_library {
7170 name: "libfoo2",
7171 stl: "none",
7172 system_shared_libs: [],
7173 shared_libs: ["libbaz"],
7174 apex_available: ["//apex_available:platform"],
7175 }
7176
7177 cc_library {
7178 name: "libbar",
7179 stl: "none",
7180 system_shared_libs: [],
7181 apex_available: ["myapex"],
7182 }
7183
7184 cc_library {
7185 name: "libbaz",
7186 stl: "none",
7187 system_shared_libs: [],
7188 apex_available: ["myapex"],
7189 stubs: {
7190 versions: ["1"],
7191 },
Jiyong Park127b40b2019-09-30 16:04:35 +09007192 }`)
7193
Jiyong Park89e850a2020-04-07 16:37:39 +09007194 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
7195 // because it depends on libbar which isn't available to platform
7196 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7197 if libfoo.NotAvailableForPlatform() != true {
7198 t.Errorf("%q shouldn't be available to platform", libfoo.String())
7199 }
7200
7201 // libfoo2 however can be available to platform because it depends on libbaz which provides
7202 // stubs
7203 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7204 if libfoo2.NotAvailableForPlatform() == true {
7205 t.Errorf("%q should be available to platform", libfoo2.String())
7206 }
Paul Duffine52e66f2020-03-30 17:54:29 +01007207}
Jiyong Parka90ca002019-10-07 15:47:24 +09007208
Paul Duffine52e66f2020-03-30 17:54:29 +01007209func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007210 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007211 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09007212 apex {
7213 name: "myapex",
7214 key: "myapex.key",
7215 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007216 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09007217 }
7218
7219 apex_key {
7220 name: "myapex.key",
7221 public_key: "testkey.avbpubkey",
7222 private_key: "testkey.pem",
7223 }
7224
7225 cc_library {
7226 name: "libfoo",
7227 stl: "none",
7228 system_shared_libs: [],
7229 apex_available: ["myapex"],
7230 static: {
7231 apex_available: ["//apex_available:platform"],
7232 },
7233 }`)
7234
Jiyong Park89e850a2020-04-07 16:37:39 +09007235 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7236 if libfooShared.NotAvailableForPlatform() != true {
7237 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
7238 }
7239 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
7240 if libfooStatic.NotAvailableForPlatform() != false {
7241 t.Errorf("%q should be available to platform", libfooStatic.String())
7242 }
Jiyong Park127b40b2019-09-30 16:04:35 +09007243}
7244
Jooyung Han9a419e22024-08-16 17:14:21 +09007245func TestApexAvailable_PrefixMatch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007246 t.Parallel()
Jooyung Han9a419e22024-08-16 17:14:21 +09007247
7248 for _, tc := range []struct {
7249 name string
7250 apexAvailable string
7251 expectedError string
7252 }{
7253 {
7254 name: "prefix matches correctly",
7255 apexAvailable: "com.foo.*",
7256 },
7257 {
7258 name: "prefix doesn't match",
7259 apexAvailable: "com.bar.*",
7260 expectedError: `Consider .* "com.foo\.\*"`,
7261 },
7262 {
7263 name: "short prefix",
7264 apexAvailable: "com.*",
7265 expectedError: "requires two or more components",
7266 },
7267 {
7268 name: "wildcard not in the end",
7269 apexAvailable: "com.*.foo",
7270 expectedError: "should end with .*",
7271 },
7272 {
7273 name: "wildcard in the middle",
7274 apexAvailable: "com.foo*.*",
7275 expectedError: "not allowed in the middle",
7276 },
7277 {
7278 name: "hint with prefix pattern",
7279 apexAvailable: "//apex_available:platform",
7280 expectedError: "Consider adding \"com.foo.bar\" or \"com.foo.*\"",
7281 },
7282 } {
7283 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007284 t.Parallel()
Jooyung Han9a419e22024-08-16 17:14:21 +09007285 errorHandler := android.FixtureExpectsNoErrors
7286 if tc.expectedError != "" {
7287 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(tc.expectedError)
7288 }
7289 context := android.GroupFixturePreparers(
7290 prepareForApexTest,
7291 android.FixtureMergeMockFs(android.MockFS{
7292 "system/sepolicy/apex/com.foo.bar-file_contexts": nil,
7293 }),
7294 ).ExtendWithErrorHandler(errorHandler)
7295
7296 context.RunTestWithBp(t, `
7297 apex {
7298 name: "com.foo.bar",
7299 key: "myapex.key",
7300 native_shared_libs: ["libfoo"],
7301 updatable: false,
7302 }
7303
7304 apex_key {
7305 name: "myapex.key",
7306 public_key: "testkey.avbpubkey",
7307 private_key: "testkey.pem",
7308 }
7309
7310 cc_library {
7311 name: "libfoo",
7312 stl: "none",
7313 system_shared_libs: [],
7314 apex_available: ["`+tc.apexAvailable+`"],
7315 }`)
7316 })
7317 }
7318 testApexError(t, `Consider adding "com.foo" to`, `
7319 apex {
7320 name: "com.foo", // too short for a partner apex
7321 key: "myapex.key",
7322 native_shared_libs: ["libfoo"],
7323 updatable: false,
7324 }
7325
7326 apex_key {
7327 name: "myapex.key",
7328 public_key: "testkey.avbpubkey",
7329 private_key: "testkey.pem",
7330 }
7331
7332 cc_library {
7333 name: "libfoo",
7334 stl: "none",
7335 system_shared_libs: [],
7336 }
7337 `)
7338}
7339
Jooyung Han5f7fa502025-01-14 16:52:14 +09007340func TestApexValidation_UsesProperPartitionTag(t *testing.T) {
7341 t.Parallel()
7342 ctx := testApex(t, `
7343 apex {
7344 name: "myapex",
7345 key: "myapex.key",
7346 updatable: false,
7347 vendor: true,
7348 }
7349 apex_key {
7350 name: "myapex.key",
7351 public_key: "testkey.avbpubkey",
7352 private_key: "testkey.pem",
7353 }
7354 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7355 // vendor path should not affect "partition tag"
7356 variables.VendorPath = proptools.StringPtr("system/vendor")
7357 }))
7358
7359 module := ctx.ModuleForTests("myapex", "android_common_myapex")
7360 android.AssertStringEquals(t, "partition tag for host_apex_verifier",
7361 "vendor",
7362 module.Output("host_apex_verifier.timestamp").Args["partition_tag"])
7363 android.AssertStringEquals(t, "partition tag for apex_sepolicy_tests",
7364 "vendor",
7365 module.Output("apex_sepolicy_tests.timestamp").Args["partition_tag"])
7366}
7367
Jooyung Hanb9518072024-11-22 14:05:20 +09007368func TestApexValidation_TestApexCanSkipInitRcCheck(t *testing.T) {
7369 t.Parallel()
7370 ctx := testApex(t, `
7371 apex_test {
7372 name: "myapex",
7373 key: "myapex.key",
7374 skip_validations: {
7375 host_apex_verifier: true,
7376 },
7377 updatable: false,
7378 }
7379 apex_key {
7380 name: "myapex.key",
7381 public_key: "testkey.avbpubkey",
7382 private_key: "testkey.pem",
7383 }
7384 `)
7385
7386 validations := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk").Validations.Strings()
7387 if android.SuffixInList(validations, "host_apex_verifier.timestamp") {
7388 t.Error("should not run host_apex_verifier")
7389 }
7390}
7391
7392func TestApexValidation_TestApexCheckInitRc(t *testing.T) {
7393 t.Parallel()
7394 ctx := testApex(t, `
7395 apex_test {
7396 name: "myapex",
7397 key: "myapex.key",
7398 updatable: false,
7399 }
7400 apex_key {
7401 name: "myapex.key",
7402 public_key: "testkey.avbpubkey",
7403 private_key: "testkey.pem",
7404 }
7405 `)
7406
7407 validations := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk").Validations.Strings()
7408 if !android.SuffixInList(validations, "host_apex_verifier.timestamp") {
7409 t.Error("should run host_apex_verifier")
7410 }
7411}
7412
Jiyong Park5d790c32019-11-15 18:40:32 +09007413func TestOverrideApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007414 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007415 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09007416 apex {
7417 name: "myapex",
7418 key: "myapex.key",
7419 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08007420 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007421 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007422 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007423 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09007424 }
7425
7426 override_apex {
7427 name: "override_myapex",
7428 base: "myapex",
7429 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08007430 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007431 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007432 overrides: ["unknownapex"],
Jesse Melhuishec60e252024-03-29 19:08:20 +00007433 compile_multilib: "first",
7434 multilib: {
7435 lib32: {
7436 native_shared_libs: ["mylib32"],
7437 },
7438 lib64: {
7439 native_shared_libs: ["mylib64"],
7440 },
7441 },
Baligh Uddin004d7172020-02-19 21:29:28 -08007442 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007443 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007444 key: "mynewapex.key",
7445 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09007446 }
7447
7448 apex_key {
7449 name: "myapex.key",
7450 public_key: "testkey.avbpubkey",
7451 private_key: "testkey.pem",
7452 }
7453
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007454 apex_key {
7455 name: "mynewapex.key",
7456 public_key: "testkey2.avbpubkey",
7457 private_key: "testkey2.pem",
7458 }
7459
7460 android_app_certificate {
7461 name: "myapex.certificate",
7462 certificate: "testkey",
7463 }
7464
Jiyong Park5d790c32019-11-15 18:40:32 +09007465 android_app {
7466 name: "app",
7467 srcs: ["foo/bar/MyClass.java"],
7468 package_name: "foo",
7469 sdk_version: "none",
7470 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007471 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09007472 }
7473
7474 override_android_app {
7475 name: "override_app",
7476 base: "app",
7477 package_name: "bar",
7478 }
markchien7c803b82021-08-26 22:10:06 +08007479
7480 bpf {
7481 name: "bpf",
7482 srcs: ["bpf.c"],
7483 }
7484
7485 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08007486 name: "overrideBpf",
7487 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08007488 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07007489
7490 prebuilt_etc {
7491 name: "myetc",
7492 src: "myprebuilt",
7493 }
7494
7495 prebuilt_etc {
7496 name: "override_myetc",
7497 src: "override_myprebuilt",
7498 }
Jesse Melhuishec60e252024-03-29 19:08:20 +00007499
7500 cc_library {
7501 name: "mylib32",
7502 apex_available: [ "myapex" ],
7503 }
7504
7505 cc_library {
7506 name: "mylib64",
7507 apex_available: [ "myapex" ],
7508 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007509 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007510
Jooyung Hana0503a52023-08-23 13:12:50 +09007511 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
Spandan Das50801e22024-05-13 18:29:45 +00007512 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09007513 if originalVariant.GetOverriddenBy() != "" {
7514 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7515 }
7516 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7517 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7518 }
7519
Spandan Das50801e22024-05-13 18:29:45 +00007520 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007521 apexRule := module.Rule("apexRule")
7522 copyCmds := apexRule.Args["copy_commands"]
7523
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007524 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7525 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007526
markchien7c803b82021-08-26 22:10:06 +08007527 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007528 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007529
Daniel Norman5a3ce132021-08-26 15:44:43 -07007530 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7531 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7532
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007533 apexBundle := module.Module().(*apexBundle)
7534 name := apexBundle.Name()
7535 if name != "override_myapex" {
7536 t.Errorf("name should be \"override_myapex\", but was %q", name)
7537 }
7538
Baligh Uddin004d7172020-02-19 21:29:28 -08007539 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7540 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7541 }
7542
Jiyong Park20bacab2020-03-03 11:45:41 +09007543 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007544 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007545 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7546
7547 signApkRule := module.Rule("signapk")
7548 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007549
Colin Crossaa255532020-07-03 13:18:24 -07007550 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007551 var builder strings.Builder
7552 data.Custom(&builder, name, "TARGET_", "", data)
7553 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007554 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7555 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007556 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007557 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007558 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007559 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007560 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007561 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007562}
7563
Albert Martineefabcf2022-03-21 20:11:16 +00007564func TestMinSdkVersionOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007565 t.Parallel()
Albert Martineefabcf2022-03-21 20:11:16 +00007566 // Override from 29 to 31
7567 minSdkOverride31 := "31"
7568 ctx := testApex(t, `
7569 apex {
7570 name: "myapex",
7571 key: "myapex.key",
7572 native_shared_libs: ["mylib"],
7573 updatable: true,
7574 min_sdk_version: "29"
7575 }
7576
7577 override_apex {
7578 name: "override_myapex",
7579 base: "myapex",
7580 logging_parent: "com.foo.bar",
7581 package_name: "test.overridden.package"
7582 }
7583
7584 apex_key {
7585 name: "myapex.key",
7586 public_key: "testkey.avbpubkey",
7587 private_key: "testkey.pem",
7588 }
7589
7590 cc_library {
7591 name: "mylib",
7592 srcs: ["mylib.cpp"],
7593 runtime_libs: ["libbar"],
7594 system_shared_libs: [],
7595 stl: "none",
7596 apex_available: [ "myapex" ],
7597 min_sdk_version: "apex_inherit"
7598 }
7599
7600 cc_library {
7601 name: "libbar",
7602 srcs: ["mylib.cpp"],
7603 system_shared_libs: [],
7604 stl: "none",
7605 apex_available: [ "myapex" ],
7606 min_sdk_version: "apex_inherit"
7607 }
7608
7609 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7610
Jooyung Hana0503a52023-08-23 13:12:50 +09007611 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007612 copyCmds := apexRule.Args["copy_commands"]
7613
7614 // Ensure that direct non-stubs dep is always included
7615 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7616
7617 // Ensure that runtime_libs dep in included
7618 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7619
7620 // Ensure libraries target overridden min_sdk_version value
7621 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7622}
7623
7624func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007625 t.Parallel()
Albert Martineefabcf2022-03-21 20:11:16 +00007626 // Attempt to override from 31 to 29, should be a NOOP
7627 minSdkOverride29 := "29"
7628 ctx := testApex(t, `
7629 apex {
7630 name: "myapex",
7631 key: "myapex.key",
7632 native_shared_libs: ["mylib"],
7633 updatable: true,
7634 min_sdk_version: "31"
7635 }
7636
7637 override_apex {
7638 name: "override_myapex",
7639 base: "myapex",
7640 logging_parent: "com.foo.bar",
7641 package_name: "test.overridden.package"
7642 }
7643
7644 apex_key {
7645 name: "myapex.key",
7646 public_key: "testkey.avbpubkey",
7647 private_key: "testkey.pem",
7648 }
7649
7650 cc_library {
7651 name: "mylib",
7652 srcs: ["mylib.cpp"],
7653 runtime_libs: ["libbar"],
7654 system_shared_libs: [],
7655 stl: "none",
7656 apex_available: [ "myapex" ],
7657 min_sdk_version: "apex_inherit"
7658 }
7659
7660 cc_library {
7661 name: "libbar",
7662 srcs: ["mylib.cpp"],
7663 system_shared_libs: [],
7664 stl: "none",
7665 apex_available: [ "myapex" ],
7666 min_sdk_version: "apex_inherit"
7667 }
7668
7669 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7670
Jooyung Hana0503a52023-08-23 13:12:50 +09007671 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007672 copyCmds := apexRule.Args["copy_commands"]
7673
7674 // Ensure that direct non-stubs dep is always included
7675 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7676
7677 // Ensure that runtime_libs dep in included
7678 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7679
7680 // Ensure libraries target the original min_sdk_version value rather than the overridden
7681 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7682}
7683
Jooyung Han214bf372019-11-12 13:03:50 +09007684func TestLegacyAndroid10Support(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007685 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007686 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007687 apex {
7688 name: "myapex",
7689 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007690 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007691 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007692 }
7693
7694 apex_key {
7695 name: "myapex.key",
7696 public_key: "testkey.avbpubkey",
7697 private_key: "testkey.pem",
7698 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007699
7700 cc_library {
7701 name: "mylib",
7702 srcs: ["mylib.cpp"],
7703 stl: "libc++",
7704 system_shared_libs: [],
7705 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007706 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007707 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007708 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007709
Jooyung Hana0503a52023-08-23 13:12:50 +09007710 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007711 args := module.Rule("apexRule").Args
7712 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007713
7714 // The copies of the libraries in the apex should have one more dependency than
7715 // the ones outside the apex, namely the unwinder. Ideally we should check
7716 // the dependency names directly here but for some reason the names are blank in
7717 // this test.
7718 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007719 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007720 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7721 if len(apexImplicits) != len(nonApexImplicits)+1 {
7722 t.Errorf("%q missing unwinder dep", lib)
7723 }
7724 }
Jooyung Han214bf372019-11-12 13:03:50 +09007725}
7726
Paul Duffine05480a2021-03-08 15:07:14 +00007727var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007728 "api/current.txt": nil,
7729 "api/removed.txt": nil,
7730 "api/system-current.txt": nil,
7731 "api/system-removed.txt": nil,
7732 "api/test-current.txt": nil,
7733 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007734
Anton Hanssondff2c782020-12-21 17:10:01 +00007735 "100/public/api/foo.txt": nil,
7736 "100/public/api/foo-removed.txt": nil,
7737 "100/system/api/foo.txt": nil,
7738 "100/system/api/foo-removed.txt": nil,
7739
Paul Duffineedc5d52020-06-12 17:46:39 +01007740 // For java_sdk_library_import
7741 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007742}
7743
Jooyung Han58f26ab2019-12-18 15:34:32 +09007744func TestJavaSDKLibrary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007745 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007746 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007747 apex {
7748 name: "myapex",
7749 key: "myapex.key",
7750 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007751 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007752 }
7753
7754 apex_key {
7755 name: "myapex.key",
7756 public_key: "testkey.avbpubkey",
7757 private_key: "testkey.pem",
7758 }
7759
7760 java_sdk_library {
7761 name: "foo",
7762 srcs: ["a.java"],
7763 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007764 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007765 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007766
7767 prebuilt_apis {
7768 name: "sdk",
7769 api_dirs: ["100"],
7770 }
Paul Duffin9b879592020-05-26 13:21:35 +01007771 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007772
7773 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007774 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007775 "javalib/foo.jar",
7776 "etc/permissions/foo.xml",
7777 })
7778 // Permission XML should point to the activated path of impl jar of java_sdk_library
Paul Duffin1816cde2024-04-10 10:58:21 +01007779 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Output("foo.xml")
7780 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7781 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
Jooyung Han58f26ab2019-12-18 15:34:32 +09007782}
7783
Spandan Das3ee19692024-06-19 04:47:40 +00007784func TestJavaSDKLibraryOverrideApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007785 t.Parallel()
Spandan Das3ee19692024-06-19 04:47:40 +00007786 ctx := testApex(t, `
7787 override_apex {
7788 name: "mycompanyapex",
7789 base: "myapex",
7790 }
7791 apex {
7792 name: "myapex",
7793 key: "myapex.key",
7794 java_libs: ["foo"],
7795 updatable: false,
7796 }
7797
7798 apex_key {
7799 name: "myapex.key",
7800 public_key: "testkey.avbpubkey",
7801 private_key: "testkey.pem",
7802 }
7803
7804 java_sdk_library {
7805 name: "foo",
7806 srcs: ["a.java"],
7807 api_packages: ["foo"],
7808 apex_available: [ "myapex" ],
7809 }
7810
7811 prebuilt_apis {
7812 name: "sdk",
7813 api_dirs: ["100"],
7814 }
7815 `, withFiles(filesForSdkLibrary))
7816
7817 // Permission XML should point to the activated path of impl jar of java_sdk_library.
7818 // Since override variants (com.mycompany.android.foo) are installed in the same package as the overridden variant
7819 // (com.android.foo), the filepath should not contain override apex name.
7820 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_mycompanyapex").Output("foo.xml")
7821 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7822 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
7823}
7824
Paul Duffin9b879592020-05-26 13:21:35 +01007825func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007826 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007827 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007828 apex {
7829 name: "myapex",
7830 key: "myapex.key",
7831 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007832 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007833 }
7834
7835 apex_key {
7836 name: "myapex.key",
7837 public_key: "testkey.avbpubkey",
7838 private_key: "testkey.pem",
7839 }
7840
7841 java_sdk_library {
7842 name: "foo",
7843 srcs: ["a.java"],
7844 api_packages: ["foo"],
7845 apex_available: ["myapex"],
7846 sdk_version: "none",
7847 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007848 compile_dex: true,
Paul Duffin9b879592020-05-26 13:21:35 +01007849 }
7850
7851 java_library {
7852 name: "bar",
7853 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007854 libs: ["foo.impl"],
Paul Duffin9b879592020-05-26 13:21:35 +01007855 apex_available: ["myapex"],
7856 sdk_version: "none",
7857 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007858 compile_dex: true,
Paul Duffin9b879592020-05-26 13:21:35 +01007859 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007860
7861 prebuilt_apis {
7862 name: "sdk",
7863 api_dirs: ["100"],
7864 }
Paul Duffin9b879592020-05-26 13:21:35 +01007865 `, withFiles(filesForSdkLibrary))
7866
7867 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007868 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007869 "javalib/bar.jar",
7870 "javalib/foo.jar",
7871 "etc/permissions/foo.xml",
7872 })
7873
7874 // The bar library should depend on the implementation jar.
7875 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007876 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007877 t.Errorf("expected %q, found %#q", expected, actual)
7878 }
7879}
7880
7881func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007882 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007883 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007884 apex {
7885 name: "myapex",
7886 key: "myapex.key",
7887 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007888 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007889 }
7890
7891 apex_key {
7892 name: "myapex.key",
7893 public_key: "testkey.avbpubkey",
7894 private_key: "testkey.pem",
7895 }
7896
7897 java_sdk_library {
7898 name: "foo",
7899 srcs: ["a.java"],
7900 api_packages: ["foo"],
7901 apex_available: ["myapex"],
7902 sdk_version: "none",
7903 system_modules: "none",
7904 }
7905
7906 java_library {
7907 name: "bar",
7908 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007909 libs: ["foo.stubs"],
Paul Duffin9b879592020-05-26 13:21:35 +01007910 sdk_version: "none",
7911 system_modules: "none",
7912 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007913
7914 prebuilt_apis {
7915 name: "sdk",
7916 api_dirs: ["100"],
7917 }
Paul Duffin9b879592020-05-26 13:21:35 +01007918 `, withFiles(filesForSdkLibrary))
7919
7920 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007921 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007922 "javalib/foo.jar",
7923 "etc/permissions/foo.xml",
7924 })
7925
7926 // The bar library should depend on the stubs jar.
7927 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007928 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007929 t.Errorf("expected %q, found %#q", expected, actual)
7930 }
7931}
7932
Paul Duffineedc5d52020-06-12 17:46:39 +01007933func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007934 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007935 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007936 prebuilt_apis {
7937 name: "sdk",
7938 api_dirs: ["100"],
7939 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007940 withFiles(map[string][]byte{
7941 "apex/a.java": nil,
7942 "apex/apex_manifest.json": nil,
7943 "apex/Android.bp": []byte(`
7944 package {
7945 default_visibility: ["//visibility:private"],
7946 }
7947
7948 apex {
7949 name: "myapex",
7950 key: "myapex.key",
7951 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007952 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007953 }
7954
7955 apex_key {
7956 name: "myapex.key",
7957 public_key: "testkey.avbpubkey",
7958 private_key: "testkey.pem",
7959 }
7960
7961 java_library {
7962 name: "bar",
7963 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007964 libs: ["foo.impl"],
Paul Duffineedc5d52020-06-12 17:46:39 +01007965 apex_available: ["myapex"],
7966 sdk_version: "none",
7967 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007968 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01007969 }
7970`),
7971 "source/a.java": nil,
7972 "source/api/current.txt": nil,
7973 "source/api/removed.txt": nil,
7974 "source/Android.bp": []byte(`
7975 package {
7976 default_visibility: ["//visibility:private"],
7977 }
7978
7979 java_sdk_library {
7980 name: "foo",
7981 visibility: ["//apex"],
7982 srcs: ["a.java"],
7983 api_packages: ["foo"],
7984 apex_available: ["myapex"],
7985 sdk_version: "none",
7986 system_modules: "none",
7987 public: {
7988 enabled: true,
7989 },
Colin Crosse4f34882024-11-14 12:26:00 -08007990 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01007991 }
7992`),
7993 "prebuilt/a.jar": nil,
7994 "prebuilt/Android.bp": []byte(`
7995 package {
7996 default_visibility: ["//visibility:private"],
7997 }
7998
7999 java_sdk_library_import {
8000 name: "foo",
8001 visibility: ["//apex", "//source"],
8002 apex_available: ["myapex"],
8003 prefer: true,
8004 public: {
8005 jars: ["a.jar"],
8006 },
Colin Crosse4f34882024-11-14 12:26:00 -08008007 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01008008 }
8009`),
Anton Hanssondff2c782020-12-21 17:10:01 +00008010 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01008011 )
8012
8013 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09008014 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01008015 "javalib/bar.jar",
8016 "javalib/foo.jar",
8017 "etc/permissions/foo.xml",
8018 })
8019
8020 // The bar library should depend on the implementation jar.
8021 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00008022 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01008023 t.Errorf("expected %q, found %#q", expected, actual)
8024 }
8025}
8026
8027func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008028 t.Parallel()
Paul Duffineedc5d52020-06-12 17:46:39 +01008029 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
8030 apex {
8031 name: "myapex",
8032 key: "myapex.key",
8033 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008034 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01008035 }
8036
8037 apex_key {
8038 name: "myapex.key",
8039 public_key: "testkey.avbpubkey",
8040 private_key: "testkey.pem",
8041 }
8042
8043 java_sdk_library_import {
8044 name: "foo",
8045 apex_available: ["myapex"],
8046 prefer: true,
8047 public: {
8048 jars: ["a.jar"],
8049 },
8050 }
8051
8052 `, withFiles(filesForSdkLibrary))
8053}
8054
atrost6e126252020-01-27 17:01:16 +00008055func TestCompatConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008056 t.Parallel()
Paul Duffin284165a2021-03-29 01:50:31 +01008057 result := android.GroupFixturePreparers(
8058 prepareForApexTest,
8059 java.PrepareForTestWithPlatformCompatConfig,
8060 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00008061 apex {
8062 name: "myapex",
8063 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00008064 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00008065 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008066 updatable: false,
atrost6e126252020-01-27 17:01:16 +00008067 }
8068
8069 apex_key {
8070 name: "myapex.key",
8071 public_key: "testkey.avbpubkey",
8072 private_key: "testkey.pem",
8073 }
8074
8075 platform_compat_config {
8076 name: "myjar-platform-compat-config",
8077 src: ":myjar",
8078 }
8079
8080 java_library {
8081 name: "myjar",
8082 srcs: ["foo/bar/MyClass.java"],
8083 sdk_version: "none",
8084 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00008085 apex_available: [ "myapex" ],
Colin Crosse4f34882024-11-14 12:26:00 -08008086 compile_dex: true,
atrost6e126252020-01-27 17:01:16 +00008087 }
Paul Duffin1b29e002021-03-16 15:06:54 +00008088
8089 // Make sure that a preferred prebuilt does not affect the apex contents.
8090 prebuilt_platform_compat_config {
8091 name: "myjar-platform-compat-config",
8092 metadata: "compat-config/metadata.xml",
8093 prefer: true,
8094 }
atrost6e126252020-01-27 17:01:16 +00008095 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00008096 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09008097 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00008098 "etc/compatconfig/myjar-platform-compat-config.xml",
8099 "javalib/myjar.jar",
8100 })
8101}
8102
Jooyung Han862c0d62022-12-21 10:15:37 +09008103func TestNoDupeApexFiles(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008104 t.Parallel()
Jooyung Han862c0d62022-12-21 10:15:37 +09008105 android.GroupFixturePreparers(
8106 android.PrepareForTestWithAndroidBuildComponents,
8107 PrepareForTestWithApexBuildComponents,
8108 prepareForTestWithMyapex,
8109 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
8110 ).
8111 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
8112 RunTestWithBp(t, `
8113 apex {
8114 name: "myapex",
8115 key: "myapex.key",
8116 prebuilts: ["foo", "bar"],
8117 updatable: false,
8118 }
8119
8120 apex_key {
8121 name: "myapex.key",
8122 public_key: "testkey.avbpubkey",
8123 private_key: "testkey.pem",
8124 }
8125
8126 prebuilt_etc {
8127 name: "foo",
8128 src: "myprebuilt",
8129 filename_from_src: true,
8130 }
8131
8132 prebuilt_etc {
8133 name: "bar",
8134 src: "myprebuilt",
8135 filename_from_src: true,
8136 }
8137 `)
8138}
8139
Jooyung Hana8bd72a2023-11-02 11:56:48 +09008140func TestApexUnwantedTransitiveDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008141 t.Parallel()
Jooyung Hana8bd72a2023-11-02 11:56:48 +09008142 bp := `
8143 apex {
8144 name: "myapex",
8145 key: "myapex.key",
8146 native_shared_libs: ["libfoo"],
8147 updatable: false,
8148 unwanted_transitive_deps: ["libbar"],
8149 }
8150
8151 apex_key {
8152 name: "myapex.key",
8153 public_key: "testkey.avbpubkey",
8154 private_key: "testkey.pem",
8155 }
8156
8157 cc_library {
8158 name: "libfoo",
8159 srcs: ["foo.cpp"],
8160 shared_libs: ["libbar"],
8161 apex_available: ["myapex"],
8162 }
8163
8164 cc_library {
8165 name: "libbar",
8166 srcs: ["bar.cpp"],
8167 apex_available: ["myapex"],
8168 }`
8169 ctx := testApex(t, bp)
8170 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
8171 "*/libc++.so",
8172 "*/libfoo.so",
8173 // not libbar.so
8174 })
8175}
8176
Jiyong Park479321d2019-12-16 11:47:12 +09008177func TestRejectNonInstallableJavaLibrary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008178 t.Parallel()
Jiyong Park479321d2019-12-16 11:47:12 +09008179 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
8180 apex {
8181 name: "myapex",
8182 key: "myapex.key",
8183 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008184 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09008185 }
8186
8187 apex_key {
8188 name: "myapex.key",
8189 public_key: "testkey.avbpubkey",
8190 private_key: "testkey.pem",
8191 }
8192
8193 java_library {
8194 name: "myjar",
8195 srcs: ["foo/bar/MyClass.java"],
8196 sdk_version: "none",
8197 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09008198 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09008199 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09008200 }
8201 `)
8202}
8203
Jiyong Park7cd10e32020-01-14 09:22:18 +09008204func TestSymlinksFromApexToSystem(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008205 t.Parallel()
Jiyong Park7cd10e32020-01-14 09:22:18 +09008206 bp := `
8207 apex {
8208 name: "myapex",
8209 key: "myapex.key",
8210 native_shared_libs: ["mylib"],
8211 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008212 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09008213 }
8214
Jiyong Park9d677202020-02-19 16:29:35 +09008215 apex {
8216 name: "myapex.updatable",
8217 key: "myapex.key",
8218 native_shared_libs: ["mylib"],
8219 java_libs: ["myjar"],
8220 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00008221 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09008222 }
8223
Jiyong Park7cd10e32020-01-14 09:22:18 +09008224 apex_key {
8225 name: "myapex.key",
8226 public_key: "testkey.avbpubkey",
8227 private_key: "testkey.pem",
8228 }
8229
8230 cc_library {
8231 name: "mylib",
8232 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09008233 shared_libs: [
8234 "myotherlib",
8235 "myotherlib_ext",
8236 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09008237 system_shared_libs: [],
8238 stl: "none",
8239 apex_available: [
8240 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008241 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008242 "//apex_available:platform",
8243 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008244 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008245 }
8246
8247 cc_library {
8248 name: "myotherlib",
8249 srcs: ["mylib.cpp"],
8250 system_shared_libs: [],
8251 stl: "none",
8252 apex_available: [
8253 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008254 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008255 "//apex_available:platform",
8256 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008257 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008258 }
8259
Jiyong Parkce243632023-02-17 18:22:25 +09008260 cc_library {
8261 name: "myotherlib_ext",
8262 srcs: ["mylib.cpp"],
8263 system_shared_libs: [],
8264 system_ext_specific: true,
8265 stl: "none",
8266 apex_available: [
8267 "myapex",
8268 "myapex.updatable",
8269 "//apex_available:platform",
8270 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008271 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09008272 }
8273
Jiyong Park7cd10e32020-01-14 09:22:18 +09008274 java_library {
8275 name: "myjar",
8276 srcs: ["foo/bar/MyClass.java"],
8277 sdk_version: "none",
8278 system_modules: "none",
Jihoon Kang85bc1932024-07-01 17:04:46 +00008279 static_libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09008280 apex_available: [
8281 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008282 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008283 "//apex_available:platform",
8284 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008285 min_sdk_version: "33",
Colin Crosse4f34882024-11-14 12:26:00 -08008286 compile_dex: true,
Jiyong Park7cd10e32020-01-14 09:22:18 +09008287 }
8288
8289 java_library {
8290 name: "myotherjar",
8291 srcs: ["foo/bar/MyClass.java"],
8292 sdk_version: "none",
8293 system_modules: "none",
8294 apex_available: [
8295 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008296 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008297 "//apex_available:platform",
8298 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008299 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008300 }
8301 `
8302
8303 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
8304 for _, f := range files {
8305 if f.path == file {
8306 if f.isLink {
8307 t.Errorf("%q is not a real file", file)
8308 }
8309 return
8310 }
8311 }
8312 t.Errorf("%q is not found", file)
8313 }
8314
Jiyong Parkce243632023-02-17 18:22:25 +09008315 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09008316 for _, f := range files {
8317 if f.path == file {
8318 if !f.isLink {
8319 t.Errorf("%q is not a symlink", file)
8320 }
Jiyong Parkce243632023-02-17 18:22:25 +09008321 if f.src != target {
8322 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
8323 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09008324 return
8325 }
8326 }
8327 t.Errorf("%q is not found", file)
8328 }
8329
Jiyong Park9d677202020-02-19 16:29:35 +09008330 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
8331 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08008332 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09008333 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008334 ensureRealfileExists(t, files, "javalib/myjar.jar")
8335 ensureRealfileExists(t, files, "lib64/mylib.so")
8336 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008337 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008338
Jooyung Hana0503a52023-08-23 13:12:50 +09008339 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008340 ensureRealfileExists(t, files, "javalib/myjar.jar")
8341 ensureRealfileExists(t, files, "lib64/mylib.so")
8342 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008343 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09008344
8345 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08008346 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09008347 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008348 ensureRealfileExists(t, files, "javalib/myjar.jar")
8349 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008350 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
8351 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09008352
Jooyung Hana0503a52023-08-23 13:12:50 +09008353 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008354 ensureRealfileExists(t, files, "javalib/myjar.jar")
8355 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008356 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
8357 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09008358}
8359
Yo Chiange8128052020-07-23 20:09:18 +08008360func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008361 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008362 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08008363 apex {
8364 name: "myapex",
8365 key: "myapex.key",
8366 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008367 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08008368 }
8369
8370 apex_key {
8371 name: "myapex.key",
8372 public_key: "testkey.avbpubkey",
8373 private_key: "testkey.pem",
8374 }
8375
8376 cc_library_shared {
8377 name: "mylib",
8378 srcs: ["mylib.cpp"],
8379 shared_libs: ["myotherlib"],
8380 system_shared_libs: [],
8381 stl: "none",
8382 apex_available: [
8383 "myapex",
8384 "//apex_available:platform",
8385 ],
8386 }
8387
8388 cc_prebuilt_library_shared {
8389 name: "myotherlib",
8390 srcs: ["prebuilt.so"],
8391 system_shared_libs: [],
8392 stl: "none",
8393 apex_available: [
8394 "myapex",
8395 "//apex_available:platform",
8396 ],
8397 }
8398 `)
8399
Jooyung Hana0503a52023-08-23 13:12:50 +09008400 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008401 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08008402 var builder strings.Builder
8403 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8404 androidMk := builder.String()
8405 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008406 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08008407 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
8408 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
8409 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008410 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08008411}
8412
Jooyung Han643adc42020-02-27 13:50:06 +09008413func TestApexWithJniLibs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008414 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008415 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09008416 apex {
8417 name: "myapex",
8418 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008419 binaries: ["mybin"],
8420 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008421 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09008422 }
8423
8424 apex_key {
8425 name: "myapex.key",
8426 public_key: "testkey.avbpubkey",
8427 private_key: "testkey.pem",
8428 }
8429
8430 cc_library {
8431 name: "mylib",
8432 srcs: ["mylib.cpp"],
8433 shared_libs: ["mylib2"],
8434 system_shared_libs: [],
8435 stl: "none",
8436 apex_available: [ "myapex" ],
8437 }
8438
8439 cc_library {
8440 name: "mylib2",
8441 srcs: ["mylib.cpp"],
8442 system_shared_libs: [],
8443 stl: "none",
8444 apex_available: [ "myapex" ],
8445 }
Jiyong Park34d5c332022-02-24 18:02:44 +09008446
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008447 // Used as both a JNI library and a regular shared library.
8448 cc_library {
8449 name: "mylib3",
8450 srcs: ["mylib.cpp"],
8451 system_shared_libs: [],
8452 stl: "none",
8453 apex_available: [ "myapex" ],
8454 }
8455
8456 cc_binary {
8457 name: "mybin",
8458 srcs: ["mybin.cpp"],
8459 shared_libs: ["mylib3"],
8460 system_shared_libs: [],
8461 stl: "none",
8462 apex_available: [ "myapex" ],
8463 }
8464
Jiyong Park34d5c332022-02-24 18:02:44 +09008465 rust_ffi_shared {
8466 name: "libfoo.rust",
8467 crate_name: "foo",
8468 srcs: ["foo.rs"],
8469 shared_libs: ["libfoo.shared_from_rust"],
8470 prefer_rlib: true,
8471 apex_available: ["myapex"],
8472 }
8473
8474 cc_library_shared {
8475 name: "libfoo.shared_from_rust",
8476 srcs: ["mylib.cpp"],
8477 system_shared_libs: [],
8478 stl: "none",
8479 stubs: {
8480 versions: ["10", "11", "12"],
8481 },
8482 }
8483
Jooyung Han643adc42020-02-27 13:50:06 +09008484 `)
8485
Jooyung Hana0503a52023-08-23 13:12:50 +09008486 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09008487 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008488 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09008489 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008490 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09008491 "lib64/mylib.so",
8492 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008493 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09008494 "lib64/libfoo.rust.so",
Jooyung Han643adc42020-02-27 13:50:06 +09008495 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008496
8497 // b/220397949
8498 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008499}
8500
Jooyung Han49f67012020-04-17 13:43:10 +09008501func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008502 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008503 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008504 apex {
8505 name: "myapex",
8506 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008507 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008508 }
8509 apex_key {
8510 name: "myapex.key",
8511 public_key: "testkey.avbpubkey",
8512 private_key: "testkey.pem",
8513 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008514 `,
8515 android.FixtureModifyConfig(func(config android.Config) {
8516 delete(config.Targets, android.Android)
8517 config.AndroidCommonTarget = android.Target{}
8518 }),
8519 )
Jooyung Han49f67012020-04-17 13:43:10 +09008520
8521 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8522 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8523 }
8524}
8525
Jiyong Parkbd159612020-02-28 15:22:21 +09008526func TestAppBundle(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008527 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008528 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008529 apex {
8530 name: "myapex",
8531 key: "myapex.key",
8532 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008533 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008534 }
8535
8536 apex_key {
8537 name: "myapex.key",
8538 public_key: "testkey.avbpubkey",
8539 private_key: "testkey.pem",
8540 }
8541
8542 android_app {
8543 name: "AppFoo",
8544 srcs: ["foo/bar/MyClass.java"],
8545 sdk_version: "none",
8546 system_modules: "none",
8547 apex_available: [ "myapex" ],
8548 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008549 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008550
Jooyung Hana0503a52023-08-23 13:12:50 +09008551 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008552 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Jiyong Parkbd159612020-02-28 15:22:21 +09008553
8554 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008555 ensureContains(t, content, `"apex_config":{"apex_embedded_apk_config":[{"package_name":"com.android.foo","path":"app/AppFoo@TEST.BUILD_ID/AppFoo.apk"}]}`)
Jiyong Parkbd159612020-02-28 15:22:21 +09008556}
8557
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008558func TestAppSetBundle(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008559 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008560 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008561 apex {
8562 name: "myapex",
8563 key: "myapex.key",
8564 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008565 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008566 }
8567
8568 apex_key {
8569 name: "myapex.key",
8570 public_key: "testkey.avbpubkey",
8571 private_key: "testkey.pem",
8572 }
8573
8574 android_app_set {
8575 name: "AppSet",
8576 set: "AppSet.apks",
8577 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09008578 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08008579 bundleConfigRule := mod.Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008580 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008581 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8582 s := mod.Rule("apexRule").Args["copy_commands"]
8583 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008584 if len(copyCmds) != 4 {
8585 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008586 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008587 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8588 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008589 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8590 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008591
8592 // Ensure that canned_fs_config has an entry for the app set zip file
8593 generateFsRule := mod.Rule("generateFsConfig")
8594 cmd := generateFsRule.RuleParams.Command
8595 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008596}
8597
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008598func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008599 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008600 apex_set {
8601 name: "myapex",
8602 filename: "foo_v2.apex",
8603 sanitized: {
8604 none: { set: "myapex.apks", },
8605 hwaddress: { set: "myapex.hwasan.apks", },
8606 },
Paul Duffin24704672021-04-06 16:09:30 +01008607 }
8608 `
8609 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008610
Paul Duffin24704672021-04-06 16:09:30 +01008611 // Check that the extractor produces the correct output file from the correct input file.
Spandan Das9d6e2092024-09-21 02:50:00 +00008612 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008613
Spandan Das9d6e2092024-09-21 02:50:00 +00008614 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin24704672021-04-06 16:09:30 +01008615 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008616
Paul Duffin24704672021-04-06 16:09:30 +01008617 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8618
8619 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008620 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8621 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008622
8623 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008624}
8625
Pranav Guptaeba03b02022-09-27 00:27:08 +00008626func TestApexSetApksModuleAssignment(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008627 t.Parallel()
Pranav Guptaeba03b02022-09-27 00:27:08 +00008628 ctx := testApex(t, `
8629 apex_set {
8630 name: "myapex",
8631 set: ":myapex_apks_file",
8632 }
8633
8634 filegroup {
8635 name: "myapex_apks_file",
8636 srcs: ["myapex.apks"],
8637 }
8638 `)
8639
Spandan Das9d6e2092024-09-21 02:50:00 +00008640 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Pranav Guptaeba03b02022-09-27 00:27:08 +00008641
8642 // Check that the extractor produces the correct apks file from the input module
Spandan Das9d6e2092024-09-21 02:50:00 +00008643 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.apks"
Pranav Guptaeba03b02022-09-27 00:27:08 +00008644 extractedApex := m.Output(extractorOutput)
8645
8646 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8647}
8648
Paul Duffin89f570a2021-06-16 01:42:33 +01008649func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008650 t.Helper()
8651
Paul Duffin55607122021-03-30 23:32:51 +01008652 fs := android.MockFS{
8653 "a.java": nil,
8654 "a.jar": nil,
8655 "apex_manifest.json": nil,
8656 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008657 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008658 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8659 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8660 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008661 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008662 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008663
Paul Duffin55607122021-03-30 23:32:51 +01008664 errorHandler := android.FixtureExpectsNoErrors
8665 if errmsg != "" {
8666 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008667 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008668
Paul Duffin55607122021-03-30 23:32:51 +01008669 result := android.GroupFixturePreparers(
8670 cc.PrepareForTestWithCcDefaultModules,
8671 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008672 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008673 java.PrepareForTestWithJavaSdkLibraryFiles,
8674 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008675 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008676 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008677 android.FixtureModifyMockFS(func(fs android.MockFS) {
8678 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8679 insert := ""
8680 for _, fragment := range fragments {
8681 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8682 }
8683 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8684 platform_bootclasspath {
8685 name: "platform-bootclasspath",
8686 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008687 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008688 %s
8689 ],
8690 }
8691 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008692 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008693 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008694 // Dexpreopt for boot jars requires the ART boot image profile.
8695 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8696 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008697 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008698 ).
8699 ExtendWithErrorHandler(errorHandler).
8700 RunTestWithBp(t, bp)
8701
8702 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008703}
8704
Jooyung Han548640b2020-04-27 12:10:30 +09008705func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008706 t.Parallel()
Jooyung Han548640b2020-04-27 12:10:30 +09008707 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8708 apex {
8709 name: "myapex",
8710 key: "myapex.key",
8711 updatable: true,
8712 }
8713
8714 apex_key {
8715 name: "myapex.key",
8716 public_key: "testkey.avbpubkey",
8717 private_key: "testkey.pem",
8718 }
8719 `)
8720}
8721
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008722func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008723 t.Parallel()
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008724 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8725 apex {
8726 name: "myapex",
8727 key: "myapex.key",
8728 }
8729
8730 apex_key {
8731 name: "myapex.key",
8732 public_key: "testkey.avbpubkey",
8733 private_key: "testkey.pem",
8734 }
8735 `)
8736}
8737
satayevb98371c2021-06-15 16:49:50 +01008738func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008739 t.Parallel()
satayevb98371c2021-06-15 16:49:50 +01008740 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8741 apex {
8742 name: "myapex",
8743 key: "myapex.key",
8744 systemserverclasspath_fragments: [
8745 "mysystemserverclasspathfragment",
8746 ],
8747 min_sdk_version: "29",
8748 updatable: true,
8749 }
8750
8751 apex_key {
8752 name: "myapex.key",
8753 public_key: "testkey.avbpubkey",
8754 private_key: "testkey.pem",
8755 }
8756
8757 java_library {
8758 name: "foo",
8759 srcs: ["b.java"],
8760 min_sdk_version: "29",
8761 installable: true,
8762 apex_available: [
8763 "myapex",
8764 ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00008765 sdk_version: "current",
satayevb98371c2021-06-15 16:49:50 +01008766 }
8767
8768 systemserverclasspath_fragment {
8769 name: "mysystemserverclasspathfragment",
8770 generate_classpaths_proto: false,
8771 contents: [
8772 "foo",
8773 ],
8774 apex_available: [
8775 "myapex",
8776 ],
8777 }
satayevabcd5972021-08-06 17:49:46 +01008778 `,
8779 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8780 )
satayevb98371c2021-06-15 16:49:50 +01008781}
8782
Paul Duffin064b70c2020-11-02 17:32:38 +00008783func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008784 t.Parallel()
satayevabcd5972021-08-06 17:49:46 +01008785 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008786 t.Run("prebuilt no source", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008787 t.Parallel()
Paul Duffin89f570a2021-06-16 01:42:33 +01008788 fragment := java.ApexVariantReference{
8789 Apex: proptools.StringPtr("myapex"),
8790 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8791 }
8792
Paul Duffin064b70c2020-11-02 17:32:38 +00008793 testDexpreoptWithApexes(t, `
8794 prebuilt_apex {
8795 name: "myapex" ,
8796 arch: {
8797 arm64: {
8798 src: "myapex-arm64.apex",
8799 },
8800 arm: {
8801 src: "myapex-arm.apex",
8802 },
8803 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008804 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8805 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008806
Paul Duffin89f570a2021-06-16 01:42:33 +01008807 prebuilt_bootclasspath_fragment {
8808 name: "my-bootclasspath-fragment",
8809 contents: ["libfoo"],
8810 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008811 hidden_api: {
8812 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8813 metadata: "my-bootclasspath-fragment/metadata.csv",
8814 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008815 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8816 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8817 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008818 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008819 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008820
Spandan Das52c01a12024-09-20 01:09:48 +00008821 java_sdk_library_import {
8822 name: "libfoo",
8823 prefer: true,
8824 public: {
Paul Duffin89f570a2021-06-16 01:42:33 +01008825 jars: ["libfoo.jar"],
Spandan Das52c01a12024-09-20 01:09:48 +00008826 },
8827 apex_available: ["myapex"],
8828 shared_library: false,
8829 permitted_packages: ["libfoo"],
8830 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008831 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008832 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008833}
8834
Spandan Dasf14e2542021-11-12 00:01:37 +00008835func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008836 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008837 bp += `
8838 apex_key {
8839 name: "myapex.key",
8840 public_key: "testkey.avbpubkey",
8841 private_key: "testkey.pem",
8842 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008843 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008844 "lib1/src/A.java": nil,
8845 "lib2/src/B.java": nil,
8846 "system/sepolicy/apex/myapex-file_contexts": nil,
8847 }
8848
Paul Duffin45338f02021-03-30 23:07:52 +01008849 errorHandler := android.FixtureExpectsNoErrors
8850 if errmsg != "" {
8851 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008852 }
Colin Crossae8600b2020-10-29 17:09:13 -07008853
Paul Duffin45338f02021-03-30 23:07:52 +01008854 android.GroupFixturePreparers(
8855 android.PrepareForTestWithAndroidBuildComponents,
8856 java.PrepareForTestWithJavaBuildComponents,
8857 PrepareForTestWithApexBuildComponents,
8858 android.PrepareForTestWithNeverallowRules(rules),
8859 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008860 apexBootJars := make([]string, 0, len(bootJars))
8861 for _, apexBootJar := range bootJars {
8862 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008863 }
satayevd604b212021-07-21 14:23:52 +01008864 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008865 }),
8866 fs.AddToFixture(),
8867 ).
8868 ExtendWithErrorHandler(errorHandler).
8869 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008870}
8871
8872func TestApexPermittedPackagesRules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008873 t.Parallel()
Andrei Onea115e7e72020-06-05 21:14:03 +01008874 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008875 name string
8876 expectedError string
8877 bp string
8878 bootJars []string
8879 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008880 }{
8881
8882 {
8883 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8884 expectedError: "",
8885 bp: `
8886 java_library {
8887 name: "bcp_lib1",
8888 srcs: ["lib1/src/*.java"],
8889 permitted_packages: ["foo.bar"],
8890 apex_available: ["myapex"],
8891 sdk_version: "none",
8892 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008893 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008894 }
8895 java_library {
8896 name: "nonbcp_lib2",
8897 srcs: ["lib2/src/*.java"],
8898 apex_available: ["myapex"],
8899 permitted_packages: ["a.b"],
8900 sdk_version: "none",
8901 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008902 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008903 }
8904 apex {
8905 name: "myapex",
8906 key: "myapex.key",
8907 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008908 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008909 }`,
8910 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008911 bcpPermittedPackages: map[string][]string{
8912 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008913 "foo.bar",
8914 },
8915 },
8916 },
8917 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008918 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008919 expectedError: `(?s)module "bcp_lib2" .* which is restricted because bcp_lib2 bootjar may only use these package prefixes: foo.bar. Please consider the following alternatives:\n 1. If the offending code is from a statically linked library, consider removing that dependency and using an alternative already in the bootclasspath, or perhaps a shared library. 2. Move the offending code into an allowed package.\n 3. Jarjar the offending code. Please be mindful of the potential system health implications of bundling that code, particularly if the offending jar is part of the bootclasspath.`,
Andrei Onea115e7e72020-06-05 21:14:03 +01008920 bp: `
8921 java_library {
8922 name: "bcp_lib1",
8923 srcs: ["lib1/src/*.java"],
8924 apex_available: ["myapex"],
8925 permitted_packages: ["foo.bar"],
8926 sdk_version: "none",
8927 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008928 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008929 }
8930 java_library {
8931 name: "bcp_lib2",
8932 srcs: ["lib2/src/*.java"],
8933 apex_available: ["myapex"],
8934 permitted_packages: ["foo.bar", "bar.baz"],
8935 sdk_version: "none",
8936 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008937 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008938 }
8939 apex {
8940 name: "myapex",
8941 key: "myapex.key",
8942 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008943 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008944 }
8945 `,
8946 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008947 bcpPermittedPackages: map[string][]string{
8948 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008949 "foo.bar",
8950 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008951 "bcp_lib2": []string{
8952 "foo.bar",
8953 },
8954 },
8955 },
8956 {
8957 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8958 expectedError: "",
8959 bp: `
8960 java_library {
8961 name: "bcp_lib_restricted",
8962 srcs: ["lib1/src/*.java"],
8963 apex_available: ["myapex"],
8964 permitted_packages: ["foo.bar"],
8965 sdk_version: "none",
8966 min_sdk_version: "29",
8967 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008968 compile_dex: true,
Spandan Dasf14e2542021-11-12 00:01:37 +00008969 }
8970 java_library {
8971 name: "bcp_lib_unrestricted",
8972 srcs: ["lib2/src/*.java"],
8973 apex_available: ["myapex"],
8974 permitted_packages: ["foo.bar", "bar.baz"],
8975 sdk_version: "none",
8976 min_sdk_version: "29",
8977 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008978 compile_dex: true,
Spandan Dasf14e2542021-11-12 00:01:37 +00008979 }
8980 apex {
8981 name: "myapex",
8982 key: "myapex.key",
8983 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8984 updatable: true,
8985 min_sdk_version: "29",
8986 }
8987 `,
8988 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8989 bcpPermittedPackages: map[string][]string{
8990 "bcp_lib1_non_updateable": []string{
8991 "foo.bar",
8992 },
8993 // bcp_lib2_updateable has no entry here since updateable bcp can contain new packages - tracking via an allowlist is not necessary
Andrei Onea115e7e72020-06-05 21:14:03 +01008994 },
8995 },
8996 }
8997 for _, tc := range testcases {
8998 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008999 t.Parallel()
Spandan Dasf14e2542021-11-12 00:01:37 +00009000 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
9001 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01009002 })
9003 }
9004}
9005
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009006// TODO(jungjw): Move this to proptools
9007func intPtr(i int) *int {
9008 return &i
9009}
9010
9011func TestApexSet(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009012 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009013 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009014 apex_set {
9015 name: "myapex",
9016 set: "myapex.apks",
9017 filename: "foo_v2.apex",
9018 overrides: ["foo"],
9019 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009020 `,
9021 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9022 variables.Platform_sdk_version = intPtr(30)
9023 }),
9024 android.FixtureModifyConfig(func(config android.Config) {
9025 config.Targets[android.Android] = []android.Target{
9026 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
9027 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
9028 }
9029 }),
9030 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009031
Spandan Das9d6e2092024-09-21 02:50:00 +00009032 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009033
9034 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01009035 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009036 actual := extractedApex.Args["abis"]
9037 expected := "ARMEABI_V7A,ARM64_V8A"
9038 if actual != expected {
9039 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9040 }
9041 actual = extractedApex.Args["sdk-version"]
9042 expected = "30"
9043 if actual != expected {
9044 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9045 }
9046
Paul Duffin6717d882021-06-15 19:09:41 +01009047 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009048 a := m.Module().(*ApexSet)
9049 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07009050 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009051 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
9052 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
9053 }
9054}
9055
Anton Hansson805e0a52022-11-25 14:06:46 +00009056func TestApexSet_NativeBridge(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009057 t.Parallel()
Anton Hansson805e0a52022-11-25 14:06:46 +00009058 ctx := testApex(t, `
9059 apex_set {
9060 name: "myapex",
9061 set: "myapex.apks",
9062 filename: "foo_v2.apex",
9063 overrides: ["foo"],
9064 }
9065 `,
9066 android.FixtureModifyConfig(func(config android.Config) {
9067 config.Targets[android.Android] = []android.Target{
9068 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
9069 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
9070 }
9071 }),
9072 )
9073
Spandan Das9d6e2092024-09-21 02:50:00 +00009074 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Anton Hansson805e0a52022-11-25 14:06:46 +00009075
9076 // Check extract_apks tool parameters. No native bridge arch expected
9077 extractedApex := m.Output("extracted/myapex.apks")
9078 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
9079}
9080
Jiyong Park7d95a512020-05-10 15:16:24 +09009081func TestNoStaticLinkingToStubsLib(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009082 t.Parallel()
Jiyong Park7d95a512020-05-10 15:16:24 +09009083 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
9084 apex {
9085 name: "myapex",
9086 key: "myapex.key",
9087 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009088 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09009089 }
9090
9091 apex_key {
9092 name: "myapex.key",
9093 public_key: "testkey.avbpubkey",
9094 private_key: "testkey.pem",
9095 }
9096
9097 cc_library {
9098 name: "mylib",
9099 srcs: ["mylib.cpp"],
9100 static_libs: ["otherlib"],
9101 system_shared_libs: [],
9102 stl: "none",
9103 apex_available: [ "myapex" ],
9104 }
9105
9106 cc_library {
9107 name: "otherlib",
9108 srcs: ["mylib.cpp"],
9109 system_shared_libs: [],
9110 stl: "none",
9111 stubs: {
9112 versions: ["1", "2", "3"],
9113 },
9114 apex_available: [ "myapex" ],
9115 }
9116 `)
9117}
9118
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009119func TestApexKeysTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009120 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009121 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009122 apex {
9123 name: "myapex",
9124 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009125 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09009126 custom_sign_tool: "sign_myapex",
9127 }
9128
9129 apex_key {
9130 name: "myapex.key",
9131 public_key: "testkey.avbpubkey",
9132 private_key: "testkey.pem",
9133 }
9134 `)
9135
Jooyung Han286957d2023-10-30 16:17:56 +09009136 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07009137 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009138 ensureContains(t, content, `name="myapex.apex" public_key="vendor/foo/devkeys/testkey.avbpubkey" private_key="vendor/foo/devkeys/testkey.pem" container_certificate="vendor/foo/devkeys/test.x509.pem" container_private_key="vendor/foo/devkeys/test.pk8" partition="system" sign_tool="sign_myapex"`)
Jooyung Han09c11ad2021-10-27 03:45:31 +09009139}
9140
9141func TestApexKeysTxtOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009142 t.Parallel()
Jooyung Han09c11ad2021-10-27 03:45:31 +09009143 ctx := testApex(t, `
9144 apex {
9145 name: "myapex",
9146 key: "myapex.key",
9147 updatable: false,
9148 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009149 }
9150
9151 apex_key {
9152 name: "myapex.key",
9153 public_key: "testkey.avbpubkey",
9154 private_key: "testkey.pem",
9155 }
9156
9157 prebuilt_apex {
9158 name: "myapex",
9159 prefer: true,
9160 arch: {
9161 arm64: {
9162 src: "myapex-arm64.apex",
9163 },
9164 arm: {
9165 src: "myapex-arm.apex",
9166 },
9167 },
9168 }
9169
9170 apex_set {
9171 name: "myapex_set",
9172 set: "myapex.apks",
9173 filename: "myapex_set.apex",
9174 overrides: ["myapex"],
9175 }
9176 `)
9177
Colin Crossf61d03d2023-11-02 16:56:39 -07009178 content := android.ContentFromFileRuleForTests(t, ctx,
9179 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09009180 ensureContains(t, content, `name="myapex.apex" public_key="vendor/foo/devkeys/testkey.avbpubkey" private_key="vendor/foo/devkeys/testkey.pem" container_certificate="vendor/foo/devkeys/test.x509.pem" container_private_key="vendor/foo/devkeys/test.pk8" partition="system" sign_tool="sign_myapex"`)
Colin Crossf61d03d2023-11-02 16:56:39 -07009181 content = android.ContentFromFileRuleForTests(t, ctx,
9182 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009183 ensureContains(t, content, `name="myapex_set.apex" public_key="PRESIGNED" private_key="PRESIGNED" container_certificate="PRESIGNED" container_private_key="PRESIGNED" partition="system"`)
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009184}
9185
Jooyung Han938b5932020-06-20 12:47:47 +09009186func TestAllowedFiles(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009187 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009188 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09009189 apex {
9190 name: "myapex",
9191 key: "myapex.key",
9192 apps: ["app"],
9193 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009194 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09009195 }
9196
9197 apex_key {
9198 name: "myapex.key",
9199 public_key: "testkey.avbpubkey",
9200 private_key: "testkey.pem",
9201 }
9202
9203 android_app {
9204 name: "app",
9205 srcs: ["foo/bar/MyClass.java"],
9206 package_name: "foo",
9207 sdk_version: "none",
9208 system_modules: "none",
9209 apex_available: [ "myapex" ],
9210 }
9211 `, withFiles(map[string][]byte{
9212 "sub/Android.bp": []byte(`
9213 override_apex {
9214 name: "override_myapex",
9215 base: "myapex",
9216 apps: ["override_app"],
9217 allowed_files: ":allowed",
9218 }
9219 // Overridable "path" property should be referenced indirectly
9220 filegroup {
9221 name: "allowed",
9222 srcs: ["allowed.txt"],
9223 }
9224 override_android_app {
9225 name: "override_app",
9226 base: "app",
9227 package_name: "bar",
9228 }
9229 `),
9230 }))
9231
Jooyung Hana0503a52023-08-23 13:12:50 +09009232 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009233 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
9234 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9235 }
9236
Spandan Das50801e22024-05-13 18:29:45 +00009237 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009238 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
9239 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9240 }
9241}
9242
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009243func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009244 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009245 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009246 apex {
9247 name: "myapex",
9248 key: "myapex.key",
9249 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009250 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009251 }
9252
9253 apex_key {
9254 name: "myapex.key",
9255 public_key: "testkey.avbpubkey",
9256 private_key: "testkey.pem",
9257 }
9258
9259 cc_library {
9260 name: "mylib",
9261 srcs: ["mylib.cpp"],
9262 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009263 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009264 },
9265 apex_available: ["myapex"],
9266 }
9267
9268 cc_prebuilt_library_shared {
9269 name: "mylib",
9270 prefer: false,
9271 srcs: ["prebuilt.so"],
9272 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009273 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009274 },
9275 apex_available: ["myapex"],
9276 }
9277 `)
9278}
9279
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009280func TestCompressedApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009281 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009282 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009283 apex {
9284 name: "myapex",
9285 key: "myapex.key",
9286 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009287 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009288 }
9289 apex_key {
9290 name: "myapex.key",
9291 public_key: "testkey.avbpubkey",
9292 private_key: "testkey.pem",
9293 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009294 `,
9295 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9296 variables.CompressedApex = proptools.BoolPtr(true)
9297 }),
9298 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009299
Jooyung Hana0503a52023-08-23 13:12:50 +09009300 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009301 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9302
Jooyung Hana0503a52023-08-23 13:12:50 +09009303 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009304 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9305
9306 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09009307 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009308 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9309
9310 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009311 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009312 var builder strings.Builder
9313 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9314 androidMk := builder.String()
9315 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9316}
9317
Jooyung Hana8fb73b2024-11-25 16:51:25 +09009318func TestCompressedApexIsDisabledWhenUsingErofs(t *testing.T) {
9319 t.Parallel()
9320 ctx := testApex(t, `
9321 apex {
9322 name: "myapex",
9323 key: "myapex.key",
9324 compressible: true,
9325 updatable: false,
9326 payload_fs_type: "erofs",
9327 }
9328 apex_key {
9329 name: "myapex.key",
9330 public_key: "testkey.avbpubkey",
9331 private_key: "testkey.pem",
9332 }
9333 `,
9334 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9335 variables.CompressedApex = proptools.BoolPtr(true)
9336 }),
9337 )
9338
9339 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").MaybeRule("compressRule")
9340 if compressRule.Rule != nil {
9341 t.Error("erofs apex should not be compressed")
9342 }
9343}
9344
Jooyung Han26ec8482024-07-31 15:04:05 +09009345func TestApexSet_ShouldRespectCompressedApexFlag(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009346 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09009347 for _, compressionEnabled := range []bool{true, false} {
9348 t.Run(fmt.Sprintf("compressionEnabled=%v", compressionEnabled), func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009349 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09009350 ctx := testApex(t, `
9351 apex_set {
9352 name: "com.company.android.myapex",
9353 apex_name: "com.android.myapex",
9354 set: "company-myapex.apks",
9355 }
9356 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9357 variables.CompressedApex = proptools.BoolPtr(compressionEnabled)
9358 }),
9359 )
9360
9361 build := ctx.ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex").Output("com.company.android.myapex.apex")
9362 if compressionEnabled {
9363 ensureEquals(t, build.Rule.String(), "android/soong/android.Cp")
9364 } else {
9365 ensureEquals(t, build.Rule.String(), "android/apex.decompressApex")
9366 }
9367 })
9368 }
9369}
9370
Martin Stjernholm2856c662020-12-02 15:03:42 +00009371func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009372 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009373 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009374 apex {
9375 name: "myapex",
9376 key: "myapex.key",
9377 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009378 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009379 }
9380
9381 apex_key {
9382 name: "myapex.key",
9383 public_key: "testkey.avbpubkey",
9384 private_key: "testkey.pem",
9385 }
9386
9387 cc_library {
9388 name: "mylib",
9389 srcs: ["mylib.cpp"],
9390 apex_available: ["myapex"],
9391 shared_libs: ["otherlib"],
9392 system_shared_libs: [],
9393 }
9394
9395 cc_library {
9396 name: "otherlib",
9397 srcs: ["mylib.cpp"],
9398 stubs: {
9399 versions: ["current"],
9400 },
9401 }
9402
9403 cc_prebuilt_library_shared {
9404 name: "otherlib",
9405 prefer: true,
9406 srcs: ["prebuilt.so"],
9407 stubs: {
9408 versions: ["current"],
9409 },
9410 }
9411 `)
9412
Jooyung Hana0503a52023-08-23 13:12:50 +09009413 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009414 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009415 var builder strings.Builder
9416 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9417 androidMk := builder.String()
9418
9419 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9420 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009421 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009422}
9423
Jiyong Parke3867542020-12-03 17:28:25 +09009424func TestExcludeDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009425 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009426 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009427 apex {
9428 name: "myapex",
9429 key: "myapex.key",
9430 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009431 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009432 }
9433
9434 apex_key {
9435 name: "myapex.key",
9436 public_key: "testkey.avbpubkey",
9437 private_key: "testkey.pem",
9438 }
9439
9440 cc_library {
9441 name: "mylib",
9442 srcs: ["mylib.cpp"],
9443 system_shared_libs: [],
9444 stl: "none",
9445 apex_available: ["myapex"],
9446 shared_libs: ["mylib2"],
9447 target: {
9448 apex: {
9449 exclude_shared_libs: ["mylib2"],
9450 },
9451 },
9452 }
9453
9454 cc_library {
9455 name: "mylib2",
9456 srcs: ["mylib.cpp"],
9457 system_shared_libs: [],
9458 stl: "none",
9459 }
9460 `)
9461
9462 // Check if mylib is linked to mylib2 for the non-apex target
9463 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9464 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9465
9466 // Make sure that the link doesn't occur for the apex target
9467 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9468 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9469
9470 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009471 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009472 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9473}
9474
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009475func TestPrebuiltStubLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009476 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009477 bpBase := `
9478 apex {
9479 name: "myapex",
9480 key: "myapex.key",
9481 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009482 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009483 }
9484 apex_key {
9485 name: "myapex.key",
9486 public_key: "testkey.avbpubkey",
9487 private_key: "testkey.pem",
9488 }
9489 cc_library {
9490 name: "mylib",
9491 srcs: ["mylib.cpp"],
9492 apex_available: ["myapex"],
9493 shared_libs: ["stublib"],
9494 system_shared_libs: [],
9495 }
9496 apex {
9497 name: "otherapex",
9498 enabled: %s,
9499 key: "myapex.key",
9500 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009501 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009502 }
9503 `
9504
9505 stublibSourceBp := `
9506 cc_library {
9507 name: "stublib",
9508 srcs: ["mylib.cpp"],
9509 apex_available: ["otherapex"],
9510 system_shared_libs: [],
9511 stl: "none",
9512 stubs: {
9513 versions: ["1"],
9514 },
9515 }
9516 `
9517
9518 stublibPrebuiltBp := `
9519 cc_prebuilt_library_shared {
9520 name: "stublib",
9521 srcs: ["prebuilt.so"],
9522 apex_available: ["otherapex"],
9523 stubs: {
9524 versions: ["1"],
9525 },
9526 %s
9527 }
9528 `
9529
9530 tests := []struct {
9531 name string
9532 stublibBp string
9533 usePrebuilt bool
9534 modNames []string // Modules to collect AndroidMkEntries for
9535 otherApexEnabled []string
9536 }{
9537 {
9538 name: "only_source",
9539 stublibBp: stublibSourceBp,
9540 usePrebuilt: false,
9541 modNames: []string{"stublib"},
9542 otherApexEnabled: []string{"true", "false"},
9543 },
9544 {
9545 name: "source_preferred",
9546 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9547 usePrebuilt: false,
9548 modNames: []string{"stublib", "prebuilt_stublib"},
9549 otherApexEnabled: []string{"true", "false"},
9550 },
9551 {
9552 name: "prebuilt_preferred",
9553 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9554 usePrebuilt: true,
9555 modNames: []string{"stublib", "prebuilt_stublib"},
9556 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9557 },
9558 {
9559 name: "only_prebuilt",
9560 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9561 usePrebuilt: true,
9562 modNames: []string{"stublib"},
9563 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9564 },
9565 }
9566
9567 for _, test := range tests {
9568 t.Run(test.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009569 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009570 for _, otherApexEnabled := range test.otherApexEnabled {
9571 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009572 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009573 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009574
9575 type modAndMkEntries struct {
9576 mod *cc.Module
Yu Liue70976d2024-10-15 20:45:35 +00009577 mkEntries android.AndroidMkInfo
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009578 }
9579 entries := []*modAndMkEntries{}
9580
9581 // Gather shared lib modules that are installable
9582 for _, modName := range test.modNames {
9583 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9584 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9585 continue
9586 }
9587 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Cole Fausta963b942024-04-11 17:43:00 -07009588 if !mod.Enabled(android.PanickingConfigAndErrorContext(ctx)) || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009589 continue
9590 }
Yu Liue70976d2024-10-15 20:45:35 +00009591 info := android.AndroidMkInfoForTest(t, ctx, mod)
9592 ents := []android.AndroidMkInfo{info.PrimaryInfo}
9593 ents = append(ents, info.ExtraInfo...)
9594 for _, ent := range ents {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009595 if ent.Disabled {
9596 continue
9597 }
9598 entries = append(entries, &modAndMkEntries{
9599 mod: mod,
9600 mkEntries: ent,
9601 })
9602 }
9603 }
9604 }
9605
9606 var entry *modAndMkEntries = nil
9607 for _, ent := range entries {
9608 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9609 if entry != nil {
9610 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9611 } else {
9612 entry = ent
9613 }
9614 }
9615 }
9616
9617 if entry == nil {
9618 t.Errorf("AndroidMk entry for \"stublib\" missing")
9619 } else {
9620 isPrebuilt := entry.mod.Prebuilt() != nil
9621 if isPrebuilt != test.usePrebuilt {
9622 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9623 }
9624 if !entry.mod.IsStubs() {
9625 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9626 }
9627 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9628 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9629 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009630 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009631 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009632 if !android.InList(expected, cflags) {
9633 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9634 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009635 }
9636 })
9637 }
9638 })
9639 }
9640}
9641
Colin Crossc33e5212021-05-25 18:16:02 -07009642func TestApexJavaCoverage(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009643 t.Parallel()
Colin Crossc33e5212021-05-25 18:16:02 -07009644 bp := `
9645 apex {
9646 name: "myapex",
9647 key: "myapex.key",
9648 java_libs: ["mylib"],
9649 bootclasspath_fragments: ["mybootclasspathfragment"],
9650 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9651 updatable: false,
9652 }
9653
9654 apex_key {
9655 name: "myapex.key",
9656 public_key: "testkey.avbpubkey",
9657 private_key: "testkey.pem",
9658 }
9659
9660 java_library {
9661 name: "mylib",
9662 srcs: ["mylib.java"],
9663 apex_available: ["myapex"],
9664 compile_dex: true,
9665 }
9666
9667 bootclasspath_fragment {
9668 name: "mybootclasspathfragment",
9669 contents: ["mybootclasspathlib"],
9670 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009671 hidden_api: {
9672 split_packages: ["*"],
9673 },
Colin Crossc33e5212021-05-25 18:16:02 -07009674 }
9675
9676 java_library {
9677 name: "mybootclasspathlib",
9678 srcs: ["mybootclasspathlib.java"],
9679 apex_available: ["myapex"],
9680 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009681 sdk_version: "current",
Colin Crossc33e5212021-05-25 18:16:02 -07009682 }
9683
9684 systemserverclasspath_fragment {
9685 name: "mysystemserverclasspathfragment",
9686 contents: ["mysystemserverclasspathlib"],
9687 apex_available: ["myapex"],
9688 }
9689
9690 java_library {
9691 name: "mysystemserverclasspathlib",
9692 srcs: ["mysystemserverclasspathlib.java"],
9693 apex_available: ["myapex"],
9694 compile_dex: true,
9695 }
9696 `
9697
9698 result := android.GroupFixturePreparers(
9699 PrepareForTestWithApexBuildComponents,
9700 prepareForTestWithMyapex,
9701 java.PrepareForTestWithJavaDefaultModules,
9702 android.PrepareForTestWithAndroidBuildComponents,
9703 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009704 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9705 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009706 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009707 ).RunTest(t)
9708
9709 // Make sure jacoco ran on both mylib and mybootclasspathlib
9710 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9711 t.Errorf("Failed to find jacoco rule for mylib")
9712 }
9713 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9714 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9715 }
9716 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9717 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9718 }
9719}
9720
Jiyong Park192600a2021-08-03 07:52:17 +00009721func TestProhibitStaticExecutable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009722 t.Parallel()
Jiyong Park192600a2021-08-03 07:52:17 +00009723 testApexError(t, `executable mybin is static`, `
9724 apex {
9725 name: "myapex",
9726 key: "myapex.key",
9727 binaries: ["mybin"],
9728 min_sdk_version: "29",
9729 }
9730
9731 apex_key {
9732 name: "myapex.key",
9733 public_key: "testkey.avbpubkey",
9734 private_key: "testkey.pem",
9735 }
9736
9737 cc_binary {
9738 name: "mybin",
9739 srcs: ["mylib.cpp"],
9740 relative_install_path: "foo/bar",
9741 static_executable: true,
9742 system_shared_libs: [],
9743 stl: "none",
9744 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009745 min_sdk_version: "29",
9746 }
9747 `)
9748
9749 testApexError(t, `executable mybin.rust is static`, `
9750 apex {
9751 name: "myapex",
9752 key: "myapex.key",
9753 binaries: ["mybin.rust"],
9754 min_sdk_version: "29",
9755 }
9756
9757 apex_key {
9758 name: "myapex.key",
9759 public_key: "testkey.avbpubkey",
9760 private_key: "testkey.pem",
9761 }
9762
9763 rust_binary {
9764 name: "mybin.rust",
9765 srcs: ["foo.rs"],
9766 static_executable: true,
9767 apex_available: ["myapex"],
9768 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009769 }
9770 `)
9771}
9772
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009773func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009774 t.Parallel()
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009775 ctx := testApex(t, `
9776 apex {
9777 name: "myapex",
9778 key: "myapex.key",
9779 updatable: false,
9780 java_libs: ["foo"],
9781 }
9782
9783 apex_key {
9784 name: "myapex.key",
9785 public_key: "testkey.avbpubkey",
9786 private_key: "testkey.pem",
9787 }
9788
9789 java_library {
9790 name: "foo",
9791 srcs: ["foo.java"],
9792 apex_available: ["myapex"],
9793 installable: true,
9794 }
9795 `,
9796 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9797 )
9798
Jooyung Hana0503a52023-08-23 13:12:50 +09009799 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009800 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9801 var builder strings.Builder
9802 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9803 androidMk := builder.String()
Colin Cross388c6612025-01-28 14:00:12 -08009804 out := ctx.Config().OutDir()
9805 ensureContains(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS += "+
9806 filepath.Join(out, "soong/.intermediates/foo/android_common_apex10000/dexpreopt/foo/oat/arm64/javalib.odex")+
9807 ":"+
9808 filepath.Join(out, "target/product/test_device/system/framework/oat/arm64/apex@myapex@javalib@foo.jar@classes.odex")+
9809 " "+
9810 filepath.Join(out, "soong/.intermediates/foo/android_common_apex10000/dexpreopt/foo/oat/arm64/javalib.vdex")+
9811 ":"+
9812 filepath.Join(out, "target/product/test_device/system/framework/oat/arm64/apex@myapex@javalib@foo.jar@classes.vdex")+
9813 "\n")
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009814}
9815
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009816func TestAndroidMk_RequiredModules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009817 t.Parallel()
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009818 ctx := testApex(t, `
9819 apex {
9820 name: "myapex",
9821 key: "myapex.key",
9822 updatable: false,
9823 java_libs: ["foo"],
9824 required: ["otherapex"],
9825 }
9826
9827 apex {
9828 name: "otherapex",
9829 key: "myapex.key",
9830 updatable: false,
9831 java_libs: ["foo"],
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009832 }
9833
9834 apex_key {
9835 name: "myapex.key",
9836 public_key: "testkey.avbpubkey",
9837 private_key: "testkey.pem",
9838 }
9839
9840 java_library {
9841 name: "foo",
9842 srcs: ["foo.java"],
9843 apex_available: ["myapex", "otherapex"],
9844 installable: true,
9845 }
9846 `)
9847
Jooyung Hana0503a52023-08-23 13:12:50 +09009848 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009849 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9850 var builder strings.Builder
9851 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9852 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009853 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009854}
9855
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009856func TestAndroidMk_RequiredDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009857 t.Parallel()
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009858 ctx := testApex(t, `
9859 apex {
9860 name: "myapex",
9861 key: "myapex.key",
9862 updatable: false,
9863 }
9864
9865 apex_key {
9866 name: "myapex.key",
9867 public_key: "testkey.avbpubkey",
9868 private_key: "testkey.pem",
9869 }
9870 `)
9871
Jooyung Hana0503a52023-08-23 13:12:50 +09009872 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009873 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009874 data := android.AndroidMkDataForTest(t, ctx, bundle)
9875 var builder strings.Builder
9876 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9877 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009878 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009879}
9880
Jooyung Hana6d36672022-02-24 13:58:07 +09009881func TestApexOutputFileProducer(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009882 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009883 for _, tc := range []struct {
9884 name string
9885 ref string
9886 expected_data []string
9887 }{
9888 {
9889 name: "test_using_output",
9890 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009891 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009892 },
9893 {
9894 name: "test_using_apex",
9895 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009896 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009897 },
9898 } {
9899 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009900 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009901 ctx := testApex(t, `
9902 apex {
9903 name: "myapex",
9904 key: "myapex.key",
9905 compressible: true,
9906 updatable: false,
9907 }
9908
9909 apex_key {
9910 name: "myapex.key",
9911 public_key: "testkey.avbpubkey",
9912 private_key: "testkey.pem",
9913 }
9914
9915 java_test {
9916 name: "`+tc.name+`",
9917 srcs: ["a.java"],
9918 data: ["`+tc.ref+`"],
9919 }
9920 `,
9921 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9922 variables.CompressedApex = proptools.BoolPtr(true)
9923 }))
9924 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9925 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9926 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9927 })
9928 }
9929}
9930
satayev758968a2021-12-06 11:42:40 +00009931func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009932 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009933 preparer := android.GroupFixturePreparers(
9934 PrepareForTestWithApexBuildComponents,
9935 prepareForTestWithMyapex,
9936 java.PrepareForTestWithJavaSdkLibraryFiles,
9937 java.PrepareForTestWithJavaDefaultModules,
9938 android.PrepareForTestWithAndroidBuildComponents,
9939 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9940 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9941 )
9942
9943 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9944 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009945 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009946 preparer.RunTestWithBp(t, `
9947 apex {
9948 name: "myapex",
9949 key: "myapex.key",
9950 bootclasspath_fragments: ["mybootclasspathfragment"],
9951 min_sdk_version: "30",
9952 updatable: false,
9953 }
9954
9955 apex_key {
9956 name: "myapex.key",
9957 public_key: "testkey.avbpubkey",
9958 private_key: "testkey.pem",
9959 }
9960
9961 bootclasspath_fragment {
9962 name: "mybootclasspathfragment",
9963 contents: ["mybootclasspathlib"],
9964 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009965 hidden_api: {
9966 split_packages: ["*"],
9967 },
satayev758968a2021-12-06 11:42:40 +00009968 }
9969
9970 java_sdk_library {
9971 name: "mybootclasspathlib",
9972 srcs: ["mybootclasspathlib.java"],
9973 apex_available: ["myapex"],
9974 compile_dex: true,
9975 unsafe_ignore_missing_latest_api: true,
9976 min_sdk_version: "31",
9977 static_libs: ["util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009978 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009979 }
9980
9981 java_library {
9982 name: "util",
9983 srcs: ["a.java"],
9984 apex_available: ["myapex"],
9985 min_sdk_version: "31",
9986 static_libs: ["another_util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009987 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009988 }
9989
9990 java_library {
9991 name: "another_util",
9992 srcs: ["a.java"],
9993 min_sdk_version: "31",
9994 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009995 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009996 }
9997 `)
9998 })
9999
10000 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
10001 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010002 t.Parallel()
satayev758968a2021-12-06 11:42:40 +000010003 preparer.RunTestWithBp(t, `
10004 apex {
10005 name: "myapex",
10006 key: "myapex.key",
10007 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
10008 min_sdk_version: "30",
10009 updatable: false,
10010 }
10011
10012 apex_key {
10013 name: "myapex.key",
10014 public_key: "testkey.avbpubkey",
10015 private_key: "testkey.pem",
10016 }
10017
10018 systemserverclasspath_fragment {
10019 name: "mysystemserverclasspathfragment",
10020 contents: ["mysystemserverclasspathlib"],
10021 apex_available: ["myapex"],
10022 }
10023
10024 java_sdk_library {
10025 name: "mysystemserverclasspathlib",
10026 srcs: ["mysystemserverclasspathlib.java"],
10027 apex_available: ["myapex"],
10028 compile_dex: true,
10029 min_sdk_version: "32",
10030 unsafe_ignore_missing_latest_api: true,
10031 static_libs: ["util"],
10032 }
10033
10034 java_library {
10035 name: "util",
10036 srcs: ["a.java"],
10037 apex_available: ["myapex"],
10038 min_sdk_version: "31",
10039 static_libs: ["another_util"],
10040 }
10041
10042 java_library {
10043 name: "another_util",
10044 srcs: ["a.java"],
10045 min_sdk_version: "31",
10046 apex_available: ["myapex"],
10047 }
10048 `)
10049 })
10050
10051 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010052 t.Parallel()
Jihoon Kang85bc1932024-07-01 17:04:46 +000010053 preparer.
satayev758968a2021-12-06 11:42:40 +000010054 RunTestWithBp(t, `
10055 apex {
10056 name: "myapex",
10057 key: "myapex.key",
10058 bootclasspath_fragments: ["mybootclasspathfragment"],
10059 min_sdk_version: "30",
10060 updatable: false,
10061 }
10062
10063 apex_key {
10064 name: "myapex.key",
10065 public_key: "testkey.avbpubkey",
10066 private_key: "testkey.pem",
10067 }
10068
10069 bootclasspath_fragment {
10070 name: "mybootclasspathfragment",
10071 contents: ["mybootclasspathlib"],
10072 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +010010073 hidden_api: {
10074 split_packages: ["*"],
10075 },
satayev758968a2021-12-06 11:42:40 +000010076 }
10077
10078 java_sdk_library {
10079 name: "mybootclasspathlib",
10080 srcs: ["mybootclasspathlib.java"],
10081 apex_available: ["myapex"],
10082 compile_dex: true,
10083 unsafe_ignore_missing_latest_api: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +000010084 sdk_version: "current",
10085 min_sdk_version: "30",
satayev758968a2021-12-06 11:42:40 +000010086 }
10087 `)
10088 })
10089
10090 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010091 t.Parallel()
satayev758968a2021-12-06 11:42:40 +000010092 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
10093 RunTestWithBp(t, `
10094 apex {
10095 name: "myapex",
10096 key: "myapex.key",
10097 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
10098 min_sdk_version: "30",
10099 updatable: false,
10100 }
10101
10102 apex_key {
10103 name: "myapex.key",
10104 public_key: "testkey.avbpubkey",
10105 private_key: "testkey.pem",
10106 }
10107
10108 systemserverclasspath_fragment {
10109 name: "mysystemserverclasspathfragment",
10110 contents: ["mysystemserverclasspathlib"],
10111 apex_available: ["myapex"],
10112 }
10113
10114 java_sdk_library {
10115 name: "mysystemserverclasspathlib",
10116 srcs: ["mysystemserverclasspathlib.java"],
10117 apex_available: ["myapex"],
10118 compile_dex: true,
10119 unsafe_ignore_missing_latest_api: true,
10120 }
10121 `)
10122 })
10123}
10124
Jiakai Zhang6decef92022-01-12 17:56:19 +000010125// Verifies that the APEX depends on all the Make modules in the list.
10126func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10127 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10128 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010129 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010130 }
10131}
10132
10133// Verifies that the APEX does not depend on any of the Make modules in the list.
10134func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10135 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10136 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010137 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010138 }
10139}
10140
Cole Faust24e25c02024-01-19 14:12:17 -080010141func TestApexStrictUpdtabilityLint(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010142 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -080010143 bpTemplate := `
10144 apex {
10145 name: "myapex",
10146 key: "myapex.key",
10147 java_libs: ["myjavalib"],
10148 updatable: %v,
10149 min_sdk_version: "29",
10150 }
10151 apex_key {
10152 name: "myapex.key",
10153 }
10154 java_library {
10155 name: "myjavalib",
10156 srcs: ["MyClass.java"],
10157 apex_available: [ "myapex" ],
10158 lint: {
10159 strict_updatability_linting: %v,
10160 %s
10161 },
10162 sdk_version: "current",
10163 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -080010164 compile_dex: true,
Cole Faust24e25c02024-01-19 14:12:17 -080010165 }
10166 `
10167 fs := android.MockFS{
10168 "lint-baseline.xml": nil,
10169 }
10170
10171 testCases := []struct {
Colin Cross87427352024-09-25 15:41:19 -070010172 testCaseName string
10173 apexUpdatable bool
10174 javaStrictUpdtabilityLint bool
10175 lintFileExists bool
10176 disallowedFlagExpectedOnApex bool
10177 disallowedFlagExpectedOnJavalib bool
Cole Faust24e25c02024-01-19 14:12:17 -080010178 }{
10179 {
Colin Cross87427352024-09-25 15:41:19 -070010180 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
10181 apexUpdatable: true,
10182 javaStrictUpdtabilityLint: true,
10183 lintFileExists: false,
10184 disallowedFlagExpectedOnApex: false,
10185 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -080010186 },
10187 {
Colin Cross87427352024-09-25 15:41:19 -070010188 testCaseName: "non-updatable apex respects strict_updatability of javalib",
10189 apexUpdatable: false,
10190 javaStrictUpdtabilityLint: false,
10191 lintFileExists: true,
10192 disallowedFlagExpectedOnApex: false,
10193 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -080010194 },
10195 {
Colin Cross87427352024-09-25 15:41:19 -070010196 testCaseName: "non-updatable apex respects strict updatability of javalib",
10197 apexUpdatable: false,
10198 javaStrictUpdtabilityLint: true,
10199 lintFileExists: true,
10200 disallowedFlagExpectedOnApex: false,
10201 disallowedFlagExpectedOnJavalib: true,
Cole Faust24e25c02024-01-19 14:12:17 -080010202 },
10203 {
Colin Cross87427352024-09-25 15:41:19 -070010204 testCaseName: "updatable apex checks strict updatability of javalib",
10205 apexUpdatable: true,
10206 javaStrictUpdtabilityLint: false,
10207 lintFileExists: true,
10208 disallowedFlagExpectedOnApex: true,
10209 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -080010210 },
10211 }
10212
10213 for _, testCase := range testCases {
Colin Cross87427352024-09-25 15:41:19 -070010214 t.Run(testCase.testCaseName, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010215 t.Parallel()
Colin Cross87427352024-09-25 15:41:19 -070010216 fixtures := []android.FixturePreparer{}
10217 baselineProperty := ""
10218 if testCase.lintFileExists {
10219 fixtures = append(fixtures, fs.AddToFixture())
10220 baselineProperty = "baseline_filename: \"lint-baseline.xml\""
10221 }
10222 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint, baselineProperty)
Cole Faust24e25c02024-01-19 14:12:17 -080010223
Colin Cross87427352024-09-25 15:41:19 -070010224 result := testApex(t, bp, fixtures...)
Cole Faust24e25c02024-01-19 14:12:17 -080010225
Colin Cross87427352024-09-25 15:41:19 -070010226 checkModule := func(m android.TestingBuildParams, name string, expectStrictUpdatability bool) {
10227 if expectStrictUpdatability {
10228 if m.Rule == nil {
10229 t.Errorf("expected strict updatability check rule on %s", name)
10230 } else {
10231 android.AssertStringDoesContain(t, fmt.Sprintf("strict updatability check rule for %s", name),
10232 m.RuleParams.Command, "--disallowed_issues NewApi")
10233 android.AssertStringListContains(t, fmt.Sprintf("strict updatability check baselines for %s", name),
10234 m.Inputs.Strings(), "lint-baseline.xml")
10235 }
10236 } else {
10237 if m.Rule != nil {
10238 t.Errorf("expected no strict updatability check rule on %s", name)
10239 }
10240 }
10241 }
10242
10243 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10244 apex := result.ModuleForTests("myapex", "android_common_myapex")
10245 apexStrictUpdatabilityCheck := apex.MaybeOutput("lint_strict_updatability_check.stamp")
10246 javalibStrictUpdatabilityCheck := myjavalib.MaybeOutput("lint_strict_updatability_check.stamp")
10247
10248 checkModule(apexStrictUpdatabilityCheck, "myapex", testCase.disallowedFlagExpectedOnApex)
10249 checkModule(javalibStrictUpdatabilityCheck, "myjavalib", testCase.disallowedFlagExpectedOnJavalib)
10250 })
Cole Faust24e25c02024-01-19 14:12:17 -080010251 }
10252}
10253
Cole Faust24e25c02024-01-19 14:12:17 -080010254// checks transtive deps of an apex coming from bootclasspath_fragment
10255func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010256 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -080010257 bp := `
10258 apex {
10259 name: "myapex",
10260 key: "myapex.key",
10261 bootclasspath_fragments: ["mybootclasspathfragment"],
10262 updatable: true,
10263 min_sdk_version: "29",
10264 }
10265 apex_key {
10266 name: "myapex.key",
10267 }
10268 bootclasspath_fragment {
10269 name: "mybootclasspathfragment",
10270 contents: ["myjavalib"],
10271 apex_available: ["myapex"],
10272 hidden_api: {
10273 split_packages: ["*"],
10274 },
10275 }
10276 java_library {
10277 name: "myjavalib",
10278 srcs: ["MyClass.java"],
10279 apex_available: [ "myapex" ],
10280 sdk_version: "current",
10281 min_sdk_version: "29",
10282 compile_dex: true,
10283 lint: {
10284 baseline_filename: "lint-baseline.xml",
10285 }
10286 }
10287 `
10288 fs := android.MockFS{
10289 "lint-baseline.xml": nil,
10290 }
10291
10292 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
Colin Cross87427352024-09-25 15:41:19 -070010293 apex := result.ModuleForTests("myapex", "android_common_myapex")
10294 apexStrictUpdatabilityCheck := apex.Output("lint_strict_updatability_check.stamp")
10295 android.AssertStringDoesContain(t, "strict updatability check rule for myapex",
10296 apexStrictUpdatabilityCheck.RuleParams.Command, "--disallowed_issues NewApi")
10297 android.AssertStringListContains(t, "strict updatability check baselines for myapex",
10298 apexStrictUpdatabilityCheck.Inputs.Strings(), "lint-baseline.xml")
Cole Faust24e25c02024-01-19 14:12:17 -080010299}
Spandan Das66773252022-01-15 00:23:18 +000010300
Jihoon Kang784c0052024-06-25 22:15:39 +000010301func TestApexLintBcpFragmentSdkLibDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010302 t.Parallel()
Jihoon Kang784c0052024-06-25 22:15:39 +000010303 bp := `
10304 apex {
10305 name: "myapex",
10306 key: "myapex.key",
10307 bootclasspath_fragments: ["mybootclasspathfragment"],
10308 min_sdk_version: "29",
Jihoon Kang85bc1932024-07-01 17:04:46 +000010309 java_libs: [
10310 "jacocoagent",
10311 ],
Jihoon Kang784c0052024-06-25 22:15:39 +000010312 }
10313 apex_key {
10314 name: "myapex.key",
10315 }
10316 bootclasspath_fragment {
10317 name: "mybootclasspathfragment",
10318 contents: ["foo"],
10319 apex_available: ["myapex"],
10320 hidden_api: {
10321 split_packages: ["*"],
10322 },
10323 }
10324 java_sdk_library {
10325 name: "foo",
10326 srcs: ["MyClass.java"],
10327 apex_available: [ "myapex" ],
10328 sdk_version: "current",
10329 min_sdk_version: "29",
10330 compile_dex: true,
10331 }
10332 `
10333 fs := android.MockFS{
10334 "lint-baseline.xml": nil,
10335 }
10336
10337 result := android.GroupFixturePreparers(
10338 prepareForApexTest,
10339 java.PrepareForTestWithJavaSdkLibraryFiles,
10340 java.PrepareForTestWithJacocoInstrumentation,
10341 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang784c0052024-06-25 22:15:39 +000010342 android.FixtureMergeMockFs(fs),
10343 ).RunTestWithBp(t, bp)
10344
10345 myapex := result.ModuleForTests("myapex", "android_common_myapex")
10346 lintReportInputs := strings.Join(myapex.Output("lint-report-xml.zip").Inputs.Strings(), " ")
10347 android.AssertStringDoesContain(t,
10348 "myapex lint report expected to contain that of the sdk library impl lib as an input",
10349 lintReportInputs, "foo.impl")
10350}
10351
Spandan Das42e89502022-05-06 22:12:55 +000010352// updatable apexes should propagate updatable=true to its apps
10353func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010354 t.Parallel()
Spandan Das42e89502022-05-06 22:12:55 +000010355 bp := `
10356 apex {
10357 name: "myapex",
10358 key: "myapex.key",
Colin Cross99939e92024-10-01 16:02:46 -070010359 updatable: true,
Spandan Das42e89502022-05-06 22:12:55 +000010360 apps: [
10361 "myapp",
10362 ],
10363 min_sdk_version: "30",
10364 }
10365 apex_key {
10366 name: "myapex.key",
10367 }
10368 android_app {
10369 name: "myapp",
Spandan Das42e89502022-05-06 22:12:55 +000010370 apex_available: [
10371 "myapex",
10372 ],
10373 sdk_version: "current",
10374 min_sdk_version: "30",
10375 }
10376 `
Colin Cross99939e92024-10-01 16:02:46 -070010377 _ = android.GroupFixturePreparers(
10378 prepareForApexTest,
10379 ).ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern("app dependency myapp must have updatable: true")).
10380 RunTestWithBp(t, bp)
Spandan Das42e89502022-05-06 22:12:55 +000010381}
10382
Jingwen Chendea7a642023-03-28 11:30:50 +000010383func TestCannedFsConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010384 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010385 ctx := testApex(t, `
10386 apex {
10387 name: "myapex",
10388 key: "myapex.key",
10389 updatable: false,
10390 }
10391
10392 apex_key {
10393 name: "myapex.key",
10394 public_key: "testkey.avbpubkey",
10395 private_key: "testkey.pem",
10396 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010397 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010398 generateFsRule := mod.Rule("generateFsConfig")
10399 cmd := generateFsRule.RuleParams.Command
10400
10401 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10402}
10403
10404func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010405 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010406 ctx := testApex(t, `
10407 apex {
10408 name: "myapex",
10409 key: "myapex.key",
10410 canned_fs_config: "my_config",
10411 updatable: false,
10412 }
10413
10414 apex_key {
10415 name: "myapex.key",
10416 public_key: "testkey.avbpubkey",
10417 private_key: "testkey.pem",
10418 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010419 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010420 generateFsRule := mod.Rule("generateFsConfig")
10421 cmd := generateFsRule.RuleParams.Command
10422
10423 // Ensure that canned_fs_config has "cat my_config" at the end
10424 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10425}
Spandan Das20fce2d2023-04-12 17:21:39 +000010426
10427func TestStubLibrariesMultipleApexViolation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010428 t.Parallel()
Spandan Das20fce2d2023-04-12 17:21:39 +000010429 testCases := []struct {
10430 desc string
10431 hasStubs bool
10432 apexAvailable string
10433 expectedError string
10434 }{
10435 {
10436 desc: "non-stub library can have multiple apex_available",
10437 hasStubs: false,
10438 apexAvailable: `["myapex", "otherapex"]`,
10439 },
10440 {
10441 desc: "stub library should not be available to anyapex",
10442 hasStubs: true,
10443 apexAvailable: `["//apex_available:anyapex"]`,
10444 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10445 },
10446 {
10447 desc: "stub library should not be available to multiple apexes",
10448 hasStubs: true,
10449 apexAvailable: `["myapex", "otherapex"]`,
10450 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10451 },
10452 {
Colin Crossaf4c8562024-11-20 15:07:58 -080010453 desc: "stub library can be available to a core apex and a test apex using apex_available_name",
Spandan Das20fce2d2023-04-12 17:21:39 +000010454 hasStubs: true,
Colin Crossaf4c8562024-11-20 15:07:58 -080010455 apexAvailable: `["myapex"]`,
Spandan Das20fce2d2023-04-12 17:21:39 +000010456 },
10457 }
10458 bpTemplate := `
10459 cc_library {
10460 name: "libfoo",
10461 %v
10462 apex_available: %v,
10463 }
10464 apex {
10465 name: "myapex",
10466 key: "apex.key",
10467 updatable: false,
10468 native_shared_libs: ["libfoo"],
10469 }
10470 apex {
10471 name: "otherapex",
10472 key: "apex.key",
10473 updatable: false,
10474 }
10475 apex_test {
10476 name: "test_myapex",
10477 key: "apex.key",
10478 updatable: false,
10479 native_shared_libs: ["libfoo"],
Colin Crossaf4c8562024-11-20 15:07:58 -080010480 apex_available_name: "myapex",
Spandan Das20fce2d2023-04-12 17:21:39 +000010481 }
10482 apex_key {
10483 name: "apex.key",
10484 }
10485 `
10486 for _, tc := range testCases {
Colin Crossaf4c8562024-11-20 15:07:58 -080010487 t.Run(tc.desc, func(t *testing.T) {
10488 stubs := ""
10489 if tc.hasStubs {
10490 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10491 }
10492 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10493 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10494 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10495 })
10496 if tc.expectedError == "" {
10497 testApex(t, bp, mockFsFixturePreparer)
10498 } else {
10499 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10500 }
Spandan Das20fce2d2023-04-12 17:21:39 +000010501 })
Spandan Das20fce2d2023-04-12 17:21:39 +000010502 }
10503}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010504
10505func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010506 t.Parallel()
Colin Crossbd3a16b2023-04-25 11:30:51 -070010507 context := android.GroupFixturePreparers(
10508 android.PrepareForIntegrationTestWithAndroid,
10509 cc.PrepareForIntegrationTestWithCc,
10510 PrepareForTestWithApexBuildComponents,
10511 prepareForTestWithMyapex,
10512 filesystem.PrepareForTestWithFilesystemBuildComponents,
10513 )
10514 result := context.RunTestWithBp(t, `
10515 android_system_image {
10516 name: "myfilesystem",
10517 deps: [
10518 "libfoo",
10519 ],
Spandan Das2047a4c2024-11-11 21:24:58 +000010520 linker_config: {
Kiyoung Kim67118212024-11-07 13:23:44 +090010521 gen_linker_config: true,
10522 linker_config_srcs: ["linker.config.json"],
10523 },
Colin Crossbd3a16b2023-04-25 11:30:51 -070010524 }
10525
10526 cc_library {
10527 name: "libfoo",
10528 shared_libs: [
10529 "libbar",
10530 ],
10531 stl: "none",
10532 }
10533
10534 cc_library {
10535 name: "libbar",
10536 stl: "none",
10537 apex_available: ["myapex"],
10538 }
10539
10540 apex {
10541 name: "myapex",
10542 native_shared_libs: ["libbar"],
10543 key: "myapex.key",
10544 updatable: false,
10545 }
10546
10547 apex_key {
10548 name: "myapex.key",
10549 public_key: "testkey.avbpubkey",
10550 private_key: "testkey.pem",
10551 }
10552 `)
10553
Cole Faust3b806d32024-03-11 15:15:03 -070010554 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img").Implicits
Colin Crossbd3a16b2023-04-25 11:30:51 -070010555 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10556 inputs.Strings(),
10557 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10558}
Yu Liueae7b362023-11-16 17:05:47 -080010559
10560var apex_default_bp = `
10561 apex_key {
10562 name: "myapex.key",
10563 public_key: "testkey.avbpubkey",
10564 private_key: "testkey.pem",
10565 }
10566
10567 filegroup {
10568 name: "myapex.manifest",
10569 srcs: ["apex_manifest.json"],
10570 }
10571
10572 filegroup {
10573 name: "myapex.androidmanifest",
10574 srcs: ["AndroidManifest.xml"],
10575 }
10576`
10577
10578func TestAconfigFilesJavaDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010579 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010580 ctx := testApex(t, apex_default_bp+`
10581 apex {
10582 name: "myapex",
10583 manifest: ":myapex.manifest",
10584 androidManifest: ":myapex.androidmanifest",
10585 key: "myapex.key",
10586 java_libs: [
10587 "my_java_library_foo",
10588 "my_java_library_bar",
10589 ],
10590 updatable: false,
10591 }
10592
10593 java_library {
10594 name: "my_java_library_foo",
10595 srcs: ["foo/bar/MyClass.java"],
10596 sdk_version: "none",
10597 system_modules: "none",
10598 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010599 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010600 "myapex",
10601 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010602 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010603 }
10604
10605 java_library {
10606 name: "my_java_library_bar",
10607 srcs: ["foo/bar/MyClass.java"],
10608 sdk_version: "none",
10609 system_modules: "none",
10610 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010611 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010612 "myapex",
10613 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010614 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010615 }
10616
10617 aconfig_declarations {
10618 name: "my_aconfig_declarations_foo",
10619 package: "com.example.package",
10620 container: "myapex",
10621 srcs: ["foo.aconfig"],
10622 }
10623
10624 java_aconfig_library {
10625 name: "my_java_aconfig_library_foo",
10626 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010627 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010628 "myapex",
10629 ],
10630 }
10631
10632 aconfig_declarations {
10633 name: "my_aconfig_declarations_bar",
10634 package: "com.example.package",
10635 container: "myapex",
10636 srcs: ["bar.aconfig"],
10637 }
10638
10639 java_aconfig_library {
10640 name: "my_java_aconfig_library_bar",
10641 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010642 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010643 "myapex",
10644 ],
10645 }
10646 `)
10647
10648 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10649 s := mod.Rule("apexRule").Args["copy_commands"]
10650 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010651 if len(copyCmds) != 14 {
10652 t.Fatalf("Expected 14 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010653 }
10654
Jooyung Hana3fddf42024-09-03 13:22:21 +090010655 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10656 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10657 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10658 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010659 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info.*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010660
Yu Liubba555e2024-02-17 00:36:42 +000010661 inputs := []string{
10662 "my_aconfig_declarations_foo/intermediate.pb",
10663 "my_aconfig_declarations_bar/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010664 }
Yu Liubba555e2024-02-17 00:36:42 +000010665 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10666 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10667 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10668 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010669 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010670}
10671
10672func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010673 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010674 ctx := testApex(t, apex_default_bp+`
10675 apex {
10676 name: "myapex",
10677 manifest: ":myapex.manifest",
10678 androidManifest: ":myapex.androidmanifest",
10679 key: "myapex.key",
10680 java_libs: [
10681 "my_java_library_foo",
10682 ],
10683 native_shared_libs: [
10684 "my_cc_library_bar",
10685 ],
10686 binaries: [
10687 "my_cc_binary_baz",
10688 ],
10689 updatable: false,
10690 }
10691
10692 java_library {
10693 name: "my_java_library_foo",
10694 srcs: ["foo/bar/MyClass.java"],
10695 sdk_version: "none",
10696 system_modules: "none",
10697 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010698 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010699 "myapex",
10700 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010701 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010702 }
10703
10704 cc_library {
10705 name: "my_cc_library_bar",
10706 srcs: ["foo/bar/MyClass.cc"],
Yu Liucec0e412023-11-30 16:45:50 -080010707 static_libs: [
10708 "my_cc_aconfig_library_bar",
10709 "my_cc_aconfig_library_baz",
10710 ],
Yu Liueae7b362023-11-16 17:05:47 -080010711 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010712 "myapex",
10713 ],
10714 }
10715
10716 cc_binary {
10717 name: "my_cc_binary_baz",
10718 srcs: ["foo/bar/MyClass.cc"],
10719 static_libs: ["my_cc_aconfig_library_baz"],
Yu Liueae7b362023-11-16 17:05:47 -080010720 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010721 "myapex",
10722 ],
10723 }
10724
10725 aconfig_declarations {
10726 name: "my_aconfig_declarations_foo",
10727 package: "com.example.package",
10728 container: "myapex",
10729 srcs: ["foo.aconfig"],
10730 }
10731
10732 java_aconfig_library {
10733 name: "my_java_aconfig_library_foo",
10734 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010735 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010736 "myapex",
10737 ],
10738 }
10739
10740 aconfig_declarations {
10741 name: "my_aconfig_declarations_bar",
10742 package: "com.example.package",
10743 container: "myapex",
10744 srcs: ["bar.aconfig"],
10745 }
10746
10747 cc_aconfig_library {
10748 name: "my_cc_aconfig_library_bar",
10749 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010750 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010751 "myapex",
10752 ],
10753 }
10754
10755 aconfig_declarations {
10756 name: "my_aconfig_declarations_baz",
10757 package: "com.example.package",
10758 container: "myapex",
10759 srcs: ["baz.aconfig"],
10760 }
10761
10762 cc_aconfig_library {
10763 name: "my_cc_aconfig_library_baz",
10764 aconfig_declarations: "my_aconfig_declarations_baz",
Yu Liueae7b362023-11-16 17:05:47 -080010765 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010766 "myapex",
10767 ],
10768 }
10769
10770 cc_library {
10771 name: "server_configurable_flags",
10772 srcs: ["server_configurable_flags.cc"],
10773 }
Ted Bauerf0f18592024-04-23 18:25:26 +000010774 cc_library {
10775 name: "libbase",
10776 srcs: ["libbase.cc"],
Ted Bauer1e96f8c2024-04-25 19:50:01 +000010777 apex_available: [
10778 "myapex",
10779 ],
Ted Bauerf0f18592024-04-23 18:25:26 +000010780 }
10781 cc_library {
10782 name: "libaconfig_storage_read_api_cc",
10783 srcs: ["libaconfig_storage_read_api_cc.cc"],
10784 }
Yu Liueae7b362023-11-16 17:05:47 -080010785 `)
10786
10787 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10788 s := mod.Rule("apexRule").Args["copy_commands"]
10789 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010790 if len(copyCmds) != 18 {
10791 t.Fatalf("Expected 18 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010792 }
10793
Jooyung Hana3fddf42024-09-03 13:22:21 +090010794 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10795 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10796 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10797 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010798 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010799
Yu Liubba555e2024-02-17 00:36:42 +000010800 inputs := []string{
10801 "my_aconfig_declarations_foo/intermediate.pb",
10802 "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/myapex/aconfig_merged.pb",
10803 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010804 }
Yu Liubba555e2024-02-17 00:36:42 +000010805 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10806 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10807 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10808 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010809 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010810}
10811
Yu Liucec0e412023-11-30 16:45:50 -080010812func TestAconfigFilesRustDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010813 t.Parallel()
Yu Liucec0e412023-11-30 16:45:50 -080010814 ctx := testApex(t, apex_default_bp+`
10815 apex {
10816 name: "myapex",
10817 manifest: ":myapex.manifest",
10818 androidManifest: ":myapex.androidmanifest",
10819 key: "myapex.key",
10820 native_shared_libs: [
10821 "libmy_rust_library",
10822 ],
10823 binaries: [
10824 "my_rust_binary",
10825 ],
10826 rust_dyn_libs: [
10827 "libmy_rust_dylib",
10828 ],
10829 updatable: false,
10830 }
10831
10832 rust_library {
Yu Liucec0e412023-11-30 16:45:50 -080010833 name: "liblazy_static", // test mock
10834 crate_name: "lazy_static",
10835 srcs: ["src/lib.rs"],
10836 apex_available: [
10837 "myapex",
10838 ],
10839 }
10840
Ted Bauer02d475c2024-03-27 20:56:26 +000010841 rust_library {
10842 name: "libaconfig_storage_read_api", // test mock
10843 crate_name: "aconfig_storage_read_api",
10844 srcs: ["src/lib.rs"],
10845 apex_available: [
10846 "myapex",
10847 ],
10848 }
10849
Ted Bauer6ef40db2024-03-29 14:04:10 +000010850 rust_library {
10851 name: "liblogger", // test mock
10852 crate_name: "logger",
10853 srcs: ["src/lib.rs"],
10854 apex_available: [
10855 "myapex",
10856 ],
10857 }
10858
10859 rust_library {
10860 name: "liblog_rust", // test mock
10861 crate_name: "log_rust",
10862 srcs: ["src/lib.rs"],
10863 apex_available: [
10864 "myapex",
10865 ],
10866 }
10867
Yu Liucec0e412023-11-30 16:45:50 -080010868 rust_ffi_shared {
10869 name: "libmy_rust_library",
10870 srcs: ["src/lib.rs"],
10871 rustlibs: ["libmy_rust_aconfig_library_foo"],
10872 crate_name: "my_rust_library",
10873 apex_available: [
10874 "myapex",
10875 ],
10876 }
10877
10878 rust_library_dylib {
10879 name: "libmy_rust_dylib",
10880 srcs: ["foo/bar/MyClass.rs"],
10881 rustlibs: ["libmy_rust_aconfig_library_bar"],
10882 crate_name: "my_rust_dylib",
10883 apex_available: [
10884 "myapex",
10885 ],
10886 }
10887
10888 rust_binary {
10889 name: "my_rust_binary",
10890 srcs: ["foo/bar/MyClass.rs"],
10891 rustlibs: [
10892 "libmy_rust_aconfig_library_baz",
10893 "libmy_rust_dylib",
10894 ],
10895 apex_available: [
10896 "myapex",
10897 ],
10898 }
10899
10900 aconfig_declarations {
10901 name: "my_aconfig_declarations_foo",
10902 package: "com.example.package",
10903 container: "myapex",
10904 srcs: ["foo.aconfig"],
10905 }
10906
10907 aconfig_declarations {
10908 name: "my_aconfig_declarations_bar",
10909 package: "com.example.package",
10910 container: "myapex",
10911 srcs: ["bar.aconfig"],
10912 }
10913
10914 aconfig_declarations {
10915 name: "my_aconfig_declarations_baz",
10916 package: "com.example.package",
10917 container: "myapex",
10918 srcs: ["baz.aconfig"],
10919 }
10920
10921 rust_aconfig_library {
10922 name: "libmy_rust_aconfig_library_foo",
10923 aconfig_declarations: "my_aconfig_declarations_foo",
10924 crate_name: "my_rust_aconfig_library_foo",
10925 apex_available: [
10926 "myapex",
10927 ],
10928 }
10929
10930 rust_aconfig_library {
10931 name: "libmy_rust_aconfig_library_bar",
10932 aconfig_declarations: "my_aconfig_declarations_bar",
10933 crate_name: "my_rust_aconfig_library_bar",
10934 apex_available: [
10935 "myapex",
10936 ],
10937 }
10938
10939 rust_aconfig_library {
10940 name: "libmy_rust_aconfig_library_baz",
10941 aconfig_declarations: "my_aconfig_declarations_baz",
10942 crate_name: "my_rust_aconfig_library_baz",
10943 apex_available: [
10944 "myapex",
10945 ],
10946 }
10947 `)
10948
10949 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10950 s := mod.Rule("apexRule").Args["copy_commands"]
10951 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen396237a2025-01-30 20:06:25 +000010952 if len(copyCmds) != 32 {
10953 t.Fatalf("Expected 32 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liucec0e412023-11-30 16:45:50 -080010954 }
10955
Jooyung Hana3fddf42024-09-03 13:22:21 +090010956 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10957 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10958 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10959 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010960 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liucec0e412023-11-30 16:45:50 -080010961
Yu Liubba555e2024-02-17 00:36:42 +000010962 inputs := []string{
10963 "my_aconfig_declarations_foo/intermediate.pb",
Yu Liuab31c822024-02-28 22:21:31 +000010964 "my_aconfig_declarations_bar/intermediate.pb",
10965 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liubba555e2024-02-17 00:36:42 +000010966 "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb",
10967 }
10968 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10969 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10970 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10971 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010972 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liubba555e2024-02-17 00:36:42 +000010973}
10974
10975func VerifyAconfigRule(t *testing.T, mod *android.TestingModule, desc string, inputs []string, output string, container string, file_type string) {
10976 aconfigRule := mod.Description(desc)
10977 s := " " + aconfigRule.Args["cache_files"]
Yu Liucec0e412023-11-30 16:45:50 -080010978 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
Yu Liubba555e2024-02-17 00:36:42 +000010979 if len(aconfigArgs) != len(inputs) {
10980 t.Fatalf("Expected %d commands, got %d in:\n%s", len(inputs), len(aconfigArgs), s)
Yu Liucec0e412023-11-30 16:45:50 -080010981 }
Yu Liucec0e412023-11-30 16:45:50 -080010982
Yu Liubba555e2024-02-17 00:36:42 +000010983 ensureEquals(t, container, aconfigRule.Args["container"])
10984 ensureEquals(t, file_type, aconfigRule.Args["file_type"])
10985
10986 buildParams := aconfigRule.BuildParams
10987 for _, input := range inputs {
10988 android.EnsureListContainsSuffix(t, aconfigArgs, input)
10989 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), input)
Yu Liucec0e412023-11-30 16:45:50 -080010990 }
Yu Liubba555e2024-02-17 00:36:42 +000010991
10992 ensureContains(t, buildParams.Output.String(), output)
Yu Liucec0e412023-11-30 16:45:50 -080010993}
10994
Yu Liueae7b362023-11-16 17:05:47 -080010995func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010996 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010997 ctx := testApex(t, apex_default_bp+`
10998 apex {
10999 name: "myapex",
11000 manifest: ":myapex.manifest",
11001 androidManifest: ":myapex.androidmanifest",
11002 key: "myapex.key",
11003 java_libs: [
11004 "my_java_library_foo",
11005 "other_java_library_bar",
11006 ],
11007 updatable: false,
11008 }
11009
11010 java_library {
11011 name: "my_java_library_foo",
11012 srcs: ["foo/bar/MyClass.java"],
11013 sdk_version: "none",
11014 system_modules: "none",
11015 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011016 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011017 "myapex",
11018 ],
Colin Crosse4f34882024-11-14 12:26:00 -080011019 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080011020 }
11021
11022 java_library {
11023 name: "other_java_library_bar",
11024 srcs: ["foo/bar/MyClass.java"],
11025 sdk_version: "none",
11026 system_modules: "none",
11027 static_libs: ["other_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011028 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011029 "myapex",
11030 ],
Colin Crosse4f34882024-11-14 12:26:00 -080011031 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080011032 }
11033
11034 aconfig_declarations {
11035 name: "my_aconfig_declarations_foo",
11036 package: "com.example.package",
11037 container: "myapex",
11038 srcs: ["foo.aconfig"],
11039 }
11040
11041 java_aconfig_library {
11042 name: "my_java_aconfig_library_foo",
11043 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011044 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011045 "myapex",
11046 ],
11047 }
11048
11049 aconfig_declarations {
11050 name: "other_aconfig_declarations_bar",
11051 package: "com.example.package",
11052 container: "otherapex",
11053 srcs: ["bar.aconfig"],
11054 }
11055
11056 java_aconfig_library {
11057 name: "other_java_aconfig_library_bar",
11058 aconfig_declarations: "other_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080011059 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011060 "myapex",
11061 ],
11062 }
11063 `)
11064
11065 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11066 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11067 s := " " + combineAconfigRule.Args["cache_files"]
11068 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11069 if len(aconfigArgs) != 1 {
11070 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11071 }
11072 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11073
11074 buildParams := combineAconfigRule.BuildParams
11075 if len(buildParams.Inputs) != 1 {
11076 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11077 }
11078 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11079 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11080}
11081
11082func TestAconfigFilesRemoveDuplicates(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011083 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080011084 ctx := testApex(t, apex_default_bp+`
11085 apex {
11086 name: "myapex",
11087 manifest: ":myapex.manifest",
11088 androidManifest: ":myapex.androidmanifest",
11089 key: "myapex.key",
11090 java_libs: [
11091 "my_java_library_foo",
11092 "my_java_library_bar",
11093 ],
11094 updatable: false,
11095 }
11096
11097 java_library {
11098 name: "my_java_library_foo",
11099 srcs: ["foo/bar/MyClass.java"],
11100 sdk_version: "none",
11101 system_modules: "none",
11102 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011103 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011104 "myapex",
11105 ],
Colin Crosse4f34882024-11-14 12:26:00 -080011106 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080011107 }
11108
11109 java_library {
11110 name: "my_java_library_bar",
11111 srcs: ["foo/bar/MyClass.java"],
11112 sdk_version: "none",
11113 system_modules: "none",
11114 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011115 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011116 "myapex",
11117 ],
Colin Crosse4f34882024-11-14 12:26:00 -080011118 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080011119 }
11120
11121 aconfig_declarations {
11122 name: "my_aconfig_declarations_foo",
11123 package: "com.example.package",
11124 container: "myapex",
11125 srcs: ["foo.aconfig"],
11126 }
11127
11128 java_aconfig_library {
11129 name: "my_java_aconfig_library_foo",
11130 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011131 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011132 "myapex",
11133 ],
11134 }
11135
11136 java_aconfig_library {
11137 name: "my_java_aconfig_library_bar",
11138 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011139 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011140 "myapex",
11141 ],
11142 }
11143 `)
11144
11145 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11146 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11147 s := " " + combineAconfigRule.Args["cache_files"]
11148 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11149 if len(aconfigArgs) != 1 {
11150 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11151 }
11152 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11153
11154 buildParams := combineAconfigRule.BuildParams
11155 if len(buildParams.Inputs) != 1 {
11156 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11157 }
11158 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11159 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11160}
Spandan Das5be63332023-12-13 00:06:32 +000011161
11162// Test that the boot jars come from the _selected_ apex prebuilt
11163// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11164func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011165 t.Parallel()
Spandan Das5be63332023-12-13 00:06:32 +000011166 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
11167 t.Helper()
11168 s := ctx.ModuleForTests("dex_bootjars", "android_common")
11169 foundLibfooJar := false
11170 base := stem + ".jar"
11171 for _, output := range s.AllOutputs() {
11172 if filepath.Base(output) == base {
11173 foundLibfooJar = true
11174 buildRule := s.Output(output)
11175 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
11176 }
11177 }
11178 if !foundLibfooJar {
11179 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
11180 }
11181 }
11182
Spandan Das64c9e0c2023-12-20 20:13:34 +000011183 // Check that the boot jars of the selected apex are run through boot_jars_package_check
11184 // This validates that the jars on the bootclasspath do not contain packages outside an allowlist
11185 checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11186 platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common")
11187 bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
11188 android.AssertStringMatches(t, "Could not find the correct boot dex jar in package check rule", bootJarsCheckRule.RuleParams.Command, "build/soong/scripts/check_boot_jars/package_allowed_list.txt.*"+expectedBootJar)
11189 }
11190
11191 // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex
11192 checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11193 monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command
11194 android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar)
11195 }
11196
Spandan Das5be63332023-12-13 00:06:32 +000011197 bp := `
11198 // Source APEX.
11199
11200 java_library {
11201 name: "framework-foo",
11202 srcs: ["foo.java"],
11203 installable: true,
11204 apex_available: [
11205 "com.android.foo",
11206 ],
11207 }
11208
11209 bootclasspath_fragment {
11210 name: "foo-bootclasspath-fragment",
11211 contents: ["framework-foo"],
11212 apex_available: [
11213 "com.android.foo",
11214 ],
11215 hidden_api: {
11216 split_packages: ["*"],
11217 },
11218 }
11219
11220 apex_key {
11221 name: "com.android.foo.key",
11222 public_key: "com.android.foo.avbpubkey",
11223 private_key: "com.android.foo.pem",
11224 }
11225
11226 apex {
11227 name: "com.android.foo",
11228 key: "com.android.foo.key",
11229 bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11230 updatable: false,
11231 }
11232
11233 // Prebuilt APEX.
11234
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011235 java_sdk_library_import {
Spandan Das5be63332023-12-13 00:06:32 +000011236 name: "framework-foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011237 public: {
11238 jars: ["foo.jar"],
11239 },
Spandan Das5be63332023-12-13 00:06:32 +000011240 apex_available: ["com.android.foo"],
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011241 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +000011242 }
11243
11244 prebuilt_bootclasspath_fragment {
11245 name: "foo-bootclasspath-fragment",
11246 contents: ["framework-foo"],
11247 hidden_api: {
11248 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
11249 metadata: "my-bootclasspath-fragment/metadata.csv",
11250 index: "my-bootclasspath-fragment/index.csv",
11251 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
11252 all_flags: "my-bootclasspath-fragment/all-flags.csv",
11253 },
11254 apex_available: [
11255 "com.android.foo",
11256 ],
11257 }
11258
11259 prebuilt_apex {
11260 name: "com.android.foo",
11261 apex_name: "com.android.foo",
11262 src: "com.android.foo-arm.apex",
11263 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11264 }
11265
11266 // Another Prebuilt ART APEX
11267 prebuilt_apex {
11268 name: "com.android.foo.v2",
11269 apex_name: "com.android.foo", // Used to determine the API domain
11270 src: "com.android.foo-arm.apex",
11271 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11272 }
11273
11274 // APEX contribution modules
11275
11276 apex_contributions {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011277 name: "foo.source.contributions",
Spandan Das5be63332023-12-13 00:06:32 +000011278 api_domain: "com.android.foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011279 contents: ["com.android.foo"],
11280 }
11281
11282 apex_contributions {
11283 name: "foo.prebuilt.contributions",
11284 api_domain: "com.android.foo",
11285 contents: ["prebuilt_com.android.foo"],
11286 }
11287
11288 apex_contributions {
11289 name: "foo.prebuilt.v2.contributions",
11290 api_domain: "com.android.foo",
11291 contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
Spandan Das5be63332023-12-13 00:06:32 +000011292 }
11293 `
11294
11295 testCases := []struct {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011296 desc string
11297 selectedApexContributions string
11298 expectedBootJar string
Spandan Das5be63332023-12-13 00:06:32 +000011299 }{
11300 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011301 desc: "Source apex com.android.foo is selected, bootjar should come from source java library",
11302 selectedApexContributions: "foo.source.contributions",
Colin Crosse5c7d7c2024-12-18 17:08:07 -080011303 expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_com.android.foo/hiddenapi-modular/encoded/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011304 },
11305 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011306 desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
11307 selectedApexContributions: "foo.prebuilt.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000011308 expectedBootJar: "out/soong/.intermediates/prebuilt_com.android.foo/android_common_com.android.foo/deapexer/javalib/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011309 },
11310 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011311 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt",
11312 selectedApexContributions: "foo.prebuilt.v2.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000011313 expectedBootJar: "out/soong/.intermediates/com.android.foo.v2/android_common_com.android.foo/deapexer/javalib/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011314 },
11315 }
11316
11317 fragment := java.ApexVariantReference{
11318 Apex: proptools.StringPtr("com.android.foo"),
11319 Module: proptools.StringPtr("foo-bootclasspath-fragment"),
11320 }
11321
11322 for _, tc := range testCases {
11323 preparer := android.GroupFixturePreparers(
11324 java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"),
11325 android.FixtureMergeMockFs(map[string][]byte{
11326 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11327 }),
Spandan Das81fe4d12024-05-15 18:43:47 +000011328 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
11329 // file creation.
11330 java.FixtureConfigureBootJars("platform:foo"),
11331 android.FixtureModifyMockFS(func(fs android.MockFS) {
11332 fs["platform/Android.bp"] = []byte(`
11333 java_library {
11334 name: "foo",
11335 srcs: ["Test.java"],
11336 compile_dex: true,
11337 }
11338 `)
11339 fs["platform/Test.java"] = nil
11340 }),
11341
Colin Crossa66b4632024-08-08 15:50:47 -070011342 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das5be63332023-12-13 00:06:32 +000011343 )
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011344 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das5be63332023-12-13 00:06:32 +000011345 checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar)
Spandan Das64c9e0c2023-12-20 20:13:34 +000011346 checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar)
11347 checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar)
Spandan Das5be63332023-12-13 00:06:32 +000011348 }
11349}
Spandan Das3576e762024-01-03 18:57:03 +000011350
11351// Test that product packaging installs the selected mainline module (either source or a specific prebuilt)
11352// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11353func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011354 t.Parallel()
Spandan Das3576e762024-01-03 18:57:03 +000011355 // for a mainline module family, check that only the flagged soong module is visible to make
11356 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) {
11357 variation := func(moduleName string) string {
11358 ret := "android_common_com.android.foo"
11359 if moduleName == "com.google.android.foo" {
Colin Cross697f25d2024-12-17 15:27:16 -080011360 ret = "android_common_com.google.android.foo"
Spandan Das3576e762024-01-03 18:57:03 +000011361 }
11362 return ret
11363 }
11364
11365 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11366 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11367
11368 for _, hiddenModuleName := range hiddenModuleNames {
11369 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11370 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11371
11372 }
11373 }
11374
11375 bp := `
11376 apex_key {
11377 name: "com.android.foo.key",
11378 public_key: "com.android.foo.avbpubkey",
11379 private_key: "com.android.foo.pem",
11380 }
11381
11382 // AOSP source apex
11383 apex {
11384 name: "com.android.foo",
11385 key: "com.android.foo.key",
11386 updatable: false,
11387 }
11388
11389 // Google source apex
11390 override_apex {
11391 name: "com.google.android.foo",
11392 base: "com.android.foo",
11393 key: "com.android.foo.key",
11394 }
11395
11396 // Prebuilt Google APEX.
11397
11398 prebuilt_apex {
11399 name: "com.google.android.foo",
11400 apex_name: "com.android.foo",
11401 src: "com.android.foo-arm.apex",
11402 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11403 }
11404
11405 // Another Prebuilt Google APEX
11406 prebuilt_apex {
11407 name: "com.google.android.foo.v2",
11408 apex_name: "com.android.foo",
Spandan Dasa8e2d612024-07-26 19:24:27 +000011409 source_apex_name: "com.google.android.foo",
Spandan Das3576e762024-01-03 18:57:03 +000011410 src: "com.android.foo-arm.apex",
11411 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11412 }
11413
11414 // APEX contribution modules
11415
11416 apex_contributions {
11417 name: "foo.source.contributions",
11418 api_domain: "com.android.foo",
11419 contents: ["com.google.android.foo"],
11420 }
11421
11422 apex_contributions {
11423 name: "foo.prebuilt.contributions",
11424 api_domain: "com.android.foo",
11425 contents: ["prebuilt_com.google.android.foo"],
11426 }
11427
11428 apex_contributions {
11429 name: "foo.prebuilt.v2.contributions",
11430 api_domain: "com.android.foo",
11431 contents: ["prebuilt_com.google.android.foo.v2"],
11432 }
11433
11434 // This is an incompatible module because it selects multiple versions of the same mainline module
11435 apex_contributions {
11436 name: "foo.prebuilt.duplicate.contributions",
11437 api_domain: "com.android.foo",
11438 contents: [
11439 "prebuilt_com.google.android.foo",
11440 "prebuilt_com.google.android.foo.v2",
11441 ],
11442 }
11443 `
11444
11445 testCases := []struct {
11446 desc string
11447 selectedApexContributions string
11448 expectedVisibleModuleName string
11449 expectedHiddenModuleNames []string
11450 expectedError string
11451 }{
11452 {
11453 desc: "Source apex is selected, prebuilts should be hidden from make",
11454 selectedApexContributions: "foo.source.contributions",
11455 expectedVisibleModuleName: "com.google.android.foo",
11456 expectedHiddenModuleNames: []string{"prebuilt_com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11457 },
11458 {
11459 desc: "Prebuilt apex prebuilt_com.android.foo is selected, source and the other prebuilt should be hidden from make",
11460 selectedApexContributions: "foo.prebuilt.contributions",
11461 expectedVisibleModuleName: "prebuilt_com.google.android.foo",
11462 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11463 },
11464 {
11465 desc: "Prebuilt apex prebuilt_com.android.fooi.v2 is selected, source and the other prebuilt should be hidden from make",
11466 selectedApexContributions: "foo.prebuilt.v2.contributions",
11467 expectedVisibleModuleName: "prebuilt_com.google.android.foo.v2",
11468 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo"},
11469 },
11470 {
11471 desc: "Multiple versions of a prebuilt apex is selected in the same release config",
11472 selectedApexContributions: "foo.prebuilt.duplicate.contributions",
11473 expectedError: "Found duplicate variations of the same module in apex_contributions: prebuilt_com.google.android.foo and prebuilt_com.google.android.foo.v2",
11474 },
11475 }
11476
11477 for _, tc := range testCases {
11478 preparer := android.GroupFixturePreparers(
11479 android.FixtureMergeMockFs(map[string][]byte{
11480 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11481 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011482 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das3576e762024-01-03 18:57:03 +000011483 )
11484 if tc.expectedError != "" {
11485 preparer = preparer.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(tc.expectedError))
11486 testApex(t, bp, preparer)
11487 return
11488 }
11489 ctx := testApex(t, bp, preparer)
11490
Spandan Das3576e762024-01-03 18:57:03 +000011491 // Check that
11492 // 1. The contents of the selected apex_contributions are visible to make
11493 // 2. The rest of the apexes in the mainline module family (source or other prebuilt) is hidden from make
11494 checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
11495 }
11496}
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011497
Spandan Das85bd4622024-08-01 00:51:20 +000011498// Test that product packaging installs the selected mainline module in workspaces withtout source mainline module
11499func TestInstallationRulesForMultipleApexPrebuiltsWithoutSource(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011500 t.Parallel()
Spandan Das85bd4622024-08-01 00:51:20 +000011501 // for a mainline module family, check that only the flagged soong module is visible to make
11502 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleNames []string, hiddenModuleNames []string) {
11503 variation := func(moduleName string) string {
11504 ret := "android_common_com.android.adservices"
11505 if moduleName == "com.google.android.foo" {
11506 ret = "android_common_com.google.android.foo_com.google.android.foo"
11507 }
11508 return ret
11509 }
11510
11511 for _, visibleModuleName := range visibleModuleNames {
11512 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11513 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11514 }
11515
11516 for _, hiddenModuleName := range hiddenModuleNames {
11517 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11518 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11519
11520 }
11521 }
11522
11523 bp := `
11524 apex_key {
11525 name: "com.android.adservices.key",
11526 public_key: "com.android.adservices.avbpubkey",
11527 private_key: "com.android.adservices.pem",
11528 }
11529
11530 // AOSP source apex
11531 apex {
11532 name: "com.android.adservices",
11533 key: "com.android.adservices.key",
11534 updatable: false,
11535 }
11536
11537 // Prebuilt Google APEX.
11538
11539 prebuilt_apex {
11540 name: "com.google.android.adservices",
11541 apex_name: "com.android.adservices",
11542 src: "com.android.foo-arm.apex",
11543 }
11544
11545 // Another Prebuilt Google APEX
11546 prebuilt_apex {
11547 name: "com.google.android.adservices.v2",
11548 apex_name: "com.android.adservices",
11549 src: "com.android.foo-arm.apex",
11550 }
11551
11552 // APEX contribution modules
11553
11554
11555 apex_contributions {
11556 name: "adservices.prebuilt.contributions",
11557 api_domain: "com.android.adservices",
11558 contents: ["prebuilt_com.google.android.adservices"],
11559 }
11560
11561 apex_contributions {
11562 name: "adservices.prebuilt.v2.contributions",
11563 api_domain: "com.android.adservices",
11564 contents: ["prebuilt_com.google.android.adservices.v2"],
11565 }
11566 `
11567
11568 testCases := []struct {
11569 desc string
11570 selectedApexContributions string
11571 expectedVisibleModuleNames []string
11572 expectedHiddenModuleNames []string
11573 }{
11574 {
11575 desc: "No apex contributions selected, source aosp apex should be visible, and mainline prebuilts should be hidden",
11576 selectedApexContributions: "",
11577 expectedVisibleModuleNames: []string{"com.android.adservices"},
11578 expectedHiddenModuleNames: []string{"com.google.android.adservices", "com.google.android.adservices.v2"},
11579 },
11580 {
11581 desc: "Prebuilt apex prebuilt_com.android.foo is selected",
11582 selectedApexContributions: "adservices.prebuilt.contributions",
11583 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices"},
11584 expectedHiddenModuleNames: []string{"com.google.android.adservices.v2"},
11585 },
11586 {
11587 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected",
11588 selectedApexContributions: "adservices.prebuilt.v2.contributions",
11589 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices.v2"},
11590 expectedHiddenModuleNames: []string{"com.google.android.adservices"},
11591 },
11592 }
11593
11594 for _, tc := range testCases {
11595 preparer := android.GroupFixturePreparers(
11596 android.FixtureMergeMockFs(map[string][]byte{
11597 "system/sepolicy/apex/com.android.adservices-file_contexts": nil,
11598 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011599 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das85bd4622024-08-01 00:51:20 +000011600 )
11601 ctx := testApex(t, bp, preparer)
11602
11603 checkHideFromMake(t, ctx, tc.expectedVisibleModuleNames, tc.expectedHiddenModuleNames)
11604 }
11605}
11606
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011607func TestAconfifDeclarationsValidation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011608 t.Parallel()
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011609 aconfigDeclarationLibraryString := func(moduleNames []string) (ret string) {
11610 for _, moduleName := range moduleNames {
11611 ret += fmt.Sprintf(`
11612 aconfig_declarations {
11613 name: "%[1]s",
11614 package: "com.example.package",
Yu Liu315a53c2024-04-24 16:41:57 +000011615 container: "system",
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011616 srcs: [
11617 "%[1]s.aconfig",
11618 ],
11619 }
11620 java_aconfig_library {
11621 name: "%[1]s-lib",
11622 aconfig_declarations: "%[1]s",
11623 }
11624 `, moduleName)
11625 }
11626 return ret
11627 }
11628
11629 result := android.GroupFixturePreparers(
11630 prepareForApexTest,
11631 java.PrepareForTestWithJavaSdkLibraryFiles,
11632 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011633 ).RunTestWithBp(t, `
11634 java_library {
11635 name: "baz-java-lib",
11636 static_libs: [
11637 "baz-lib",
11638 ],
11639 }
11640 filegroup {
11641 name: "qux-filegroup",
Cole Faust65cb40a2024-10-21 15:41:42 -070011642 device_common_srcs: [
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011643 ":qux-lib{.generated_srcjars}",
11644 ],
11645 }
11646 filegroup {
11647 name: "qux-another-filegroup",
11648 srcs: [
11649 ":qux-filegroup",
11650 ],
11651 }
11652 java_library {
11653 name: "quux-java-lib",
11654 srcs: [
11655 "a.java",
11656 ],
11657 libs: [
11658 "quux-lib",
11659 ],
11660 }
11661 java_sdk_library {
11662 name: "foo",
11663 srcs: [
11664 ":qux-another-filegroup",
11665 ],
11666 api_packages: ["foo"],
11667 system: {
11668 enabled: true,
11669 },
11670 module_lib: {
11671 enabled: true,
11672 },
11673 test: {
11674 enabled: true,
11675 },
11676 static_libs: [
11677 "bar-lib",
11678 ],
11679 libs: [
11680 "baz-java-lib",
11681 "quux-java-lib",
11682 ],
11683 aconfig_declarations: [
11684 "bar",
11685 ],
11686 }
11687 `+aconfigDeclarationLibraryString([]string{"bar", "baz", "qux", "quux"}))
11688
11689 m := result.ModuleForTests("foo.stubs.source", "android_common")
11690 outDir := "out/soong/.intermediates"
11691
11692 // Arguments passed to aconfig to retrieve the state of the flags defined in the
11693 // textproto files
11694 aconfigFlagArgs := m.Output("released-flagged-apis-exportable.txt").Args["flags_path"]
11695
11696 // "bar-lib" is a static_lib of "foo" and is passed to metalava as classpath. Thus the
11697 // cache file provided by the associated aconfig_declarations module "bar" should be passed
11698 // to aconfig.
11699 android.AssertStringDoesContain(t, "cache file of a java_aconfig_library static_lib "+
11700 "passed as an input",
11701 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "bar"))
11702
11703 // "baz-java-lib", which statically depends on "baz-lib", is a lib of "foo" and is passed
11704 // to metalava as classpath. Thus the cache file provided by the associated
11705 // aconfig_declarations module "baz" should be passed to aconfig.
11706 android.AssertStringDoesContain(t, "cache file of a lib that statically depends on "+
11707 "java_aconfig_library passed as an input",
11708 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "baz"))
11709
11710 // "qux-lib" is passed to metalava as src via the filegroup, thus the cache file provided by
11711 // the associated aconfig_declarations module "qux" should be passed to aconfig.
11712 android.AssertStringDoesContain(t, "cache file of srcs java_aconfig_library passed as an "+
11713 "input",
11714 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "qux"))
11715
11716 // "quux-java-lib" is a lib of "foo" and is passed to metalava as classpath, but does not
11717 // statically depend on "quux-lib". Therefore, the cache file provided by the associated
11718 // aconfig_declarations module "quux" should not be passed to aconfig.
11719 android.AssertStringDoesNotContain(t, "cache file of a lib that does not statically "+
11720 "depend on java_aconfig_library not passed as an input",
11721 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "quux"))
11722}
Cole Faust7c991b42024-05-15 11:17:55 -070011723
11724func TestMultiplePrebuiltsWithSameBase(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011725 t.Parallel()
Cole Faust7c991b42024-05-15 11:17:55 -070011726 ctx := testApex(t, `
11727 apex {
11728 name: "myapex",
11729 key: "myapex.key",
11730 prebuilts: ["myetc", "myetc2"],
11731 min_sdk_version: "29",
11732 }
11733 apex_key {
11734 name: "myapex.key",
11735 public_key: "testkey.avbpubkey",
11736 private_key: "testkey.pem",
11737 }
11738
11739 prebuilt_etc {
11740 name: "myetc",
11741 src: "myprebuilt",
11742 filename: "myfilename",
11743 }
11744 prebuilt_etc {
11745 name: "myetc2",
11746 sub_dir: "mysubdir",
11747 src: "myprebuilt",
11748 filename: "myfilename",
11749 }
11750 `, withFiles(android.MockFS{
11751 "packages/modules/common/build/allowed_deps.txt": nil,
11752 }))
11753
11754 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
11755 data := android.AndroidMkDataForTest(t, ctx, ab)
11756 var builder strings.Builder
11757 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
11758 androidMk := builder.String()
11759
11760 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_myfilename.myapex")
11761 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_mysubdir_myfilename.myapex")
11762}
Spandan Das50801e22024-05-13 18:29:45 +000011763
11764func TestApexMinSdkVersionOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011765 t.Parallel()
Spandan Das50801e22024-05-13 18:29:45 +000011766 checkMinSdkVersion := func(t *testing.T, module android.TestingModule, expectedMinSdkVersion string) {
11767 args := module.Rule("apexRule").Args
11768 optFlags := args["opt_flags"]
11769 if !strings.Contains(optFlags, "--min_sdk_version "+expectedMinSdkVersion) {
11770 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", module.Module(), expectedMinSdkVersion, optFlags)
11771 }
11772 }
11773
11774 checkHasDep := func(t *testing.T, ctx *android.TestContext, m android.Module, wantDep android.Module) {
11775 t.Helper()
11776 found := false
11777 ctx.VisitDirectDeps(m, func(dep blueprint.Module) {
11778 if dep == wantDep {
11779 found = true
11780 }
11781 })
11782 if !found {
11783 t.Errorf("Could not find a dependency from %v to %v\n", m, wantDep)
11784 }
11785 }
11786
11787 ctx := testApex(t, `
11788 apex {
11789 name: "com.android.apex30",
11790 min_sdk_version: "30",
11791 key: "apex30.key",
11792 java_libs: ["javalib"],
11793 }
11794
11795 java_library {
11796 name: "javalib",
11797 srcs: ["A.java"],
11798 apex_available: ["com.android.apex30"],
11799 min_sdk_version: "30",
11800 sdk_version: "current",
Colin Crosse4f34882024-11-14 12:26:00 -080011801 compile_dex: true,
Spandan Das50801e22024-05-13 18:29:45 +000011802 }
11803
11804 override_apex {
11805 name: "com.mycompany.android.apex30",
11806 base: "com.android.apex30",
11807 }
11808
11809 override_apex {
11810 name: "com.mycompany.android.apex31",
11811 base: "com.android.apex30",
11812 min_sdk_version: "31",
11813 }
11814
11815 apex_key {
11816 name: "apex30.key",
11817 public_key: "testkey.avbpubkey",
11818 private_key: "testkey.pem",
11819 }
11820
11821 `, android.FixtureMergeMockFs(android.MockFS{
11822 "system/sepolicy/apex/com.android.apex30-file_contexts": nil,
11823 }),
11824 )
11825
11826 baseModule := ctx.ModuleForTests("com.android.apex30", "android_common_com.android.apex30")
11827 checkMinSdkVersion(t, baseModule, "30")
11828
11829 // Override module, but uses same min_sdk_version
11830 overridingModuleSameMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex30_com.mycompany.android.apex30")
11831 javalibApex30Variant := ctx.ModuleForTests("javalib", "android_common_apex30")
11832 checkMinSdkVersion(t, overridingModuleSameMinSdkVersion, "30")
11833 checkHasDep(t, ctx, overridingModuleSameMinSdkVersion.Module(), javalibApex30Variant.Module())
11834
11835 // Override module, uses different min_sdk_version
11836 overridingModuleDifferentMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex31_com.mycompany.android.apex31")
11837 javalibApex31Variant := ctx.ModuleForTests("javalib", "android_common_apex31")
11838 checkMinSdkVersion(t, overridingModuleDifferentMinSdkVersion, "31")
11839 checkHasDep(t, ctx, overridingModuleDifferentMinSdkVersion.Module(), javalibApex31Variant.Module())
11840}
Spandan Das0b28fa02024-05-28 23:40:17 +000011841
11842func TestOverrideApexWithPrebuiltApexPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011843 t.Parallel()
Spandan Das0b28fa02024-05-28 23:40:17 +000011844 context := android.GroupFixturePreparers(
11845 android.PrepareForIntegrationTestWithAndroid,
11846 PrepareForTestWithApexBuildComponents,
11847 android.FixtureMergeMockFs(android.MockFS{
11848 "system/sepolicy/apex/foo-file_contexts": nil,
11849 }),
11850 )
11851 res := context.RunTestWithBp(t, `
11852 apex {
11853 name: "foo",
11854 key: "myapex.key",
11855 apex_available_name: "com.android.foo",
11856 variant_version: "0",
11857 updatable: false,
11858 }
11859 apex_key {
11860 name: "myapex.key",
11861 public_key: "testkey.avbpubkey",
11862 private_key: "testkey.pem",
11863 }
11864 prebuilt_apex {
11865 name: "foo",
11866 src: "foo.apex",
11867 prefer: true,
11868 }
11869 override_apex {
11870 name: "myoverrideapex",
11871 base: "foo",
11872 }
11873 `)
11874
Colin Cross697f25d2024-12-17 15:27:16 -080011875 java.CheckModuleHasDependency(t, res.TestContext, "myoverrideapex", "android_common_myoverrideapex", "foo")
Spandan Das0b28fa02024-05-28 23:40:17 +000011876}
Spandan Dasca1d63e2024-07-01 22:53:49 +000011877
11878func TestUpdatableApexMinSdkVersionCurrent(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011879 t.Parallel()
Spandan Dasca1d63e2024-07-01 22:53:49 +000011880 testApexError(t, `"myapex" .*: updatable: updatable APEXes should not set min_sdk_version to current. Please use a finalized API level or a recognized in-development codename`, `
11881 apex {
11882 name: "myapex",
11883 key: "myapex.key",
11884 updatable: true,
11885 min_sdk_version: "current",
11886 }
11887
11888 apex_key {
11889 name: "myapex.key",
11890 public_key: "testkey.avbpubkey",
11891 private_key: "testkey.pem",
11892 }
11893 `)
11894}
Spandan Das2f68f192024-07-22 19:25:50 +000011895
11896func TestPrebuiltStubNoinstall(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011897 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011898 testFunc := func(t *testing.T, expectLibfooOnSystemLib bool, fs android.MockFS) {
11899 result := android.GroupFixturePreparers(
11900 prepareForApexTest,
11901 android.PrepareForTestWithAndroidMk,
11902 android.PrepareForTestWithMakevars,
11903 android.FixtureMergeMockFs(fs),
11904 ).RunTest(t)
11905
11906 ldRule := result.ModuleForTests("installedlib", "android_arm64_armv8-a_shared").Rule("ld")
Spandan Das357ffcc2024-07-24 18:07:48 +000011907 android.AssertStringDoesContain(t, "", ldRule.Args["libFlags"], "android_arm64_armv8-a_shared_current/libfoo.so")
Spandan Das2f68f192024-07-22 19:25:50 +000011908
11909 installRules := result.InstallMakeRulesForTesting(t)
11910
11911 var installedlibRule *android.InstallMakeRule
11912 for i, rule := range installRules {
11913 if rule.Target == "out/target/product/test_device/system/lib/installedlib.so" {
11914 if installedlibRule != nil {
11915 t.Errorf("Duplicate install rules for %s", rule.Target)
11916 }
11917 installedlibRule = &installRules[i]
11918 }
11919 }
11920 if installedlibRule == nil {
11921 t.Errorf("No install rule found for installedlib")
11922 return
11923 }
11924
11925 if expectLibfooOnSystemLib {
11926 android.AssertStringListContains(t,
11927 "installedlib doesn't have install dependency on libfoo impl",
11928 installedlibRule.OrderOnlyDeps,
11929 "out/target/product/test_device/system/lib/libfoo.so")
11930 } else {
11931 android.AssertStringListDoesNotContain(t,
11932 "installedlib has install dependency on libfoo stub",
11933 installedlibRule.Deps,
11934 "out/target/product/test_device/system/lib/libfoo.so")
11935 android.AssertStringListDoesNotContain(t,
11936 "installedlib has order-only install dependency on libfoo stub",
11937 installedlibRule.OrderOnlyDeps,
11938 "out/target/product/test_device/system/lib/libfoo.so")
11939 }
11940 }
11941
11942 prebuiltLibfooBp := []byte(`
11943 cc_prebuilt_library {
11944 name: "libfoo",
11945 prefer: true,
11946 srcs: ["libfoo.so"],
11947 stubs: {
11948 versions: ["1"],
11949 },
11950 apex_available: ["apexfoo"],
11951 }
11952 `)
11953
11954 apexfooBp := []byte(`
11955 apex {
11956 name: "apexfoo",
11957 key: "apexfoo.key",
11958 native_shared_libs: ["libfoo"],
11959 updatable: false,
11960 compile_multilib: "both",
11961 }
11962 apex_key {
11963 name: "apexfoo.key",
11964 public_key: "testkey.avbpubkey",
11965 private_key: "testkey.pem",
11966 }
11967 `)
11968
11969 installedlibBp := []byte(`
11970 cc_library {
11971 name: "installedlib",
11972 shared_libs: ["libfoo"],
11973 }
11974 `)
11975
11976 t.Run("prebuilt stub (without source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011977 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011978 testFunc(
11979 t,
11980 /*expectLibfooOnSystemLib=*/ false,
11981 android.MockFS{
11982 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11983 "apexfoo/Android.bp": apexfooBp,
11984 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11985 "Android.bp": installedlibBp,
11986 },
11987 )
11988 })
11989
11990 disabledSourceLibfooBp := []byte(`
11991 cc_library {
11992 name: "libfoo",
11993 enabled: false,
11994 stubs: {
11995 versions: ["1"],
11996 },
11997 apex_available: ["apexfoo"],
11998 }
11999 `)
12000
12001 t.Run("prebuilt stub (with disabled source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070012002 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000012003 testFunc(
12004 t,
12005 /*expectLibfooOnSystemLib=*/ false,
12006 android.MockFS{
12007 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
12008 "impl/Android.bp": disabledSourceLibfooBp,
12009 "apexfoo/Android.bp": apexfooBp,
12010 "system/sepolicy/apex/apexfoo-file_contexts": nil,
12011 "Android.bp": installedlibBp,
12012 },
12013 )
12014 })
12015}
Jihoon Kange246bb72024-09-18 22:26:22 +000012016
12017func TestSdkLibraryTransitiveClassLoaderContext(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070012018 t.Parallel()
Jihoon Kange246bb72024-09-18 22:26:22 +000012019 // This test case tests that listing the impl lib instead of the top level java_sdk_library
12020 // in libs of android_app and java_library does not lead to class loader context device/host
12021 // path mismatch errors.
12022 android.GroupFixturePreparers(
12023 prepareForApexTest,
12024 android.PrepareForIntegrationTestWithAndroid,
12025 PrepareForTestWithApexBuildComponents,
12026 android.FixtureModifyEnv(func(env map[string]string) {
12027 env["DISABLE_CONTAINER_CHECK"] = "true"
12028 }),
12029 withFiles(filesForSdkLibrary),
12030 android.FixtureMergeMockFs(android.MockFS{
12031 "system/sepolicy/apex/com.android.foo30-file_contexts": nil,
12032 }),
12033 ).RunTestWithBp(t, `
12034 apex {
12035 name: "com.android.foo30",
12036 key: "myapex.key",
12037 updatable: true,
12038 bootclasspath_fragments: [
12039 "foo-bootclasspath-fragment",
12040 ],
12041 java_libs: [
12042 "bar",
12043 ],
12044 apps: [
12045 "bar-app",
12046 ],
12047 min_sdk_version: "30",
12048 }
12049 apex_key {
12050 name: "myapex.key",
12051 public_key: "testkey.avbpubkey",
12052 private_key: "testkey.pem",
12053 }
12054 bootclasspath_fragment {
12055 name: "foo-bootclasspath-fragment",
12056 contents: [
12057 "framework-foo",
12058 ],
12059 apex_available: [
12060 "com.android.foo30",
12061 ],
12062 hidden_api: {
12063 split_packages: ["*"]
12064 },
12065 }
12066
12067 java_sdk_library {
12068 name: "framework-foo",
12069 srcs: [
12070 "A.java"
12071 ],
12072 unsafe_ignore_missing_latest_api: true,
12073 apex_available: [
12074 "com.android.foo30",
12075 ],
12076 compile_dex: true,
12077 sdk_version: "core_current",
12078 shared_library: false,
12079 }
12080
12081 java_library {
12082 name: "bar",
12083 srcs: [
12084 "A.java"
12085 ],
12086 libs: [
12087 "framework-foo.impl",
12088 ],
12089 apex_available: [
12090 "com.android.foo30",
12091 ],
12092 sdk_version: "core_current",
Colin Crosse4f34882024-11-14 12:26:00 -080012093 compile_dex: true,
Jihoon Kange246bb72024-09-18 22:26:22 +000012094 }
12095
12096 java_library {
12097 name: "baz",
12098 srcs: [
12099 "A.java"
12100 ],
12101 libs: [
12102 "bar",
12103 ],
12104 sdk_version: "core_current",
12105 }
12106
12107 android_app {
12108 name: "bar-app",
12109 srcs: [
12110 "A.java"
12111 ],
12112 libs: [
12113 "baz",
12114 "framework-foo.impl",
12115 ],
12116 apex_available: [
12117 "com.android.foo30",
12118 ],
12119 sdk_version: "core_current",
12120 min_sdk_version: "30",
12121 manifest: "AndroidManifest.xml",
Colin Cross99939e92024-10-01 16:02:46 -070012122 updatable: true,
Jihoon Kange246bb72024-09-18 22:26:22 +000012123 }
12124 `)
12125}
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000012126
12127// If an apex sets system_ext_specific: true, its systemserverclasspath libraries must set this property as well.
12128func TestApexSSCPJarMustBeInSamePartitionAsApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070012129 t.Parallel()
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000012130 testApexError(t, `foo is an apex systemserver jar, but its partition does not match the partition of its containing apex`, `
12131 apex {
12132 name: "myapex",
12133 key: "myapex.key",
12134 systemserverclasspath_fragments: [
12135 "mysystemserverclasspathfragment",
12136 ],
12137 min_sdk_version: "29",
12138 updatable: true,
12139 system_ext_specific: true,
12140 }
12141
12142 apex_key {
12143 name: "myapex.key",
12144 public_key: "testkey.avbpubkey",
12145 private_key: "testkey.pem",
12146 }
12147
12148 java_library {
12149 name: "foo",
12150 srcs: ["b.java"],
12151 min_sdk_version: "29",
12152 installable: true,
12153 apex_available: [
12154 "myapex",
12155 ],
12156 sdk_version: "current",
12157 }
12158
12159 systemserverclasspath_fragment {
12160 name: "mysystemserverclasspathfragment",
12161 contents: [
12162 "foo",
12163 ],
12164 apex_available: [
12165 "myapex",
12166 ],
12167 }
12168 `,
12169 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
12170 )
12171}
Spandan Das72d86c62024-10-15 19:27:41 +000012172
12173// partitions should not package the artifacts that are included inside the apex.
12174func TestFilesystemWithApexDeps(t *testing.T) {
12175 t.Parallel()
12176 result := testApex(t, `
12177 android_filesystem {
12178 name: "myfilesystem",
12179 deps: ["myapex"],
12180 }
12181 apex {
12182 name: "myapex",
12183 key: "myapex.key",
12184 binaries: ["binfoo"],
12185 native_shared_libs: ["libfoo"],
12186 apps: ["appfoo"],
12187 updatable: false,
12188 }
12189 apex_key {
12190 name: "myapex.key",
12191 }
12192 cc_binary {
12193 name: "binfoo",
12194 apex_available: ["myapex"],
12195 }
12196 cc_library {
12197 name: "libfoo",
12198 apex_available: ["myapex"],
12199 }
12200 android_app {
12201 name: "appfoo",
12202 sdk_version: "current",
12203 apex_available: ["myapex"],
12204 }
12205 `, filesystem.PrepareForTestWithFilesystemBuildComponents)
12206
12207 partition := result.ModuleForTests("myfilesystem", "android_common")
12208 fileList := android.ContentFromFileRuleForTests(t, result, partition.Output("fileList"))
12209 android.AssertDeepEquals(t, "filesystem with apex", "apex/myapex.apex\n", fileList)
12210}