blob: 219d58b31743d8f92ab5d9412a8ea3e325d80450 [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 withTargets(targets map[android.OsType][]android.Target) android.FixturePreparer {
86 return android.FixtureModifyConfig(func(config android.Config) {
Jooyung Han344d5432019-08-23 11:17:39 +090087 for k, v := range targets {
88 config.Targets[k] = v
89 }
Paul Duffin810f33d2021-03-09 14:12:32 +000090 })
Jooyung Han344d5432019-08-23 11:17:39 +090091}
92
Jooyung Han35155c42020-02-06 17:33:20 +090093// withNativeBridgeTargets sets configuration with targets including:
94// - X86_64 (primary)
95// - X86 (secondary)
96// - Arm64 on X86_64 (native bridge)
97// - Arm on X86 (native bridge)
Paul Duffin810f33d2021-03-09 14:12:32 +000098var withNativeBridgeEnabled = android.FixtureModifyConfig(
99 func(config android.Config) {
100 config.Targets[android.Android] = []android.Target{
101 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
102 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
103 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
104 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
105 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
106 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
107 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
108 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
109 }
110 },
111)
112
113func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
114 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
115 variables.ManifestPackageNameOverrides = specs
116 })
Jooyung Han35155c42020-02-06 17:33:20 +0900117}
118
Albert Martineefabcf2022-03-21 20:11:16 +0000119func withApexGlobalMinSdkVersionOverride(minSdkOverride *string) android.FixturePreparer {
120 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
121 variables.ApexGlobalMinSdkVersionOverride = minSdkOverride
122 })
123}
124
Paul Duffin810f33d2021-03-09 14:12:32 +0000125var withBinder32bit = android.FixtureModifyProductVariables(
126 func(variables android.FixtureProductVariables) {
127 variables.Binder32bit = proptools.BoolPtr(true)
128 },
129)
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900130
Paul Duffin810f33d2021-03-09 14:12:32 +0000131var withUnbundledBuild = android.FixtureModifyProductVariables(
132 func(variables android.FixtureProductVariables) {
133 variables.Unbundled_build = proptools.BoolPtr(true)
134 },
135)
Jiyong Park7cd10e32020-01-14 09:22:18 +0900136
Paul Duffin284165a2021-03-29 01:50:31 +0100137// Legacy preparer used for running tests within the apex package.
138//
139// This includes everything that was needed to run any test in the apex package prior to the
140// introduction of the test fixtures. Tests that are being converted to use fixtures directly
141// rather than through the testApex...() methods should avoid using this and instead use the
142// various preparers directly, using android.GroupFixturePreparers(...) to group them when
143// necessary.
144//
145// deprecated
146var prepareForApexTest = android.GroupFixturePreparers(
Paul Duffin37aad602021-03-08 09:47:16 +0000147 // General preparers in alphabetical order as test infrastructure will enforce correct
148 // registration order.
149 android.PrepareForTestWithAndroidBuildComponents,
150 bpf.PrepareForTestWithBpf,
151 cc.PrepareForTestWithCcBuildComponents,
Jiakai Zhangb95998b2023-05-11 16:39:27 +0100152 java.PrepareForTestWithDexpreopt,
Paul Duffin37aad602021-03-08 09:47:16 +0000153 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
154 rust.PrepareForTestWithRustDefaultModules,
155 sh.PrepareForTestWithShBuildComponents,
Yu Liueae7b362023-11-16 17:05:47 -0800156 codegen.PrepareForTestWithAconfigBuildComponents,
Paul Duffin37aad602021-03-08 09:47:16 +0000157
158 PrepareForTestWithApexBuildComponents,
159
160 // Additional apex test specific preparers.
161 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
162 filegroup {
163 name: "myapex-file_contexts",
164 srcs: [
165 "apex/myapex-file_contexts",
166 ],
167 }
168 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000169 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000170 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000171 "a.java": nil,
172 "PrebuiltAppFoo.apk": nil,
173 "PrebuiltAppFooPriv.apk": nil,
174 "apex_manifest.json": nil,
175 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000176 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
177 "system/sepolicy/apex/myapex2-file_contexts": nil,
178 "system/sepolicy/apex/otherapex-file_contexts": nil,
179 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
180 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Crossabc0dab2022-04-07 17:39:21 -0700181 "mylib.cpp": nil,
182 "mytest.cpp": nil,
183 "mytest1.cpp": nil,
184 "mytest2.cpp": nil,
185 "mytest3.cpp": nil,
186 "myprebuilt": nil,
187 "my_include": nil,
188 "foo/bar/MyClass.java": nil,
189 "prebuilt.jar": nil,
190 "prebuilt.so": nil,
191 "vendor/foo/devkeys/test.x509.pem": nil,
192 "vendor/foo/devkeys/test.pk8": nil,
193 "testkey.x509.pem": nil,
194 "testkey.pk8": nil,
195 "testkey.override.x509.pem": nil,
196 "testkey.override.pk8": nil,
197 "vendor/foo/devkeys/testkey.avbpubkey": nil,
198 "vendor/foo/devkeys/testkey.pem": nil,
199 "NOTICE": nil,
200 "custom_notice": nil,
201 "custom_notice_for_static_lib": nil,
202 "testkey2.avbpubkey": nil,
203 "testkey2.pem": nil,
204 "myapex-arm64.apex": nil,
205 "myapex-arm.apex": nil,
206 "myapex.apks": nil,
207 "frameworks/base/api/current.txt": nil,
208 "framework/aidl/a.aidl": nil,
209 "dummy.txt": nil,
210 "baz": nil,
211 "bar/baz": nil,
212 "testdata/baz": nil,
213 "AppSet.apks": nil,
214 "foo.rs": nil,
215 "libfoo.jar": nil,
216 "libbar.jar": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000217 },
218 ),
219
220 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
Paul Duffin37aad602021-03-08 09:47:16 +0000221 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
222 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
223 variables.Platform_sdk_codename = proptools.StringPtr("Q")
224 variables.Platform_sdk_final = proptools.BoolPtr(false)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000225 // "Tiramisu" needs to be in the next line for compatibility with soong code,
226 // not because of these tests specifically (it's not used by the tests)
227 variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000228 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
Paul Duffin37aad602021-03-08 09:47:16 +0000229 }),
230)
231
Paul Duffin52bfaa42021-03-23 23:40:12 +0000232var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
233 "system/sepolicy/apex/myapex-file_contexts": nil,
234})
235
Jooyung Han643adc42020-02-27 13:50:06 +0900236// ensure that 'result' equals 'expected'
237func ensureEquals(t *testing.T, result string, expected string) {
238 t.Helper()
239 if result != expected {
240 t.Errorf("%q != %q", expected, result)
241 }
242}
243
Jiyong Park25fc6a92018-11-18 18:02:45 +0900244// ensure that 'result' contains 'expected'
245func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900246 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900247 if !strings.Contains(result, expected) {
248 t.Errorf("%q is not found in %q", expected, result)
249 }
250}
251
Liz Kammer5bd365f2020-05-27 15:15:11 -0700252// ensure that 'result' contains 'expected' exactly one time
253func ensureContainsOnce(t *testing.T, result string, expected string) {
254 t.Helper()
255 count := strings.Count(result, expected)
256 if count != 1 {
257 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
258 }
259}
260
Jiyong Park25fc6a92018-11-18 18:02:45 +0900261// ensures that 'result' does not contain 'notExpected'
262func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900263 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900264 if strings.Contains(result, notExpected) {
265 t.Errorf("%q is found in %q", notExpected, result)
266 }
267}
268
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700269func ensureMatches(t *testing.T, result string, expectedRex string) {
Jooyung Hana3fddf42024-09-03 13:22:21 +0900270 t.Helper()
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700271 ok, err := regexp.MatchString(expectedRex, result)
272 if err != nil {
273 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
274 return
275 }
276 if !ok {
277 t.Errorf("%s does not match regular expession %s", result, expectedRex)
278 }
279}
280
Jooyung Hana3fddf42024-09-03 13:22:21 +0900281func ensureListContainsMatch(t *testing.T, result []string, expectedRex string) {
282 t.Helper()
283 p := regexp.MustCompile(expectedRex)
284 if android.IndexListPred(func(s string) bool { return p.MatchString(s) }, result) == -1 {
285 t.Errorf("%q is not found in %v", expectedRex, result)
286 }
287}
288
Jiyong Park25fc6a92018-11-18 18:02:45 +0900289func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900290 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900291 if !android.InList(expected, result) {
292 t.Errorf("%q is not found in %v", expected, result)
293 }
294}
295
296func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900297 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900298 if android.InList(notExpected, result) {
299 t.Errorf("%q is found in %v", notExpected, result)
300 }
301}
302
Jooyung Hane1633032019-08-01 17:41:43 +0900303func ensureListEmpty(t *testing.T, result []string) {
304 t.Helper()
305 if len(result) > 0 {
306 t.Errorf("%q is expected to be empty", result)
307 }
308}
309
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000310func ensureListNotEmpty(t *testing.T, result []string) {
311 t.Helper()
312 if len(result) == 0 {
313 t.Errorf("%q is expected to be not empty", result)
314 }
315}
316
Jiyong Park25fc6a92018-11-18 18:02:45 +0900317// Minimal test
318func TestBasicApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800319 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900320 apex_defaults {
321 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900322 manifest: ":myapex.manifest",
323 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900324 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900325 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900326 native_shared_libs: [
327 "mylib",
328 "libfoo.ffi",
329 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900330 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800331 multilib: {
332 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900333 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800334 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900335 },
Jiyong Park77acec62020-06-01 21:39:15 +0900336 java_libs: [
337 "myjar",
338 "myjar_dex",
339 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000340 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900341 }
342
Jiyong Park30ca9372019-02-07 16:27:23 +0900343 apex {
344 name: "myapex",
345 defaults: ["myapex-defaults"],
346 }
347
Jiyong Park25fc6a92018-11-18 18:02:45 +0900348 apex_key {
349 name: "myapex.key",
350 public_key: "testkey.avbpubkey",
351 private_key: "testkey.pem",
352 }
353
Jiyong Park809bb722019-02-13 21:33:49 +0900354 filegroup {
355 name: "myapex.manifest",
356 srcs: ["apex_manifest.json"],
357 }
358
359 filegroup {
360 name: "myapex.androidmanifest",
361 srcs: ["AndroidManifest.xml"],
362 }
363
Jiyong Park25fc6a92018-11-18 18:02:45 +0900364 cc_library {
365 name: "mylib",
366 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900367 shared_libs: [
368 "mylib2",
369 "libbar.ffi",
370 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900371 system_shared_libs: [],
372 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000373 // TODO: remove //apex_available:platform
374 apex_available: [
375 "//apex_available:platform",
376 "myapex",
377 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900378 }
379
Alex Light3d673592019-01-18 14:37:31 -0800380 cc_binary {
381 name: "foo",
382 srcs: ["mylib.cpp"],
383 compile_multilib: "both",
384 multilib: {
385 lib32: {
386 suffix: "32",
387 },
388 lib64: {
389 suffix: "64",
390 },
391 },
392 symlinks: ["foo_link_"],
393 symlink_preferred_arch: true,
394 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800395 stl: "none",
Jooyung Han40b79172024-08-16 16:00:33 +0900396 apex_available: [ "myapex" ],
Yifan Hongd22a84a2020-07-28 17:37:46 -0700397 }
398
Jiyong Park99644e92020-11-17 22:21:02 +0900399 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000400 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900401 srcs: ["foo.rs"],
402 rlibs: ["libfoo.rlib.rust"],
Vinh Tran4eeb2a92023-08-14 13:29:30 -0400403 rustlibs: ["libfoo.dylib.rust"],
Jiyong Park99644e92020-11-17 22:21:02 +0900404 apex_available: ["myapex"],
405 }
406
407 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000408 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900409 srcs: ["foo.rs"],
410 crate_name: "foo",
411 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900412 shared_libs: ["libfoo.shared_from_rust"],
413 }
414
415 cc_library_shared {
416 name: "libfoo.shared_from_rust",
417 srcs: ["mylib.cpp"],
418 system_shared_libs: [],
419 stl: "none",
420 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900421 }
422
423 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000424 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900425 srcs: ["foo.rs"],
426 crate_name: "foo",
427 apex_available: ["myapex"],
428 }
429
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900430 rust_ffi_shared {
431 name: "libfoo.ffi",
432 srcs: ["foo.rs"],
433 crate_name: "foo",
434 apex_available: ["myapex"],
435 }
436
437 rust_ffi_shared {
438 name: "libbar.ffi",
439 srcs: ["foo.rs"],
440 crate_name: "bar",
441 apex_available: ["myapex"],
442 }
443
Paul Duffindddd5462020-04-07 15:25:44 +0100444 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900445 name: "mylib2",
446 srcs: ["mylib.cpp"],
447 system_shared_libs: [],
448 stl: "none",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900449 static_libs: ["libstatic"],
450 // TODO: remove //apex_available:platform
451 apex_available: [
452 "//apex_available:platform",
453 "myapex",
454 ],
455 }
456
Paul Duffindddd5462020-04-07 15:25:44 +0100457 cc_prebuilt_library_shared {
458 name: "mylib2",
459 srcs: ["prebuilt.so"],
460 // TODO: remove //apex_available:platform
461 apex_available: [
462 "//apex_available:platform",
463 "myapex",
464 ],
465 }
466
Jiyong Park9918e1a2020-03-17 19:16:40 +0900467 cc_library_static {
468 name: "libstatic",
469 srcs: ["mylib.cpp"],
470 system_shared_libs: [],
471 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000472 // TODO: remove //apex_available:platform
473 apex_available: [
474 "//apex_available:platform",
475 "myapex",
476 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900477 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900478
479 java_library {
480 name: "myjar",
481 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900482 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900483 sdk_version: "none",
484 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900485 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900486 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000487 // TODO: remove //apex_available:platform
488 apex_available: [
489 "//apex_available:platform",
490 "myapex",
491 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900492 }
493
Jiyong Park77acec62020-06-01 21:39:15 +0900494 dex_import {
495 name: "myjar_dex",
496 jars: ["prebuilt.jar"],
497 apex_available: [
498 "//apex_available:platform",
499 "myapex",
500 ],
501 }
502
Jiyong Park7f7766d2019-07-25 22:02:35 +0900503 java_library {
504 name: "myotherjar",
505 srcs: ["foo/bar/MyClass.java"],
506 sdk_version: "none",
507 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900508 // TODO: remove //apex_available:platform
509 apex_available: [
510 "//apex_available:platform",
511 "myapex",
512 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900513 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900514
515 java_library {
516 name: "mysharedjar",
517 srcs: ["foo/bar/MyClass.java"],
518 sdk_version: "none",
519 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900520 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900521 `)
522
Jooyung Hana0503a52023-08-23 13:12:50 +0900523 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900524
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900525 // Make sure that Android.mk is created
Jooyung Hana0503a52023-08-23 13:12:50 +0900526 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700527 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900528 var builder strings.Builder
529 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
530
531 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +0000532 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900533 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
534
Jiyong Park42cca6c2019-04-01 11:15:50 +0900535 optFlags := apexRule.Args["opt_flags"]
536 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700537 // Ensure that the NOTICE output is being packaged as an asset.
Jooyung Hana0503a52023-08-23 13:12:50 +0900538 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900539
Jiyong Park25fc6a92018-11-18 18:02:45 +0900540 copyCmds := apexRule.Args["copy_commands"]
541
542 // Ensure that main rule creates an output
543 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
544
545 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700546 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
547 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
548 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900549 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900550 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900551
552 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700553 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
554 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900555 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
556 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900557 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900558 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900559
560 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800561 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
562 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900563 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900564 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900565 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900566 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
567 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900568 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900569 // .. but not for java libs
570 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900571 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800572
Colin Cross7113d202019-11-20 16:39:12 -0800573 // Ensure that the platform variant ends with _shared or _common
574 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
575 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900576 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
577 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900578 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
579
580 // Ensure that dynamic dependency to java libs are not included
581 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800582
583 // Ensure that all symlinks are present.
584 found_foo_link_64 := false
585 found_foo := false
586 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900587 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800588 if strings.HasSuffix(cmd, "bin/foo") {
589 found_foo = true
590 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
591 found_foo_link_64 = true
592 }
593 }
594 }
595 good := found_foo && found_foo_link_64
596 if !good {
597 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
598 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900599
Colin Crossf61d03d2023-11-02 16:56:39 -0700600 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
601 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100602 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100603 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
604 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
605 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100606
Colin Crossf61d03d2023-11-02 16:56:39 -0700607 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
608 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100609 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100610 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
611 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
612 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800613}
614
Jooyung Hanf21c7972019-12-16 22:32:06 +0900615func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800616 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900617 apex_defaults {
618 name: "myapex-defaults",
619 key: "myapex.key",
620 prebuilts: ["myetc"],
621 native_shared_libs: ["mylib"],
622 java_libs: ["myjar"],
623 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900624 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800625 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000626 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900627 }
628
629 prebuilt_etc {
630 name: "myetc",
631 src: "myprebuilt",
632 }
633
634 apex {
635 name: "myapex",
636 defaults: ["myapex-defaults"],
637 }
638
639 apex_key {
640 name: "myapex.key",
641 public_key: "testkey.avbpubkey",
642 private_key: "testkey.pem",
643 }
644
645 cc_library {
646 name: "mylib",
647 system_shared_libs: [],
648 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000649 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900650 }
651
652 java_library {
653 name: "myjar",
654 srcs: ["foo/bar/MyClass.java"],
655 sdk_version: "none",
656 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000657 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900658 }
659
660 android_app {
661 name: "AppFoo",
662 srcs: ["foo/bar/MyClass.java"],
663 sdk_version: "none",
664 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000665 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900666 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900667
668 runtime_resource_overlay {
669 name: "rro",
670 theme: "blue",
671 }
672
markchien2f59ec92020-09-02 16:23:38 +0800673 bpf {
674 name: "bpf",
675 srcs: ["bpf.c", "bpf2.c"],
676 }
677
Ken Chenfad7f9d2021-11-10 22:02:57 +0800678 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800679 name: "netdTest",
680 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800681 sub_dir: "netd",
682 }
683
Jooyung Hanf21c7972019-12-16 22:32:06 +0900684 `)
Jooyung Hana0503a52023-08-23 13:12:50 +0900685 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900686 "etc/myetc",
687 "javalib/myjar.jar",
688 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000689 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900690 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800691 "etc/bpf/bpf.o",
692 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800693 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900694 })
695}
696
Jooyung Han01a3ee22019-11-02 02:52:25 +0900697func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800698 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900699 apex {
700 name: "myapex",
701 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000702 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900703 }
704
705 apex_key {
706 name: "myapex.key",
707 public_key: "testkey.avbpubkey",
708 private_key: "testkey.pem",
709 }
710 `)
711
Jooyung Hana0503a52023-08-23 13:12:50 +0900712 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +0900713 args := module.Rule("apexRule").Args
714 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
715 t.Error("manifest should be apex_manifest.pb, but " + manifest)
716 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900717}
718
Liz Kammer4854a7d2021-05-27 14:28:27 -0400719func TestApexManifestMinSdkVersion(t *testing.T) {
720 ctx := testApex(t, `
721 apex_defaults {
722 name: "my_defaults",
723 key: "myapex.key",
724 product_specific: true,
725 file_contexts: ":my-file-contexts",
726 updatable: false,
727 }
728 apex {
729 name: "myapex_30",
730 min_sdk_version: "30",
731 defaults: ["my_defaults"],
732 }
733
734 apex {
735 name: "myapex_current",
736 min_sdk_version: "current",
737 defaults: ["my_defaults"],
738 }
739
740 apex {
741 name: "myapex_none",
742 defaults: ["my_defaults"],
743 }
744
745 apex_key {
746 name: "myapex.key",
747 public_key: "testkey.avbpubkey",
748 private_key: "testkey.pem",
749 }
750
751 filegroup {
752 name: "my-file-contexts",
753 srcs: ["product_specific_file_contexts"],
754 }
755 `, withFiles(map[string][]byte{
756 "product_specific_file_contexts": nil,
757 }), android.FixtureModifyProductVariables(
758 func(variables android.FixtureProductVariables) {
759 variables.Unbundled_build = proptools.BoolPtr(true)
760 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
761 }), android.FixtureMergeEnv(map[string]string{
762 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
763 }))
764
765 testCases := []struct {
766 module string
767 minSdkVersion string
768 }{
769 {
770 module: "myapex_30",
771 minSdkVersion: "30",
772 },
773 {
774 module: "myapex_current",
775 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
776 },
777 {
778 module: "myapex_none",
779 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
780 },
781 }
782 for _, tc := range testCases {
Jooyung Hana0503a52023-08-23 13:12:50 +0900783 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
Liz Kammer4854a7d2021-05-27 14:28:27 -0400784 args := module.Rule("apexRule").Args
785 optFlags := args["opt_flags"]
786 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
787 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
788 }
789 }
790}
791
Jihoon Kang842b9992024-02-08 01:41:51 +0000792func TestApexWithDessertSha(t *testing.T) {
793 ctx := testApex(t, `
794 apex_defaults {
795 name: "my_defaults",
796 key: "myapex.key",
797 product_specific: true,
798 file_contexts: ":my-file-contexts",
799 updatable: false,
800 }
801 apex {
802 name: "myapex_30",
803 min_sdk_version: "30",
804 defaults: ["my_defaults"],
805 }
806
807 apex {
808 name: "myapex_current",
809 min_sdk_version: "current",
810 defaults: ["my_defaults"],
811 }
812
813 apex {
814 name: "myapex_none",
815 defaults: ["my_defaults"],
816 }
817
818 apex_key {
819 name: "myapex.key",
820 public_key: "testkey.avbpubkey",
821 private_key: "testkey.pem",
822 }
823
824 filegroup {
825 name: "my-file-contexts",
826 srcs: ["product_specific_file_contexts"],
827 }
828 `, withFiles(map[string][]byte{
829 "product_specific_file_contexts": nil,
830 }), android.FixtureModifyProductVariables(
831 func(variables android.FixtureProductVariables) {
832 variables.Unbundled_build = proptools.BoolPtr(true)
833 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
834 }), android.FixtureMergeEnv(map[string]string{
835 "UNBUNDLED_BUILD_TARGET_SDK_WITH_DESSERT_SHA": "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
836 }))
837
838 testCases := []struct {
839 module string
840 minSdkVersion string
841 }{
842 {
843 module: "myapex_30",
844 minSdkVersion: "30",
845 },
846 {
847 module: "myapex_current",
848 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
849 },
850 {
851 module: "myapex_none",
852 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
853 },
854 }
855 for _, tc := range testCases {
856 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
857 args := module.Rule("apexRule").Args
858 optFlags := args["opt_flags"]
859 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
860 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
861 }
862 }
863}
864
Jooyung Hanaf730952023-02-28 14:13:38 +0900865func TestFileContexts(t *testing.T) {
Jooyung Hanbe953902023-05-31 16:42:16 +0900866 for _, vendor := range []bool{true, false} {
Jooyung Hanaf730952023-02-28 14:13:38 +0900867 prop := ""
Jooyung Hanbe953902023-05-31 16:42:16 +0900868 if vendor {
869 prop = "vendor: true,\n"
Jooyung Hanaf730952023-02-28 14:13:38 +0900870 }
871 ctx := testApex(t, `
872 apex {
873 name: "myapex",
874 key: "myapex.key",
Jooyung Hanaf730952023-02-28 14:13:38 +0900875 updatable: false,
Jooyung Hanaf730952023-02-28 14:13:38 +0900876 `+prop+`
877 }
878
879 apex_key {
880 name: "myapex.key",
881 public_key: "testkey.avbpubkey",
882 private_key: "testkey.pem",
883 }
Jooyung Hanbe953902023-05-31 16:42:16 +0900884 `)
Jooyung Hanaf730952023-02-28 14:13:38 +0900885
Jooyung Hana0503a52023-08-23 13:12:50 +0900886 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("file_contexts")
Jooyung Hanbe953902023-05-31 16:42:16 +0900887 if vendor {
888 android.AssertStringDoesContain(t, "should force-label as vendor_apex_metadata_file",
889 rule.RuleParams.Command,
890 "apex_manifest\\\\.pb u:object_r:vendor_apex_metadata_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900891 } else {
Jooyung Hanbe953902023-05-31 16:42:16 +0900892 android.AssertStringDoesContain(t, "should force-label as system_file",
893 rule.RuleParams.Command,
894 "apex_manifest\\\\.pb u:object_r:system_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900895 }
896 }
897}
898
Jiyong Park25fc6a92018-11-18 18:02:45 +0900899func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800900 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900901 apex {
902 name: "myapex",
903 key: "myapex.key",
904 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900905 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000906 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900907 }
908
909 apex_key {
910 name: "myapex.key",
911 public_key: "testkey.avbpubkey",
912 private_key: "testkey.pem",
913 }
914
915 cc_library {
916 name: "mylib",
917 srcs: ["mylib.cpp"],
Spandan Das357ffcc2024-07-24 18:07:48 +0000918 shared_libs: ["mylib2", "mylib3", "my_prebuilt_platform_lib", "my_prebuilt_platform_stub_only_lib"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900919 system_shared_libs: [],
920 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000921 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900922 }
923
924 cc_library {
925 name: "mylib2",
926 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900927 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900928 system_shared_libs: [],
929 stl: "none",
930 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +0000931 symbol_file: "mylib2.map.txt",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900932 versions: ["1", "2", "3"],
933 },
934 }
935
936 cc_library {
937 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900938 srcs: ["mylib.cpp"],
939 shared_libs: ["mylib4"],
940 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900941 stl: "none",
942 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +0000943 symbol_file: "mylib3.map.txt",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900944 versions: ["10", "11", "12"],
945 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000946 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900947 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900948
949 cc_library {
950 name: "mylib4",
951 srcs: ["mylib.cpp"],
952 system_shared_libs: [],
953 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000954 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900955 }
Jiyong Park105dc322021-06-11 17:22:09 +0900956
Spandan Das357ffcc2024-07-24 18:07:48 +0000957 cc_prebuilt_library_shared {
958 name: "my_prebuilt_platform_lib",
959 stubs: {
960 symbol_file: "my_prebuilt_platform_lib.map.txt",
961 versions: ["1", "2", "3"],
962 },
963 srcs: ["foo.so"],
964 }
965
966 // Similar to my_prebuilt_platform_lib, but this library only provides stubs, i.e. srcs is empty
967 cc_prebuilt_library_shared {
968 name: "my_prebuilt_platform_stub_only_lib",
969 stubs: {
970 symbol_file: "my_prebuilt_platform_stub_only_lib.map.txt",
971 versions: ["1", "2", "3"],
972 }
973 }
974
Jiyong Park105dc322021-06-11 17:22:09 +0900975 rust_binary {
976 name: "foo.rust",
977 srcs: ["foo.rs"],
978 shared_libs: ["libfoo.shared_from_rust"],
979 prefer_rlib: true,
980 apex_available: ["myapex"],
981 }
982
983 cc_library_shared {
984 name: "libfoo.shared_from_rust",
985 srcs: ["mylib.cpp"],
986 system_shared_libs: [],
987 stl: "none",
988 stubs: {
989 versions: ["10", "11", "12"],
990 },
991 }
992
Jiyong Park25fc6a92018-11-18 18:02:45 +0900993 `)
994
Jooyung Hana0503a52023-08-23 13:12:50 +0900995 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900996 copyCmds := apexRule.Args["copy_commands"]
997
998 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800999 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001000
1001 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -08001002 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001003
1004 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -08001005 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001006
Colin Crossaede88c2020-08-11 12:17:01 -07001007 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001008
1009 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001010 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001011 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +09001012 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001013
1014 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
Colin Crossaede88c2020-08-11 12:17:01 -07001015 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001016 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -07001017 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +09001018
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001019 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
1020 // is replaced by sharing of "cFlags" in cc/builder.go.
1021 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
1022 // module variable representing "cflags". So it was not detected by ensureNotContains.
1023 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
1024 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
1025 // including the original cflags's "-include mylib.h".
1026 //
Jiyong Park64379952018-12-13 18:37:29 +09001027 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001028 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1029 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +09001030
Jiyong Park85cc35a2022-07-17 11:30:47 +09001031 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1032 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
1033 // Ensure that genstub for apex-provided lib is invoked with --apex
1034 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +09001035
Jooyung Hana0503a52023-08-23 13:12:50 +09001036 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +09001037 "lib64/mylib.so",
1038 "lib64/mylib3.so",
1039 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +09001040 "bin/foo.rust",
1041 "lib64/libc++.so", // by the implicit dependency from foo.rust
1042 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +09001043 })
Jiyong Park105dc322021-06-11 17:22:09 +09001044
1045 // Ensure that stub dependency from a rust module is not included
1046 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1047 // The rust module is linked to the stub cc library
Colin Cross004bd3f2023-10-02 11:39:17 -07001048 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +09001049 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1050 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +09001051
Jooyung Hana0503a52023-08-23 13:12:50 +09001052 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jiyong Park34d5c332022-02-24 18:02:44 +09001053 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Spandan Das357ffcc2024-07-24 18:07:48 +00001054
1055 // Ensure that mylib is linking with the latest version of stubs for my_prebuilt_platform_lib
1056 ensureContains(t, mylibLdFlags, "my_prebuilt_platform_lib/android_arm64_armv8-a_shared_current/my_prebuilt_platform_lib.so")
1057 // ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib
1058 ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_lib.so")
1059 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1060 ensureContains(t, ctx.ModuleForTests("my_prebuilt_platform_lib", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
1061
1062 // Ensure that mylib is linking with the latest version of stubs for my_prebuilt_platform_lib
1063 ensureContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared_current/my_prebuilt_platform_stub_only_lib.so")
1064 // ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib
1065 ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_stub_only_lib.so")
1066 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1067 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 +09001068}
1069
Jooyung Han20348752023-12-05 15:23:56 +09001070func TestApexShouldNotEmbedStubVariant(t *testing.T) {
1071 testApexError(t, `module "myapex" .*: native_shared_libs: "libbar" is a stub`, `
1072 apex {
1073 name: "myapex",
1074 key: "myapex.key",
1075 vendor: true,
1076 updatable: false,
1077 native_shared_libs: ["libbar"], // should not add an LLNDK stub in a vendor apex
1078 }
1079
1080 apex_key {
1081 name: "myapex.key",
1082 public_key: "testkey.avbpubkey",
1083 private_key: "testkey.pem",
1084 }
1085
1086 cc_library {
1087 name: "libbar",
1088 srcs: ["mylib.cpp"],
1089 llndk: {
1090 symbol_file: "libbar.map.txt",
1091 }
1092 }
1093 `)
1094}
1095
Jiyong Park1bc84122021-06-22 20:23:05 +09001096func TestApexCanUsePrivateApis(t *testing.T) {
1097 ctx := testApex(t, `
1098 apex {
1099 name: "myapex",
1100 key: "myapex.key",
1101 native_shared_libs: ["mylib"],
1102 binaries: ["foo.rust"],
1103 updatable: false,
1104 platform_apis: true,
1105 }
1106
1107 apex_key {
1108 name: "myapex.key",
1109 public_key: "testkey.avbpubkey",
1110 private_key: "testkey.pem",
1111 }
1112
1113 cc_library {
1114 name: "mylib",
1115 srcs: ["mylib.cpp"],
1116 shared_libs: ["mylib2"],
1117 system_shared_libs: [],
1118 stl: "none",
1119 apex_available: [ "myapex" ],
1120 }
1121
1122 cc_library {
1123 name: "mylib2",
1124 srcs: ["mylib.cpp"],
1125 cflags: ["-include mylib.h"],
1126 system_shared_libs: [],
1127 stl: "none",
1128 stubs: {
1129 versions: ["1", "2", "3"],
1130 },
1131 }
1132
1133 rust_binary {
1134 name: "foo.rust",
1135 srcs: ["foo.rs"],
1136 shared_libs: ["libfoo.shared_from_rust"],
1137 prefer_rlib: true,
1138 apex_available: ["myapex"],
1139 }
1140
1141 cc_library_shared {
1142 name: "libfoo.shared_from_rust",
1143 srcs: ["mylib.cpp"],
1144 system_shared_libs: [],
1145 stl: "none",
1146 stubs: {
1147 versions: ["10", "11", "12"],
1148 },
1149 }
1150 `)
1151
Jooyung Hana0503a52023-08-23 13:12:50 +09001152 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park1bc84122021-06-22 20:23:05 +09001153 copyCmds := apexRule.Args["copy_commands"]
1154
1155 // Ensure that indirect stubs dep is not included
1156 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1157 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1158
1159 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1160 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001161 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001162 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1163 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Colin Cross004bd3f2023-10-02 11:39:17 -07001164 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001165 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1166 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1167}
1168
Colin Cross7812fd32020-09-25 12:35:10 -07001169func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1170 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001171 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001172 apex {
1173 name: "myapex",
1174 key: "myapex.key",
1175 native_shared_libs: ["mylib", "mylib3"],
1176 min_sdk_version: "29",
1177 }
1178
1179 apex_key {
1180 name: "myapex.key",
1181 public_key: "testkey.avbpubkey",
1182 private_key: "testkey.pem",
1183 }
1184
1185 cc_library {
1186 name: "mylib",
1187 srcs: ["mylib.cpp"],
1188 shared_libs: ["mylib2", "mylib3"],
1189 system_shared_libs: [],
1190 stl: "none",
1191 apex_available: [ "myapex" ],
1192 min_sdk_version: "28",
1193 }
1194
1195 cc_library {
1196 name: "mylib2",
1197 srcs: ["mylib.cpp"],
1198 cflags: ["-include mylib.h"],
1199 system_shared_libs: [],
1200 stl: "none",
1201 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +00001202 symbol_file: "mylib2.map.txt",
Colin Cross7812fd32020-09-25 12:35:10 -07001203 versions: ["28", "29", "30", "current"],
1204 },
1205 min_sdk_version: "28",
1206 }
1207
1208 cc_library {
1209 name: "mylib3",
1210 srcs: ["mylib.cpp"],
1211 shared_libs: ["mylib4"],
1212 system_shared_libs: [],
1213 stl: "none",
1214 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +00001215 symbol_file: "mylib3.map.txt",
Colin Cross7812fd32020-09-25 12:35:10 -07001216 versions: ["28", "29", "30", "current"],
1217 },
1218 apex_available: [ "myapex" ],
1219 min_sdk_version: "28",
1220 }
1221
1222 cc_library {
1223 name: "mylib4",
1224 srcs: ["mylib.cpp"],
1225 system_shared_libs: [],
1226 stl: "none",
1227 apex_available: [ "myapex" ],
1228 min_sdk_version: "28",
1229 }
1230 `)
1231
Jooyung Hana0503a52023-08-23 13:12:50 +09001232 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Colin Cross7812fd32020-09-25 12:35:10 -07001233 copyCmds := apexRule.Args["copy_commands"]
1234
1235 // Ensure that direct non-stubs dep is always included
1236 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1237
1238 // Ensure that indirect stubs dep is not included
1239 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1240
1241 // Ensure that direct stubs dep is included
1242 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1243
1244 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1245
Jiyong Park55549df2021-02-26 23:57:23 +09001246 // Ensure that mylib is linking with the latest version of stub for mylib2
1247 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001248 // ... and not linking to the non-stub (impl) variant of mylib2
1249 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1250
1251 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1252 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1253 // .. and not linking to the stubs variant of mylib3
1254 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1255
1256 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001257 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001258 ensureNotContains(t, mylib2Cflags, "-include ")
1259
Jiyong Park85cc35a2022-07-17 11:30:47 +09001260 // Ensure that genstub is invoked with --systemapi
1261 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001262
Jooyung Hana0503a52023-08-23 13:12:50 +09001263 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Colin Cross7812fd32020-09-25 12:35:10 -07001264 "lib64/mylib.so",
1265 "lib64/mylib3.so",
1266 "lib64/mylib4.so",
1267 })
1268}
1269
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001270func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1271 t.Parallel()
1272 // myapex (Z)
1273 // mylib -----------------.
1274 // |
1275 // otherapex (29) |
1276 // libstub's versions: 29 Z current
1277 // |
1278 // <platform> |
1279 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001280 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001281 apex {
1282 name: "myapex",
1283 key: "myapex.key",
1284 native_shared_libs: ["mylib"],
1285 min_sdk_version: "Z", // non-final
1286 }
1287
1288 cc_library {
1289 name: "mylib",
1290 srcs: ["mylib.cpp"],
1291 shared_libs: ["libstub"],
1292 apex_available: ["myapex"],
1293 min_sdk_version: "Z",
1294 }
1295
1296 apex_key {
1297 name: "myapex.key",
1298 public_key: "testkey.avbpubkey",
1299 private_key: "testkey.pem",
1300 }
1301
1302 apex {
1303 name: "otherapex",
1304 key: "myapex.key",
1305 native_shared_libs: ["libstub"],
1306 min_sdk_version: "29",
1307 }
1308
1309 cc_library {
1310 name: "libstub",
1311 srcs: ["mylib.cpp"],
1312 stubs: {
1313 versions: ["29", "Z", "current"],
1314 },
1315 apex_available: ["otherapex"],
1316 min_sdk_version: "29",
1317 }
1318
1319 // platform module depending on libstub from otherapex should use the latest stub("current")
1320 cc_library {
1321 name: "libplatform",
1322 srcs: ["mylib.cpp"],
1323 shared_libs: ["libstub"],
1324 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001325 `,
1326 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1327 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1328 variables.Platform_sdk_final = proptools.BoolPtr(false)
1329 variables.Platform_version_active_codenames = []string{"Z"}
1330 }),
1331 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001332
Jiyong Park55549df2021-02-26 23:57:23 +09001333 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001334 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001335 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001336 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001337 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001338
1339 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1340 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1341 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1342 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1343 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1344}
1345
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001346func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001347 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001348 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001349 name: "myapex2",
1350 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001351 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001352 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001353 }
1354
1355 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001356 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001357 public_key: "testkey.avbpubkey",
1358 private_key: "testkey.pem",
1359 }
1360
1361 cc_library {
1362 name: "mylib",
1363 srcs: ["mylib.cpp"],
1364 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001365 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001366 system_shared_libs: [],
1367 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001368 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001369 }
1370
1371 cc_library {
1372 name: "libfoo",
1373 srcs: ["mylib.cpp"],
1374 shared_libs: ["libbar"],
1375 system_shared_libs: [],
1376 stl: "none",
1377 stubs: {
1378 versions: ["10", "20", "30"],
1379 },
1380 }
1381
1382 cc_library {
1383 name: "libbar",
1384 srcs: ["mylib.cpp"],
1385 system_shared_libs: [],
1386 stl: "none",
1387 }
1388
Jiyong Park678c8812020-02-07 17:25:49 +09001389 cc_library_static {
1390 name: "libbaz",
1391 srcs: ["mylib.cpp"],
1392 system_shared_libs: [],
1393 stl: "none",
1394 apex_available: [ "myapex2" ],
1395 }
1396
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001397 `)
1398
Jooyung Hana0503a52023-08-23 13:12:50 +09001399 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001400 copyCmds := apexRule.Args["copy_commands"]
1401
1402 // Ensure that direct non-stubs dep is always included
1403 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1404
1405 // Ensure that indirect stubs dep is not included
1406 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1407
1408 // Ensure that dependency of stubs is not included
1409 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1410
Colin Crossaede88c2020-08-11 12:17:01 -07001411 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001412
1413 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001414 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001415 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001416 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001417
Jiyong Park3ff16992019-12-27 14:11:47 +09001418 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001419
1420 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1421 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001422
Colin Crossf61d03d2023-11-02 16:56:39 -07001423 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1424 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001425 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001426
Colin Crossf61d03d2023-11-02 16:56:39 -07001427 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1428 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001429 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001430}
1431
Jooyung Hand3639552019-08-09 12:57:43 +09001432func TestApexWithRuntimeLibsDependency(t *testing.T) {
1433 /*
1434 myapex
1435 |
1436 v (runtime_libs)
1437 mylib ------+------> libfoo [provides stub]
1438 |
1439 `------> libbar
1440 */
Colin Cross1c460562021-02-16 17:55:47 -08001441 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001442 apex {
1443 name: "myapex",
1444 key: "myapex.key",
1445 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001446 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001447 }
1448
1449 apex_key {
1450 name: "myapex.key",
1451 public_key: "testkey.avbpubkey",
1452 private_key: "testkey.pem",
1453 }
1454
1455 cc_library {
1456 name: "mylib",
1457 srcs: ["mylib.cpp"],
Liz Kammer5f108fa2023-05-11 14:33:17 -04001458 static_libs: ["libstatic"],
1459 shared_libs: ["libshared"],
Jooyung Hand3639552019-08-09 12:57:43 +09001460 runtime_libs: ["libfoo", "libbar"],
1461 system_shared_libs: [],
1462 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001463 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001464 }
1465
1466 cc_library {
1467 name: "libfoo",
1468 srcs: ["mylib.cpp"],
1469 system_shared_libs: [],
1470 stl: "none",
1471 stubs: {
1472 versions: ["10", "20", "30"],
1473 },
1474 }
1475
1476 cc_library {
1477 name: "libbar",
1478 srcs: ["mylib.cpp"],
1479 system_shared_libs: [],
1480 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001481 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001482 }
1483
Liz Kammer5f108fa2023-05-11 14:33:17 -04001484 cc_library {
1485 name: "libstatic",
1486 srcs: ["mylib.cpp"],
1487 system_shared_libs: [],
1488 stl: "none",
1489 apex_available: [ "myapex" ],
1490 runtime_libs: ["libstatic_to_runtime"],
1491 }
1492
1493 cc_library {
1494 name: "libshared",
1495 srcs: ["mylib.cpp"],
1496 system_shared_libs: [],
1497 stl: "none",
1498 apex_available: [ "myapex" ],
1499 runtime_libs: ["libshared_to_runtime"],
1500 }
1501
1502 cc_library {
1503 name: "libstatic_to_runtime",
1504 srcs: ["mylib.cpp"],
1505 system_shared_libs: [],
1506 stl: "none",
1507 apex_available: [ "myapex" ],
1508 }
1509
1510 cc_library {
1511 name: "libshared_to_runtime",
1512 srcs: ["mylib.cpp"],
1513 system_shared_libs: [],
1514 stl: "none",
1515 apex_available: [ "myapex" ],
1516 }
Jooyung Hand3639552019-08-09 12:57:43 +09001517 `)
1518
Jooyung Hana0503a52023-08-23 13:12:50 +09001519 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001520 copyCmds := apexRule.Args["copy_commands"]
1521
1522 // Ensure that direct non-stubs dep is always included
1523 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1524
1525 // Ensure that indirect stubs dep is not included
1526 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1527
1528 // Ensure that runtime_libs dep in included
1529 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
Liz Kammer5f108fa2023-05-11 14:33:17 -04001530 ensureContains(t, copyCmds, "image.apex/lib64/libshared.so")
1531 ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so")
1532
1533 ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001534
Jooyung Hana0503a52023-08-23 13:12:50 +09001535 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001536 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1537 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001538}
1539
Paul Duffina02cae32021-03-09 01:44:06 +00001540var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1541 cc.PrepareForTestWithCcBuildComponents,
1542 PrepareForTestWithApexBuildComponents,
1543 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001544 apex {
1545 name: "com.android.runtime",
1546 key: "com.android.runtime.key",
1547 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001548 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001549 }
1550
1551 apex_key {
1552 name: "com.android.runtime.key",
1553 public_key: "testkey.avbpubkey",
1554 private_key: "testkey.pem",
1555 }
Paul Duffina02cae32021-03-09 01:44:06 +00001556 `),
1557 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1558)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001559
Paul Duffina02cae32021-03-09 01:44:06 +00001560func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001561 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001562 cc_library {
1563 name: "libc",
1564 no_libcrt: true,
1565 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001566 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001567 stl: "none",
1568 system_shared_libs: [],
1569 stubs: { versions: ["1"] },
1570 apex_available: ["com.android.runtime"],
1571
1572 sanitize: {
1573 hwaddress: true,
1574 }
1575 }
1576
1577 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001578 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001579 no_libcrt: true,
1580 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001581 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001582 stl: "none",
1583 system_shared_libs: [],
1584 srcs: [""],
1585 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001586 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001587
1588 sanitize: {
1589 never: true,
1590 },
Spandan Das4de7b492023-05-05 21:13:01 +00001591 apex_available: [
1592 "//apex_available:anyapex",
1593 "//apex_available:platform",
1594 ],
Paul Duffina02cae32021-03-09 01:44:06 +00001595 } `)
1596 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001597
Jooyung Hana0503a52023-08-23 13:12:50 +09001598 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001599 "lib64/bionic/libc.so",
1600 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1601 })
1602
Colin Cross4c4c1be2022-02-10 11:41:18 -08001603 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001604
1605 installed := hwasan.Description("install libclang_rt.hwasan")
1606 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1607
1608 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1609 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1610 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1611}
1612
1613func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001614 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001615 prepareForTestOfRuntimeApexWithHwasan,
1616 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1617 variables.SanitizeDevice = []string{"hwaddress"}
1618 }),
1619 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001620 cc_library {
1621 name: "libc",
1622 no_libcrt: true,
1623 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001624 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001625 stl: "none",
1626 system_shared_libs: [],
1627 stubs: { versions: ["1"] },
1628 apex_available: ["com.android.runtime"],
1629 }
1630
1631 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001632 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001633 no_libcrt: true,
1634 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001635 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001636 stl: "none",
1637 system_shared_libs: [],
1638 srcs: [""],
1639 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001640 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001641
1642 sanitize: {
1643 never: true,
1644 },
Spandan Das4de7b492023-05-05 21:13:01 +00001645 apex_available: [
1646 "//apex_available:anyapex",
1647 "//apex_available:platform",
1648 ],
Jooyung Han8ce8db92020-05-15 19:05:05 +09001649 }
Paul Duffina02cae32021-03-09 01:44:06 +00001650 `)
1651 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001652
Jooyung Hana0503a52023-08-23 13:12:50 +09001653 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001654 "lib64/bionic/libc.so",
1655 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1656 })
1657
Colin Cross4c4c1be2022-02-10 11:41:18 -08001658 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001659
1660 installed := hwasan.Description("install libclang_rt.hwasan")
1661 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1662
1663 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1664 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1665 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1666}
1667
Jooyung Han61b66e92020-03-21 14:21:46 +00001668func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1669 testcases := []struct {
1670 name string
1671 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001672 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001673 shouldLink string
1674 shouldNotLink []string
1675 }{
1676 {
Jiyong Park55549df2021-02-26 23:57:23 +09001677 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001678 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001679 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001680 shouldLink: "current",
1681 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001682 },
1683 {
Jiyong Park55549df2021-02-26 23:57:23 +09001684 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001685 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001686 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001687 shouldLink: "current",
1688 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001689 },
1690 }
1691 for _, tc := range testcases {
1692 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001693 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001694 apex {
1695 name: "myapex",
1696 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001697 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001698 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001699 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001700 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001701
Jooyung Han61b66e92020-03-21 14:21:46 +00001702 apex_key {
1703 name: "myapex.key",
1704 public_key: "testkey.avbpubkey",
1705 private_key: "testkey.pem",
1706 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001707
Jooyung Han61b66e92020-03-21 14:21:46 +00001708 cc_library {
1709 name: "mylib",
1710 srcs: ["mylib.cpp"],
1711 vendor_available: true,
1712 shared_libs: ["libbar"],
1713 system_shared_libs: [],
1714 stl: "none",
1715 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001716 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001717 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001718
Jooyung Han61b66e92020-03-21 14:21:46 +00001719 cc_library {
1720 name: "libbar",
1721 srcs: ["mylib.cpp"],
1722 system_shared_libs: [],
1723 stl: "none",
1724 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001725 llndk: {
1726 symbol_file: "libbar.map.txt",
1727 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001728 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001729 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001730 withUnbundledBuild,
1731 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001732
Jooyung Han61b66e92020-03-21 14:21:46 +00001733 // Ensure that LLNDK dep is not included
Jooyung Hana0503a52023-08-23 13:12:50 +09001734 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han61b66e92020-03-21 14:21:46 +00001735 "lib64/mylib.so",
1736 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001737
Jooyung Han61b66e92020-03-21 14:21:46 +00001738 // Ensure that LLNDK dep is required
Jooyung Hana0503a52023-08-23 13:12:50 +09001739 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han61b66e92020-03-21 14:21:46 +00001740 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1741 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001742
Steven Moreland2c4000c2021-04-27 02:08:49 +00001743 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1744 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001745 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001746 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001747 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001748
Steven Moreland2c4000c2021-04-27 02:08:49 +00001749 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001750 ver := tc.shouldLink
1751 if tc.shouldLink == "current" {
1752 ver = strconv.Itoa(android.FutureApiLevelInt)
1753 }
1754 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001755 })
1756 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001757}
1758
Jiyong Park25fc6a92018-11-18 18:02:45 +09001759func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001760 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001761 apex {
1762 name: "myapex",
1763 key: "myapex.key",
1764 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001765 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001766 }
1767
1768 apex_key {
1769 name: "myapex.key",
1770 public_key: "testkey.avbpubkey",
1771 private_key: "testkey.pem",
1772 }
1773
1774 cc_library {
1775 name: "mylib",
1776 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001777 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001778 shared_libs: ["libdl#27"],
1779 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001780 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001781 }
1782
1783 cc_library_shared {
1784 name: "mylib_shared",
1785 srcs: ["mylib.cpp"],
1786 shared_libs: ["libdl#27"],
1787 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001788 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001789 }
1790
1791 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001792 name: "libBootstrap",
1793 srcs: ["mylib.cpp"],
1794 stl: "none",
1795 bootstrap: true,
1796 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001797 `)
1798
Jooyung Hana0503a52023-08-23 13:12:50 +09001799 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001800 copyCmds := apexRule.Args["copy_commands"]
1801
1802 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001803 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001804 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1805 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001806
1807 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001808 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001809
Colin Crossaede88c2020-08-11 12:17:01 -07001810 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1811 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1812 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001813
1814 // For dependency to libc
1815 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001816 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001817 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001818 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001819 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001820 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1821 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001822
1823 // For dependency to libm
1824 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001825 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001826 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001827 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001828 // ... and is not compiling with the stub
1829 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1830 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1831
1832 // For dependency to libdl
1833 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001834 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001835 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001836 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1837 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001838 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001839 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001840 // ... Cflags from stub is correctly exported to mylib
1841 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1842 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001843
1844 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001845 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1846 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1847 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1848 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001849}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001850
Jooyung Han749dc692020-04-15 11:03:39 +09001851func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001852 // there are three links between liba --> libz.
1853 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001854 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001855 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001856 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001857 apex {
1858 name: "myapex",
1859 key: "myapex.key",
1860 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001861 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001862 }
1863
1864 apex {
1865 name: "otherapex",
1866 key: "myapex.key",
1867 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001868 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001869 }
1870
1871 apex_key {
1872 name: "myapex.key",
1873 public_key: "testkey.avbpubkey",
1874 private_key: "testkey.pem",
1875 }
1876
1877 cc_library {
1878 name: "libx",
1879 shared_libs: ["liba"],
1880 system_shared_libs: [],
1881 stl: "none",
1882 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001883 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001884 }
1885
1886 cc_library {
1887 name: "liby",
1888 shared_libs: ["liba"],
1889 system_shared_libs: [],
1890 stl: "none",
1891 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001892 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001893 }
1894
1895 cc_library {
1896 name: "liba",
1897 shared_libs: ["libz"],
1898 system_shared_libs: [],
1899 stl: "none",
1900 apex_available: [
1901 "//apex_available:anyapex",
1902 "//apex_available:platform",
1903 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001904 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001905 }
1906
1907 cc_library {
1908 name: "libz",
1909 system_shared_libs: [],
1910 stl: "none",
1911 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001912 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001913 },
1914 }
Jooyung Han749dc692020-04-15 11:03:39 +09001915 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001916
1917 expectLink := func(from, from_variant, to, to_variant string) {
1918 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1919 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1920 }
1921 expectNoLink := func(from, from_variant, to, to_variant string) {
1922 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1923 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1924 }
1925 // platform liba is linked to non-stub version
1926 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001927 // liba in myapex is linked to current
1928 expectLink("liba", "shared_apex29", "libz", "shared_current")
1929 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001930 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001931 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001932 // liba in otherapex is linked to current
1933 expectLink("liba", "shared_apex30", "libz", "shared_current")
1934 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001935 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1936 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001937}
1938
Jooyung Hanaed150d2020-04-02 01:41:41 +09001939func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001940 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001941 apex {
1942 name: "myapex",
1943 key: "myapex.key",
1944 native_shared_libs: ["libx"],
1945 min_sdk_version: "R",
1946 }
1947
1948 apex_key {
1949 name: "myapex.key",
1950 public_key: "testkey.avbpubkey",
1951 private_key: "testkey.pem",
1952 }
1953
1954 cc_library {
1955 name: "libx",
1956 shared_libs: ["libz"],
1957 system_shared_libs: [],
1958 stl: "none",
1959 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001960 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001961 }
1962
1963 cc_library {
1964 name: "libz",
1965 system_shared_libs: [],
1966 stl: "none",
1967 stubs: {
1968 versions: ["29", "R"],
1969 },
1970 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001971 `,
1972 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1973 variables.Platform_version_active_codenames = []string{"R"}
1974 }),
1975 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001976
1977 expectLink := func(from, from_variant, to, to_variant string) {
1978 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1979 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1980 }
1981 expectNoLink := func(from, from_variant, to, to_variant string) {
1982 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1983 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1984 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001985 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1986 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001987 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1988 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001989}
1990
Jooyung Han4c4da062021-06-23 10:23:16 +09001991func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1992 testApex(t, `
1993 apex {
1994 name: "myapex",
1995 key: "myapex.key",
1996 java_libs: ["libx"],
1997 min_sdk_version: "S",
1998 }
1999
2000 apex_key {
2001 name: "myapex.key",
2002 public_key: "testkey.avbpubkey",
2003 private_key: "testkey.pem",
2004 }
2005
2006 java_library {
2007 name: "libx",
2008 srcs: ["a.java"],
2009 apex_available: [ "myapex" ],
2010 sdk_version: "current",
2011 min_sdk_version: "S", // should be okay
2012 }
2013 `,
2014 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2015 variables.Platform_version_active_codenames = []string{"S"}
2016 variables.Platform_sdk_codename = proptools.StringPtr("S")
2017 }),
2018 )
2019}
2020
Jooyung Han749dc692020-04-15 11:03:39 +09002021func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002022 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002023 apex {
2024 name: "myapex",
2025 key: "myapex.key",
2026 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002027 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002028 }
2029
2030 apex_key {
2031 name: "myapex.key",
2032 public_key: "testkey.avbpubkey",
2033 private_key: "testkey.pem",
2034 }
2035
2036 cc_library {
2037 name: "libx",
2038 shared_libs: ["libz"],
2039 system_shared_libs: [],
2040 stl: "none",
2041 apex_available: [ "myapex" ],
2042 }
2043
2044 cc_library {
2045 name: "libz",
2046 system_shared_libs: [],
2047 stl: "none",
2048 stubs: {
2049 versions: ["1", "2"],
2050 },
2051 }
2052 `)
2053
2054 expectLink := func(from, from_variant, to, to_variant string) {
2055 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2056 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2057 }
2058 expectNoLink := func(from, from_variant, to, to_variant string) {
2059 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2060 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2061 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002062 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002063 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002064 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07002065 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09002066}
2067
Jooyung Handfc864c2023-03-20 18:19:07 +09002068func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Jiyong Park5df7bd32021-08-25 16:18:46 +09002069 ctx := testApex(t, `
2070 apex {
2071 name: "myapex",
2072 key: "myapex.key",
2073 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09002074 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002075 vendor: true,
2076 min_sdk_version: "29",
2077 }
2078
2079 apex_key {
2080 name: "myapex.key",
2081 public_key: "testkey.avbpubkey",
2082 private_key: "testkey.pem",
2083 }
2084
2085 cc_library {
2086 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09002087 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09002088 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002089 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09002090 shared_libs: ["libbar"],
2091 }
2092
2093 cc_library {
2094 name: "libbar",
2095 stubs: { versions: ["29", "30"] },
2096 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09002097 }
2098 `)
2099
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002100 vendorVariant := "android_vendor_arm64_armv8-a"
Jiyong Park5df7bd32021-08-25 16:18:46 +09002101
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002102 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29")
Jooyung Handfc864c2023-03-20 18:19:07 +09002103
2104 // Ensure that mylib links with "current" LLNDK
2105 libFlags := names(mylib.Rule("ld").Args["libFlags"])
Jooyung Han5e8994e2024-03-12 14:12:12 +09002106 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared/libbar.so")
Jooyung Handfc864c2023-03-20 18:19:07 +09002107
2108 // Ensure that mylib is targeting 29
2109 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
2110 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
2111
2112 // Ensure that the correct variant of crtbegin_so is used.
2113 crtBegin := mylib.Rule("ld").Args["crtBegin"]
2114 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09002115
2116 // Ensure that the crtbegin_so used by the APEX is targeting 29
2117 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
2118 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
2119}
2120
Jooyung Han4495f842023-04-25 16:39:59 +09002121func TestTrackAllowedDeps(t *testing.T) {
2122 ctx := testApex(t, `
2123 apex {
2124 name: "myapex",
2125 key: "myapex.key",
2126 updatable: true,
2127 native_shared_libs: [
2128 "mylib",
2129 "yourlib",
2130 ],
2131 min_sdk_version: "29",
2132 }
2133
2134 apex {
2135 name: "myapex2",
2136 key: "myapex.key",
2137 updatable: false,
2138 native_shared_libs: ["yourlib"],
2139 }
2140
2141 apex_key {
2142 name: "myapex.key",
2143 public_key: "testkey.avbpubkey",
2144 private_key: "testkey.pem",
2145 }
2146
2147 cc_library {
2148 name: "mylib",
2149 srcs: ["mylib.cpp"],
2150 shared_libs: ["libbar"],
2151 min_sdk_version: "29",
2152 apex_available: ["myapex"],
2153 }
2154
2155 cc_library {
2156 name: "libbar",
2157 stubs: { versions: ["29", "30"] },
2158 }
2159
2160 cc_library {
2161 name: "yourlib",
2162 srcs: ["mylib.cpp"],
2163 min_sdk_version: "29",
2164 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2165 }
2166 `, withFiles(android.MockFS{
2167 "packages/modules/common/build/allowed_deps.txt": nil,
2168 }))
2169
2170 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2171 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2172 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002173 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002174 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002175 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002176
Jooyung Hana0503a52023-08-23 13:12:50 +09002177 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07002178 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2179 myapex.Output("depsinfo/flatlist.txt")), "\n")
Jooyung Han4495f842023-04-25 16:39:59 +09002180 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2181 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2182 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2183 flatlist, "mylib:(minSdkVersion:29)")
2184 android.AssertStringListContains(t, "track platform-available lib",
2185 flatlist, "yourlib(minSdkVersion:29)")
2186}
2187
2188func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
2189 ctx := testApex(t, `
2190 apex {
2191 name: "myapex",
2192 key: "myapex.key",
2193 updatable: true,
2194 min_sdk_version: "29",
2195 }
2196
2197 apex_key {
2198 name: "myapex.key",
2199 public_key: "testkey.avbpubkey",
2200 private_key: "testkey.pem",
2201 }
2202 `)
2203 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2204 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2205 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2206 }
2207}
2208
Jooyung Han03b51852020-02-26 22:45:42 +09002209func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002210 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002211 apex {
2212 name: "myapex",
2213 key: "myapex.key",
2214 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002215 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002216 }
2217
2218 apex_key {
2219 name: "myapex.key",
2220 public_key: "testkey.avbpubkey",
2221 private_key: "testkey.pem",
2222 }
2223
2224 cc_library {
2225 name: "libx",
2226 system_shared_libs: [],
2227 stl: "none",
2228 apex_available: [ "myapex" ],
2229 stubs: {
2230 versions: ["1", "2"],
2231 },
2232 }
2233
2234 cc_library {
2235 name: "libz",
2236 shared_libs: ["libx"],
2237 system_shared_libs: [],
2238 stl: "none",
2239 }
2240 `)
2241
2242 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002243 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002244 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2245 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2246 }
2247 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002248 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002249 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2250 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2251 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002252 expectLink("libz", "shared", "libx", "shared_current")
2253 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002254 expectNoLink("libz", "shared", "libz", "shared_1")
2255 expectNoLink("libz", "shared", "libz", "shared")
2256}
2257
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002258var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2259 func(variables android.FixtureProductVariables) {
2260 variables.SanitizeDevice = []string{"hwaddress"}
2261 },
2262)
2263
Jooyung Han75568392020-03-20 04:29:24 +09002264func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002265 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002266 apex {
2267 name: "myapex",
2268 key: "myapex.key",
2269 native_shared_libs: ["libx"],
2270 min_sdk_version: "29",
2271 }
2272
2273 apex_key {
2274 name: "myapex.key",
2275 public_key: "testkey.avbpubkey",
2276 private_key: "testkey.pem",
2277 }
2278
2279 cc_library {
2280 name: "libx",
2281 shared_libs: ["libbar"],
2282 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002283 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002284 }
2285
2286 cc_library {
2287 name: "libbar",
2288 stubs: {
2289 versions: ["29", "30"],
2290 },
2291 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002292 `,
2293 prepareForTestWithSantitizeHwaddress,
2294 )
Jooyung Han03b51852020-02-26 22:45:42 +09002295 expectLink := func(from, from_variant, to, to_variant string) {
2296 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2297 libFlags := ld.Args["libFlags"]
2298 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2299 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002300 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002301}
2302
Jooyung Han75568392020-03-20 04:29:24 +09002303func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002304 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002305 apex {
2306 name: "myapex",
2307 key: "myapex.key",
2308 native_shared_libs: ["libx"],
2309 min_sdk_version: "29",
2310 }
2311
2312 apex_key {
2313 name: "myapex.key",
2314 public_key: "testkey.avbpubkey",
2315 private_key: "testkey.pem",
2316 }
2317
2318 cc_library {
2319 name: "libx",
2320 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002321 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002322 }
Jooyung Han75568392020-03-20 04:29:24 +09002323 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002324
2325 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002326 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002327 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002328 // note that platform variant is not.
2329 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002330 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002331}
2332
Jooyung Han749dc692020-04-15 11:03:39 +09002333func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2334 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002335 apex {
2336 name: "myapex",
2337 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002338 native_shared_libs: ["mylib"],
2339 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002340 }
2341
2342 apex_key {
2343 name: "myapex.key",
2344 public_key: "testkey.avbpubkey",
2345 private_key: "testkey.pem",
2346 }
Jooyung Han749dc692020-04-15 11:03:39 +09002347
2348 cc_library {
2349 name: "mylib",
2350 srcs: ["mylib.cpp"],
2351 system_shared_libs: [],
2352 stl: "none",
2353 apex_available: [
2354 "myapex",
2355 ],
2356 min_sdk_version: "30",
2357 }
2358 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002359
2360 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2361 apex {
2362 name: "myapex",
2363 key: "myapex.key",
2364 native_shared_libs: ["libfoo.ffi"],
2365 min_sdk_version: "29",
2366 }
2367
2368 apex_key {
2369 name: "myapex.key",
2370 public_key: "testkey.avbpubkey",
2371 private_key: "testkey.pem",
2372 }
2373
2374 rust_ffi_shared {
2375 name: "libfoo.ffi",
2376 srcs: ["foo.rs"],
2377 crate_name: "foo",
2378 apex_available: [
2379 "myapex",
2380 ],
2381 min_sdk_version: "30",
2382 }
2383 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002384
2385 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2386 apex {
2387 name: "myapex",
2388 key: "myapex.key",
2389 java_libs: ["libfoo"],
2390 min_sdk_version: "29",
2391 }
2392
2393 apex_key {
2394 name: "myapex.key",
2395 public_key: "testkey.avbpubkey",
2396 private_key: "testkey.pem",
2397 }
2398
2399 java_import {
2400 name: "libfoo",
2401 jars: ["libfoo.jar"],
2402 apex_available: [
2403 "myapex",
2404 ],
2405 min_sdk_version: "30",
2406 }
2407 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002408
2409 // Skip check for modules compiling against core API surface
2410 testApex(t, `
2411 apex {
2412 name: "myapex",
2413 key: "myapex.key",
2414 java_libs: ["libfoo"],
2415 min_sdk_version: "29",
2416 }
2417
2418 apex_key {
2419 name: "myapex.key",
2420 public_key: "testkey.avbpubkey",
2421 private_key: "testkey.pem",
2422 }
2423
2424 java_library {
2425 name: "libfoo",
2426 srcs: ["Foo.java"],
2427 apex_available: [
2428 "myapex",
2429 ],
2430 // Compile against core API surface
2431 sdk_version: "core_current",
2432 min_sdk_version: "30",
2433 }
2434 `)
2435
Jooyung Han749dc692020-04-15 11:03:39 +09002436}
2437
2438func TestApexMinSdkVersion_Okay(t *testing.T) {
2439 testApex(t, `
2440 apex {
2441 name: "myapex",
2442 key: "myapex.key",
2443 native_shared_libs: ["libfoo"],
2444 java_libs: ["libbar"],
2445 min_sdk_version: "29",
2446 }
2447
2448 apex_key {
2449 name: "myapex.key",
2450 public_key: "testkey.avbpubkey",
2451 private_key: "testkey.pem",
2452 }
2453
2454 cc_library {
2455 name: "libfoo",
2456 srcs: ["mylib.cpp"],
2457 shared_libs: ["libfoo_dep"],
2458 apex_available: ["myapex"],
2459 min_sdk_version: "29",
2460 }
2461
2462 cc_library {
2463 name: "libfoo_dep",
2464 srcs: ["mylib.cpp"],
2465 apex_available: ["myapex"],
2466 min_sdk_version: "29",
2467 }
2468
2469 java_library {
2470 name: "libbar",
2471 sdk_version: "current",
2472 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002473 static_libs: [
2474 "libbar_dep",
2475 "libbar_import_dep",
2476 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002477 apex_available: ["myapex"],
2478 min_sdk_version: "29",
2479 }
2480
2481 java_library {
2482 name: "libbar_dep",
2483 sdk_version: "current",
2484 srcs: ["a.java"],
2485 apex_available: ["myapex"],
2486 min_sdk_version: "29",
2487 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002488
2489 java_import {
2490 name: "libbar_import_dep",
2491 jars: ["libbar.jar"],
2492 apex_available: ["myapex"],
2493 min_sdk_version: "29",
2494 }
Jooyung Han03b51852020-02-26 22:45:42 +09002495 `)
2496}
2497
Colin Cross8ca61c12022-10-06 21:00:14 -07002498func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2499 // Tests that an apex dependency with min_sdk_version higher than the
2500 // min_sdk_version of the apex is allowed as long as the dependency's
2501 // min_sdk_version is less than or equal to the api level that the
2502 // architecture was introduced in. In this case, arm64 didn't exist
2503 // until api level 21, so the arm64 code will never need to run on
2504 // an api level 20 device, even if other architectures of the apex
2505 // will.
2506 testApex(t, `
2507 apex {
2508 name: "myapex",
2509 key: "myapex.key",
2510 native_shared_libs: ["libfoo"],
2511 min_sdk_version: "20",
2512 }
2513
2514 apex_key {
2515 name: "myapex.key",
2516 public_key: "testkey.avbpubkey",
2517 private_key: "testkey.pem",
2518 }
2519
2520 cc_library {
2521 name: "libfoo",
2522 srcs: ["mylib.cpp"],
2523 apex_available: ["myapex"],
2524 min_sdk_version: "21",
2525 stl: "none",
2526 }
2527 `)
2528}
2529
Artur Satayev8cf899a2020-04-15 17:29:42 +01002530func TestJavaStableSdkVersion(t *testing.T) {
2531 testCases := []struct {
2532 name string
2533 expectedError string
2534 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002535 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002536 }{
2537 {
2538 name: "Non-updatable apex with non-stable dep",
2539 bp: `
2540 apex {
2541 name: "myapex",
2542 java_libs: ["myjar"],
2543 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002544 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002545 }
2546 apex_key {
2547 name: "myapex.key",
2548 public_key: "testkey.avbpubkey",
2549 private_key: "testkey.pem",
2550 }
2551 java_library {
2552 name: "myjar",
2553 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002554 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002555 apex_available: ["myapex"],
2556 }
2557 `,
2558 },
2559 {
2560 name: "Updatable apex with stable dep",
2561 bp: `
2562 apex {
2563 name: "myapex",
2564 java_libs: ["myjar"],
2565 key: "myapex.key",
2566 updatable: true,
2567 min_sdk_version: "29",
2568 }
2569 apex_key {
2570 name: "myapex.key",
2571 public_key: "testkey.avbpubkey",
2572 private_key: "testkey.pem",
2573 }
2574 java_library {
2575 name: "myjar",
2576 srcs: ["foo/bar/MyClass.java"],
2577 sdk_version: "current",
2578 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002579 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002580 }
2581 `,
2582 },
2583 {
2584 name: "Updatable apex with non-stable dep",
2585 expectedError: "cannot depend on \"myjar\"",
2586 bp: `
2587 apex {
2588 name: "myapex",
2589 java_libs: ["myjar"],
2590 key: "myapex.key",
2591 updatable: true,
2592 }
2593 apex_key {
2594 name: "myapex.key",
2595 public_key: "testkey.avbpubkey",
2596 private_key: "testkey.pem",
2597 }
2598 java_library {
2599 name: "myjar",
2600 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002601 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002602 apex_available: ["myapex"],
2603 }
2604 `,
2605 },
2606 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002607 name: "Updatable apex with non-stable legacy core platform dep",
2608 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2609 bp: `
2610 apex {
2611 name: "myapex",
2612 java_libs: ["myjar-uses-legacy"],
2613 key: "myapex.key",
2614 updatable: true,
2615 }
2616 apex_key {
2617 name: "myapex.key",
2618 public_key: "testkey.avbpubkey",
2619 private_key: "testkey.pem",
2620 }
2621 java_library {
2622 name: "myjar-uses-legacy",
2623 srcs: ["foo/bar/MyClass.java"],
2624 sdk_version: "core_platform",
2625 apex_available: ["myapex"],
2626 }
2627 `,
2628 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2629 },
2630 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002631 name: "Updatable apex with non-stable transitive dep",
2632 // This is not actually detecting that the transitive dependency is unstable, rather it is
2633 // detecting that the transitive dependency is building against a wider API surface than the
2634 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002635 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002636 bp: `
2637 apex {
2638 name: "myapex",
2639 java_libs: ["myjar"],
2640 key: "myapex.key",
2641 updatable: true,
2642 }
2643 apex_key {
2644 name: "myapex.key",
2645 public_key: "testkey.avbpubkey",
2646 private_key: "testkey.pem",
2647 }
2648 java_library {
2649 name: "myjar",
2650 srcs: ["foo/bar/MyClass.java"],
2651 sdk_version: "current",
2652 apex_available: ["myapex"],
2653 static_libs: ["transitive-jar"],
2654 }
2655 java_library {
2656 name: "transitive-jar",
2657 srcs: ["foo/bar/MyClass.java"],
2658 sdk_version: "core_platform",
2659 apex_available: ["myapex"],
2660 }
2661 `,
2662 },
2663 }
2664
2665 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002666 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2667 continue
2668 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002669 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002670 errorHandler := android.FixtureExpectsNoErrors
2671 if test.expectedError != "" {
2672 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002673 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002674 android.GroupFixturePreparers(
2675 java.PrepareForTestWithJavaDefaultModules,
2676 PrepareForTestWithApexBuildComponents,
2677 prepareForTestWithMyapex,
2678 android.OptionalFixturePreparer(test.preparer),
2679 ).
2680 ExtendWithErrorHandler(errorHandler).
2681 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002682 })
2683 }
2684}
2685
Jooyung Han749dc692020-04-15 11:03:39 +09002686func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2687 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2688 apex {
2689 name: "myapex",
2690 key: "myapex.key",
2691 native_shared_libs: ["mylib"],
2692 min_sdk_version: "29",
2693 }
2694
2695 apex_key {
2696 name: "myapex.key",
2697 public_key: "testkey.avbpubkey",
2698 private_key: "testkey.pem",
2699 }
2700
2701 cc_library {
2702 name: "mylib",
2703 srcs: ["mylib.cpp"],
2704 shared_libs: ["mylib2"],
2705 system_shared_libs: [],
2706 stl: "none",
2707 apex_available: [
2708 "myapex",
2709 ],
2710 min_sdk_version: "29",
2711 }
2712
2713 // indirect part of the apex
2714 cc_library {
2715 name: "mylib2",
2716 srcs: ["mylib.cpp"],
2717 system_shared_libs: [],
2718 stl: "none",
2719 apex_available: [
2720 "myapex",
2721 ],
2722 min_sdk_version: "30",
2723 }
2724 `)
2725}
2726
2727func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2728 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2729 apex {
2730 name: "myapex",
2731 key: "myapex.key",
2732 apps: ["AppFoo"],
2733 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002734 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002735 }
2736
2737 apex_key {
2738 name: "myapex.key",
2739 public_key: "testkey.avbpubkey",
2740 private_key: "testkey.pem",
2741 }
2742
2743 android_app {
2744 name: "AppFoo",
2745 srcs: ["foo/bar/MyClass.java"],
2746 sdk_version: "current",
2747 min_sdk_version: "29",
2748 system_modules: "none",
2749 stl: "none",
2750 static_libs: ["bar"],
2751 apex_available: [ "myapex" ],
2752 }
2753
2754 java_library {
2755 name: "bar",
2756 sdk_version: "current",
2757 srcs: ["a.java"],
2758 apex_available: [ "myapex" ],
2759 }
2760 `)
2761}
2762
2763func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002764 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002765 apex {
2766 name: "myapex",
2767 key: "myapex.key",
2768 native_shared_libs: ["mylib"],
2769 min_sdk_version: "29",
2770 }
2771
2772 apex_key {
2773 name: "myapex.key",
2774 public_key: "testkey.avbpubkey",
2775 private_key: "testkey.pem",
2776 }
2777
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002778 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002779 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2780 cc_library {
2781 name: "mylib",
2782 srcs: ["mylib.cpp"],
2783 shared_libs: ["mylib2"],
2784 system_shared_libs: [],
2785 stl: "none",
2786 apex_available: ["myapex", "otherapex"],
2787 min_sdk_version: "29",
2788 }
2789
2790 cc_library {
2791 name: "mylib2",
2792 srcs: ["mylib.cpp"],
2793 system_shared_libs: [],
2794 stl: "none",
2795 apex_available: ["otherapex"],
2796 stubs: { versions: ["29", "30"] },
2797 min_sdk_version: "30",
2798 }
2799
2800 apex {
2801 name: "otherapex",
2802 key: "myapex.key",
2803 native_shared_libs: ["mylib", "mylib2"],
2804 min_sdk_version: "30",
2805 }
2806 `)
2807 expectLink := func(from, from_variant, to, to_variant string) {
2808 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2809 libFlags := ld.Args["libFlags"]
2810 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2811 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002812 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002813 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002814}
2815
Jooyung Haned124c32021-01-26 11:43:46 +09002816func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002817 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2818 func(variables android.FixtureProductVariables) {
2819 variables.Platform_sdk_codename = proptools.StringPtr("S")
2820 variables.Platform_version_active_codenames = []string{"S"}
2821 },
2822 )
Jooyung Haned124c32021-01-26 11:43:46 +09002823 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2824 apex {
2825 name: "myapex",
2826 key: "myapex.key",
2827 native_shared_libs: ["libfoo"],
2828 min_sdk_version: "S",
2829 }
2830 apex_key {
2831 name: "myapex.key",
2832 public_key: "testkey.avbpubkey",
2833 private_key: "testkey.pem",
2834 }
2835 cc_library {
2836 name: "libfoo",
2837 shared_libs: ["libbar"],
2838 apex_available: ["myapex"],
2839 min_sdk_version: "29",
2840 }
2841 cc_library {
2842 name: "libbar",
2843 apex_available: ["myapex"],
2844 }
2845 `, withSAsActiveCodeNames)
2846}
2847
2848func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002849 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2850 variables.Platform_sdk_codename = proptools.StringPtr("S")
2851 variables.Platform_version_active_codenames = []string{"S", "T"}
2852 })
Colin Cross1c460562021-02-16 17:55:47 -08002853 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002854 apex {
2855 name: "myapex",
2856 key: "myapex.key",
2857 native_shared_libs: ["libfoo"],
2858 min_sdk_version: "S",
2859 }
2860 apex_key {
2861 name: "myapex.key",
2862 public_key: "testkey.avbpubkey",
2863 private_key: "testkey.pem",
2864 }
2865 cc_library {
2866 name: "libfoo",
2867 shared_libs: ["libbar"],
2868 apex_available: ["myapex"],
2869 min_sdk_version: "S",
2870 }
2871 cc_library {
2872 name: "libbar",
2873 stubs: {
2874 symbol_file: "libbar.map.txt",
2875 versions: ["30", "S", "T"],
2876 },
2877 }
2878 `, withSAsActiveCodeNames)
2879
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002880 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002881 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2882 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002883 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002884}
2885
Jiyong Park7c2ee712018-12-07 00:42:25 +09002886func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002887 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002888 apex {
2889 name: "myapex",
2890 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002891 native_shared_libs: ["mylib"],
Jooyung Han4ed512b2023-08-11 16:30:04 +09002892 binaries: ["mybin", "mybin.rust"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002893 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002894 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002895 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002896 }
2897
2898 apex_key {
2899 name: "myapex.key",
2900 public_key: "testkey.avbpubkey",
2901 private_key: "testkey.pem",
2902 }
2903
2904 prebuilt_etc {
2905 name: "myetc",
2906 src: "myprebuilt",
2907 sub_dir: "foo/bar",
2908 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002909
2910 cc_library {
2911 name: "mylib",
2912 srcs: ["mylib.cpp"],
2913 relative_install_path: "foo/bar",
2914 system_shared_libs: [],
2915 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002916 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002917 }
2918
2919 cc_binary {
2920 name: "mybin",
2921 srcs: ["mylib.cpp"],
2922 relative_install_path: "foo/bar",
2923 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002924 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002925 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002926 }
Jooyung Han4ed512b2023-08-11 16:30:04 +09002927
2928 rust_binary {
2929 name: "mybin.rust",
2930 srcs: ["foo.rs"],
2931 relative_install_path: "rust_subdir",
2932 apex_available: [ "myapex" ],
2933 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002934 `)
2935
Jooyung Hana0503a52023-08-23 13:12:50 +09002936 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002937 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002938
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002939 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002940 ensureContains(t, cmd, "/etc ")
2941 ensureContains(t, cmd, "/etc/foo ")
2942 ensureContains(t, cmd, "/etc/foo/bar ")
2943 ensureContains(t, cmd, "/lib64 ")
2944 ensureContains(t, cmd, "/lib64/foo ")
2945 ensureContains(t, cmd, "/lib64/foo/bar ")
2946 ensureContains(t, cmd, "/lib ")
2947 ensureContains(t, cmd, "/lib/foo ")
2948 ensureContains(t, cmd, "/lib/foo/bar ")
2949 ensureContains(t, cmd, "/bin ")
2950 ensureContains(t, cmd, "/bin/foo ")
2951 ensureContains(t, cmd, "/bin/foo/bar ")
Jooyung Han4ed512b2023-08-11 16:30:04 +09002952 ensureContains(t, cmd, "/bin/rust_subdir ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002953}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002954
Jooyung Han35155c42020-02-06 17:33:20 +09002955func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002956 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002957 apex {
2958 name: "myapex",
2959 key: "myapex.key",
2960 multilib: {
2961 both: {
2962 native_shared_libs: ["mylib"],
2963 binaries: ["mybin"],
2964 },
2965 },
2966 compile_multilib: "both",
2967 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002968 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002969 }
2970
2971 apex_key {
2972 name: "myapex.key",
2973 public_key: "testkey.avbpubkey",
2974 private_key: "testkey.pem",
2975 }
2976
2977 cc_library {
2978 name: "mylib",
2979 relative_install_path: "foo/bar",
2980 system_shared_libs: [],
2981 stl: "none",
2982 apex_available: [ "myapex" ],
2983 native_bridge_supported: true,
2984 }
2985
2986 cc_binary {
2987 name: "mybin",
2988 relative_install_path: "foo/bar",
2989 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002990 stl: "none",
2991 apex_available: [ "myapex" ],
2992 native_bridge_supported: true,
2993 compile_multilib: "both", // default is "first" for binary
2994 multilib: {
2995 lib64: {
2996 suffix: "64",
2997 },
2998 },
2999 }
3000 `, withNativeBridgeEnabled)
Jooyung Hana0503a52023-08-23 13:12:50 +09003001 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han35155c42020-02-06 17:33:20 +09003002 "bin/foo/bar/mybin",
3003 "bin/foo/bar/mybin64",
3004 "bin/arm/foo/bar/mybin",
3005 "bin/arm64/foo/bar/mybin64",
3006 "lib/foo/bar/mylib.so",
3007 "lib/arm/foo/bar/mylib.so",
3008 "lib64/foo/bar/mylib.so",
3009 "lib64/arm64/foo/bar/mylib.so",
3010 })
3011}
3012
Jooyung Han85d61762020-06-24 23:50:26 +09003013func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08003014 result := android.GroupFixturePreparers(
3015 prepareForApexTest,
3016 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
3017 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09003018 apex {
3019 name: "myapex",
3020 key: "myapex.key",
3021 binaries: ["mybin"],
3022 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003023 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09003024 }
3025 apex_key {
3026 name: "myapex.key",
3027 public_key: "testkey.avbpubkey",
3028 private_key: "testkey.pem",
3029 }
3030 cc_binary {
3031 name: "mybin",
3032 vendor: true,
3033 shared_libs: ["libfoo"],
3034 }
3035 cc_library {
3036 name: "libfoo",
3037 proprietary: true,
3038 }
3039 `)
3040
Jooyung Hana0503a52023-08-23 13:12:50 +09003041 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09003042 "bin/mybin",
3043 "lib64/libfoo.so",
3044 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
3045 "lib64/libc++.so",
3046 })
3047
Jooyung Hana0503a52023-08-23 13:12:50 +09003048 apexBundle := result.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossc68db4b2021-11-11 18:59:15 -08003049 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09003050 name := apexBundle.BaseModuleName()
3051 prefix := "TARGET_"
3052 var builder strings.Builder
3053 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08003054 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01003055 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01003056 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003057
Jooyung Hana0503a52023-08-23 13:12:50 +09003058 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003059 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3060 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09003061}
3062
Justin Yun13decfb2021-03-08 19:25:55 +09003063func TestProductVariant(t *testing.T) {
3064 ctx := testApex(t, `
3065 apex {
3066 name: "myapex",
3067 key: "myapex.key",
3068 updatable: false,
3069 product_specific: true,
3070 binaries: ["foo"],
3071 }
3072
3073 apex_key {
3074 name: "myapex.key",
3075 public_key: "testkey.avbpubkey",
3076 private_key: "testkey.pem",
3077 }
3078
3079 cc_binary {
3080 name: "foo",
3081 product_available: true,
3082 apex_available: ["myapex"],
3083 srcs: ["foo.cpp"],
3084 }
Justin Yunaf1fde42023-09-27 16:22:10 +09003085 `)
Justin Yun13decfb2021-03-08 19:25:55 +09003086
3087 cflags := strings.Fields(
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003088 ctx.ModuleForTests("foo", "android_product_arm64_armv8-a_apex10000").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003089 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3090 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3091 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3092 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3093}
3094
Jooyung Han8e5685d2020-09-21 11:02:57 +09003095func TestApex_withPrebuiltFirmware(t *testing.T) {
3096 testCases := []struct {
3097 name string
3098 additionalProp string
3099 }{
3100 {"system apex with prebuilt_firmware", ""},
3101 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3102 }
3103 for _, tc := range testCases {
3104 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003105 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003106 apex {
3107 name: "myapex",
3108 key: "myapex.key",
3109 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003110 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003111 `+tc.additionalProp+`
3112 }
3113 apex_key {
3114 name: "myapex.key",
3115 public_key: "testkey.avbpubkey",
3116 private_key: "testkey.pem",
3117 }
3118 prebuilt_firmware {
3119 name: "myfirmware",
3120 src: "myfirmware.bin",
3121 filename_from_src: true,
3122 `+tc.additionalProp+`
3123 }
3124 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09003125 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han8e5685d2020-09-21 11:02:57 +09003126 "etc/firmware/myfirmware.bin",
3127 })
3128 })
3129 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003130}
3131
Jooyung Hanefb184e2020-06-25 17:14:25 +09003132func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003133 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003134 apex {
3135 name: "myapex",
3136 key: "myapex.key",
3137 vendor: true,
3138 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003139 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003140 }
3141
3142 apex_key {
3143 name: "myapex.key",
3144 public_key: "testkey.avbpubkey",
3145 private_key: "testkey.pem",
3146 }
3147
3148 cc_library {
3149 name: "mylib",
3150 vendor_available: true,
3151 }
3152 `)
3153
Jooyung Hana0503a52023-08-23 13:12:50 +09003154 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003155 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003156 name := apexBundle.BaseModuleName()
3157 prefix := "TARGET_"
3158 var builder strings.Builder
3159 data.Custom(&builder, name, prefix, "", data)
3160 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09003161 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 +09003162}
3163
Jooyung Han2ed99d02020-06-24 23:26:26 +09003164func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003165 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003166 apex {
3167 name: "myapex",
3168 key: "myapex.key",
3169 vintf_fragments: ["fragment.xml"],
3170 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003171 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003172 }
3173 apex_key {
3174 name: "myapex.key",
3175 public_key: "testkey.avbpubkey",
3176 private_key: "testkey.pem",
3177 }
3178 cc_binary {
3179 name: "mybin",
3180 }
3181 `)
3182
Jooyung Hana0503a52023-08-23 13:12:50 +09003183 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003184 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003185 name := apexBundle.BaseModuleName()
3186 prefix := "TARGET_"
3187 var builder strings.Builder
3188 data.Custom(&builder, name, prefix, "", data)
3189 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003190 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003191 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003192}
3193
Jiyong Park16e91a02018-12-20 18:18:08 +09003194func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003195 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003196 apex {
3197 name: "myapex",
3198 key: "myapex.key",
3199 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003200 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003201 }
3202
3203 apex_key {
3204 name: "myapex.key",
3205 public_key: "testkey.avbpubkey",
3206 private_key: "testkey.pem",
3207 }
3208
3209 cc_library {
3210 name: "mylib",
3211 srcs: ["mylib.cpp"],
3212 system_shared_libs: [],
3213 stl: "none",
3214 stubs: {
3215 versions: ["1", "2", "3"],
3216 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003217 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003218 }
3219
3220 cc_binary {
3221 name: "not_in_apex",
3222 srcs: ["mylib.cpp"],
3223 static_libs: ["mylib"],
3224 static_executable: true,
3225 system_shared_libs: [],
3226 stl: "none",
3227 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003228 `)
3229
Colin Cross7113d202019-11-20 16:39:12 -08003230 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003231
3232 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003233 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003234}
Jiyong Park9335a262018-12-24 11:31:58 +09003235
3236func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003237 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003238 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003239 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003240 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003241 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003242 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003243 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003244 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003245 }
3246
3247 cc_library {
3248 name: "mylib",
3249 srcs: ["mylib.cpp"],
3250 system_shared_libs: [],
3251 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003252 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003253 }
3254
3255 apex_key {
3256 name: "myapex.key",
3257 public_key: "testkey.avbpubkey",
3258 private_key: "testkey.pem",
3259 }
3260
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003261 android_app_certificate {
3262 name: "myapex.certificate",
3263 certificate: "testkey",
3264 }
3265
3266 android_app_certificate {
3267 name: "myapex.certificate.override",
3268 certificate: "testkey.override",
3269 }
3270
Jiyong Park9335a262018-12-24 11:31:58 +09003271 `)
3272
3273 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003274 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003275
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003276 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3277 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003278 "vendor/foo/devkeys/testkey.avbpubkey")
3279 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003280 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3281 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003282 "vendor/foo/devkeys/testkey.pem")
3283 }
3284
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003285 // check the APK certs. It should be overridden to myapex.certificate.override
Jooyung Hana0503a52023-08-23 13:12:50 +09003286 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003287 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003288 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003289 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003290 }
3291}
Jiyong Park58e364a2019-01-19 19:24:06 +09003292
Jooyung Hanf121a652019-12-17 14:30:11 +09003293func TestCertificate(t *testing.T) {
3294 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003295 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003296 apex {
3297 name: "myapex",
3298 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003299 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003300 }
3301 apex_key {
3302 name: "myapex.key",
3303 public_key: "testkey.avbpubkey",
3304 private_key: "testkey.pem",
3305 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003306 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003307 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3308 if actual := rule.Args["certificates"]; actual != expected {
3309 t.Errorf("certificates should be %q, not %q", expected, actual)
3310 }
3311 })
3312 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003313 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003314 apex {
3315 name: "myapex_keytest",
3316 key: "myapex.key",
3317 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003318 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003319 }
3320 apex_key {
3321 name: "myapex.key",
3322 public_key: "testkey.avbpubkey",
3323 private_key: "testkey.pem",
3324 }
3325 android_app_certificate {
3326 name: "myapex.certificate.override",
3327 certificate: "testkey.override",
3328 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003329 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003330 expected := "testkey.override.x509.pem testkey.override.pk8"
3331 if actual := rule.Args["certificates"]; actual != expected {
3332 t.Errorf("certificates should be %q, not %q", expected, actual)
3333 }
3334 })
3335 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003336 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003337 apex {
3338 name: "myapex",
3339 key: "myapex.key",
3340 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003341 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003342 }
3343 apex_key {
3344 name: "myapex.key",
3345 public_key: "testkey.avbpubkey",
3346 private_key: "testkey.pem",
3347 }
3348 android_app_certificate {
3349 name: "myapex.certificate",
3350 certificate: "testkey",
3351 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003352 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003353 expected := "testkey.x509.pem testkey.pk8"
3354 if actual := rule.Args["certificates"]; actual != expected {
3355 t.Errorf("certificates should be %q, not %q", expected, actual)
3356 }
3357 })
3358 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003359 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003360 apex {
3361 name: "myapex_keytest",
3362 key: "myapex.key",
3363 file_contexts: ":myapex-file_contexts",
3364 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003365 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003366 }
3367 apex_key {
3368 name: "myapex.key",
3369 public_key: "testkey.avbpubkey",
3370 private_key: "testkey.pem",
3371 }
3372 android_app_certificate {
3373 name: "myapex.certificate.override",
3374 certificate: "testkey.override",
3375 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003376 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003377 expected := "testkey.override.x509.pem testkey.override.pk8"
3378 if actual := rule.Args["certificates"]; actual != expected {
3379 t.Errorf("certificates should be %q, not %q", expected, actual)
3380 }
3381 })
3382 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003383 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003384 apex {
3385 name: "myapex",
3386 key: "myapex.key",
3387 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003388 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003389 }
3390 apex_key {
3391 name: "myapex.key",
3392 public_key: "testkey.avbpubkey",
3393 private_key: "testkey.pem",
3394 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003395 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003396 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3397 if actual := rule.Args["certificates"]; actual != expected {
3398 t.Errorf("certificates should be %q, not %q", expected, actual)
3399 }
3400 })
3401 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003402 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003403 apex {
3404 name: "myapex_keytest",
3405 key: "myapex.key",
3406 file_contexts: ":myapex-file_contexts",
3407 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003408 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003409 }
3410 apex_key {
3411 name: "myapex.key",
3412 public_key: "testkey.avbpubkey",
3413 private_key: "testkey.pem",
3414 }
3415 android_app_certificate {
3416 name: "myapex.certificate.override",
3417 certificate: "testkey.override",
3418 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003419 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003420 expected := "testkey.override.x509.pem testkey.override.pk8"
3421 if actual := rule.Args["certificates"]; actual != expected {
3422 t.Errorf("certificates should be %q, not %q", expected, actual)
3423 }
3424 })
3425}
3426
Jiyong Park58e364a2019-01-19 19:24:06 +09003427func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003428 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003429 apex {
3430 name: "myapex",
3431 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003432 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003433 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003434 }
3435
3436 apex {
3437 name: "otherapex",
3438 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003439 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003440 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003441 }
3442
3443 apex_key {
3444 name: "myapex.key",
3445 public_key: "testkey.avbpubkey",
3446 private_key: "testkey.pem",
3447 }
3448
3449 cc_library {
3450 name: "mylib",
3451 srcs: ["mylib.cpp"],
3452 system_shared_libs: [],
3453 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003454 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003455 "myapex",
3456 "otherapex",
3457 ],
Jooyung Han24282772020-03-21 23:20:55 +09003458 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003459 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003460 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003461 cc_library {
3462 name: "mylib2",
3463 srcs: ["mylib.cpp"],
3464 system_shared_libs: [],
3465 stl: "none",
3466 apex_available: [
3467 "myapex",
3468 "otherapex",
3469 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003470 static_libs: ["mylib3"],
3471 recovery_available: true,
3472 min_sdk_version: "29",
3473 }
3474 cc_library {
3475 name: "mylib3",
3476 srcs: ["mylib.cpp"],
3477 system_shared_libs: [],
3478 stl: "none",
3479 apex_available: [
3480 "myapex",
3481 "otherapex",
3482 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003483 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003484 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003485 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003486 `)
3487
Jooyung Hanc87a0592020-03-02 17:44:33 +09003488 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003489 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003490 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003491
Vinh Tranf9754732023-01-19 22:41:46 -05003492 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003493 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003494 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003495
Vinh Tranf9754732023-01-19 22:41:46 -05003496 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003497 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003498 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003499
Colin Crossaede88c2020-08-11 12:17:01 -07003500 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3501 // each variant defines additional macros to distinguish which apex variant it is built for
3502
3503 // non-APEX variant does not have __ANDROID_APEX__ defined
3504 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3505 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3506
Vinh Tranf9754732023-01-19 22:41:46 -05003507 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003508 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3509 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003510
Jooyung Hanc87a0592020-03-02 17:44:33 +09003511 // non-APEX variant does not have __ANDROID_APEX__ defined
3512 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3513 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3514
Vinh Tranf9754732023-01-19 22:41:46 -05003515 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003516 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003517 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003518}
Jiyong Park7e636d02019-01-28 16:16:54 +09003519
3520func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003521 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003522 apex {
3523 name: "myapex",
3524 key: "myapex.key",
3525 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003526 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003527 }
3528
3529 apex_key {
3530 name: "myapex.key",
3531 public_key: "testkey.avbpubkey",
3532 private_key: "testkey.pem",
3533 }
3534
3535 cc_library_headers {
3536 name: "mylib_headers",
3537 export_include_dirs: ["my_include"],
3538 system_shared_libs: [],
3539 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003540 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003541 }
3542
3543 cc_library {
3544 name: "mylib",
3545 srcs: ["mylib.cpp"],
3546 system_shared_libs: [],
3547 stl: "none",
3548 header_libs: ["mylib_headers"],
3549 export_header_lib_headers: ["mylib_headers"],
3550 stubs: {
3551 versions: ["1", "2", "3"],
3552 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003553 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003554 }
3555
3556 cc_library {
3557 name: "otherlib",
3558 srcs: ["mylib.cpp"],
3559 system_shared_libs: [],
3560 stl: "none",
3561 shared_libs: ["mylib"],
3562 }
3563 `)
3564
Colin Cross7113d202019-11-20 16:39:12 -08003565 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003566
3567 // Ensure that the include path of the header lib is exported to 'otherlib'
3568 ensureContains(t, cFlags, "-Imy_include")
3569}
Alex Light9670d332019-01-29 18:07:33 -08003570
Jiyong Park7cd10e32020-01-14 09:22:18 +09003571type fileInApex struct {
3572 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003573 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003574 isLink bool
3575}
3576
Jooyung Han1724d582022-12-21 10:17:44 +09003577func (f fileInApex) String() string {
3578 return f.src + ":" + f.path
3579}
3580
3581func (f fileInApex) match(expectation string) bool {
3582 parts := strings.Split(expectation, ":")
3583 if len(parts) == 1 {
3584 match, _ := path.Match(parts[0], f.path)
3585 return match
3586 }
3587 if len(parts) == 2 {
3588 matchSrc, _ := path.Match(parts[0], f.src)
3589 matchDst, _ := path.Match(parts[1], f.path)
3590 return matchSrc && matchDst
3591 }
3592 panic("invalid expected file specification: " + expectation)
3593}
3594
Jooyung Hana57af4a2020-01-23 05:36:59 +00003595func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003596 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003597 module := ctx.ModuleForTests(moduleName, variant)
3598 apexRule := module.MaybeRule("apexRule")
3599 apexDir := "/image.apex/"
Jooyung Han31c470b2019-10-18 16:26:59 +09003600 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003601 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003602 for _, cmd := range strings.Split(copyCmds, "&&") {
3603 cmd = strings.TrimSpace(cmd)
3604 if cmd == "" {
3605 continue
3606 }
3607 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003608 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003609 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003610 switch terms[0] {
3611 case "mkdir":
3612 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003613 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003614 t.Fatal("copyCmds contains invalid cp command", cmd)
3615 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003616 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003617 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003618 isLink = false
3619 case "ln":
3620 if len(terms) != 3 && len(terms) != 4 {
3621 // ln LINK TARGET or ln -s LINK TARGET
3622 t.Fatal("copyCmds contains invalid ln command", cmd)
3623 }
3624 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003625 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003626 isLink = true
3627 default:
3628 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3629 }
3630 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003631 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003632 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003633 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003634 }
Jooyung Han1724d582022-12-21 10:17:44 +09003635 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003636 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003637 }
3638 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003639 return ret
3640}
3641
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003642func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003643 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003644 var failed bool
3645 var surplus []string
3646 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003647 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003648 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003649 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003650 if file.match(expected) {
3651 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003652 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003653 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003654 }
3655 }
Jooyung Han1724d582022-12-21 10:17:44 +09003656 if !matchFound {
3657 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003658 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003659 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003660
Jooyung Han31c470b2019-10-18 16:26:59 +09003661 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003662 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003663 t.Log("surplus files", surplus)
3664 failed = true
3665 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003666
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003667 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003668 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003669 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003670 if !filesMatched[expected] {
3671 missing = append(missing, expected)
3672 }
3673 }
3674 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003675 t.Log("missing files", missing)
3676 failed = true
3677 }
3678 if failed {
3679 t.Fail()
3680 }
3681}
3682
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003683func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3684 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3685}
3686
3687func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
Spandan Das2069c3f2023-12-06 19:40:24 +00003688 deapexer := ctx.ModuleForTests(moduleName+".deapexer", variant).Description("deapex")
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003689 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3690 if deapexer.Output != nil {
3691 outputs = append(outputs, deapexer.Output.String())
3692 }
3693 for _, output := range deapexer.ImplicitOutputs {
3694 outputs = append(outputs, output.String())
3695 }
3696 actualFiles := make([]fileInApex, 0, len(outputs))
3697 for _, output := range outputs {
3698 dir := "/deapexer/"
3699 pos := strings.LastIndex(output, dir)
3700 if pos == -1 {
3701 t.Fatal("Unknown deapexer output ", output)
3702 }
3703 path := output[pos+len(dir):]
3704 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3705 }
3706 assertFileListEquals(t, files, actualFiles)
3707}
3708
Jooyung Han39edb6c2019-11-06 16:53:07 +09003709func vndkLibrariesTxtFiles(vers ...string) (result string) {
3710 for _, v := range vers {
Kiyoung Kim973cb6f2024-04-29 14:14:53 +09003711 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Justin Yund5784122023-10-25 13:25:32 +09003712 result += `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003713 prebuilt_etc {
3714 name: "` + txt + `.libraries.` + v + `.txt",
3715 src: "dummy.txt",
3716 }
3717 `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003718 }
3719 }
3720 return
3721}
3722
Jooyung Han344d5432019-08-23 11:17:39 +09003723func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003724 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003725 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003726 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003727 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003728 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003729 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003730 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003731 }
3732
3733 apex_key {
3734 name: "myapex.key",
3735 public_key: "testkey.avbpubkey",
3736 private_key: "testkey.pem",
3737 }
3738
Jooyung Han31c470b2019-10-18 16:26:59 +09003739 vndk_prebuilt_shared {
3740 name: "libvndk27",
3741 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003742 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003743 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003744 vndk: {
3745 enabled: true,
3746 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003747 target_arch: "arm64",
3748 arch: {
3749 arm: {
3750 srcs: ["libvndk27_arm.so"],
3751 },
3752 arm64: {
3753 srcs: ["libvndk27_arm64.so"],
3754 },
3755 },
Colin Cross2807f002021-03-02 10:15:29 -08003756 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003757 }
3758
3759 vndk_prebuilt_shared {
3760 name: "libvndk27",
3761 version: "27",
3762 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003763 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003764 vndk: {
3765 enabled: true,
3766 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003767 target_arch: "x86_64",
3768 arch: {
3769 x86: {
3770 srcs: ["libvndk27_x86.so"],
3771 },
3772 x86_64: {
3773 srcs: ["libvndk27_x86_64.so"],
3774 },
3775 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003776 }
3777 `+vndkLibrariesTxtFiles("27"),
3778 withFiles(map[string][]byte{
3779 "libvndk27_arm.so": nil,
3780 "libvndk27_arm64.so": nil,
3781 "libvndk27_x86.so": nil,
3782 "libvndk27_x86_64.so": nil,
3783 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003784
Jooyung Hana0503a52023-08-23 13:12:50 +09003785 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003786 "lib/libvndk27_arm.so",
3787 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003788 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003789 })
Jooyung Han344d5432019-08-23 11:17:39 +09003790}
3791
Jooyung Han90eee022019-10-01 20:02:42 +09003792func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003793 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003794 apex_vndk {
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003795 name: "com.android.vndk.v29",
Jooyung Han90eee022019-10-01 20:02:42 +09003796 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003797 file_contexts: ":myapex-file_contexts",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003798 vndk_version: "29",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003799 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003800 }
3801 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003802 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003803 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003804 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003805 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003806 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003807 }
3808 apex_key {
3809 name: "myapex.key",
3810 public_key: "testkey.avbpubkey",
3811 private_key: "testkey.pem",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003812 }`+vndkLibrariesTxtFiles("28", "29"))
Jooyung Han90eee022019-10-01 20:02:42 +09003813
3814 assertApexName := func(expected, moduleName string) {
Jooyung Hana0503a52023-08-23 13:12:50 +09003815 module := ctx.ModuleForTests(moduleName, "android_common")
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09003816 apexManifestRule := module.Rule("apexManifestRule")
3817 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09003818 }
3819
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003820 assertApexName("com.android.vndk.v29", "com.android.vndk.v29")
Colin Cross2807f002021-03-02 10:15:29 -08003821 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003822}
3823
Jooyung Han344d5432019-08-23 11:17:39 +09003824func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003825 testApexError(t, `module "com.android.vndk.v30" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003826 apex_vndk {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003827 name: "com.android.vndk.v30",
3828 key: "com.android.vndk.v30.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003829 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003830 native_bridge_supported: true,
3831 }
3832
3833 apex_key {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003834 name: "com.android.vndk.v30.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003835 public_key: "testkey.avbpubkey",
3836 private_key: "testkey.pem",
3837 }
3838
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003839 vndk_prebuilt_shared {
Jooyung Han344d5432019-08-23 11:17:39 +09003840 name: "libvndk",
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003841 version: "30",
3842 target_arch: "arm",
Jooyung Han344d5432019-08-23 11:17:39 +09003843 srcs: ["mylib.cpp"],
3844 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003845 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003846 native_bridge_supported: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003847 vndk: {
3848 enabled: true,
3849 },
Jooyung Han344d5432019-08-23 11:17:39 +09003850 }
3851 `)
3852}
3853
Jooyung Han31c470b2019-10-18 16:26:59 +09003854func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003855 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003856 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003857 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003858 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003859 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003860 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003861 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003862 }
3863
3864 apex_key {
3865 name: "myapex.key",
3866 public_key: "testkey.avbpubkey",
3867 private_key: "testkey.pem",
3868 }
3869
3870 vndk_prebuilt_shared {
3871 name: "libvndk27",
3872 version: "27",
3873 target_arch: "arm",
3874 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003875 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003876 vndk: {
3877 enabled: true,
3878 },
3879 arch: {
3880 arm: {
3881 srcs: ["libvndk27.so"],
3882 }
3883 },
3884 }
3885
3886 vndk_prebuilt_shared {
3887 name: "libvndk27",
3888 version: "27",
3889 target_arch: "arm",
3890 binder32bit: true,
3891 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003892 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003893 vndk: {
3894 enabled: true,
3895 },
3896 arch: {
3897 arm: {
3898 srcs: ["libvndk27binder32.so"],
3899 }
3900 },
Colin Cross2807f002021-03-02 10:15:29 -08003901 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003902 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003903 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003904 withFiles(map[string][]byte{
3905 "libvndk27.so": nil,
3906 "libvndk27binder32.so": nil,
3907 }),
3908 withBinder32bit,
3909 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07003910 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09003911 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3912 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003913 },
3914 }),
3915 )
3916
Jooyung Hana0503a52023-08-23 13:12:50 +09003917 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003918 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003919 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003920 })
3921}
3922
Jooyung Hane1633032019-08-01 17:41:43 +09003923func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003924 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09003925 apex {
3926 name: "myapex_nodep",
3927 key: "myapex.key",
3928 native_shared_libs: ["lib_nodep"],
3929 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003930 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003931 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003932 }
3933
3934 apex {
3935 name: "myapex_dep",
3936 key: "myapex.key",
3937 native_shared_libs: ["lib_dep"],
3938 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003939 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003940 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003941 }
3942
3943 apex {
3944 name: "myapex_provider",
3945 key: "myapex.key",
3946 native_shared_libs: ["libfoo"],
3947 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003948 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003949 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003950 }
3951
3952 apex {
3953 name: "myapex_selfcontained",
3954 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00003955 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09003956 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003957 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003958 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003959 }
3960
3961 apex_key {
3962 name: "myapex.key",
3963 public_key: "testkey.avbpubkey",
3964 private_key: "testkey.pem",
3965 }
3966
3967 cc_library {
3968 name: "lib_nodep",
3969 srcs: ["mylib.cpp"],
3970 system_shared_libs: [],
3971 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003972 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003973 }
3974
3975 cc_library {
3976 name: "lib_dep",
3977 srcs: ["mylib.cpp"],
3978 shared_libs: ["libfoo"],
3979 system_shared_libs: [],
3980 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003981 apex_available: [
3982 "myapex_dep",
3983 "myapex_provider",
3984 "myapex_selfcontained",
3985 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003986 }
3987
3988 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00003989 name: "lib_dep_on_bar",
3990 srcs: ["mylib.cpp"],
3991 shared_libs: ["libbar"],
3992 system_shared_libs: [],
3993 stl: "none",
3994 apex_available: [
3995 "myapex_selfcontained",
3996 ],
3997 }
3998
3999
4000 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004001 name: "libfoo",
4002 srcs: ["mytest.cpp"],
4003 stubs: {
4004 versions: ["1"],
4005 },
4006 system_shared_libs: [],
4007 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004008 apex_available: [
4009 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004010 ],
4011 }
4012
4013 cc_library {
4014 name: "libbar",
4015 srcs: ["mytest.cpp"],
4016 stubs: {
4017 versions: ["1"],
4018 },
4019 system_shared_libs: [],
4020 stl: "none",
4021 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004022 "myapex_selfcontained",
4023 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004024 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004025
Jooyung Hane1633032019-08-01 17:41:43 +09004026 `)
4027
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004028 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004029 var provideNativeLibs, requireNativeLibs []string
4030
Jooyung Hana0503a52023-08-23 13:12:50 +09004031 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004032 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4033 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004034 ensureListEmpty(t, provideNativeLibs)
4035 ensureListEmpty(t, requireNativeLibs)
4036
Jooyung Hana0503a52023-08-23 13:12:50 +09004037 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004038 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4039 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004040 ensureListEmpty(t, provideNativeLibs)
4041 ensureListContains(t, requireNativeLibs, "libfoo.so")
4042
Jooyung Hana0503a52023-08-23 13:12:50 +09004043 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004044 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4045 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004046 ensureListContains(t, provideNativeLibs, "libfoo.so")
4047 ensureListEmpty(t, requireNativeLibs)
4048
Jooyung Hana0503a52023-08-23 13:12:50 +09004049 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004050 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4051 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004052 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004053 ensureListEmpty(t, requireNativeLibs)
4054}
4055
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004056func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4057 ctx := testApex(t, `
4058 apex {
4059 name: "myapex",
4060 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004061 native_shared_libs: ["mylib"],
4062 updatable: false,
4063 }
4064
4065 apex_key {
4066 name: "myapex.key",
4067 public_key: "testkey.avbpubkey",
4068 private_key: "testkey.pem",
4069 }
4070
4071 cc_library {
4072 name: "mylib",
4073 srcs: ["mylib.cpp"],
4074 system_shared_libs: [],
4075 stl: "none",
4076 apex_available: [
4077 "//apex_available:platform",
4078 "myapex",
4079 ],
4080 }
4081 `, android.FixtureMergeEnv(map[string]string{
4082 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4083 }))
4084
Jooyung Hana0503a52023-08-23 13:12:50 +09004085 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004086 apexManifestRule := module.Rule("apexManifestRule")
4087 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4088}
4089
Vinh Tran8f5310f2022-10-07 18:16:47 -04004090func TestCompileMultilibProp(t *testing.T) {
4091 testCases := []struct {
4092 compileMultiLibProp string
4093 containedLibs []string
4094 notContainedLibs []string
4095 }{
4096 {
4097 containedLibs: []string{
4098 "image.apex/lib64/mylib.so",
4099 "image.apex/lib/mylib.so",
4100 },
4101 compileMultiLibProp: `compile_multilib: "both",`,
4102 },
4103 {
4104 containedLibs: []string{"image.apex/lib64/mylib.so"},
4105 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4106 compileMultiLibProp: `compile_multilib: "first",`,
4107 },
4108 {
4109 containedLibs: []string{"image.apex/lib64/mylib.so"},
4110 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4111 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4112 },
4113 {
4114 containedLibs: []string{"image.apex/lib64/mylib.so"},
4115 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4116 compileMultiLibProp: `compile_multilib: "64",`,
4117 },
4118 {
4119 containedLibs: []string{"image.apex/lib/mylib.so"},
4120 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4121 compileMultiLibProp: `compile_multilib: "32",`,
4122 },
4123 }
4124 for _, testCase := range testCases {
4125 ctx := testApex(t, fmt.Sprintf(`
4126 apex {
4127 name: "myapex",
4128 key: "myapex.key",
4129 %s
4130 native_shared_libs: ["mylib"],
4131 updatable: false,
4132 }
4133 apex_key {
4134 name: "myapex.key",
4135 public_key: "testkey.avbpubkey",
4136 private_key: "testkey.pem",
4137 }
4138 cc_library {
4139 name: "mylib",
4140 srcs: ["mylib.cpp"],
4141 apex_available: [
4142 "//apex_available:platform",
4143 "myapex",
4144 ],
4145 }
4146 `, testCase.compileMultiLibProp),
4147 )
Jooyung Hana0503a52023-08-23 13:12:50 +09004148 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Vinh Tran8f5310f2022-10-07 18:16:47 -04004149 apexRule := module.Rule("apexRule")
4150 copyCmds := apexRule.Args["copy_commands"]
4151 for _, containedLib := range testCase.containedLibs {
4152 ensureContains(t, copyCmds, containedLib)
4153 }
4154 for _, notContainedLib := range testCase.notContainedLibs {
4155 ensureNotContains(t, copyCmds, notContainedLib)
4156 }
4157 }
4158}
4159
Alex Light0851b882019-02-07 13:20:53 -08004160func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004161 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004162 apex {
4163 name: "myapex",
4164 key: "myapex.key",
4165 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004166 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004167 }
4168
4169 apex_key {
4170 name: "myapex.key",
4171 public_key: "testkey.avbpubkey",
4172 private_key: "testkey.pem",
4173 }
4174
4175 cc_library {
4176 name: "mylib_common",
4177 srcs: ["mylib.cpp"],
4178 system_shared_libs: [],
4179 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004180 apex_available: [
4181 "//apex_available:platform",
4182 "myapex",
4183 ],
Alex Light0851b882019-02-07 13:20:53 -08004184 }
4185 `)
4186
Jooyung Hana0503a52023-08-23 13:12:50 +09004187 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004188 apexRule := module.Rule("apexRule")
4189 copyCmds := apexRule.Args["copy_commands"]
4190
4191 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4192 t.Log("Apex was a test apex!")
4193 t.Fail()
4194 }
4195 // Ensure that main rule creates an output
4196 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4197
4198 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004199 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004200
4201 // Ensure that both direct and indirect deps are copied into apex
4202 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4203
Colin Cross7113d202019-11-20 16:39:12 -08004204 // Ensure that the platform variant ends with _shared
4205 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004206
Colin Cross56a83212020-09-15 18:30:11 -07004207 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004208 t.Log("Found mylib_common not in any apex!")
4209 t.Fail()
4210 }
4211}
4212
4213func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004214 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004215 apex_test {
4216 name: "myapex",
4217 key: "myapex.key",
4218 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004219 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004220 }
4221
4222 apex_key {
4223 name: "myapex.key",
4224 public_key: "testkey.avbpubkey",
4225 private_key: "testkey.pem",
4226 }
4227
4228 cc_library {
4229 name: "mylib_common_test",
4230 srcs: ["mylib.cpp"],
4231 system_shared_libs: [],
4232 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004233 // TODO: remove //apex_available:platform
4234 apex_available: [
4235 "//apex_available:platform",
4236 "myapex",
4237 ],
Alex Light0851b882019-02-07 13:20:53 -08004238 }
4239 `)
4240
Jooyung Hana0503a52023-08-23 13:12:50 +09004241 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004242 apexRule := module.Rule("apexRule")
4243 copyCmds := apexRule.Args["copy_commands"]
4244
4245 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4246 t.Log("Apex was not a test apex!")
4247 t.Fail()
4248 }
4249 // Ensure that main rule creates an output
4250 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4251
4252 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004253 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004254
4255 // Ensure that both direct and indirect deps are copied into apex
4256 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4257
Colin Cross7113d202019-11-20 16:39:12 -08004258 // Ensure that the platform variant ends with _shared
4259 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004260}
4261
Jooyung Han85707de2023-12-01 14:21:13 +09004262func TestLibzVendorIsntStable(t *testing.T) {
4263 ctx := testApex(t, `
4264 apex {
4265 name: "myapex",
4266 key: "myapex.key",
4267 updatable: false,
4268 binaries: ["mybin"],
4269 }
4270 apex {
4271 name: "myvendorapex",
4272 key: "myapex.key",
4273 file_contexts: "myvendorapex_file_contexts",
4274 vendor: true,
4275 updatable: false,
4276 binaries: ["mybin"],
4277 }
4278 apex_key {
4279 name: "myapex.key",
4280 public_key: "testkey.avbpubkey",
4281 private_key: "testkey.pem",
4282 }
4283 cc_binary {
4284 name: "mybin",
4285 vendor_available: true,
4286 system_shared_libs: [],
4287 stl: "none",
4288 shared_libs: ["libz"],
4289 apex_available: ["//apex_available:anyapex"],
4290 }
4291 cc_library {
4292 name: "libz",
4293 vendor_available: true,
4294 system_shared_libs: [],
4295 stl: "none",
4296 stubs: {
4297 versions: ["28", "30"],
4298 },
4299 target: {
4300 vendor: {
4301 no_stubs: true,
4302 },
4303 },
4304 }
4305 `, withFiles(map[string][]byte{
4306 "myvendorapex_file_contexts": nil,
4307 }))
4308
4309 // libz provides stubs for core variant.
4310 {
4311 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
4312 "bin/mybin",
4313 })
4314 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
4315 android.AssertStringEquals(t, "should require libz", apexManifestRule.Args["requireNativeLibs"], "libz.so")
4316 }
4317 // libz doesn't provide stubs for vendor variant.
4318 {
4319 ensureExactContents(t, ctx, "myvendorapex", "android_common_myvendorapex", []string{
4320 "bin/mybin",
4321 "lib64/libz.so",
4322 })
4323 apexManifestRule := ctx.ModuleForTests("myvendorapex", "android_common_myvendorapex").Rule("apexManifestRule")
4324 android.AssertStringEquals(t, "should not require libz", apexManifestRule.Args["requireNativeLibs"], "")
4325 }
4326}
4327
Alex Light9670d332019-01-29 18:07:33 -08004328func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004329 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004330 apex {
4331 name: "myapex",
4332 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004333 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004334 multilib: {
4335 first: {
4336 native_shared_libs: ["mylib_common"],
4337 }
4338 },
4339 target: {
4340 android: {
4341 multilib: {
4342 first: {
4343 native_shared_libs: ["mylib"],
4344 }
4345 }
4346 },
4347 host: {
4348 multilib: {
4349 first: {
4350 native_shared_libs: ["mylib2"],
4351 }
4352 }
4353 }
4354 }
4355 }
4356
4357 apex_key {
4358 name: "myapex.key",
4359 public_key: "testkey.avbpubkey",
4360 private_key: "testkey.pem",
4361 }
4362
4363 cc_library {
4364 name: "mylib",
4365 srcs: ["mylib.cpp"],
4366 system_shared_libs: [],
4367 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004368 // TODO: remove //apex_available:platform
4369 apex_available: [
4370 "//apex_available:platform",
4371 "myapex",
4372 ],
Alex Light9670d332019-01-29 18:07:33 -08004373 }
4374
4375 cc_library {
4376 name: "mylib_common",
4377 srcs: ["mylib.cpp"],
4378 system_shared_libs: [],
4379 stl: "none",
4380 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004381 // TODO: remove //apex_available:platform
4382 apex_available: [
4383 "//apex_available:platform",
4384 "myapex",
4385 ],
Alex Light9670d332019-01-29 18:07:33 -08004386 }
4387
4388 cc_library {
4389 name: "mylib2",
4390 srcs: ["mylib.cpp"],
4391 system_shared_libs: [],
4392 stl: "none",
4393 compile_multilib: "first",
4394 }
4395 `)
4396
Jooyung Hana0503a52023-08-23 13:12:50 +09004397 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004398 copyCmds := apexRule.Args["copy_commands"]
4399
4400 // Ensure that main rule creates an output
4401 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4402
4403 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004404 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4405 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4406 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004407
4408 // Ensure that both direct and indirect deps are copied into apex
4409 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4410 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4411 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4412
Colin Cross7113d202019-11-20 16:39:12 -08004413 // Ensure that the platform variant ends with _shared
4414 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4415 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4416 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004417}
Jiyong Park04480cf2019-02-06 00:16:29 +09004418
Jiyong Park59140302020-12-14 18:44:04 +09004419func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004420 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004421 apex {
4422 name: "myapex",
4423 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004424 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004425 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004426 arch: {
4427 arm64: {
4428 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004429 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004430 },
4431 x86_64: {
4432 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004433 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004434 },
4435 }
4436 }
4437
4438 apex_key {
4439 name: "myapex.key",
4440 public_key: "testkey.avbpubkey",
4441 private_key: "testkey.pem",
4442 }
4443
4444 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004445 name: "mylib.generic",
4446 srcs: ["mylib.cpp"],
4447 system_shared_libs: [],
4448 stl: "none",
4449 // TODO: remove //apex_available:platform
4450 apex_available: [
4451 "//apex_available:platform",
4452 "myapex",
4453 ],
4454 }
4455
4456 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004457 name: "mylib.arm64",
4458 srcs: ["mylib.cpp"],
4459 system_shared_libs: [],
4460 stl: "none",
4461 // TODO: remove //apex_available:platform
4462 apex_available: [
4463 "//apex_available:platform",
4464 "myapex",
4465 ],
4466 }
4467
4468 cc_library {
4469 name: "mylib.x64",
4470 srcs: ["mylib.cpp"],
4471 system_shared_libs: [],
4472 stl: "none",
4473 // TODO: remove //apex_available:platform
4474 apex_available: [
4475 "//apex_available:platform",
4476 "myapex",
4477 ],
4478 }
4479 `)
4480
Jooyung Hana0503a52023-08-23 13:12:50 +09004481 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park59140302020-12-14 18:44:04 +09004482 copyCmds := apexRule.Args["copy_commands"]
4483
4484 // Ensure that apex variant is created for the direct dep
4485 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004486 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004487 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4488
4489 // Ensure that both direct and indirect deps are copied into apex
4490 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4491 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4492}
4493
Jiyong Park04480cf2019-02-06 00:16:29 +09004494func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004495 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004496 apex {
4497 name: "myapex",
4498 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004499 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004500 updatable: false,
Riya Thakur654461c2024-02-27 07:21:05 +00004501 compile_multilib: "both",
Jiyong Park04480cf2019-02-06 00:16:29 +09004502 }
4503
4504 apex_key {
4505 name: "myapex.key",
4506 public_key: "testkey.avbpubkey",
4507 private_key: "testkey.pem",
4508 }
4509
4510 sh_binary {
4511 name: "myscript",
4512 src: "mylib.cpp",
4513 filename: "myscript.sh",
4514 sub_dir: "script",
4515 }
4516 `)
4517
Jooyung Hana0503a52023-08-23 13:12:50 +09004518 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004519 copyCmds := apexRule.Args["copy_commands"]
4520
4521 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4522}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004523
Jooyung Han91df2082019-11-20 01:49:42 +09004524func TestApexInVariousPartition(t *testing.T) {
4525 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004526 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09004527 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004528 {"", "system"},
4529 {"product_specific: true", "product"},
4530 {"soc_specific: true", "vendor"},
4531 {"proprietary: true", "vendor"},
4532 {"vendor: true", "vendor"},
4533 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09004534 }
4535 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004536 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004537 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004538 apex {
4539 name: "myapex",
4540 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004541 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004542 `+tc.propName+`
4543 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004544
Jooyung Han91df2082019-11-20 01:49:42 +09004545 apex_key {
4546 name: "myapex.key",
4547 public_key: "testkey.avbpubkey",
4548 private_key: "testkey.pem",
4549 }
4550 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004551
Jooyung Hana0503a52023-08-23 13:12:50 +09004552 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004553 expected := "out/soong/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01004554 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004555 if actual != expected {
4556 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4557 }
Jooyung Han91df2082019-11-20 01:49:42 +09004558 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004559 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004560}
Jiyong Park67882562019-03-21 01:11:21 +09004561
Jooyung Han580eb4f2020-06-24 19:33:06 +09004562func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004563 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004564 apex {
4565 name: "myapex",
4566 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004567 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004568 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004569
Jooyung Han580eb4f2020-06-24 19:33:06 +09004570 apex_key {
4571 name: "myapex.key",
4572 public_key: "testkey.avbpubkey",
4573 private_key: "testkey.pem",
4574 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004575 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09004576 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004577 rule := module.Output("file_contexts")
4578 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4579}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004580
Jooyung Han580eb4f2020-06-24 19:33:06 +09004581func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004582 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004583 apex {
4584 name: "myapex",
4585 key: "myapex.key",
4586 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004587 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004588 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004589
Jooyung Han580eb4f2020-06-24 19:33:06 +09004590 apex_key {
4591 name: "myapex.key",
4592 public_key: "testkey.avbpubkey",
4593 private_key: "testkey.pem",
4594 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004595 `, withFiles(map[string][]byte{
4596 "my_own_file_contexts": nil,
4597 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004598}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004599
Jooyung Han580eb4f2020-06-24 19:33:06 +09004600func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004601 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004602 apex {
4603 name: "myapex",
4604 key: "myapex.key",
4605 product_specific: true,
4606 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004607 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004608 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004609
Jooyung Han580eb4f2020-06-24 19:33:06 +09004610 apex_key {
4611 name: "myapex.key",
4612 public_key: "testkey.avbpubkey",
4613 private_key: "testkey.pem",
4614 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004615 `)
4616
Colin Cross1c460562021-02-16 17:55:47 -08004617 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004618 apex {
4619 name: "myapex",
4620 key: "myapex.key",
4621 product_specific: true,
4622 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004623 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004624 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004625
Jooyung Han580eb4f2020-06-24 19:33:06 +09004626 apex_key {
4627 name: "myapex.key",
4628 public_key: "testkey.avbpubkey",
4629 private_key: "testkey.pem",
4630 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004631 `, withFiles(map[string][]byte{
4632 "product_specific_file_contexts": nil,
4633 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004634 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004635 rule := module.Output("file_contexts")
4636 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4637}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004638
Jooyung Han580eb4f2020-06-24 19:33:06 +09004639func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004640 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004641 apex {
4642 name: "myapex",
4643 key: "myapex.key",
4644 product_specific: true,
4645 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004646 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004647 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004648
Jooyung Han580eb4f2020-06-24 19:33:06 +09004649 apex_key {
4650 name: "myapex.key",
4651 public_key: "testkey.avbpubkey",
4652 private_key: "testkey.pem",
4653 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004654
Jooyung Han580eb4f2020-06-24 19:33:06 +09004655 filegroup {
4656 name: "my-file-contexts",
4657 srcs: ["product_specific_file_contexts"],
4658 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004659 `, withFiles(map[string][]byte{
4660 "product_specific_file_contexts": nil,
4661 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004662 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004663 rule := module.Output("file_contexts")
4664 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004665}
4666
Jiyong Park67882562019-03-21 01:11:21 +09004667func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004668 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004669 apex_key {
4670 name: "myapex.key",
4671 public_key: ":my.avbpubkey",
4672 private_key: ":my.pem",
4673 product_specific: true,
4674 }
4675
4676 filegroup {
4677 name: "my.avbpubkey",
4678 srcs: ["testkey2.avbpubkey"],
4679 }
4680
4681 filegroup {
4682 name: "my.pem",
4683 srcs: ["testkey2.pem"],
4684 }
4685 `)
4686
4687 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4688 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004689 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004690 if actual_pubkey != expected_pubkey {
4691 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4692 }
4693 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004694 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004695 if actual_privkey != expected_privkey {
4696 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4697 }
4698}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004699
4700func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004701 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004702 prebuilt_apex {
4703 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004704 arch: {
4705 arm64: {
4706 src: "myapex-arm64.apex",
4707 },
4708 arm: {
4709 src: "myapex-arm.apex",
4710 },
4711 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004712 }
4713 `)
4714
Wei Li340ee8e2022-03-18 17:33:24 -07004715 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4716 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004717
Jiyong Parkc95714e2019-03-29 14:23:10 +09004718 expectedInput := "myapex-arm64.apex"
4719 if prebuilt.inputApex.String() != expectedInput {
4720 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4721 }
Wei Li340ee8e2022-03-18 17:33:24 -07004722 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4723 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4724 rule := testingModule.Rule("genProvenanceMetaData")
4725 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4726 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4727 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4728 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08004729
4730 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
4731 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004732}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004733
Paul Duffinc0609c62021-03-01 17:27:16 +00004734func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01004735 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004736 prebuilt_apex {
4737 name: "myapex",
4738 }
4739 `)
4740}
4741
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004742func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004743 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004744 prebuilt_apex {
4745 name: "myapex",
4746 src: "myapex-arm.apex",
4747 filename: "notmyapex.apex",
4748 }
4749 `)
4750
Wei Li340ee8e2022-03-18 17:33:24 -07004751 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4752 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004753
4754 expected := "notmyapex.apex"
4755 if p.installFilename != expected {
4756 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4757 }
Wei Li340ee8e2022-03-18 17:33:24 -07004758 rule := testingModule.Rule("genProvenanceMetaData")
4759 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4760 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4761 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4762 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004763}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004764
Samiul Islam7c02e262021-09-08 17:48:28 +01004765func TestApexSetFilenameOverride(t *testing.T) {
4766 testApex(t, `
4767 apex_set {
4768 name: "com.company.android.myapex",
4769 apex_name: "com.android.myapex",
4770 set: "company-myapex.apks",
4771 filename: "com.company.android.myapex.apex"
4772 }
4773 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4774
4775 testApex(t, `
4776 apex_set {
4777 name: "com.company.android.myapex",
4778 apex_name: "com.android.myapex",
4779 set: "company-myapex.apks",
4780 filename: "com.company.android.myapex.capex"
4781 }
4782 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4783
4784 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4785 apex_set {
4786 name: "com.company.android.myapex",
4787 apex_name: "com.android.myapex",
4788 set: "company-myapex.apks",
4789 filename: "some-random-suffix"
4790 }
4791 `)
4792}
4793
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004794func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004795 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004796 prebuilt_apex {
4797 name: "myapex.prebuilt",
4798 src: "myapex-arm.apex",
4799 overrides: [
4800 "myapex",
4801 ],
4802 }
4803 `)
4804
Wei Li340ee8e2022-03-18 17:33:24 -07004805 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
4806 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004807
4808 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004809 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004810 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004811 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004812 }
Wei Li340ee8e2022-03-18 17:33:24 -07004813 rule := testingModule.Rule("genProvenanceMetaData")
4814 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4815 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
4816 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
4817 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004818}
4819
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004820func TestPrebuiltApexName(t *testing.T) {
4821 testApex(t, `
4822 prebuilt_apex {
4823 name: "com.company.android.myapex",
4824 apex_name: "com.android.myapex",
4825 src: "company-myapex-arm.apex",
4826 }
4827 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4828
4829 testApex(t, `
4830 apex_set {
4831 name: "com.company.android.myapex",
4832 apex_name: "com.android.myapex",
4833 set: "company-myapex.apks",
4834 }
4835 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4836}
4837
4838func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
4839 _ = android.GroupFixturePreparers(
4840 java.PrepareForTestWithJavaDefaultModules,
4841 PrepareForTestWithApexBuildComponents,
4842 android.FixtureWithRootAndroidBp(`
4843 platform_bootclasspath {
4844 name: "platform-bootclasspath",
4845 fragments: [
4846 {
4847 apex: "com.android.art",
4848 module: "art-bootclasspath-fragment",
4849 },
4850 ],
4851 }
4852
4853 prebuilt_apex {
4854 name: "com.company.android.art",
4855 apex_name: "com.android.art",
4856 src: "com.company.android.art-arm.apex",
4857 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
4858 }
4859
4860 prebuilt_bootclasspath_fragment {
4861 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01004862 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004863 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01004864 hidden_api: {
4865 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4866 metadata: "my-bootclasspath-fragment/metadata.csv",
4867 index: "my-bootclasspath-fragment/index.csv",
4868 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
4869 all_flags: "my-bootclasspath-fragment/all-flags.csv",
4870 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004871 }
4872
4873 java_import {
4874 name: "core-oj",
4875 jars: ["prebuilt.jar"],
4876 }
4877 `),
4878 ).RunTest(t)
4879}
4880
Spandan Das59a4a2b2024-01-09 21:35:56 +00004881// A minimal context object for use with DexJarBuildPath
4882type moduleErrorfTestCtx struct {
4883}
4884
4885func (ctx moduleErrorfTestCtx) ModuleErrorf(format string, args ...interface{}) {
4886}
4887
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004888func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01004889 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01004890 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01004891 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
4892 // is disabled.
4893 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
Spandan Das81fe4d12024-05-15 18:43:47 +00004894
4895 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
4896 // file creation.
4897 java.FixtureConfigureBootJars("platform:foo"),
4898 android.FixtureModifyMockFS(func(fs android.MockFS) {
4899 fs["platform/Android.bp"] = []byte(`
4900 java_library {
4901 name: "foo",
4902 srcs: ["Test.java"],
4903 compile_dex: true,
4904 }
4905 `)
4906 fs["platform/Test.java"] = nil
4907 }),
Paul Duffinb6f53c02021-05-14 07:52:42 +01004908 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004909
Paul Duffin37856732021-02-26 14:24:15 +00004910 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
4911 t.Helper()
Jiakai Zhangc6879f32023-11-06 16:31:19 +00004912 s := ctx.ModuleForTests("dex_bootjars", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004913 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00004914 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004915 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00004916 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004917 foundLibfooJar = true
4918 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01004919 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004920 }
4921 }
4922 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02004923 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004924 }
4925 }
4926
Paul Duffin40a3f652021-07-19 13:11:24 +01004927 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00004928 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01004929 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01004930 var rule android.TestingBuildParams
4931
4932 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
4933 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00004934 }
4935
Paul Duffin40a3f652021-07-19 13:11:24 +01004936 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
4937 t.Helper()
4938 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
4939 var rule android.TestingBuildParams
4940
4941 rule = platformBootclasspath.Output("hiddenapi-index.csv")
4942 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
4943 }
4944
Paul Duffin89f570a2021-06-16 01:42:33 +01004945 fragment := java.ApexVariantReference{
4946 Apex: proptools.StringPtr("myapex"),
4947 Module: proptools.StringPtr("my-bootclasspath-fragment"),
4948 }
4949
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004950 t.Run("prebuilt only", func(t *testing.T) {
4951 bp := `
4952 prebuilt_apex {
4953 name: "myapex",
4954 arch: {
4955 arm64: {
4956 src: "myapex-arm64.apex",
4957 },
4958 arm: {
4959 src: "myapex-arm.apex",
4960 },
4961 },
Paul Duffin89f570a2021-06-16 01:42:33 +01004962 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
4963 }
4964
4965 prebuilt_bootclasspath_fragment {
4966 name: "my-bootclasspath-fragment",
4967 contents: ["libfoo", "libbar"],
4968 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01004969 hidden_api: {
4970 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4971 metadata: "my-bootclasspath-fragment/metadata.csv",
4972 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01004973 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
4974 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
4975 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01004976 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004977 }
4978
4979 java_import {
4980 name: "libfoo",
4981 jars: ["libfoo.jar"],
4982 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01004983 permitted_packages: ["foo"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00004984 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004985 }
Paul Duffin37856732021-02-26 14:24:15 +00004986
4987 java_sdk_library_import {
4988 name: "libbar",
4989 public: {
4990 jars: ["libbar.jar"],
4991 },
4992 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01004993 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01004994 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00004995 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004996 `
4997
Paul Duffin89f570a2021-06-16 01:42:33 +01004998 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00004999 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5000 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005001
Paul Duffin537ea3d2021-05-14 10:38:00 +01005002 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005003 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005004 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005005 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005006 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005007 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005008 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005009 })
5010
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005011 t.Run("apex_set only", func(t *testing.T) {
5012 bp := `
5013 apex_set {
5014 name: "myapex",
5015 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005016 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005017 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5018 }
5019
Paul Duffin89f570a2021-06-16 01:42:33 +01005020 prebuilt_bootclasspath_fragment {
5021 name: "my-bootclasspath-fragment",
5022 contents: ["libfoo", "libbar"],
5023 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005024 hidden_api: {
5025 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5026 metadata: "my-bootclasspath-fragment/metadata.csv",
5027 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005028 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5029 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5030 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005031 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005032 }
5033
Liz Kammer2dc72442023-04-20 10:10:48 -04005034 prebuilt_systemserverclasspath_fragment {
5035 name: "my-systemserverclasspath-fragment",
5036 contents: ["libbaz"],
5037 apex_available: ["myapex"],
5038 }
5039
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005040 java_import {
5041 name: "libfoo",
5042 jars: ["libfoo.jar"],
5043 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005044 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005045 }
5046
5047 java_sdk_library_import {
5048 name: "libbar",
5049 public: {
5050 jars: ["libbar.jar"],
5051 },
5052 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005053 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005054 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005055 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005056
5057 java_sdk_library_import {
5058 name: "libbaz",
5059 public: {
5060 jars: ["libbaz.jar"],
5061 },
5062 apex_available: ["myapex"],
5063 shared_library: false,
5064 permitted_packages: ["baz"],
5065 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005066 `
5067
Paul Duffin89f570a2021-06-16 01:42:33 +01005068 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005069 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5070 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005071
Paul Duffin537ea3d2021-05-14 10:38:00 +01005072 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005073 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005074 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005075 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005076 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005077 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005078 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005079
5080 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5081
5082 overrideNames := []string{
Spandan Dasa8e2d612024-07-26 19:24:27 +00005083 "",
Liz Kammer2dc72442023-04-20 10:10:48 -04005084 "myjavalib.myapex",
5085 "libfoo.myapex",
5086 "libbar.myapex",
5087 "libbaz.myapex",
5088 }
5089 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5090 for i, e := range mkEntries {
5091 g := e.OverrideName
5092 if w := overrideNames[i]; w != g {
5093 t.Errorf("Expected override name %q, got %q", w, g)
5094 }
5095 }
5096
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005097 })
5098
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005099 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5100 bp := `
5101 prebuilt_apex {
5102 name: "myapex",
5103 arch: {
5104 arm64: {
5105 src: "myapex-arm64.apex",
5106 },
5107 arm: {
5108 src: "myapex-arm.apex",
5109 },
5110 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005111 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5112 }
5113
5114 prebuilt_bootclasspath_fragment {
5115 name: "my-bootclasspath-fragment",
5116 contents: ["libfoo", "libbar"],
5117 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005118 hidden_api: {
5119 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5120 metadata: "my-bootclasspath-fragment/metadata.csv",
5121 index: "my-bootclasspath-fragment/index.csv",
5122 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5123 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5124 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005125 }
5126
5127 java_import {
5128 name: "libfoo",
5129 jars: ["libfoo.jar"],
5130 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005131 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005132 }
5133
5134 java_library {
5135 name: "libfoo",
5136 srcs: ["foo/bar/MyClass.java"],
5137 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005138 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005139 }
Paul Duffin37856732021-02-26 14:24:15 +00005140
5141 java_sdk_library_import {
5142 name: "libbar",
5143 public: {
5144 jars: ["libbar.jar"],
5145 },
5146 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005147 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005148 }
5149
5150 java_sdk_library {
5151 name: "libbar",
5152 srcs: ["foo/bar/MyClass.java"],
5153 unsafe_ignore_missing_latest_api: true,
5154 apex_available: ["myapex"],
5155 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005156 `
5157
5158 // In this test the source (java_library) libfoo is active since the
5159 // prebuilt (java_import) defaults to prefer:false. However the
5160 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5161 // find the dex boot jar in it. We either need to disable the source libfoo
5162 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005163 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005164 // dexbootjar check is skipped if AllowMissingDependencies is true
5165 preparerAllowMissingDeps := android.GroupFixturePreparers(
5166 preparer,
5167 android.PrepareForTestWithAllowMissingDependencies,
5168 )
5169 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005170 })
5171
5172 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5173 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005174 apex {
5175 name: "myapex",
5176 key: "myapex.key",
5177 updatable: false,
5178 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5179 }
5180
5181 apex_key {
5182 name: "myapex.key",
5183 public_key: "testkey.avbpubkey",
5184 private_key: "testkey.pem",
5185 }
5186
5187 bootclasspath_fragment {
5188 name: "my-bootclasspath-fragment",
5189 contents: ["libfoo", "libbar"],
5190 apex_available: ["myapex"],
5191 hidden_api: {
5192 split_packages: ["*"],
5193 },
5194 }
5195
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005196 prebuilt_apex {
5197 name: "myapex",
5198 arch: {
5199 arm64: {
5200 src: "myapex-arm64.apex",
5201 },
5202 arm: {
5203 src: "myapex-arm.apex",
5204 },
5205 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005206 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5207 }
5208
5209 prebuilt_bootclasspath_fragment {
5210 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005211 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005212 contents: ["libfoo", "libbar"],
5213 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005214 hidden_api: {
5215 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5216 metadata: "my-bootclasspath-fragment/metadata.csv",
5217 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005218 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5219 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5220 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005221 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005222 }
5223
5224 java_import {
5225 name: "libfoo",
5226 prefer: true,
5227 jars: ["libfoo.jar"],
5228 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005229 permitted_packages: ["foo"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005230 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005231 }
5232
5233 java_library {
5234 name: "libfoo",
5235 srcs: ["foo/bar/MyClass.java"],
5236 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005237 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005238 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005239 }
Paul Duffin37856732021-02-26 14:24:15 +00005240
5241 java_sdk_library_import {
5242 name: "libbar",
5243 prefer: true,
5244 public: {
5245 jars: ["libbar.jar"],
5246 },
5247 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005248 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005249 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005250 }
5251
5252 java_sdk_library {
5253 name: "libbar",
5254 srcs: ["foo/bar/MyClass.java"],
5255 unsafe_ignore_missing_latest_api: true,
5256 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005257 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005258 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005259 `
5260
Paul Duffin89f570a2021-06-16 01:42:33 +01005261 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005262 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5263 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005264
Paul Duffin537ea3d2021-05-14 10:38:00 +01005265 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005266 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005267 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005268 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005269 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005270 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005271 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005272 })
5273
5274 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5275 bp := `
5276 apex {
5277 name: "myapex",
5278 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005279 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005280 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005281 }
5282
5283 apex_key {
5284 name: "myapex.key",
5285 public_key: "testkey.avbpubkey",
5286 private_key: "testkey.pem",
5287 }
5288
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005289 bootclasspath_fragment {
5290 name: "my-bootclasspath-fragment",
5291 contents: ["libfoo", "libbar"],
5292 apex_available: ["myapex"],
5293 hidden_api: {
5294 split_packages: ["*"],
5295 },
5296 }
5297
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005298 prebuilt_apex {
5299 name: "myapex",
5300 arch: {
5301 arm64: {
5302 src: "myapex-arm64.apex",
5303 },
5304 arm: {
5305 src: "myapex-arm.apex",
5306 },
5307 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005308 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5309 }
5310
5311 prebuilt_bootclasspath_fragment {
5312 name: "my-bootclasspath-fragment",
5313 contents: ["libfoo", "libbar"],
5314 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005315 hidden_api: {
5316 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5317 metadata: "my-bootclasspath-fragment/metadata.csv",
5318 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005319 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5320 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5321 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005322 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005323 }
5324
5325 java_import {
5326 name: "libfoo",
5327 jars: ["libfoo.jar"],
5328 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005329 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005330 }
5331
5332 java_library {
5333 name: "libfoo",
5334 srcs: ["foo/bar/MyClass.java"],
5335 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005336 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005337 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005338 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005339 }
Paul Duffin37856732021-02-26 14:24:15 +00005340
5341 java_sdk_library_import {
5342 name: "libbar",
5343 public: {
5344 jars: ["libbar.jar"],
5345 },
5346 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005347 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005348 }
5349
5350 java_sdk_library {
5351 name: "libbar",
5352 srcs: ["foo/bar/MyClass.java"],
5353 unsafe_ignore_missing_latest_api: true,
5354 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005355 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005356 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005357 sdk_version: "core_current",
Paul Duffin37856732021-02-26 14:24:15 +00005358 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005359 `
5360
Paul Duffin89f570a2021-06-16 01:42:33 +01005361 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Jiakai Zhangc6879f32023-11-06 16:31:19 +00005362 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/hiddenapi-modular/encoded/libfoo.jar")
5363 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/hiddenapi-modular/encoded/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005364
Paul Duffin537ea3d2021-05-14 10:38:00 +01005365 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005366 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005367 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5368 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005369 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
5370 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005371 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005372 })
5373
5374 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5375 bp := `
5376 apex {
5377 name: "myapex",
5378 enabled: false,
5379 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005380 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005381 }
5382
5383 apex_key {
5384 name: "myapex.key",
5385 public_key: "testkey.avbpubkey",
5386 private_key: "testkey.pem",
5387 }
5388
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005389 bootclasspath_fragment {
5390 name: "my-bootclasspath-fragment",
5391 enabled: false,
5392 contents: ["libfoo", "libbar"],
5393 apex_available: ["myapex"],
5394 hidden_api: {
5395 split_packages: ["*"],
5396 },
5397 }
5398
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005399 prebuilt_apex {
5400 name: "myapex",
5401 arch: {
5402 arm64: {
5403 src: "myapex-arm64.apex",
5404 },
5405 arm: {
5406 src: "myapex-arm.apex",
5407 },
5408 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005409 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5410 }
5411
5412 prebuilt_bootclasspath_fragment {
5413 name: "my-bootclasspath-fragment",
5414 contents: ["libfoo", "libbar"],
5415 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005416 hidden_api: {
5417 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5418 metadata: "my-bootclasspath-fragment/metadata.csv",
5419 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005420 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5421 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5422 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005423 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005424 }
5425
5426 java_import {
5427 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005428 jars: ["libfoo.jar"],
5429 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005430 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005431 }
5432
5433 java_library {
5434 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005435 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005436 srcs: ["foo/bar/MyClass.java"],
5437 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005438 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005439 }
Paul Duffin37856732021-02-26 14:24:15 +00005440
5441 java_sdk_library_import {
5442 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00005443 public: {
5444 jars: ["libbar.jar"],
5445 },
5446 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005447 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005448 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005449 }
5450
5451 java_sdk_library {
5452 name: "libbar",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005453 enabled: false,
Paul Duffin37856732021-02-26 14:24:15 +00005454 srcs: ["foo/bar/MyClass.java"],
5455 unsafe_ignore_missing_latest_api: true,
5456 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005457 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005458 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005459 `
Cole Fausta963b942024-04-11 17:43:00 -07005460 // This test disables libbar, which causes the ComponentDepsMutator to add
5461 // deps on libbar.stubs and other sub-modules that don't exist. We can
5462 // enable AllowMissingDependencies to work around that, but enabling that
5463 // causes extra checks for missing source files to dex_bootjars, so add those
5464 // to the mock fs as well.
5465 preparer2 := android.GroupFixturePreparers(
5466 preparer,
5467 android.PrepareForTestWithAllowMissingDependencies,
5468 android.FixtureMergeMockFs(map[string][]byte{
5469 "build/soong/scripts/check_boot_jars/package_allowed_list.txt": nil,
5470 "frameworks/base/config/boot-profile.txt": nil,
5471 }),
5472 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005473
Cole Fausta963b942024-04-11 17:43:00 -07005474 ctx := testDexpreoptWithApexes(t, bp, "", preparer2, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005475 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5476 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005477
Paul Duffin537ea3d2021-05-14 10:38:00 +01005478 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005479 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005480 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005481 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005482 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005483 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005484 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005485 })
Spandan Das3a392012024-01-17 18:26:27 +00005486
Spandan Dasf2c10572024-02-27 04:49:52 +00005487 t.Run("Co-existing unflagged apexes should create a duplicate module error", func(t *testing.T) {
Spandan Das3a392012024-01-17 18:26:27 +00005488 bp := `
5489 // Source
5490 apex {
5491 name: "myapex",
5492 enabled: false,
5493 key: "myapex.key",
5494 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5495 }
5496
5497 apex_key {
5498 name: "myapex.key",
5499 public_key: "testkey.avbpubkey",
5500 private_key: "testkey.pem",
5501 }
5502
5503 // Prebuilt
5504 prebuilt_apex {
5505 name: "myapex.v1",
5506 source_apex_name: "myapex",
5507 arch: {
5508 arm64: {
5509 src: "myapex-arm64.apex",
5510 },
5511 arm: {
5512 src: "myapex-arm.apex",
5513 },
5514 },
5515 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5516 prefer: true,
5517 }
5518 prebuilt_apex {
5519 name: "myapex.v2",
5520 source_apex_name: "myapex",
5521 arch: {
5522 arm64: {
5523 src: "myapex-arm64.apex",
5524 },
5525 arm: {
5526 src: "myapex-arm.apex",
5527 },
5528 },
5529 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5530 prefer: true,
5531 }
5532
5533 prebuilt_bootclasspath_fragment {
5534 name: "my-bootclasspath-fragment",
5535 contents: ["libfoo", "libbar"],
5536 apex_available: ["myapex"],
5537 hidden_api: {
5538 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5539 metadata: "my-bootclasspath-fragment/metadata.csv",
5540 index: "my-bootclasspath-fragment/index.csv",
5541 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5542 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5543 },
5544 prefer: true,
5545 }
5546
5547 java_import {
5548 name: "libfoo",
5549 jars: ["libfoo.jar"],
5550 apex_available: ["myapex"],
5551 prefer: true,
5552 }
5553 java_import {
5554 name: "libbar",
5555 jars: ["libbar.jar"],
5556 apex_available: ["myapex"],
5557 prefer: true,
5558 }
5559 `
5560
Spandan Dasf2c10572024-02-27 04:49:52 +00005561 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 +00005562 })
5563
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005564}
5565
Roland Levillain630846d2019-06-26 12:48:34 +01005566func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005567 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005568 apex_test {
5569 name: "myapex",
5570 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005571 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005572 tests: [
5573 "mytest",
5574 ],
5575 }
5576
5577 apex_key {
5578 name: "myapex.key",
5579 public_key: "testkey.avbpubkey",
5580 private_key: "testkey.pem",
5581 }
5582
Liz Kammer1c14a212020-05-12 15:26:55 -07005583 filegroup {
5584 name: "fg",
5585 srcs: [
5586 "baz",
5587 "bar/baz"
5588 ],
5589 }
5590
Roland Levillain630846d2019-06-26 12:48:34 +01005591 cc_test {
5592 name: "mytest",
5593 gtest: false,
5594 srcs: ["mytest.cpp"],
5595 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005596 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005597 system_shared_libs: [],
5598 static_executable: true,
5599 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005600 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005601 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005602
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005603 cc_library {
5604 name: "mylib",
5605 srcs: ["mylib.cpp"],
5606 system_shared_libs: [],
5607 stl: "none",
5608 }
5609
Liz Kammer5bd365f2020-05-27 15:15:11 -07005610 filegroup {
5611 name: "fg2",
5612 srcs: [
5613 "testdata/baz"
5614 ],
5615 }
Roland Levillain630846d2019-06-26 12:48:34 +01005616 `)
5617
Jooyung Hana0503a52023-08-23 13:12:50 +09005618 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005619 copyCmds := apexRule.Args["copy_commands"]
5620
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005621 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005622 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005623 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005624
Liz Kammer1c14a212020-05-12 15:26:55 -07005625 //Ensure that test data are copied into apex.
5626 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5627 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5628
Roland Levillainf89cd092019-07-29 16:22:59 +01005629 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09005630 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005631 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005632 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005633 prefix := "TARGET_"
5634 var builder strings.Builder
5635 data.Custom(&builder, name, prefix, "", data)
5636 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00005637 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005638 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005639}
5640
Jooyung Hand48f3c32019-08-23 11:18:57 +09005641func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5642 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5643 apex {
5644 name: "myapex",
5645 key: "myapex.key",
5646 native_shared_libs: ["libfoo"],
5647 }
5648
5649 apex_key {
5650 name: "myapex.key",
5651 public_key: "testkey.avbpubkey",
5652 private_key: "testkey.pem",
5653 }
5654
5655 cc_library {
5656 name: "libfoo",
5657 stl: "none",
5658 system_shared_libs: [],
5659 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005660 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005661 }
5662 `)
5663 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5664 apex {
5665 name: "myapex",
5666 key: "myapex.key",
5667 java_libs: ["myjar"],
5668 }
5669
5670 apex_key {
5671 name: "myapex.key",
5672 public_key: "testkey.avbpubkey",
5673 private_key: "testkey.pem",
5674 }
5675
5676 java_library {
5677 name: "myjar",
5678 srcs: ["foo/bar/MyClass.java"],
5679 sdk_version: "none",
5680 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005681 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005682 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005683 }
5684 `)
5685}
5686
Bill Peckhama41a6962021-01-11 10:58:54 -08005687func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005688 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005689 apex {
5690 name: "myapex",
5691 key: "myapex.key",
5692 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005693 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005694 }
5695
5696 apex_key {
5697 name: "myapex.key",
5698 public_key: "testkey.avbpubkey",
5699 private_key: "testkey.pem",
5700 }
5701
5702 java_import {
5703 name: "myjavaimport",
5704 apex_available: ["myapex"],
5705 jars: ["my.jar"],
5706 compile_dex: true,
5707 }
5708 `)
5709
Jooyung Hana0503a52023-08-23 13:12:50 +09005710 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08005711 apexRule := module.Rule("apexRule")
5712 copyCmds := apexRule.Args["copy_commands"]
5713 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5714}
5715
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005716func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005717 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005718 apex {
5719 name: "myapex",
5720 key: "myapex.key",
5721 apps: [
5722 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005723 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005724 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005725 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005726 }
5727
5728 apex_key {
5729 name: "myapex.key",
5730 public_key: "testkey.avbpubkey",
5731 private_key: "testkey.pem",
5732 }
5733
5734 android_app {
5735 name: "AppFoo",
5736 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005737 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005738 system_modules: "none",
Jiyong Park970c5242024-05-17 22:58:54 +00005739 use_embedded_native_libs: true,
Jiyong Park8be103b2019-11-08 15:53:48 +09005740 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005741 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005742 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005743 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005744
5745 android_app {
5746 name: "AppFooPriv",
5747 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005748 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005749 system_modules: "none",
5750 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04005751 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08005752 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005753 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005754 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005755
5756 cc_library_shared {
5757 name: "libjni",
5758 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005759 shared_libs: ["libfoo"],
5760 stl: "none",
5761 system_shared_libs: [],
5762 apex_available: [ "myapex" ],
5763 sdk_version: "current",
5764 }
5765
5766 cc_library_shared {
5767 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005768 stl: "none",
5769 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005770 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005771 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005772 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005773 `)
5774
Jooyung Hana0503a52023-08-23 13:12:50 +09005775 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005776 apexRule := module.Rule("apexRule")
5777 copyCmds := apexRule.Args["copy_commands"]
5778
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005779 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
5780 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00005781 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005782
Colin Crossaede88c2020-08-11 12:17:01 -07005783 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005784 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005785 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005786 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005787 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005788 // JNI libraries including transitive deps are
5789 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01005790 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005791 // ... embedded inside APK (jnilibs.zip)
5792 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5793 // ... and not directly inside the APEX
5794 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5795 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04005796
5797 apexBundle := module.Module().(*apexBundle)
5798 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
5799 var builder strings.Builder
5800 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
5801 androidMk := builder.String()
5802 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
5803 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
5804 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
5805 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
5806 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
5807 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 +01005808}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005809
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005810func TestApexWithAppImportBuildId(t *testing.T) {
5811 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
5812 for _, id := range invalidBuildIds {
5813 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
5814 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5815 variables.BuildId = proptools.StringPtr(id)
5816 })
5817 testApexError(t, message, `apex {
5818 name: "myapex",
5819 key: "myapex.key",
5820 apps: ["AppFooPrebuilt"],
5821 updatable: false,
5822 }
5823
5824 apex_key {
5825 name: "myapex.key",
5826 public_key: "testkey.avbpubkey",
5827 private_key: "testkey.pem",
5828 }
5829
5830 android_app_import {
5831 name: "AppFooPrebuilt",
5832 apk: "PrebuiltAppFoo.apk",
5833 presigned: true,
5834 apex_available: ["myapex"],
5835 }
5836 `, fixture)
5837 }
5838}
5839
Dario Frenicde2a032019-10-27 00:29:22 +01005840func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005841 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01005842 apex {
5843 name: "myapex",
5844 key: "myapex.key",
5845 apps: [
5846 "AppFooPrebuilt",
5847 "AppFooPrivPrebuilt",
5848 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005849 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01005850 }
5851
5852 apex_key {
5853 name: "myapex.key",
5854 public_key: "testkey.avbpubkey",
5855 private_key: "testkey.pem",
5856 }
5857
5858 android_app_import {
5859 name: "AppFooPrebuilt",
5860 apk: "PrebuiltAppFoo.apk",
5861 presigned: true,
5862 dex_preopt: {
5863 enabled: false,
5864 },
Jiyong Park592a6a42020-04-21 22:34:28 +09005865 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005866 }
5867
5868 android_app_import {
5869 name: "AppFooPrivPrebuilt",
5870 apk: "PrebuiltAppFooPriv.apk",
5871 privileged: true,
5872 presigned: true,
5873 dex_preopt: {
5874 enabled: false,
5875 },
Jooyung Han39ee1192020-03-23 20:21:11 +09005876 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09005877 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005878 }
5879 `)
5880
Jooyung Hana0503a52023-08-23 13:12:50 +09005881 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01005882 apexRule := module.Rule("apexRule")
5883 copyCmds := apexRule.Args["copy_commands"]
5884
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005885 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
5886 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005887}
5888
5889func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005890 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09005891 apex {
5892 name: "myapex",
5893 key: "myapex.key",
5894 apps: [
5895 "AppFoo",
5896 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005897 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09005898 }
5899
5900 apex_key {
5901 name: "myapex.key",
5902 public_key: "testkey.avbpubkey",
5903 private_key: "testkey.pem",
5904 }
5905
5906 android_app {
5907 name: "AppFoo",
5908 srcs: ["foo/bar/MyClass.java"],
5909 sdk_version: "none",
5910 system_modules: "none",
5911 apex_available: [ "myapex" ],
5912 }
5913
5914 android_app_import {
5915 name: "AppFoo",
5916 apk: "AppFooPrebuilt.apk",
5917 filename: "AppFooPrebuilt.apk",
5918 presigned: true,
5919 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09005920 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09005921 }
5922 `, withFiles(map[string][]byte{
5923 "AppFooPrebuilt.apk": nil,
5924 }))
5925
Jooyung Hana0503a52023-08-23 13:12:50 +09005926 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005927 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09005928 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005929}
5930
Dario Freni6f3937c2019-12-20 22:58:03 +00005931func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005932 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00005933 apex {
5934 name: "myapex",
5935 key: "myapex.key",
5936 apps: [
5937 "TesterHelpAppFoo",
5938 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005939 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00005940 }
5941
5942 apex_key {
5943 name: "myapex.key",
5944 public_key: "testkey.avbpubkey",
5945 private_key: "testkey.pem",
5946 }
5947
5948 android_test_helper_app {
5949 name: "TesterHelpAppFoo",
5950 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005951 apex_available: [ "myapex" ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005952 sdk_version: "test_current",
Dario Freni6f3937c2019-12-20 22:58:03 +00005953 }
5954
5955 `)
5956
Jooyung Hana0503a52023-08-23 13:12:50 +09005957 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00005958 apexRule := module.Rule("apexRule")
5959 copyCmds := apexRule.Args["copy_commands"]
5960
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005961 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00005962}
5963
Jooyung Han18020ea2019-11-13 10:50:48 +09005964func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
5965 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00005966 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09005967 apex {
5968 name: "myapex",
5969 key: "myapex.key",
5970 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005971 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005972 }
5973
5974 apex_key {
5975 name: "myapex.key",
5976 public_key: "testkey.avbpubkey",
5977 private_key: "testkey.pem",
5978 }
5979
5980 apex {
5981 name: "otherapex",
5982 key: "myapex.key",
5983 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005984 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005985 }
5986
5987 cc_defaults {
5988 name: "libfoo-defaults",
5989 apex_available: ["otherapex"],
5990 }
5991
5992 cc_library {
5993 name: "libfoo",
5994 defaults: ["libfoo-defaults"],
5995 stl: "none",
5996 system_shared_libs: [],
5997 }`)
5998}
5999
Paul Duffine52e66f2020-03-30 17:54:29 +01006000func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006001 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006002 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006003 apex {
6004 name: "myapex",
6005 key: "myapex.key",
6006 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006007 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006008 }
6009
6010 apex_key {
6011 name: "myapex.key",
6012 public_key: "testkey.avbpubkey",
6013 private_key: "testkey.pem",
6014 }
6015
6016 apex {
6017 name: "otherapex",
6018 key: "otherapex.key",
6019 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006020 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006021 }
6022
6023 apex_key {
6024 name: "otherapex.key",
6025 public_key: "testkey.avbpubkey",
6026 private_key: "testkey.pem",
6027 }
6028
6029 cc_library {
6030 name: "libfoo",
6031 stl: "none",
6032 system_shared_libs: [],
6033 apex_available: ["otherapex"],
6034 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006035}
Jiyong Park127b40b2019-09-30 16:04:35 +09006036
Paul Duffine52e66f2020-03-30 17:54:29 +01006037func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006038 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006039 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006040.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006041.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006042.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006043.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006044.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006045.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006046 apex {
6047 name: "myapex",
6048 key: "myapex.key",
6049 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006050 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006051 }
6052
6053 apex_key {
6054 name: "myapex.key",
6055 public_key: "testkey.avbpubkey",
6056 private_key: "testkey.pem",
6057 }
6058
Jiyong Park127b40b2019-09-30 16:04:35 +09006059 cc_library {
6060 name: "libfoo",
6061 stl: "none",
6062 shared_libs: ["libbar"],
6063 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006064 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006065 }
6066
6067 cc_library {
6068 name: "libbar",
6069 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006070 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006071 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006072 apex_available: ["myapex"],
6073 }
6074
6075 cc_library {
6076 name: "libbaz",
6077 stl: "none",
6078 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006079 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006080}
Jiyong Park127b40b2019-09-30 16:04:35 +09006081
Liz Kammer5f108fa2023-05-11 14:33:17 -04006082func TestApexAvailable_IndirectStaticDep(t *testing.T) {
6083 testApex(t, `
6084 apex {
6085 name: "myapex",
6086 key: "myapex.key",
6087 native_shared_libs: ["libfoo"],
6088 updatable: false,
6089 }
6090
6091 apex_key {
6092 name: "myapex.key",
6093 public_key: "testkey.avbpubkey",
6094 private_key: "testkey.pem",
6095 }
6096
6097 cc_library {
6098 name: "libfoo",
6099 stl: "none",
6100 static_libs: ["libbar"],
6101 system_shared_libs: [],
6102 apex_available: ["myapex"],
6103 }
6104
6105 cc_library {
6106 name: "libbar",
6107 stl: "none",
6108 shared_libs: ["libbaz"],
6109 system_shared_libs: [],
6110 apex_available: ["myapex"],
6111 }
6112
6113 cc_library {
6114 name: "libbaz",
6115 stl: "none",
6116 system_shared_libs: [],
6117 }`)
6118
6119 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6120 apex {
6121 name: "myapex",
6122 key: "myapex.key",
6123 native_shared_libs: ["libfoo"],
6124 updatable: false,
6125 }
6126
6127 apex_key {
6128 name: "myapex.key",
6129 public_key: "testkey.avbpubkey",
6130 private_key: "testkey.pem",
6131 }
6132
6133 cc_library {
6134 name: "libfoo",
6135 stl: "none",
6136 static_libs: ["libbar"],
6137 system_shared_libs: [],
6138 apex_available: ["myapex"],
6139 }
6140
6141 cc_library {
6142 name: "libbar",
6143 stl: "none",
6144 system_shared_libs: [],
6145 }`)
6146}
6147
Paul Duffine52e66f2020-03-30 17:54:29 +01006148func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006149 testApexError(t, "\"otherapex\" is not a valid module name", `
6150 apex {
6151 name: "myapex",
6152 key: "myapex.key",
6153 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006154 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006155 }
6156
6157 apex_key {
6158 name: "myapex.key",
6159 public_key: "testkey.avbpubkey",
6160 private_key: "testkey.pem",
6161 }
6162
6163 cc_library {
6164 name: "libfoo",
6165 stl: "none",
6166 system_shared_libs: [],
6167 apex_available: ["otherapex"],
6168 }`)
6169
Paul Duffine52e66f2020-03-30 17:54:29 +01006170 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006171 apex {
6172 name: "myapex",
6173 key: "myapex.key",
6174 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006175 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006176 }
6177
6178 apex_key {
6179 name: "myapex.key",
6180 public_key: "testkey.avbpubkey",
6181 private_key: "testkey.pem",
6182 }
6183
6184 cc_library {
6185 name: "libfoo",
6186 stl: "none",
6187 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006188 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006189 apex_available: ["myapex"],
6190 }
6191
6192 cc_library {
6193 name: "libbar",
6194 stl: "none",
6195 system_shared_libs: [],
6196 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006197 }
6198
6199 cc_library {
6200 name: "libbaz",
6201 stl: "none",
6202 system_shared_libs: [],
6203 stubs: {
6204 versions: ["10", "20", "30"],
6205 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006206 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006207}
Jiyong Park127b40b2019-09-30 16:04:35 +09006208
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006209func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
6210 t.Run("negative variant_version produces error", func(t *testing.T) {
6211 testApexError(t, "expected an integer between 0-9; got -1", `
6212 apex {
6213 name: "myapex",
6214 key: "myapex.key",
6215 apex_available_name: "com.android.foo",
6216 variant_version: "-1",
6217 updatable: false,
6218 }
6219 apex_key {
6220 name: "myapex.key",
6221 public_key: "testkey.avbpubkey",
6222 private_key: "testkey.pem",
6223 }
6224 `)
6225 })
6226
6227 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
6228 testApexError(t, "expected an integer between 0-9; got 10", `
6229 apex {
6230 name: "myapex",
6231 key: "myapex.key",
6232 apex_available_name: "com.android.foo",
6233 variant_version: "10",
6234 updatable: false,
6235 }
6236 apex_key {
6237 name: "myapex.key",
6238 public_key: "testkey.avbpubkey",
6239 private_key: "testkey.pem",
6240 }
6241 `)
6242 })
6243}
6244
6245func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
6246 context := android.GroupFixturePreparers(
6247 android.PrepareForIntegrationTestWithAndroid,
6248 PrepareForTestWithApexBuildComponents,
6249 android.FixtureMergeMockFs(android.MockFS{
6250 "system/sepolicy/apex/foo-file_contexts": nil,
6251 "system/sepolicy/apex/bar-file_contexts": nil,
6252 }),
6253 )
6254 result := context.RunTestWithBp(t, `
6255 apex {
6256 name: "foo",
6257 key: "myapex.key",
6258 apex_available_name: "com.android.foo",
6259 variant_version: "0",
6260 updatable: false,
6261 }
6262 apex {
6263 name: "bar",
6264 key: "myapex.key",
6265 apex_available_name: "com.android.foo",
6266 variant_version: "3",
6267 updatable: false,
6268 }
6269 apex_key {
6270 name: "myapex.key",
6271 public_key: "testkey.avbpubkey",
6272 private_key: "testkey.pem",
6273 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006274 override_apex {
6275 name: "myoverrideapex",
6276 base: "bar",
6277 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006278 `)
6279
Jooyung Hana0503a52023-08-23 13:12:50 +09006280 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006281 fooExpectedDefaultVersion := android.DefaultUpdatableModuleVersion
6282 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6283 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6284 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6285 }
6286
Jooyung Hana0503a52023-08-23 13:12:50 +09006287 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006288 defaultVersionInt, _ := strconv.Atoi(android.DefaultUpdatableModuleVersion)
6289 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6290 barActualDefaultVersion := barManifestRule.Args["default_version"]
6291 if barActualDefaultVersion != barExpectedDefaultVersion {
6292 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6293 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006294
Spandan Das50801e22024-05-13 18:29:45 +00006295 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_myoverrideapex").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04006296 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6297 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6298 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6299 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006300}
6301
Sam Delmericoca816532023-06-02 14:09:50 -04006302func TestApexAvailable_ApexAvailableName(t *testing.T) {
6303 t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) {
6304 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6305 apex {
6306 name: "myapex_sminus",
6307 key: "myapex.key",
6308 apps: ["AppFoo"],
6309 apex_available_name: "myapex",
6310 updatable: false,
6311 }
6312 apex {
6313 name: "myapex",
6314 key: "myapex.key",
6315 apps: ["AppFoo"],
6316 updatable: false,
6317 }
6318 apex_key {
6319 name: "myapex.key",
6320 public_key: "testkey.avbpubkey",
6321 private_key: "testkey.pem",
6322 }
6323 android_app {
6324 name: "AppFoo",
6325 srcs: ["foo/bar/MyClass.java"],
6326 sdk_version: "none",
6327 system_modules: "none",
6328 apex_available: [ "myapex_sminus" ],
6329 }`,
6330 android.FixtureMergeMockFs(android.MockFS{
6331 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6332 }),
6333 )
6334 })
6335
6336 t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) {
6337 testApex(t, `
6338 apex {
6339 name: "myapex_sminus",
6340 key: "myapex.key",
6341 apps: ["AppFoo"],
6342 apex_available_name: "myapex",
6343 updatable: false,
6344 }
6345 apex {
6346 name: "myapex",
6347 key: "myapex.key",
6348 apps: ["AppFoo"],
6349 updatable: false,
6350 }
6351 apex_key {
6352 name: "myapex.key",
6353 public_key: "testkey.avbpubkey",
6354 private_key: "testkey.pem",
6355 }
6356 android_app {
6357 name: "AppFoo",
6358 srcs: ["foo/bar/MyClass.java"],
6359 sdk_version: "none",
6360 system_modules: "none",
6361 apex_available: [ "myapex" ],
6362 }`,
6363 android.FixtureMergeMockFs(android.MockFS{
6364 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6365 }),
6366 )
6367 })
6368
6369 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
6370 testApex(t, `
6371 override_apex {
6372 name: "myoverrideapex_sminus",
6373 base: "myapex_sminus",
6374 key: "myapex.key",
6375 apps: ["AppFooOverride"],
6376 }
6377 override_apex {
6378 name: "myoverrideapex",
6379 base: "myapex",
6380 key: "myapex.key",
6381 apps: ["AppFooOverride"],
6382 }
6383 apex {
6384 name: "myapex_sminus",
6385 key: "myapex.key",
6386 apps: ["AppFoo"],
6387 apex_available_name: "myapex",
6388 updatable: false,
6389 }
6390 apex {
6391 name: "myapex",
6392 key: "myapex.key",
6393 apps: ["AppFoo"],
6394 updatable: false,
6395 }
6396 apex_key {
6397 name: "myapex.key",
6398 public_key: "testkey.avbpubkey",
6399 private_key: "testkey.pem",
6400 }
6401 android_app {
6402 name: "AppFooOverride",
6403 srcs: ["foo/bar/MyClass.java"],
6404 sdk_version: "none",
6405 system_modules: "none",
6406 apex_available: [ "myapex" ],
6407 }
6408 android_app {
6409 name: "AppFoo",
6410 srcs: ["foo/bar/MyClass.java"],
6411 sdk_version: "none",
6412 system_modules: "none",
6413 apex_available: [ "myapex" ],
6414 }`,
6415 android.FixtureMergeMockFs(android.MockFS{
6416 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6417 }),
6418 )
6419 })
6420}
6421
6422func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
6423 context := android.GroupFixturePreparers(
6424 android.PrepareForIntegrationTestWithAndroid,
6425 PrepareForTestWithApexBuildComponents,
6426 java.PrepareForTestWithDexpreopt,
6427 android.FixtureMergeMockFs(android.MockFS{
6428 "system/sepolicy/apex/myapex-file_contexts": nil,
6429 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6430 }),
6431 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6432 variables.BuildId = proptools.StringPtr("buildid")
6433 }),
6434 )
6435 context.RunTestWithBp(t, `
6436 override_apex {
6437 name: "myoverrideapex_sminus",
6438 base: "myapex_sminus",
6439 }
6440 override_apex {
6441 name: "myoverrideapex",
6442 base: "myapex",
6443 }
6444 apex {
6445 name: "myapex",
6446 key: "myapex.key",
6447 apps: ["AppFoo"],
6448 updatable: false,
6449 }
6450 apex {
6451 name: "myapex_sminus",
6452 apex_available_name: "myapex",
6453 key: "myapex.key",
6454 apps: ["AppFoo_sminus"],
6455 updatable: false,
6456 }
6457 apex_key {
6458 name: "myapex.key",
6459 public_key: "testkey.avbpubkey",
6460 private_key: "testkey.pem",
6461 }
6462 android_app {
6463 name: "AppFoo",
6464 srcs: ["foo/bar/MyClass.java"],
6465 sdk_version: "none",
6466 system_modules: "none",
6467 apex_available: [ "myapex" ],
6468 }
6469 android_app {
6470 name: "AppFoo_sminus",
6471 srcs: ["foo/bar/MyClass.java"],
6472 sdk_version: "none",
6473 min_sdk_version: "29",
6474 system_modules: "none",
6475 apex_available: [ "myapex" ],
6476 }`)
6477}
6478
Jiyong Park89e850a2020-04-07 16:37:39 +09006479func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006480 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006481 apex {
6482 name: "myapex",
6483 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006484 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006485 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006486 }
6487
6488 apex_key {
6489 name: "myapex.key",
6490 public_key: "testkey.avbpubkey",
6491 private_key: "testkey.pem",
6492 }
6493
6494 cc_library {
6495 name: "libfoo",
6496 stl: "none",
6497 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006498 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006499 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006500 }
6501
6502 cc_library {
6503 name: "libfoo2",
6504 stl: "none",
6505 system_shared_libs: [],
6506 shared_libs: ["libbaz"],
6507 apex_available: ["//apex_available:platform"],
6508 }
6509
6510 cc_library {
6511 name: "libbar",
6512 stl: "none",
6513 system_shared_libs: [],
6514 apex_available: ["myapex"],
6515 }
6516
6517 cc_library {
6518 name: "libbaz",
6519 stl: "none",
6520 system_shared_libs: [],
6521 apex_available: ["myapex"],
6522 stubs: {
6523 versions: ["1"],
6524 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006525 }`)
6526
Jiyong Park89e850a2020-04-07 16:37:39 +09006527 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6528 // because it depends on libbar which isn't available to platform
6529 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6530 if libfoo.NotAvailableForPlatform() != true {
6531 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6532 }
6533
6534 // libfoo2 however can be available to platform because it depends on libbaz which provides
6535 // stubs
6536 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6537 if libfoo2.NotAvailableForPlatform() == true {
6538 t.Errorf("%q should be available to platform", libfoo2.String())
6539 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006540}
Jiyong Parka90ca002019-10-07 15:47:24 +09006541
Paul Duffine52e66f2020-03-30 17:54:29 +01006542func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006543 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006544 apex {
6545 name: "myapex",
6546 key: "myapex.key",
6547 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006548 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006549 }
6550
6551 apex_key {
6552 name: "myapex.key",
6553 public_key: "testkey.avbpubkey",
6554 private_key: "testkey.pem",
6555 }
6556
6557 cc_library {
6558 name: "libfoo",
6559 stl: "none",
6560 system_shared_libs: [],
6561 apex_available: ["myapex"],
6562 static: {
6563 apex_available: ["//apex_available:platform"],
6564 },
6565 }`)
6566
Jiyong Park89e850a2020-04-07 16:37:39 +09006567 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6568 if libfooShared.NotAvailableForPlatform() != true {
6569 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6570 }
6571 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6572 if libfooStatic.NotAvailableForPlatform() != false {
6573 t.Errorf("%q should be available to platform", libfooStatic.String())
6574 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006575}
6576
Jooyung Han9a419e22024-08-16 17:14:21 +09006577func TestApexAvailable_PrefixMatch(t *testing.T) {
6578
6579 for _, tc := range []struct {
6580 name string
6581 apexAvailable string
6582 expectedError string
6583 }{
6584 {
6585 name: "prefix matches correctly",
6586 apexAvailable: "com.foo.*",
6587 },
6588 {
6589 name: "prefix doesn't match",
6590 apexAvailable: "com.bar.*",
6591 expectedError: `Consider .* "com.foo\.\*"`,
6592 },
6593 {
6594 name: "short prefix",
6595 apexAvailable: "com.*",
6596 expectedError: "requires two or more components",
6597 },
6598 {
6599 name: "wildcard not in the end",
6600 apexAvailable: "com.*.foo",
6601 expectedError: "should end with .*",
6602 },
6603 {
6604 name: "wildcard in the middle",
6605 apexAvailable: "com.foo*.*",
6606 expectedError: "not allowed in the middle",
6607 },
6608 {
6609 name: "hint with prefix pattern",
6610 apexAvailable: "//apex_available:platform",
6611 expectedError: "Consider adding \"com.foo.bar\" or \"com.foo.*\"",
6612 },
6613 } {
6614 t.Run(tc.name, func(t *testing.T) {
6615 errorHandler := android.FixtureExpectsNoErrors
6616 if tc.expectedError != "" {
6617 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(tc.expectedError)
6618 }
6619 context := android.GroupFixturePreparers(
6620 prepareForApexTest,
6621 android.FixtureMergeMockFs(android.MockFS{
6622 "system/sepolicy/apex/com.foo.bar-file_contexts": nil,
6623 }),
6624 ).ExtendWithErrorHandler(errorHandler)
6625
6626 context.RunTestWithBp(t, `
6627 apex {
6628 name: "com.foo.bar",
6629 key: "myapex.key",
6630 native_shared_libs: ["libfoo"],
6631 updatable: false,
6632 }
6633
6634 apex_key {
6635 name: "myapex.key",
6636 public_key: "testkey.avbpubkey",
6637 private_key: "testkey.pem",
6638 }
6639
6640 cc_library {
6641 name: "libfoo",
6642 stl: "none",
6643 system_shared_libs: [],
6644 apex_available: ["`+tc.apexAvailable+`"],
6645 }`)
6646 })
6647 }
6648 testApexError(t, `Consider adding "com.foo" to`, `
6649 apex {
6650 name: "com.foo", // too short for a partner apex
6651 key: "myapex.key",
6652 native_shared_libs: ["libfoo"],
6653 updatable: false,
6654 }
6655
6656 apex_key {
6657 name: "myapex.key",
6658 public_key: "testkey.avbpubkey",
6659 private_key: "testkey.pem",
6660 }
6661
6662 cc_library {
6663 name: "libfoo",
6664 stl: "none",
6665 system_shared_libs: [],
6666 }
6667 `)
6668}
6669
Jiyong Park5d790c32019-11-15 18:40:32 +09006670func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006671 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006672 apex {
6673 name: "myapex",
6674 key: "myapex.key",
6675 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006676 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006677 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006678 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006679 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006680 }
6681
6682 override_apex {
6683 name: "override_myapex",
6684 base: "myapex",
6685 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08006686 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006687 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006688 overrides: ["unknownapex"],
Jesse Melhuishec60e252024-03-29 19:08:20 +00006689 compile_multilib: "first",
6690 multilib: {
6691 lib32: {
6692 native_shared_libs: ["mylib32"],
6693 },
6694 lib64: {
6695 native_shared_libs: ["mylib64"],
6696 },
6697 },
Baligh Uddin004d7172020-02-19 21:29:28 -08006698 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006699 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006700 key: "mynewapex.key",
6701 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006702 }
6703
6704 apex_key {
6705 name: "myapex.key",
6706 public_key: "testkey.avbpubkey",
6707 private_key: "testkey.pem",
6708 }
6709
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006710 apex_key {
6711 name: "mynewapex.key",
6712 public_key: "testkey2.avbpubkey",
6713 private_key: "testkey2.pem",
6714 }
6715
6716 android_app_certificate {
6717 name: "myapex.certificate",
6718 certificate: "testkey",
6719 }
6720
Jiyong Park5d790c32019-11-15 18:40:32 +09006721 android_app {
6722 name: "app",
6723 srcs: ["foo/bar/MyClass.java"],
6724 package_name: "foo",
6725 sdk_version: "none",
6726 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006727 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006728 }
6729
6730 override_android_app {
6731 name: "override_app",
6732 base: "app",
6733 package_name: "bar",
6734 }
markchien7c803b82021-08-26 22:10:06 +08006735
6736 bpf {
6737 name: "bpf",
6738 srcs: ["bpf.c"],
6739 }
6740
6741 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08006742 name: "overrideBpf",
6743 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08006744 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006745
6746 prebuilt_etc {
6747 name: "myetc",
6748 src: "myprebuilt",
6749 }
6750
6751 prebuilt_etc {
6752 name: "override_myetc",
6753 src: "override_myprebuilt",
6754 }
Jesse Melhuishec60e252024-03-29 19:08:20 +00006755
6756 cc_library {
6757 name: "mylib32",
6758 apex_available: [ "myapex" ],
6759 }
6760
6761 cc_library {
6762 name: "mylib64",
6763 apex_available: [ "myapex" ],
6764 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006765 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006766
Jooyung Hana0503a52023-08-23 13:12:50 +09006767 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
Spandan Das50801e22024-05-13 18:29:45 +00006768 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09006769 if originalVariant.GetOverriddenBy() != "" {
6770 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6771 }
6772 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6773 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6774 }
6775
Spandan Das50801e22024-05-13 18:29:45 +00006776 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006777 apexRule := module.Rule("apexRule")
6778 copyCmds := apexRule.Args["copy_commands"]
6779
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006780 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
6781 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006782
markchien7c803b82021-08-26 22:10:06 +08006783 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08006784 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08006785
Daniel Norman5a3ce132021-08-26 15:44:43 -07006786 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6787 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6788
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006789 apexBundle := module.Module().(*apexBundle)
6790 name := apexBundle.Name()
6791 if name != "override_myapex" {
6792 t.Errorf("name should be \"override_myapex\", but was %q", name)
6793 }
6794
Baligh Uddin004d7172020-02-19 21:29:28 -08006795 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6796 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6797 }
6798
Jiyong Park20bacab2020-03-03 11:45:41 +09006799 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006800 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006801 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6802
6803 signApkRule := module.Rule("signapk")
6804 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006805
Colin Crossaa255532020-07-03 13:18:24 -07006806 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006807 var builder strings.Builder
6808 data.Custom(&builder, name, "TARGET_", "", data)
6809 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006810 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
6811 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006812 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006813 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006814 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006815 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006816 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006817 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006818}
6819
Albert Martineefabcf2022-03-21 20:11:16 +00006820func TestMinSdkVersionOverride(t *testing.T) {
6821 // Override from 29 to 31
6822 minSdkOverride31 := "31"
6823 ctx := testApex(t, `
6824 apex {
6825 name: "myapex",
6826 key: "myapex.key",
6827 native_shared_libs: ["mylib"],
6828 updatable: true,
6829 min_sdk_version: "29"
6830 }
6831
6832 override_apex {
6833 name: "override_myapex",
6834 base: "myapex",
6835 logging_parent: "com.foo.bar",
6836 package_name: "test.overridden.package"
6837 }
6838
6839 apex_key {
6840 name: "myapex.key",
6841 public_key: "testkey.avbpubkey",
6842 private_key: "testkey.pem",
6843 }
6844
6845 cc_library {
6846 name: "mylib",
6847 srcs: ["mylib.cpp"],
6848 runtime_libs: ["libbar"],
6849 system_shared_libs: [],
6850 stl: "none",
6851 apex_available: [ "myapex" ],
6852 min_sdk_version: "apex_inherit"
6853 }
6854
6855 cc_library {
6856 name: "libbar",
6857 srcs: ["mylib.cpp"],
6858 system_shared_libs: [],
6859 stl: "none",
6860 apex_available: [ "myapex" ],
6861 min_sdk_version: "apex_inherit"
6862 }
6863
6864 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
6865
Jooyung Hana0503a52023-08-23 13:12:50 +09006866 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00006867 copyCmds := apexRule.Args["copy_commands"]
6868
6869 // Ensure that direct non-stubs dep is always included
6870 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6871
6872 // Ensure that runtime_libs dep in included
6873 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6874
6875 // Ensure libraries target overridden min_sdk_version value
6876 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6877}
6878
6879func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
6880 // Attempt to override from 31 to 29, should be a NOOP
6881 minSdkOverride29 := "29"
6882 ctx := testApex(t, `
6883 apex {
6884 name: "myapex",
6885 key: "myapex.key",
6886 native_shared_libs: ["mylib"],
6887 updatable: true,
6888 min_sdk_version: "31"
6889 }
6890
6891 override_apex {
6892 name: "override_myapex",
6893 base: "myapex",
6894 logging_parent: "com.foo.bar",
6895 package_name: "test.overridden.package"
6896 }
6897
6898 apex_key {
6899 name: "myapex.key",
6900 public_key: "testkey.avbpubkey",
6901 private_key: "testkey.pem",
6902 }
6903
6904 cc_library {
6905 name: "mylib",
6906 srcs: ["mylib.cpp"],
6907 runtime_libs: ["libbar"],
6908 system_shared_libs: [],
6909 stl: "none",
6910 apex_available: [ "myapex" ],
6911 min_sdk_version: "apex_inherit"
6912 }
6913
6914 cc_library {
6915 name: "libbar",
6916 srcs: ["mylib.cpp"],
6917 system_shared_libs: [],
6918 stl: "none",
6919 apex_available: [ "myapex" ],
6920 min_sdk_version: "apex_inherit"
6921 }
6922
6923 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
6924
Jooyung Hana0503a52023-08-23 13:12:50 +09006925 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00006926 copyCmds := apexRule.Args["copy_commands"]
6927
6928 // Ensure that direct non-stubs dep is always included
6929 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6930
6931 // Ensure that runtime_libs dep in included
6932 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6933
6934 // Ensure libraries target the original min_sdk_version value rather than the overridden
6935 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6936}
6937
Jooyung Han214bf372019-11-12 13:03:50 +09006938func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006939 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09006940 apex {
6941 name: "myapex",
6942 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006943 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09006944 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09006945 }
6946
6947 apex_key {
6948 name: "myapex.key",
6949 public_key: "testkey.avbpubkey",
6950 private_key: "testkey.pem",
6951 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006952
6953 cc_library {
6954 name: "mylib",
6955 srcs: ["mylib.cpp"],
6956 stl: "libc++",
6957 system_shared_libs: [],
6958 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09006959 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006960 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006961 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09006962
Jooyung Hana0503a52023-08-23 13:12:50 +09006963 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09006964 args := module.Rule("apexRule").Args
6965 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00006966 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006967
6968 // The copies of the libraries in the apex should have one more dependency than
6969 // the ones outside the apex, namely the unwinder. Ideally we should check
6970 // the dependency names directly here but for some reason the names are blank in
6971 // this test.
6972 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07006973 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006974 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
6975 if len(apexImplicits) != len(nonApexImplicits)+1 {
6976 t.Errorf("%q missing unwinder dep", lib)
6977 }
6978 }
Jooyung Han214bf372019-11-12 13:03:50 +09006979}
6980
Paul Duffine05480a2021-03-08 15:07:14 +00006981var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01006982 "api/current.txt": nil,
6983 "api/removed.txt": nil,
6984 "api/system-current.txt": nil,
6985 "api/system-removed.txt": nil,
6986 "api/test-current.txt": nil,
6987 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01006988
Anton Hanssondff2c782020-12-21 17:10:01 +00006989 "100/public/api/foo.txt": nil,
6990 "100/public/api/foo-removed.txt": nil,
6991 "100/system/api/foo.txt": nil,
6992 "100/system/api/foo-removed.txt": nil,
6993
Paul Duffineedc5d52020-06-12 17:46:39 +01006994 // For java_sdk_library_import
6995 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01006996}
6997
Jooyung Han58f26ab2019-12-18 15:34:32 +09006998func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006999 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007000 apex {
7001 name: "myapex",
7002 key: "myapex.key",
7003 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007004 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007005 }
7006
7007 apex_key {
7008 name: "myapex.key",
7009 public_key: "testkey.avbpubkey",
7010 private_key: "testkey.pem",
7011 }
7012
7013 java_sdk_library {
7014 name: "foo",
7015 srcs: ["a.java"],
7016 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007017 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007018 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007019
7020 prebuilt_apis {
7021 name: "sdk",
7022 api_dirs: ["100"],
7023 }
Paul Duffin9b879592020-05-26 13:21:35 +01007024 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007025
7026 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007027 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007028 "javalib/foo.jar",
7029 "etc/permissions/foo.xml",
7030 })
7031 // Permission XML should point to the activated path of impl jar of java_sdk_library
Paul Duffin1816cde2024-04-10 10:58:21 +01007032 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Output("foo.xml")
7033 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7034 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
Jooyung Han58f26ab2019-12-18 15:34:32 +09007035}
7036
Spandan Das3ee19692024-06-19 04:47:40 +00007037func TestJavaSDKLibraryOverrideApexes(t *testing.T) {
7038 ctx := testApex(t, `
7039 override_apex {
7040 name: "mycompanyapex",
7041 base: "myapex",
7042 }
7043 apex {
7044 name: "myapex",
7045 key: "myapex.key",
7046 java_libs: ["foo"],
7047 updatable: false,
7048 }
7049
7050 apex_key {
7051 name: "myapex.key",
7052 public_key: "testkey.avbpubkey",
7053 private_key: "testkey.pem",
7054 }
7055
7056 java_sdk_library {
7057 name: "foo",
7058 srcs: ["a.java"],
7059 api_packages: ["foo"],
7060 apex_available: [ "myapex" ],
7061 }
7062
7063 prebuilt_apis {
7064 name: "sdk",
7065 api_dirs: ["100"],
7066 }
7067 `, withFiles(filesForSdkLibrary))
7068
7069 // Permission XML should point to the activated path of impl jar of java_sdk_library.
7070 // Since override variants (com.mycompany.android.foo) are installed in the same package as the overridden variant
7071 // (com.android.foo), the filepath should not contain override apex name.
7072 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_mycompanyapex").Output("foo.xml")
7073 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7074 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
7075}
7076
Paul Duffin9b879592020-05-26 13:21:35 +01007077func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007078 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007079 apex {
7080 name: "myapex",
7081 key: "myapex.key",
7082 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007083 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007084 }
7085
7086 apex_key {
7087 name: "myapex.key",
7088 public_key: "testkey.avbpubkey",
7089 private_key: "testkey.pem",
7090 }
7091
7092 java_sdk_library {
7093 name: "foo",
7094 srcs: ["a.java"],
7095 api_packages: ["foo"],
7096 apex_available: ["myapex"],
7097 sdk_version: "none",
7098 system_modules: "none",
7099 }
7100
7101 java_library {
7102 name: "bar",
7103 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007104 libs: ["foo.impl"],
Paul Duffin9b879592020-05-26 13:21:35 +01007105 apex_available: ["myapex"],
7106 sdk_version: "none",
7107 system_modules: "none",
7108 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007109
7110 prebuilt_apis {
7111 name: "sdk",
7112 api_dirs: ["100"],
7113 }
Paul Duffin9b879592020-05-26 13:21:35 +01007114 `, withFiles(filesForSdkLibrary))
7115
7116 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007117 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007118 "javalib/bar.jar",
7119 "javalib/foo.jar",
7120 "etc/permissions/foo.xml",
7121 })
7122
7123 // The bar library should depend on the implementation jar.
7124 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007125 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007126 t.Errorf("expected %q, found %#q", expected, actual)
7127 }
7128}
7129
7130func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007131 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007132 apex {
7133 name: "myapex",
7134 key: "myapex.key",
7135 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007136 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007137 }
7138
7139 apex_key {
7140 name: "myapex.key",
7141 public_key: "testkey.avbpubkey",
7142 private_key: "testkey.pem",
7143 }
7144
7145 java_sdk_library {
7146 name: "foo",
7147 srcs: ["a.java"],
7148 api_packages: ["foo"],
7149 apex_available: ["myapex"],
7150 sdk_version: "none",
7151 system_modules: "none",
7152 }
7153
7154 java_library {
7155 name: "bar",
7156 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007157 libs: ["foo.stubs"],
Paul Duffin9b879592020-05-26 13:21:35 +01007158 sdk_version: "none",
7159 system_modules: "none",
7160 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007161
7162 prebuilt_apis {
7163 name: "sdk",
7164 api_dirs: ["100"],
7165 }
Paul Duffin9b879592020-05-26 13:21:35 +01007166 `, withFiles(filesForSdkLibrary))
7167
7168 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007169 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007170 "javalib/foo.jar",
7171 "etc/permissions/foo.xml",
7172 })
7173
7174 // The bar library should depend on the stubs jar.
7175 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007176 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007177 t.Errorf("expected %q, found %#q", expected, actual)
7178 }
7179}
7180
Paul Duffineedc5d52020-06-12 17:46:39 +01007181func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007182 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007183 prebuilt_apis {
7184 name: "sdk",
7185 api_dirs: ["100"],
7186 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007187 withFiles(map[string][]byte{
7188 "apex/a.java": nil,
7189 "apex/apex_manifest.json": nil,
7190 "apex/Android.bp": []byte(`
7191 package {
7192 default_visibility: ["//visibility:private"],
7193 }
7194
7195 apex {
7196 name: "myapex",
7197 key: "myapex.key",
7198 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007199 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007200 }
7201
7202 apex_key {
7203 name: "myapex.key",
7204 public_key: "testkey.avbpubkey",
7205 private_key: "testkey.pem",
7206 }
7207
7208 java_library {
7209 name: "bar",
7210 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007211 libs: ["foo.impl"],
Paul Duffineedc5d52020-06-12 17:46:39 +01007212 apex_available: ["myapex"],
7213 sdk_version: "none",
7214 system_modules: "none",
7215 }
7216`),
7217 "source/a.java": nil,
7218 "source/api/current.txt": nil,
7219 "source/api/removed.txt": nil,
7220 "source/Android.bp": []byte(`
7221 package {
7222 default_visibility: ["//visibility:private"],
7223 }
7224
7225 java_sdk_library {
7226 name: "foo",
7227 visibility: ["//apex"],
7228 srcs: ["a.java"],
7229 api_packages: ["foo"],
7230 apex_available: ["myapex"],
7231 sdk_version: "none",
7232 system_modules: "none",
7233 public: {
7234 enabled: true,
7235 },
7236 }
7237`),
7238 "prebuilt/a.jar": nil,
7239 "prebuilt/Android.bp": []byte(`
7240 package {
7241 default_visibility: ["//visibility:private"],
7242 }
7243
7244 java_sdk_library_import {
7245 name: "foo",
7246 visibility: ["//apex", "//source"],
7247 apex_available: ["myapex"],
7248 prefer: true,
7249 public: {
7250 jars: ["a.jar"],
7251 },
7252 }
7253`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007254 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007255 )
7256
7257 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007258 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007259 "javalib/bar.jar",
7260 "javalib/foo.jar",
7261 "etc/permissions/foo.xml",
7262 })
7263
7264 // The bar library should depend on the implementation jar.
7265 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007266 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007267 t.Errorf("expected %q, found %#q", expected, actual)
7268 }
7269}
7270
7271func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7272 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7273 apex {
7274 name: "myapex",
7275 key: "myapex.key",
7276 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007277 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007278 }
7279
7280 apex_key {
7281 name: "myapex.key",
7282 public_key: "testkey.avbpubkey",
7283 private_key: "testkey.pem",
7284 }
7285
7286 java_sdk_library_import {
7287 name: "foo",
7288 apex_available: ["myapex"],
7289 prefer: true,
7290 public: {
7291 jars: ["a.jar"],
7292 },
7293 }
7294
7295 `, withFiles(filesForSdkLibrary))
7296}
7297
atrost6e126252020-01-27 17:01:16 +00007298func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007299 result := android.GroupFixturePreparers(
7300 prepareForApexTest,
7301 java.PrepareForTestWithPlatformCompatConfig,
7302 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007303 apex {
7304 name: "myapex",
7305 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007306 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007307 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007308 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007309 }
7310
7311 apex_key {
7312 name: "myapex.key",
7313 public_key: "testkey.avbpubkey",
7314 private_key: "testkey.pem",
7315 }
7316
7317 platform_compat_config {
7318 name: "myjar-platform-compat-config",
7319 src: ":myjar",
7320 }
7321
7322 java_library {
7323 name: "myjar",
7324 srcs: ["foo/bar/MyClass.java"],
7325 sdk_version: "none",
7326 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007327 apex_available: [ "myapex" ],
7328 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007329
7330 // Make sure that a preferred prebuilt does not affect the apex contents.
7331 prebuilt_platform_compat_config {
7332 name: "myjar-platform-compat-config",
7333 metadata: "compat-config/metadata.xml",
7334 prefer: true,
7335 }
atrost6e126252020-01-27 17:01:16 +00007336 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007337 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09007338 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00007339 "etc/compatconfig/myjar-platform-compat-config.xml",
7340 "javalib/myjar.jar",
7341 })
7342}
7343
Jooyung Han862c0d62022-12-21 10:15:37 +09007344func TestNoDupeApexFiles(t *testing.T) {
7345 android.GroupFixturePreparers(
7346 android.PrepareForTestWithAndroidBuildComponents,
7347 PrepareForTestWithApexBuildComponents,
7348 prepareForTestWithMyapex,
7349 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7350 ).
7351 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7352 RunTestWithBp(t, `
7353 apex {
7354 name: "myapex",
7355 key: "myapex.key",
7356 prebuilts: ["foo", "bar"],
7357 updatable: false,
7358 }
7359
7360 apex_key {
7361 name: "myapex.key",
7362 public_key: "testkey.avbpubkey",
7363 private_key: "testkey.pem",
7364 }
7365
7366 prebuilt_etc {
7367 name: "foo",
7368 src: "myprebuilt",
7369 filename_from_src: true,
7370 }
7371
7372 prebuilt_etc {
7373 name: "bar",
7374 src: "myprebuilt",
7375 filename_from_src: true,
7376 }
7377 `)
7378}
7379
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007380func TestApexUnwantedTransitiveDeps(t *testing.T) {
7381 bp := `
7382 apex {
7383 name: "myapex",
7384 key: "myapex.key",
7385 native_shared_libs: ["libfoo"],
7386 updatable: false,
7387 unwanted_transitive_deps: ["libbar"],
7388 }
7389
7390 apex_key {
7391 name: "myapex.key",
7392 public_key: "testkey.avbpubkey",
7393 private_key: "testkey.pem",
7394 }
7395
7396 cc_library {
7397 name: "libfoo",
7398 srcs: ["foo.cpp"],
7399 shared_libs: ["libbar"],
7400 apex_available: ["myapex"],
7401 }
7402
7403 cc_library {
7404 name: "libbar",
7405 srcs: ["bar.cpp"],
7406 apex_available: ["myapex"],
7407 }`
7408 ctx := testApex(t, bp)
7409 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7410 "*/libc++.so",
7411 "*/libfoo.so",
7412 // not libbar.so
7413 })
7414}
7415
Jiyong Park479321d2019-12-16 11:47:12 +09007416func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7417 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7418 apex {
7419 name: "myapex",
7420 key: "myapex.key",
7421 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007422 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007423 }
7424
7425 apex_key {
7426 name: "myapex.key",
7427 public_key: "testkey.avbpubkey",
7428 private_key: "testkey.pem",
7429 }
7430
7431 java_library {
7432 name: "myjar",
7433 srcs: ["foo/bar/MyClass.java"],
7434 sdk_version: "none",
7435 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007436 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007437 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007438 }
7439 `)
7440}
7441
Jiyong Park7afd1072019-12-30 16:56:33 +09007442func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007443 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007444 apex {
7445 name: "myapex",
7446 key: "myapex.key",
7447 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007448 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007449 }
7450
7451 apex_key {
7452 name: "myapex.key",
7453 public_key: "testkey.avbpubkey",
7454 private_key: "testkey.pem",
7455 }
7456
7457 cc_library {
7458 name: "mylib",
7459 srcs: ["mylib.cpp"],
7460 system_shared_libs: [],
7461 stl: "none",
7462 required: ["a", "b"],
7463 host_required: ["c", "d"],
7464 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007465 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007466 }
7467 `)
7468
Jooyung Hana0503a52023-08-23 13:12:50 +09007469 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007470 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007471 name := apexBundle.BaseModuleName()
7472 prefix := "TARGET_"
7473 var builder strings.Builder
7474 data.Custom(&builder, name, prefix, "", data)
7475 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007476 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08007477 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7478 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007479}
7480
Jiyong Park7cd10e32020-01-14 09:22:18 +09007481func TestSymlinksFromApexToSystem(t *testing.T) {
7482 bp := `
7483 apex {
7484 name: "myapex",
7485 key: "myapex.key",
7486 native_shared_libs: ["mylib"],
7487 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007488 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007489 }
7490
Jiyong Park9d677202020-02-19 16:29:35 +09007491 apex {
7492 name: "myapex.updatable",
7493 key: "myapex.key",
7494 native_shared_libs: ["mylib"],
7495 java_libs: ["myjar"],
7496 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007497 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007498 }
7499
Jiyong Park7cd10e32020-01-14 09:22:18 +09007500 apex_key {
7501 name: "myapex.key",
7502 public_key: "testkey.avbpubkey",
7503 private_key: "testkey.pem",
7504 }
7505
7506 cc_library {
7507 name: "mylib",
7508 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007509 shared_libs: [
7510 "myotherlib",
7511 "myotherlib_ext",
7512 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007513 system_shared_libs: [],
7514 stl: "none",
7515 apex_available: [
7516 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007517 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007518 "//apex_available:platform",
7519 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007520 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007521 }
7522
7523 cc_library {
7524 name: "myotherlib",
7525 srcs: ["mylib.cpp"],
7526 system_shared_libs: [],
7527 stl: "none",
7528 apex_available: [
7529 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007530 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007531 "//apex_available:platform",
7532 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007533 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007534 }
7535
Jiyong Parkce243632023-02-17 18:22:25 +09007536 cc_library {
7537 name: "myotherlib_ext",
7538 srcs: ["mylib.cpp"],
7539 system_shared_libs: [],
7540 system_ext_specific: true,
7541 stl: "none",
7542 apex_available: [
7543 "myapex",
7544 "myapex.updatable",
7545 "//apex_available:platform",
7546 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007547 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007548 }
7549
Jiyong Park7cd10e32020-01-14 09:22:18 +09007550 java_library {
7551 name: "myjar",
7552 srcs: ["foo/bar/MyClass.java"],
7553 sdk_version: "none",
7554 system_modules: "none",
Jihoon Kang85bc1932024-07-01 17:04:46 +00007555 static_libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007556 apex_available: [
7557 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007558 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007559 "//apex_available:platform",
7560 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007561 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007562 }
7563
7564 java_library {
7565 name: "myotherjar",
7566 srcs: ["foo/bar/MyClass.java"],
7567 sdk_version: "none",
7568 system_modules: "none",
7569 apex_available: [
7570 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007571 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007572 "//apex_available:platform",
7573 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007574 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007575 }
7576 `
7577
7578 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7579 for _, f := range files {
7580 if f.path == file {
7581 if f.isLink {
7582 t.Errorf("%q is not a real file", file)
7583 }
7584 return
7585 }
7586 }
7587 t.Errorf("%q is not found", file)
7588 }
7589
Jiyong Parkce243632023-02-17 18:22:25 +09007590 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09007591 for _, f := range files {
7592 if f.path == file {
7593 if !f.isLink {
7594 t.Errorf("%q is not a symlink", file)
7595 }
Jiyong Parkce243632023-02-17 18:22:25 +09007596 if f.src != target {
7597 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
7598 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09007599 return
7600 }
7601 }
7602 t.Errorf("%q is not found", file)
7603 }
7604
Jiyong Park9d677202020-02-19 16:29:35 +09007605 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7606 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007607 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09007608 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007609 ensureRealfileExists(t, files, "javalib/myjar.jar")
7610 ensureRealfileExists(t, files, "lib64/mylib.so")
7611 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007612 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007613
Jooyung Hana0503a52023-08-23 13:12:50 +09007614 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09007615 ensureRealfileExists(t, files, "javalib/myjar.jar")
7616 ensureRealfileExists(t, files, "lib64/mylib.so")
7617 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007618 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09007619
7620 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007621 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09007622 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007623 ensureRealfileExists(t, files, "javalib/myjar.jar")
7624 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007625 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
7626 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007627
Jooyung Hana0503a52023-08-23 13:12:50 +09007628 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09007629 ensureRealfileExists(t, files, "javalib/myjar.jar")
7630 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007631 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
7632 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007633}
7634
Yo Chiange8128052020-07-23 20:09:18 +08007635func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007636 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007637 apex {
7638 name: "myapex",
7639 key: "myapex.key",
7640 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007641 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007642 }
7643
7644 apex_key {
7645 name: "myapex.key",
7646 public_key: "testkey.avbpubkey",
7647 private_key: "testkey.pem",
7648 }
7649
7650 cc_library_shared {
7651 name: "mylib",
7652 srcs: ["mylib.cpp"],
7653 shared_libs: ["myotherlib"],
7654 system_shared_libs: [],
7655 stl: "none",
7656 apex_available: [
7657 "myapex",
7658 "//apex_available:platform",
7659 ],
7660 }
7661
7662 cc_prebuilt_library_shared {
7663 name: "myotherlib",
7664 srcs: ["prebuilt.so"],
7665 system_shared_libs: [],
7666 stl: "none",
7667 apex_available: [
7668 "myapex",
7669 "//apex_available:platform",
7670 ],
7671 }
7672 `)
7673
Jooyung Hana0503a52023-08-23 13:12:50 +09007674 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007675 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007676 var builder strings.Builder
7677 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7678 androidMk := builder.String()
7679 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007680 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007681 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7682 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7683 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007684 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08007685}
7686
Jooyung Han643adc42020-02-27 13:50:06 +09007687func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007688 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007689 apex {
7690 name: "myapex",
7691 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007692 binaries: ["mybin"],
7693 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007694 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007695 }
7696
7697 apex_key {
7698 name: "myapex.key",
7699 public_key: "testkey.avbpubkey",
7700 private_key: "testkey.pem",
7701 }
7702
7703 cc_library {
7704 name: "mylib",
7705 srcs: ["mylib.cpp"],
7706 shared_libs: ["mylib2"],
7707 system_shared_libs: [],
7708 stl: "none",
7709 apex_available: [ "myapex" ],
7710 }
7711
7712 cc_library {
7713 name: "mylib2",
7714 srcs: ["mylib.cpp"],
7715 system_shared_libs: [],
7716 stl: "none",
7717 apex_available: [ "myapex" ],
7718 }
Jiyong Park34d5c332022-02-24 18:02:44 +09007719
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007720 // Used as both a JNI library and a regular shared library.
7721 cc_library {
7722 name: "mylib3",
7723 srcs: ["mylib.cpp"],
7724 system_shared_libs: [],
7725 stl: "none",
7726 apex_available: [ "myapex" ],
7727 }
7728
7729 cc_binary {
7730 name: "mybin",
7731 srcs: ["mybin.cpp"],
7732 shared_libs: ["mylib3"],
7733 system_shared_libs: [],
7734 stl: "none",
7735 apex_available: [ "myapex" ],
7736 }
7737
Jiyong Park34d5c332022-02-24 18:02:44 +09007738 rust_ffi_shared {
7739 name: "libfoo.rust",
7740 crate_name: "foo",
7741 srcs: ["foo.rs"],
7742 shared_libs: ["libfoo.shared_from_rust"],
7743 prefer_rlib: true,
7744 apex_available: ["myapex"],
7745 }
7746
7747 cc_library_shared {
7748 name: "libfoo.shared_from_rust",
7749 srcs: ["mylib.cpp"],
7750 system_shared_libs: [],
7751 stl: "none",
7752 stubs: {
7753 versions: ["10", "11", "12"],
7754 },
7755 }
7756
Jooyung Han643adc42020-02-27 13:50:06 +09007757 `)
7758
Jooyung Hana0503a52023-08-23 13:12:50 +09007759 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09007760 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007761 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09007762 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007763 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09007764 "lib64/mylib.so",
7765 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007766 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09007767 "lib64/libfoo.rust.so",
7768 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
7769 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09007770 })
Jiyong Park34d5c332022-02-24 18:02:44 +09007771
7772 // b/220397949
7773 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007774}
7775
Jooyung Han49f67012020-04-17 13:43:10 +09007776func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007777 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09007778 apex {
7779 name: "myapex",
7780 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007781 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09007782 }
7783 apex_key {
7784 name: "myapex.key",
7785 public_key: "testkey.avbpubkey",
7786 private_key: "testkey.pem",
7787 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007788 `,
7789 android.FixtureModifyConfig(func(config android.Config) {
7790 delete(config.Targets, android.Android)
7791 config.AndroidCommonTarget = android.Target{}
7792 }),
7793 )
Jooyung Han49f67012020-04-17 13:43:10 +09007794
7795 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
7796 t.Errorf("Expected variants: %v, but got: %v", expected, got)
7797 }
7798}
7799
Jiyong Parkbd159612020-02-28 15:22:21 +09007800func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007801 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09007802 apex {
7803 name: "myapex",
7804 key: "myapex.key",
7805 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007806 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09007807 }
7808
7809 apex_key {
7810 name: "myapex.key",
7811 public_key: "testkey.avbpubkey",
7812 private_key: "testkey.pem",
7813 }
7814
7815 android_app {
7816 name: "AppFoo",
7817 srcs: ["foo/bar/MyClass.java"],
7818 sdk_version: "none",
7819 system_modules: "none",
7820 apex_available: [ "myapex" ],
7821 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007822 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09007823
Jooyung Hana0503a52023-08-23 13:12:50 +09007824 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07007825 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Jiyong Parkbd159612020-02-28 15:22:21 +09007826
7827 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007828 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 +09007829}
7830
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007831func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007832 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007833 apex {
7834 name: "myapex",
7835 key: "myapex.key",
7836 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007837 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007838 }
7839
7840 apex_key {
7841 name: "myapex.key",
7842 public_key: "testkey.avbpubkey",
7843 private_key: "testkey.pem",
7844 }
7845
7846 android_app_set {
7847 name: "AppSet",
7848 set: "AppSet.apks",
7849 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09007850 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08007851 bundleConfigRule := mod.Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07007852 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007853 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
7854 s := mod.Rule("apexRule").Args["copy_commands"]
7855 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09007856 if len(copyCmds) != 4 {
7857 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007858 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007859 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
7860 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09007861 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
7862 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09007863
7864 // Ensure that canned_fs_config has an entry for the app set zip file
7865 generateFsRule := mod.Rule("generateFsConfig")
7866 cmd := generateFsRule.RuleParams.Command
7867 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007868}
7869
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007870func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01007871 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007872 apex_set {
7873 name: "myapex",
7874 filename: "foo_v2.apex",
7875 sanitized: {
7876 none: { set: "myapex.apks", },
7877 hwaddress: { set: "myapex.hwasan.apks", },
7878 },
Paul Duffin24704672021-04-06 16:09:30 +01007879 }
7880 `
7881 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007882
Paul Duffin24704672021-04-06 16:09:30 +01007883 // Check that the extractor produces the correct output file from the correct input file.
Spandan Das3576e762024-01-03 18:57:03 +00007884 extractorOutput := "out/soong/.intermediates/prebuilt_myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007885
Spandan Das3576e762024-01-03 18:57:03 +00007886 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Paul Duffin24704672021-04-06 16:09:30 +01007887 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007888
Paul Duffin24704672021-04-06 16:09:30 +01007889 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
7890
7891 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01007892 m = ctx.ModuleForTests("myapex", "android_common_myapex")
7893 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01007894
7895 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007896}
7897
Pranav Guptaeba03b02022-09-27 00:27:08 +00007898func TestApexSetApksModuleAssignment(t *testing.T) {
7899 ctx := testApex(t, `
7900 apex_set {
7901 name: "myapex",
7902 set: ":myapex_apks_file",
7903 }
7904
7905 filegroup {
7906 name: "myapex_apks_file",
7907 srcs: ["myapex.apks"],
7908 }
7909 `)
7910
Spandan Das3576e762024-01-03 18:57:03 +00007911 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Pranav Guptaeba03b02022-09-27 00:27:08 +00007912
7913 // Check that the extractor produces the correct apks file from the input module
Spandan Das3576e762024-01-03 18:57:03 +00007914 extractorOutput := "out/soong/.intermediates/prebuilt_myapex.apex.extractor/android_common/extracted/myapex.apks"
Pranav Guptaeba03b02022-09-27 00:27:08 +00007915 extractedApex := m.Output(extractorOutput)
7916
7917 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
7918}
7919
Paul Duffin89f570a2021-06-16 01:42:33 +01007920func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00007921 t.Helper()
7922
Paul Duffin55607122021-03-30 23:32:51 +01007923 fs := android.MockFS{
7924 "a.java": nil,
7925 "a.jar": nil,
7926 "apex_manifest.json": nil,
7927 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007928 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00007929 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
7930 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
7931 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007932 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007933 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007934
Paul Duffin55607122021-03-30 23:32:51 +01007935 errorHandler := android.FixtureExpectsNoErrors
7936 if errmsg != "" {
7937 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007938 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007939
Paul Duffin55607122021-03-30 23:32:51 +01007940 result := android.GroupFixturePreparers(
7941 cc.PrepareForTestWithCcDefaultModules,
7942 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01007943 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01007944 java.PrepareForTestWithJavaSdkLibraryFiles,
7945 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01007946 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01007947 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01007948 android.FixtureModifyMockFS(func(fs android.MockFS) {
7949 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
7950 insert := ""
7951 for _, fragment := range fragments {
7952 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
7953 }
7954 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
7955 platform_bootclasspath {
7956 name: "platform-bootclasspath",
7957 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01007958 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01007959 %s
7960 ],
7961 }
7962 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01007963 }
Paul Duffin89f570a2021-06-16 01:42:33 +01007964 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01007965 // Dexpreopt for boot jars requires the ART boot image profile.
7966 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
7967 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00007968 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01007969 ).
7970 ExtendWithErrorHandler(errorHandler).
7971 RunTestWithBp(t, bp)
7972
7973 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007974}
7975
Paul Duffin5556c5f2022-06-09 17:32:21 +00007976func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01007977 preparers := android.GroupFixturePreparers(
7978 java.PrepareForTestWithJavaDefaultModules,
Spandan Das5be63332023-12-13 00:06:32 +00007979 prepareForTestWithBootclasspathFragment,
7980 dexpreopt.FixtureSetTestOnlyArtBootImageJars("com.android.art:libfoo"),
Martin Stjernholm43c44b02021-06-30 16:35:07 +01007981 PrepareForTestWithApexBuildComponents,
7982 ).
7983 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
Spandan Das3576e762024-01-03 18:57:03 +00007984 "Multiple installable prebuilt APEXes provide ambiguous deapexers: prebuilt_com.android.art and prebuilt_com.mycompany.android.art"))
Martin Stjernholm43c44b02021-06-30 16:35:07 +01007985
7986 bpBase := `
7987 apex_set {
Spandan Das5be63332023-12-13 00:06:32 +00007988 name: "com.android.art",
Martin Stjernholm43c44b02021-06-30 16:35:07 +01007989 installable: true,
Spandan Das5be63332023-12-13 00:06:32 +00007990 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01007991 set: "myapex.apks",
7992 }
7993
7994 apex_set {
Spandan Das5be63332023-12-13 00:06:32 +00007995 name: "com.mycompany.android.art",
7996 apex_name: "com.android.art",
Martin Stjernholm43c44b02021-06-30 16:35:07 +01007997 installable: true,
Spandan Das5be63332023-12-13 00:06:32 +00007998 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01007999 set: "company-myapex.apks",
8000 }
8001
8002 prebuilt_bootclasspath_fragment {
Spandan Das5be63332023-12-13 00:06:32 +00008003 name: "art-bootclasspath-fragment",
8004 apex_available: ["com.android.art"],
Spandan Dasfae468e2023-12-12 23:23:53 +00008005 hidden_api: {
8006 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8007 metadata: "my-bootclasspath-fragment/metadata.csv",
8008 index: "my-bootclasspath-fragment/index.csv",
8009 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
8010 all_flags: "my-bootclasspath-fragment/all-flags.csv",
8011 },
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008012 %s
8013 }
8014 `
8015
8016 t.Run("java_import", func(t *testing.T) {
8017 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8018 java_import {
8019 name: "libfoo",
8020 jars: ["libfoo.jar"],
Spandan Das5be63332023-12-13 00:06:32 +00008021 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008022 }
8023 `)
8024 })
8025
8026 t.Run("java_sdk_library_import", func(t *testing.T) {
8027 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8028 java_sdk_library_import {
8029 name: "libfoo",
8030 public: {
8031 jars: ["libbar.jar"],
8032 },
Spandan Dasfae468e2023-12-12 23:23:53 +00008033 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +00008034 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008035 }
8036 `)
8037 })
8038
8039 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8040 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8041 image_name: "art",
8042 contents: ["libfoo"],
8043 `)+`
8044 java_sdk_library_import {
8045 name: "libfoo",
8046 public: {
8047 jars: ["libbar.jar"],
8048 },
Spandan Dasfae468e2023-12-12 23:23:53 +00008049 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +00008050 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008051 }
8052 `)
8053 })
8054}
8055
Paul Duffin5556c5f2022-06-09 17:32:21 +00008056func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
8057 preparers := android.GroupFixturePreparers(
8058 java.PrepareForTestWithJavaDefaultModules,
8059 PrepareForTestWithApexBuildComponents,
8060 )
8061
Spandan Das59a4a2b2024-01-09 21:35:56 +00008062 errCtx := moduleErrorfTestCtx{}
8063
Paul Duffin5556c5f2022-06-09 17:32:21 +00008064 bpBase := `
8065 apex_set {
8066 name: "com.android.myapex",
8067 installable: true,
8068 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8069 set: "myapex.apks",
8070 }
8071
8072 apex_set {
8073 name: "com.android.myapex_compressed",
8074 apex_name: "com.android.myapex",
8075 installable: true,
8076 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8077 set: "myapex_compressed.apks",
8078 }
8079
8080 prebuilt_bootclasspath_fragment {
8081 name: "my-bootclasspath-fragment",
8082 apex_available: [
8083 "com.android.myapex",
8084 "com.android.myapex_compressed",
8085 ],
8086 hidden_api: {
8087 annotation_flags: "annotation-flags.csv",
8088 metadata: "metadata.csv",
8089 index: "index.csv",
8090 signature_patterns: "signature_patterns.csv",
8091 },
8092 %s
8093 }
8094 `
8095
8096 t.Run("java_import", func(t *testing.T) {
8097 result := preparers.RunTestWithBp(t,
8098 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8099 java_import {
8100 name: "libfoo",
8101 jars: ["libfoo.jar"],
8102 apex_available: [
8103 "com.android.myapex",
8104 "com.android.myapex_compressed",
8105 ],
8106 }
8107 `)
8108
8109 module := result.Module("libfoo", "android_common_com.android.myapex")
8110 usesLibraryDep := module.(java.UsesLibraryDependency)
8111 android.AssertPathRelativeToTopEquals(t, "dex jar path",
Spandan Das3576e762024-01-03 18:57:03 +00008112 "out/soong/.intermediates/prebuilt_com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
Spandan Das59a4a2b2024-01-09 21:35:56 +00008113 usesLibraryDep.DexJarBuildPath(errCtx).Path())
Paul Duffin5556c5f2022-06-09 17:32:21 +00008114 })
8115
8116 t.Run("java_sdk_library_import", func(t *testing.T) {
8117 result := preparers.RunTestWithBp(t,
8118 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8119 java_sdk_library_import {
8120 name: "libfoo",
8121 public: {
8122 jars: ["libbar.jar"],
8123 },
8124 apex_available: [
8125 "com.android.myapex",
8126 "com.android.myapex_compressed",
8127 ],
8128 compile_dex: true,
8129 }
8130 `)
8131
8132 module := result.Module("libfoo", "android_common_com.android.myapex")
8133 usesLibraryDep := module.(java.UsesLibraryDependency)
8134 android.AssertPathRelativeToTopEquals(t, "dex jar path",
Spandan Das3576e762024-01-03 18:57:03 +00008135 "out/soong/.intermediates/prebuilt_com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
Spandan Das59a4a2b2024-01-09 21:35:56 +00008136 usesLibraryDep.DexJarBuildPath(errCtx).Path())
Paul Duffin5556c5f2022-06-09 17:32:21 +00008137 })
8138
8139 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8140 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8141 image_name: "art",
8142 contents: ["libfoo"],
8143 `)+`
8144 java_sdk_library_import {
8145 name: "libfoo",
8146 public: {
8147 jars: ["libbar.jar"],
8148 },
8149 apex_available: [
8150 "com.android.myapex",
8151 "com.android.myapex_compressed",
8152 ],
8153 compile_dex: true,
8154 }
8155 `)
8156 })
8157}
8158
Jooyung Han548640b2020-04-27 12:10:30 +09008159func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
8160 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8161 apex {
8162 name: "myapex",
8163 key: "myapex.key",
8164 updatable: true,
8165 }
8166
8167 apex_key {
8168 name: "myapex.key",
8169 public_key: "testkey.avbpubkey",
8170 private_key: "testkey.pem",
8171 }
8172 `)
8173}
8174
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008175func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
8176 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8177 apex {
8178 name: "myapex",
8179 key: "myapex.key",
8180 }
8181
8182 apex_key {
8183 name: "myapex.key",
8184 public_key: "testkey.avbpubkey",
8185 private_key: "testkey.pem",
8186 }
8187 `)
8188}
8189
satayevb98371c2021-06-15 16:49:50 +01008190func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
8191 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8192 apex {
8193 name: "myapex",
8194 key: "myapex.key",
8195 systemserverclasspath_fragments: [
8196 "mysystemserverclasspathfragment",
8197 ],
8198 min_sdk_version: "29",
8199 updatable: true,
8200 }
8201
8202 apex_key {
8203 name: "myapex.key",
8204 public_key: "testkey.avbpubkey",
8205 private_key: "testkey.pem",
8206 }
8207
8208 java_library {
8209 name: "foo",
8210 srcs: ["b.java"],
8211 min_sdk_version: "29",
8212 installable: true,
8213 apex_available: [
8214 "myapex",
8215 ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00008216 sdk_version: "current",
satayevb98371c2021-06-15 16:49:50 +01008217 }
8218
8219 systemserverclasspath_fragment {
8220 name: "mysystemserverclasspathfragment",
8221 generate_classpaths_proto: false,
8222 contents: [
8223 "foo",
8224 ],
8225 apex_available: [
8226 "myapex",
8227 ],
8228 }
satayevabcd5972021-08-06 17:49:46 +01008229 `,
8230 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8231 )
satayevb98371c2021-06-15 16:49:50 +01008232}
8233
Paul Duffin064b70c2020-11-02 17:32:38 +00008234func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008235 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008236 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008237 fragment := java.ApexVariantReference{
8238 Apex: proptools.StringPtr("myapex"),
8239 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8240 }
8241
Paul Duffin064b70c2020-11-02 17:32:38 +00008242 testDexpreoptWithApexes(t, `
8243 prebuilt_apex {
8244 name: "myapex" ,
8245 arch: {
8246 arm64: {
8247 src: "myapex-arm64.apex",
8248 },
8249 arm: {
8250 src: "myapex-arm.apex",
8251 },
8252 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008253 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8254 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008255
Paul Duffin89f570a2021-06-16 01:42:33 +01008256 prebuilt_bootclasspath_fragment {
8257 name: "my-bootclasspath-fragment",
8258 contents: ["libfoo"],
8259 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008260 hidden_api: {
8261 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8262 metadata: "my-bootclasspath-fragment/metadata.csv",
8263 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008264 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8265 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8266 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008267 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008268 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008269
Paul Duffin89f570a2021-06-16 01:42:33 +01008270 java_import {
8271 name: "libfoo",
8272 jars: ["libfoo.jar"],
8273 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008274 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008275 }
8276 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008277 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008278}
8279
Spandan Dasf14e2542021-11-12 00:01:37 +00008280func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008281 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008282 bp += `
8283 apex_key {
8284 name: "myapex.key",
8285 public_key: "testkey.avbpubkey",
8286 private_key: "testkey.pem",
8287 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008288 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008289 "lib1/src/A.java": nil,
8290 "lib2/src/B.java": nil,
8291 "system/sepolicy/apex/myapex-file_contexts": nil,
8292 }
8293
Paul Duffin45338f02021-03-30 23:07:52 +01008294 errorHandler := android.FixtureExpectsNoErrors
8295 if errmsg != "" {
8296 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008297 }
Colin Crossae8600b2020-10-29 17:09:13 -07008298
Paul Duffin45338f02021-03-30 23:07:52 +01008299 android.GroupFixturePreparers(
8300 android.PrepareForTestWithAndroidBuildComponents,
8301 java.PrepareForTestWithJavaBuildComponents,
8302 PrepareForTestWithApexBuildComponents,
8303 android.PrepareForTestWithNeverallowRules(rules),
8304 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008305 apexBootJars := make([]string, 0, len(bootJars))
8306 for _, apexBootJar := range bootJars {
8307 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008308 }
satayevd604b212021-07-21 14:23:52 +01008309 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008310 }),
8311 fs.AddToFixture(),
8312 ).
8313 ExtendWithErrorHandler(errorHandler).
8314 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008315}
8316
8317func TestApexPermittedPackagesRules(t *testing.T) {
8318 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008319 name string
8320 expectedError string
8321 bp string
8322 bootJars []string
8323 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008324 }{
8325
8326 {
8327 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8328 expectedError: "",
8329 bp: `
8330 java_library {
8331 name: "bcp_lib1",
8332 srcs: ["lib1/src/*.java"],
8333 permitted_packages: ["foo.bar"],
8334 apex_available: ["myapex"],
8335 sdk_version: "none",
8336 system_modules: "none",
8337 }
8338 java_library {
8339 name: "nonbcp_lib2",
8340 srcs: ["lib2/src/*.java"],
8341 apex_available: ["myapex"],
8342 permitted_packages: ["a.b"],
8343 sdk_version: "none",
8344 system_modules: "none",
8345 }
8346 apex {
8347 name: "myapex",
8348 key: "myapex.key",
8349 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008350 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008351 }`,
8352 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008353 bcpPermittedPackages: map[string][]string{
8354 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008355 "foo.bar",
8356 },
8357 },
8358 },
8359 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008360 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008361 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 +01008362 bp: `
8363 java_library {
8364 name: "bcp_lib1",
8365 srcs: ["lib1/src/*.java"],
8366 apex_available: ["myapex"],
8367 permitted_packages: ["foo.bar"],
8368 sdk_version: "none",
8369 system_modules: "none",
8370 }
8371 java_library {
8372 name: "bcp_lib2",
8373 srcs: ["lib2/src/*.java"],
8374 apex_available: ["myapex"],
8375 permitted_packages: ["foo.bar", "bar.baz"],
8376 sdk_version: "none",
8377 system_modules: "none",
8378 }
8379 apex {
8380 name: "myapex",
8381 key: "myapex.key",
8382 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008383 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008384 }
8385 `,
8386 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008387 bcpPermittedPackages: map[string][]string{
8388 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008389 "foo.bar",
8390 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008391 "bcp_lib2": []string{
8392 "foo.bar",
8393 },
8394 },
8395 },
8396 {
8397 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8398 expectedError: "",
8399 bp: `
8400 java_library {
8401 name: "bcp_lib_restricted",
8402 srcs: ["lib1/src/*.java"],
8403 apex_available: ["myapex"],
8404 permitted_packages: ["foo.bar"],
8405 sdk_version: "none",
8406 min_sdk_version: "29",
8407 system_modules: "none",
8408 }
8409 java_library {
8410 name: "bcp_lib_unrestricted",
8411 srcs: ["lib2/src/*.java"],
8412 apex_available: ["myapex"],
8413 permitted_packages: ["foo.bar", "bar.baz"],
8414 sdk_version: "none",
8415 min_sdk_version: "29",
8416 system_modules: "none",
8417 }
8418 apex {
8419 name: "myapex",
8420 key: "myapex.key",
8421 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8422 updatable: true,
8423 min_sdk_version: "29",
8424 }
8425 `,
8426 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8427 bcpPermittedPackages: map[string][]string{
8428 "bcp_lib1_non_updateable": []string{
8429 "foo.bar",
8430 },
8431 // 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 +01008432 },
8433 },
8434 }
8435 for _, tc := range testcases {
8436 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008437 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8438 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008439 })
8440 }
8441}
8442
Jiyong Park62304bb2020-04-13 16:19:48 +09008443func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008444 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008445 apex {
8446 name: "myapex",
8447 key: "myapex.key",
8448 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008449 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008450 }
8451
8452 apex_key {
8453 name: "myapex.key",
8454 public_key: "testkey.avbpubkey",
8455 private_key: "testkey.pem",
8456 }
8457
8458 cc_library {
8459 name: "mylib",
8460 srcs: ["mylib.cpp"],
8461 system_shared_libs: [],
8462 stl: "none",
8463 stubs: {
8464 versions: ["1"],
8465 },
8466 apex_available: ["myapex"],
8467 }
8468
8469 cc_library {
8470 name: "myprivlib",
8471 srcs: ["mylib.cpp"],
8472 system_shared_libs: [],
8473 stl: "none",
8474 apex_available: ["myapex"],
8475 }
8476
8477
8478 cc_test {
8479 name: "mytest",
8480 gtest: false,
8481 srcs: ["mylib.cpp"],
8482 system_shared_libs: [],
8483 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008484 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008485 test_for: ["myapex"]
8486 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008487
8488 cc_library {
8489 name: "mytestlib",
8490 srcs: ["mylib.cpp"],
8491 system_shared_libs: [],
8492 shared_libs: ["mylib", "myprivlib"],
8493 stl: "none",
8494 test_for: ["myapex"],
8495 }
8496
8497 cc_benchmark {
8498 name: "mybench",
8499 srcs: ["mylib.cpp"],
8500 system_shared_libs: [],
8501 shared_libs: ["mylib", "myprivlib"],
8502 stl: "none",
8503 test_for: ["myapex"],
8504 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008505 `)
8506
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008507 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008508 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008509 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8510 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8511 }
8512
8513 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008514 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008515 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8516 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8517 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8518}
Jiyong Park46a512f2020-12-04 18:02:13 +09008519
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008520func TestIndirectTestFor(t *testing.T) {
8521 ctx := testApex(t, `
8522 apex {
8523 name: "myapex",
8524 key: "myapex.key",
8525 native_shared_libs: ["mylib", "myprivlib"],
8526 updatable: false,
8527 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008528
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008529 apex_key {
8530 name: "myapex.key",
8531 public_key: "testkey.avbpubkey",
8532 private_key: "testkey.pem",
8533 }
8534
8535 cc_library {
8536 name: "mylib",
8537 srcs: ["mylib.cpp"],
8538 system_shared_libs: [],
8539 stl: "none",
8540 stubs: {
8541 versions: ["1"],
8542 },
8543 apex_available: ["myapex"],
8544 }
8545
8546 cc_library {
8547 name: "myprivlib",
8548 srcs: ["mylib.cpp"],
8549 system_shared_libs: [],
8550 stl: "none",
8551 shared_libs: ["mylib"],
8552 apex_available: ["myapex"],
8553 }
8554
8555 cc_library {
8556 name: "mytestlib",
8557 srcs: ["mylib.cpp"],
8558 system_shared_libs: [],
8559 shared_libs: ["myprivlib"],
8560 stl: "none",
8561 test_for: ["myapex"],
8562 }
8563 `)
8564
8565 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008566 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008567 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8568 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8569 }
8570
8571 // The platform variant of mytestlib links to the platform variant of the
8572 // internal myprivlib.
8573 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8574
8575 // The platform variant of myprivlib links to the platform variant of mylib
8576 // and bypasses its stubs.
8577 ensureLinkedLibIs("myprivlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
Jiyong Park62304bb2020-04-13 16:19:48 +09008578}
8579
Martin Stjernholmec009002021-03-27 15:18:31 +00008580func TestTestForForLibInOtherApex(t *testing.T) {
8581 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8582 _ = testApex(t, `
8583 apex {
8584 name: "com.android.art",
8585 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008586 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008587 updatable: false,
8588 }
8589
8590 apex {
8591 name: "com.android.art.debug",
8592 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008593 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008594 updatable: false,
8595 }
8596
8597 apex_key {
8598 name: "myapex.key",
8599 public_key: "testkey.avbpubkey",
8600 private_key: "testkey.pem",
8601 }
8602
8603 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008604 name: "libnativebridge",
8605 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008606 system_shared_libs: [],
8607 stl: "none",
8608 stubs: {
8609 versions: ["1"],
8610 },
8611 apex_available: ["com.android.art", "com.android.art.debug"],
8612 }
8613
8614 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008615 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00008616 srcs: ["mylib.cpp"],
8617 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00008618 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008619 stl: "none",
8620 apex_available: ["com.android.art.debug"],
8621 test_for: ["com.android.art"],
8622 }
8623 `,
8624 android.MockFS{
8625 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8626 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8627 }.AddToFixture())
8628}
8629
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008630// TODO(jungjw): Move this to proptools
8631func intPtr(i int) *int {
8632 return &i
8633}
8634
8635func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008636 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008637 apex_set {
8638 name: "myapex",
8639 set: "myapex.apks",
8640 filename: "foo_v2.apex",
8641 overrides: ["foo"],
8642 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008643 `,
8644 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8645 variables.Platform_sdk_version = intPtr(30)
8646 }),
8647 android.FixtureModifyConfig(func(config android.Config) {
8648 config.Targets[android.Android] = []android.Target{
8649 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8650 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8651 }
8652 }),
8653 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008654
Spandan Das3576e762024-01-03 18:57:03 +00008655 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008656
8657 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008658 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008659 actual := extractedApex.Args["abis"]
8660 expected := "ARMEABI_V7A,ARM64_V8A"
8661 if actual != expected {
8662 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8663 }
8664 actual = extractedApex.Args["sdk-version"]
8665 expected = "30"
8666 if actual != expected {
8667 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8668 }
8669
Paul Duffin6717d882021-06-15 19:09:41 +01008670 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008671 a := m.Module().(*ApexSet)
8672 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008673 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008674 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8675 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8676 }
8677}
8678
Anton Hansson805e0a52022-11-25 14:06:46 +00008679func TestApexSet_NativeBridge(t *testing.T) {
8680 ctx := testApex(t, `
8681 apex_set {
8682 name: "myapex",
8683 set: "myapex.apks",
8684 filename: "foo_v2.apex",
8685 overrides: ["foo"],
8686 }
8687 `,
8688 android.FixtureModifyConfig(func(config android.Config) {
8689 config.Targets[android.Android] = []android.Target{
8690 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8691 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8692 }
8693 }),
8694 )
8695
Spandan Das3576e762024-01-03 18:57:03 +00008696 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Anton Hansson805e0a52022-11-25 14:06:46 +00008697
8698 // Check extract_apks tool parameters. No native bridge arch expected
8699 extractedApex := m.Output("extracted/myapex.apks")
8700 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8701}
8702
Jiyong Park7d95a512020-05-10 15:16:24 +09008703func TestNoStaticLinkingToStubsLib(t *testing.T) {
8704 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8705 apex {
8706 name: "myapex",
8707 key: "myapex.key",
8708 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008709 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008710 }
8711
8712 apex_key {
8713 name: "myapex.key",
8714 public_key: "testkey.avbpubkey",
8715 private_key: "testkey.pem",
8716 }
8717
8718 cc_library {
8719 name: "mylib",
8720 srcs: ["mylib.cpp"],
8721 static_libs: ["otherlib"],
8722 system_shared_libs: [],
8723 stl: "none",
8724 apex_available: [ "myapex" ],
8725 }
8726
8727 cc_library {
8728 name: "otherlib",
8729 srcs: ["mylib.cpp"],
8730 system_shared_libs: [],
8731 stl: "none",
8732 stubs: {
8733 versions: ["1", "2", "3"],
8734 },
8735 apex_available: [ "myapex" ],
8736 }
8737 `)
8738}
8739
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008740func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008741 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008742 apex {
8743 name: "myapex",
8744 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008745 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008746 custom_sign_tool: "sign_myapex",
8747 }
8748
8749 apex_key {
8750 name: "myapex.key",
8751 public_key: "testkey.avbpubkey",
8752 private_key: "testkey.pem",
8753 }
8754 `)
8755
Jooyung Han286957d2023-10-30 16:17:56 +09008756 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07008757 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008758 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 +09008759}
8760
8761func TestApexKeysTxtOverrides(t *testing.T) {
8762 ctx := testApex(t, `
8763 apex {
8764 name: "myapex",
8765 key: "myapex.key",
8766 updatable: false,
8767 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008768 }
8769
8770 apex_key {
8771 name: "myapex.key",
8772 public_key: "testkey.avbpubkey",
8773 private_key: "testkey.pem",
8774 }
8775
8776 prebuilt_apex {
8777 name: "myapex",
8778 prefer: true,
8779 arch: {
8780 arm64: {
8781 src: "myapex-arm64.apex",
8782 },
8783 arm: {
8784 src: "myapex-arm.apex",
8785 },
8786 },
8787 }
8788
8789 apex_set {
8790 name: "myapex_set",
8791 set: "myapex.apks",
8792 filename: "myapex_set.apex",
8793 overrides: ["myapex"],
8794 }
8795 `)
8796
Colin Crossf61d03d2023-11-02 16:56:39 -07008797 content := android.ContentFromFileRuleForTests(t, ctx,
8798 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09008799 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 -07008800 content = android.ContentFromFileRuleForTests(t, ctx,
8801 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008802 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 +09008803}
8804
Jooyung Han938b5932020-06-20 12:47:47 +09008805func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008806 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008807 apex {
8808 name: "myapex",
8809 key: "myapex.key",
8810 apps: ["app"],
8811 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008812 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008813 }
8814
8815 apex_key {
8816 name: "myapex.key",
8817 public_key: "testkey.avbpubkey",
8818 private_key: "testkey.pem",
8819 }
8820
8821 android_app {
8822 name: "app",
8823 srcs: ["foo/bar/MyClass.java"],
8824 package_name: "foo",
8825 sdk_version: "none",
8826 system_modules: "none",
8827 apex_available: [ "myapex" ],
8828 }
8829 `, withFiles(map[string][]byte{
8830 "sub/Android.bp": []byte(`
8831 override_apex {
8832 name: "override_myapex",
8833 base: "myapex",
8834 apps: ["override_app"],
8835 allowed_files: ":allowed",
8836 }
8837 // Overridable "path" property should be referenced indirectly
8838 filegroup {
8839 name: "allowed",
8840 srcs: ["allowed.txt"],
8841 }
8842 override_android_app {
8843 name: "override_app",
8844 base: "app",
8845 package_name: "bar",
8846 }
8847 `),
8848 }))
8849
Jooyung Hana0503a52023-08-23 13:12:50 +09008850 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09008851 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8852 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8853 }
8854
Spandan Das50801e22024-05-13 18:29:45 +00008855 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09008856 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8857 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8858 }
8859}
8860
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008861func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008862 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008863 apex {
8864 name: "myapex",
8865 key: "myapex.key",
8866 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008867 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008868 }
8869
8870 apex_key {
8871 name: "myapex.key",
8872 public_key: "testkey.avbpubkey",
8873 private_key: "testkey.pem",
8874 }
8875
8876 cc_library {
8877 name: "mylib",
8878 srcs: ["mylib.cpp"],
8879 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008880 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008881 },
8882 apex_available: ["myapex"],
8883 }
8884
8885 cc_prebuilt_library_shared {
8886 name: "mylib",
8887 prefer: false,
8888 srcs: ["prebuilt.so"],
8889 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008890 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008891 },
8892 apex_available: ["myapex"],
8893 }
8894 `)
8895}
8896
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008897func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008898 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008899 apex {
8900 name: "myapex",
8901 key: "myapex.key",
8902 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008903 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008904 }
8905 apex_key {
8906 name: "myapex.key",
8907 public_key: "testkey.avbpubkey",
8908 private_key: "testkey.pem",
8909 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008910 `,
8911 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8912 variables.CompressedApex = proptools.BoolPtr(true)
8913 }),
8914 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008915
Jooyung Hana0503a52023-08-23 13:12:50 +09008916 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008917 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
8918
Jooyung Hana0503a52023-08-23 13:12:50 +09008919 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008920 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
8921
8922 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09008923 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008924 ensureContains(t, ab.outputFile.String(), "myapex.capex")
8925
8926 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07008927 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008928 var builder strings.Builder
8929 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8930 androidMk := builder.String()
8931 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
8932}
8933
Jooyung Han26ec8482024-07-31 15:04:05 +09008934func TestApexSet_ShouldRespectCompressedApexFlag(t *testing.T) {
8935 for _, compressionEnabled := range []bool{true, false} {
8936 t.Run(fmt.Sprintf("compressionEnabled=%v", compressionEnabled), func(t *testing.T) {
8937 ctx := testApex(t, `
8938 apex_set {
8939 name: "com.company.android.myapex",
8940 apex_name: "com.android.myapex",
8941 set: "company-myapex.apks",
8942 }
8943 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8944 variables.CompressedApex = proptools.BoolPtr(compressionEnabled)
8945 }),
8946 )
8947
8948 build := ctx.ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex").Output("com.company.android.myapex.apex")
8949 if compressionEnabled {
8950 ensureEquals(t, build.Rule.String(), "android/soong/android.Cp")
8951 } else {
8952 ensureEquals(t, build.Rule.String(), "android/apex.decompressApex")
8953 }
8954 })
8955 }
8956}
8957
Martin Stjernholm2856c662020-12-02 15:03:42 +00008958func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008959 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00008960 apex {
8961 name: "myapex",
8962 key: "myapex.key",
8963 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008964 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00008965 }
8966
8967 apex_key {
8968 name: "myapex.key",
8969 public_key: "testkey.avbpubkey",
8970 private_key: "testkey.pem",
8971 }
8972
8973 cc_library {
8974 name: "mylib",
8975 srcs: ["mylib.cpp"],
8976 apex_available: ["myapex"],
8977 shared_libs: ["otherlib"],
8978 system_shared_libs: [],
8979 }
8980
8981 cc_library {
8982 name: "otherlib",
8983 srcs: ["mylib.cpp"],
8984 stubs: {
8985 versions: ["current"],
8986 },
8987 }
8988
8989 cc_prebuilt_library_shared {
8990 name: "otherlib",
8991 prefer: true,
8992 srcs: ["prebuilt.so"],
8993 stubs: {
8994 versions: ["current"],
8995 },
8996 }
8997 `)
8998
Jooyung Hana0503a52023-08-23 13:12:50 +09008999 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009000 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009001 var builder strings.Builder
9002 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9003 androidMk := builder.String()
9004
9005 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9006 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009007 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009008}
9009
Jiyong Parke3867542020-12-03 17:28:25 +09009010func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009011 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009012 apex {
9013 name: "myapex",
9014 key: "myapex.key",
9015 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009016 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009017 }
9018
9019 apex_key {
9020 name: "myapex.key",
9021 public_key: "testkey.avbpubkey",
9022 private_key: "testkey.pem",
9023 }
9024
9025 cc_library {
9026 name: "mylib",
9027 srcs: ["mylib.cpp"],
9028 system_shared_libs: [],
9029 stl: "none",
9030 apex_available: ["myapex"],
9031 shared_libs: ["mylib2"],
9032 target: {
9033 apex: {
9034 exclude_shared_libs: ["mylib2"],
9035 },
9036 },
9037 }
9038
9039 cc_library {
9040 name: "mylib2",
9041 srcs: ["mylib.cpp"],
9042 system_shared_libs: [],
9043 stl: "none",
9044 }
9045 `)
9046
9047 // Check if mylib is linked to mylib2 for the non-apex target
9048 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9049 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9050
9051 // Make sure that the link doesn't occur for the apex target
9052 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9053 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9054
9055 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009056 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009057 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9058}
9059
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009060func TestPrebuiltStubLibDep(t *testing.T) {
9061 bpBase := `
9062 apex {
9063 name: "myapex",
9064 key: "myapex.key",
9065 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009066 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009067 }
9068 apex_key {
9069 name: "myapex.key",
9070 public_key: "testkey.avbpubkey",
9071 private_key: "testkey.pem",
9072 }
9073 cc_library {
9074 name: "mylib",
9075 srcs: ["mylib.cpp"],
9076 apex_available: ["myapex"],
9077 shared_libs: ["stublib"],
9078 system_shared_libs: [],
9079 }
9080 apex {
9081 name: "otherapex",
9082 enabled: %s,
9083 key: "myapex.key",
9084 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009085 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009086 }
9087 `
9088
9089 stublibSourceBp := `
9090 cc_library {
9091 name: "stublib",
9092 srcs: ["mylib.cpp"],
9093 apex_available: ["otherapex"],
9094 system_shared_libs: [],
9095 stl: "none",
9096 stubs: {
9097 versions: ["1"],
9098 },
9099 }
9100 `
9101
9102 stublibPrebuiltBp := `
9103 cc_prebuilt_library_shared {
9104 name: "stublib",
9105 srcs: ["prebuilt.so"],
9106 apex_available: ["otherapex"],
9107 stubs: {
9108 versions: ["1"],
9109 },
9110 %s
9111 }
9112 `
9113
9114 tests := []struct {
9115 name string
9116 stublibBp string
9117 usePrebuilt bool
9118 modNames []string // Modules to collect AndroidMkEntries for
9119 otherApexEnabled []string
9120 }{
9121 {
9122 name: "only_source",
9123 stublibBp: stublibSourceBp,
9124 usePrebuilt: false,
9125 modNames: []string{"stublib"},
9126 otherApexEnabled: []string{"true", "false"},
9127 },
9128 {
9129 name: "source_preferred",
9130 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9131 usePrebuilt: false,
9132 modNames: []string{"stublib", "prebuilt_stublib"},
9133 otherApexEnabled: []string{"true", "false"},
9134 },
9135 {
9136 name: "prebuilt_preferred",
9137 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9138 usePrebuilt: true,
9139 modNames: []string{"stublib", "prebuilt_stublib"},
9140 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9141 },
9142 {
9143 name: "only_prebuilt",
9144 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9145 usePrebuilt: true,
9146 modNames: []string{"stublib"},
9147 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9148 },
9149 }
9150
9151 for _, test := range tests {
9152 t.Run(test.name, func(t *testing.T) {
9153 for _, otherApexEnabled := range test.otherApexEnabled {
9154 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009155 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009156
9157 type modAndMkEntries struct {
9158 mod *cc.Module
9159 mkEntries android.AndroidMkEntries
9160 }
9161 entries := []*modAndMkEntries{}
9162
9163 // Gather shared lib modules that are installable
9164 for _, modName := range test.modNames {
9165 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9166 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9167 continue
9168 }
9169 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Cole Fausta963b942024-04-11 17:43:00 -07009170 if !mod.Enabled(android.PanickingConfigAndErrorContext(ctx)) || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009171 continue
9172 }
Colin Crossaa255532020-07-03 13:18:24 -07009173 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009174 if ent.Disabled {
9175 continue
9176 }
9177 entries = append(entries, &modAndMkEntries{
9178 mod: mod,
9179 mkEntries: ent,
9180 })
9181 }
9182 }
9183 }
9184
9185 var entry *modAndMkEntries = nil
9186 for _, ent := range entries {
9187 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9188 if entry != nil {
9189 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9190 } else {
9191 entry = ent
9192 }
9193 }
9194 }
9195
9196 if entry == nil {
9197 t.Errorf("AndroidMk entry for \"stublib\" missing")
9198 } else {
9199 isPrebuilt := entry.mod.Prebuilt() != nil
9200 if isPrebuilt != test.usePrebuilt {
9201 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9202 }
9203 if !entry.mod.IsStubs() {
9204 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9205 }
9206 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9207 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9208 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009209 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009210 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009211 if !android.InList(expected, cflags) {
9212 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9213 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009214 }
9215 })
9216 }
9217 })
9218 }
9219}
9220
Colin Crossc33e5212021-05-25 18:16:02 -07009221func TestApexJavaCoverage(t *testing.T) {
9222 bp := `
9223 apex {
9224 name: "myapex",
9225 key: "myapex.key",
9226 java_libs: ["mylib"],
9227 bootclasspath_fragments: ["mybootclasspathfragment"],
9228 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9229 updatable: false,
9230 }
9231
9232 apex_key {
9233 name: "myapex.key",
9234 public_key: "testkey.avbpubkey",
9235 private_key: "testkey.pem",
9236 }
9237
9238 java_library {
9239 name: "mylib",
9240 srcs: ["mylib.java"],
9241 apex_available: ["myapex"],
9242 compile_dex: true,
9243 }
9244
9245 bootclasspath_fragment {
9246 name: "mybootclasspathfragment",
9247 contents: ["mybootclasspathlib"],
9248 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009249 hidden_api: {
9250 split_packages: ["*"],
9251 },
Colin Crossc33e5212021-05-25 18:16:02 -07009252 }
9253
9254 java_library {
9255 name: "mybootclasspathlib",
9256 srcs: ["mybootclasspathlib.java"],
9257 apex_available: ["myapex"],
9258 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009259 sdk_version: "current",
Colin Crossc33e5212021-05-25 18:16:02 -07009260 }
9261
9262 systemserverclasspath_fragment {
9263 name: "mysystemserverclasspathfragment",
9264 contents: ["mysystemserverclasspathlib"],
9265 apex_available: ["myapex"],
9266 }
9267
9268 java_library {
9269 name: "mysystemserverclasspathlib",
9270 srcs: ["mysystemserverclasspathlib.java"],
9271 apex_available: ["myapex"],
9272 compile_dex: true,
9273 }
9274 `
9275
9276 result := android.GroupFixturePreparers(
9277 PrepareForTestWithApexBuildComponents,
9278 prepareForTestWithMyapex,
9279 java.PrepareForTestWithJavaDefaultModules,
9280 android.PrepareForTestWithAndroidBuildComponents,
9281 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009282 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9283 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009284 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009285 ).RunTest(t)
9286
9287 // Make sure jacoco ran on both mylib and mybootclasspathlib
9288 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9289 t.Errorf("Failed to find jacoco rule for mylib")
9290 }
9291 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9292 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9293 }
9294 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9295 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9296 }
9297}
9298
Jiyong Park192600a2021-08-03 07:52:17 +00009299func TestProhibitStaticExecutable(t *testing.T) {
9300 testApexError(t, `executable mybin is static`, `
9301 apex {
9302 name: "myapex",
9303 key: "myapex.key",
9304 binaries: ["mybin"],
9305 min_sdk_version: "29",
9306 }
9307
9308 apex_key {
9309 name: "myapex.key",
9310 public_key: "testkey.avbpubkey",
9311 private_key: "testkey.pem",
9312 }
9313
9314 cc_binary {
9315 name: "mybin",
9316 srcs: ["mylib.cpp"],
9317 relative_install_path: "foo/bar",
9318 static_executable: true,
9319 system_shared_libs: [],
9320 stl: "none",
9321 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009322 min_sdk_version: "29",
9323 }
9324 `)
9325
9326 testApexError(t, `executable mybin.rust is static`, `
9327 apex {
9328 name: "myapex",
9329 key: "myapex.key",
9330 binaries: ["mybin.rust"],
9331 min_sdk_version: "29",
9332 }
9333
9334 apex_key {
9335 name: "myapex.key",
9336 public_key: "testkey.avbpubkey",
9337 private_key: "testkey.pem",
9338 }
9339
9340 rust_binary {
9341 name: "mybin.rust",
9342 srcs: ["foo.rs"],
9343 static_executable: true,
9344 apex_available: ["myapex"],
9345 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009346 }
9347 `)
9348}
9349
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009350func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9351 ctx := testApex(t, `
9352 apex {
9353 name: "myapex",
9354 key: "myapex.key",
9355 updatable: false,
9356 java_libs: ["foo"],
9357 }
9358
9359 apex_key {
9360 name: "myapex.key",
9361 public_key: "testkey.avbpubkey",
9362 private_key: "testkey.pem",
9363 }
9364
9365 java_library {
9366 name: "foo",
9367 srcs: ["foo.java"],
9368 apex_available: ["myapex"],
9369 installable: true,
9370 }
9371 `,
9372 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9373 )
9374
Jooyung Hana0503a52023-08-23 13:12:50 +09009375 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009376 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9377 var builder strings.Builder
9378 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9379 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009380 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex\n")
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009381}
9382
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009383func TestAndroidMk_RequiredModules(t *testing.T) {
9384 ctx := testApex(t, `
9385 apex {
9386 name: "myapex",
9387 key: "myapex.key",
9388 updatable: false,
9389 java_libs: ["foo"],
9390 required: ["otherapex"],
9391 }
9392
9393 apex {
9394 name: "otherapex",
9395 key: "myapex.key",
9396 updatable: false,
9397 java_libs: ["foo"],
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009398 }
9399
9400 apex_key {
9401 name: "myapex.key",
9402 public_key: "testkey.avbpubkey",
9403 private_key: "testkey.pem",
9404 }
9405
9406 java_library {
9407 name: "foo",
9408 srcs: ["foo.java"],
9409 apex_available: ["myapex", "otherapex"],
9410 installable: true,
9411 }
9412 `)
9413
Jooyung Hana0503a52023-08-23 13:12:50 +09009414 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009415 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9416 var builder strings.Builder
9417 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9418 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009419 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009420}
9421
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009422func TestAndroidMk_RequiredDeps(t *testing.T) {
9423 ctx := testApex(t, `
9424 apex {
9425 name: "myapex",
9426 key: "myapex.key",
9427 updatable: false,
9428 }
9429
9430 apex_key {
9431 name: "myapex.key",
9432 public_key: "testkey.avbpubkey",
9433 private_key: "testkey.pem",
9434 }
9435 `)
9436
Jooyung Hana0503a52023-08-23 13:12:50 +09009437 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009438 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009439 data := android.AndroidMkDataForTest(t, ctx, bundle)
9440 var builder strings.Builder
9441 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9442 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009443 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009444}
9445
Jooyung Hana6d36672022-02-24 13:58:07 +09009446func TestApexOutputFileProducer(t *testing.T) {
9447 for _, tc := range []struct {
9448 name string
9449 ref string
9450 expected_data []string
9451 }{
9452 {
9453 name: "test_using_output",
9454 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009455 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009456 },
9457 {
9458 name: "test_using_apex",
9459 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009460 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009461 },
9462 } {
9463 t.Run(tc.name, func(t *testing.T) {
9464 ctx := testApex(t, `
9465 apex {
9466 name: "myapex",
9467 key: "myapex.key",
9468 compressible: true,
9469 updatable: false,
9470 }
9471
9472 apex_key {
9473 name: "myapex.key",
9474 public_key: "testkey.avbpubkey",
9475 private_key: "testkey.pem",
9476 }
9477
9478 java_test {
9479 name: "`+tc.name+`",
9480 srcs: ["a.java"],
9481 data: ["`+tc.ref+`"],
9482 }
9483 `,
9484 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9485 variables.CompressedApex = proptools.BoolPtr(true)
9486 }))
9487 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9488 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9489 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9490 })
9491 }
9492}
9493
satayev758968a2021-12-06 11:42:40 +00009494func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9495 preparer := android.GroupFixturePreparers(
9496 PrepareForTestWithApexBuildComponents,
9497 prepareForTestWithMyapex,
9498 java.PrepareForTestWithJavaSdkLibraryFiles,
9499 java.PrepareForTestWithJavaDefaultModules,
9500 android.PrepareForTestWithAndroidBuildComponents,
9501 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9502 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9503 )
9504
9505 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9506 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9507 preparer.RunTestWithBp(t, `
9508 apex {
9509 name: "myapex",
9510 key: "myapex.key",
9511 bootclasspath_fragments: ["mybootclasspathfragment"],
9512 min_sdk_version: "30",
9513 updatable: false,
9514 }
9515
9516 apex_key {
9517 name: "myapex.key",
9518 public_key: "testkey.avbpubkey",
9519 private_key: "testkey.pem",
9520 }
9521
9522 bootclasspath_fragment {
9523 name: "mybootclasspathfragment",
9524 contents: ["mybootclasspathlib"],
9525 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009526 hidden_api: {
9527 split_packages: ["*"],
9528 },
satayev758968a2021-12-06 11:42:40 +00009529 }
9530
9531 java_sdk_library {
9532 name: "mybootclasspathlib",
9533 srcs: ["mybootclasspathlib.java"],
9534 apex_available: ["myapex"],
9535 compile_dex: true,
9536 unsafe_ignore_missing_latest_api: true,
9537 min_sdk_version: "31",
9538 static_libs: ["util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009539 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009540 }
9541
9542 java_library {
9543 name: "util",
9544 srcs: ["a.java"],
9545 apex_available: ["myapex"],
9546 min_sdk_version: "31",
9547 static_libs: ["another_util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009548 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009549 }
9550
9551 java_library {
9552 name: "another_util",
9553 srcs: ["a.java"],
9554 min_sdk_version: "31",
9555 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009556 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009557 }
9558 `)
9559 })
9560
9561 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9562 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9563 preparer.RunTestWithBp(t, `
9564 apex {
9565 name: "myapex",
9566 key: "myapex.key",
9567 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9568 min_sdk_version: "30",
9569 updatable: false,
9570 }
9571
9572 apex_key {
9573 name: "myapex.key",
9574 public_key: "testkey.avbpubkey",
9575 private_key: "testkey.pem",
9576 }
9577
9578 systemserverclasspath_fragment {
9579 name: "mysystemserverclasspathfragment",
9580 contents: ["mysystemserverclasspathlib"],
9581 apex_available: ["myapex"],
9582 }
9583
9584 java_sdk_library {
9585 name: "mysystemserverclasspathlib",
9586 srcs: ["mysystemserverclasspathlib.java"],
9587 apex_available: ["myapex"],
9588 compile_dex: true,
9589 min_sdk_version: "32",
9590 unsafe_ignore_missing_latest_api: true,
9591 static_libs: ["util"],
9592 }
9593
9594 java_library {
9595 name: "util",
9596 srcs: ["a.java"],
9597 apex_available: ["myapex"],
9598 min_sdk_version: "31",
9599 static_libs: ["another_util"],
9600 }
9601
9602 java_library {
9603 name: "another_util",
9604 srcs: ["a.java"],
9605 min_sdk_version: "31",
9606 apex_available: ["myapex"],
9607 }
9608 `)
9609 })
9610
9611 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Jihoon Kang85bc1932024-07-01 17:04:46 +00009612 preparer.
satayev758968a2021-12-06 11:42:40 +00009613 RunTestWithBp(t, `
9614 apex {
9615 name: "myapex",
9616 key: "myapex.key",
9617 bootclasspath_fragments: ["mybootclasspathfragment"],
9618 min_sdk_version: "30",
9619 updatable: false,
9620 }
9621
9622 apex_key {
9623 name: "myapex.key",
9624 public_key: "testkey.avbpubkey",
9625 private_key: "testkey.pem",
9626 }
9627
9628 bootclasspath_fragment {
9629 name: "mybootclasspathfragment",
9630 contents: ["mybootclasspathlib"],
9631 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009632 hidden_api: {
9633 split_packages: ["*"],
9634 },
satayev758968a2021-12-06 11:42:40 +00009635 }
9636
9637 java_sdk_library {
9638 name: "mybootclasspathlib",
9639 srcs: ["mybootclasspathlib.java"],
9640 apex_available: ["myapex"],
9641 compile_dex: true,
9642 unsafe_ignore_missing_latest_api: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009643 sdk_version: "current",
9644 min_sdk_version: "30",
satayev758968a2021-12-06 11:42:40 +00009645 }
9646 `)
9647 })
9648
9649 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9650 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9651 RunTestWithBp(t, `
9652 apex {
9653 name: "myapex",
9654 key: "myapex.key",
9655 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9656 min_sdk_version: "30",
9657 updatable: false,
9658 }
9659
9660 apex_key {
9661 name: "myapex.key",
9662 public_key: "testkey.avbpubkey",
9663 private_key: "testkey.pem",
9664 }
9665
9666 systemserverclasspath_fragment {
9667 name: "mysystemserverclasspathfragment",
9668 contents: ["mysystemserverclasspathlib"],
9669 apex_available: ["myapex"],
9670 }
9671
9672 java_sdk_library {
9673 name: "mysystemserverclasspathlib",
9674 srcs: ["mysystemserverclasspathlib.java"],
9675 apex_available: ["myapex"],
9676 compile_dex: true,
9677 unsafe_ignore_missing_latest_api: true,
9678 }
9679 `)
9680 })
9681}
9682
Jiakai Zhang6decef92022-01-12 17:56:19 +00009683// Verifies that the APEX depends on all the Make modules in the list.
9684func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9685 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9686 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009687 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009688 }
9689}
9690
9691// Verifies that the APEX does not depend on any of the Make modules in the list.
9692func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9693 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9694 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009695 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009696 }
9697}
9698
Cole Faust24e25c02024-01-19 14:12:17 -08009699func TestApexStrictUpdtabilityLint(t *testing.T) {
9700 bpTemplate := `
9701 apex {
9702 name: "myapex",
9703 key: "myapex.key",
9704 java_libs: ["myjavalib"],
9705 updatable: %v,
9706 min_sdk_version: "29",
9707 }
9708 apex_key {
9709 name: "myapex.key",
9710 }
9711 java_library {
9712 name: "myjavalib",
9713 srcs: ["MyClass.java"],
9714 apex_available: [ "myapex" ],
9715 lint: {
9716 strict_updatability_linting: %v,
9717 %s
9718 },
9719 sdk_version: "current",
9720 min_sdk_version: "29",
9721 }
9722 `
9723 fs := android.MockFS{
9724 "lint-baseline.xml": nil,
9725 }
9726
9727 testCases := []struct {
9728 testCaseName string
9729 apexUpdatable bool
9730 javaStrictUpdtabilityLint bool
9731 lintFileExists bool
9732 disallowedFlagExpected bool
9733 }{
9734 {
9735 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9736 apexUpdatable: true,
9737 javaStrictUpdtabilityLint: true,
9738 lintFileExists: false,
9739 disallowedFlagExpected: false,
9740 },
9741 {
9742 testCaseName: "non-updatable apex respects strict_updatability of javalib",
9743 apexUpdatable: false,
9744 javaStrictUpdtabilityLint: false,
9745 lintFileExists: true,
9746 disallowedFlagExpected: false,
9747 },
9748 {
9749 testCaseName: "non-updatable apex respects strict updatability of javalib",
9750 apexUpdatable: false,
9751 javaStrictUpdtabilityLint: true,
9752 lintFileExists: true,
9753 disallowedFlagExpected: true,
9754 },
9755 {
9756 testCaseName: "updatable apex sets strict updatability of javalib to true",
9757 apexUpdatable: true,
9758 javaStrictUpdtabilityLint: false, // will be set to true by mutator
9759 lintFileExists: true,
9760 disallowedFlagExpected: true,
9761 },
9762 }
9763
9764 for _, testCase := range testCases {
9765 fixtures := []android.FixturePreparer{}
9766 baselineProperty := ""
9767 if testCase.lintFileExists {
9768 fixtures = append(fixtures, fs.AddToFixture())
9769 baselineProperty = "baseline_filename: \"lint-baseline.xml\""
9770 }
9771 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint, baselineProperty)
9772
9773 result := testApex(t, bp, fixtures...)
9774 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9775 sboxProto := android.RuleBuilderSboxProtoForTests(t, result, myjavalib.Output("lint.sbox.textproto"))
9776 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
9777
9778 if disallowedFlagActual != testCase.disallowedFlagExpected {
9779 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9780 }
9781 }
9782}
9783
9784func TestUpdatabilityLintSkipLibcore(t *testing.T) {
9785 bp := `
9786 apex {
9787 name: "myapex",
9788 key: "myapex.key",
9789 java_libs: ["myjavalib"],
9790 updatable: true,
9791 min_sdk_version: "29",
9792 }
9793 apex_key {
9794 name: "myapex.key",
9795 }
9796 java_library {
9797 name: "myjavalib",
9798 srcs: ["MyClass.java"],
9799 apex_available: [ "myapex" ],
9800 sdk_version: "current",
9801 min_sdk_version: "29",
9802 lint: {
9803 baseline_filename: "lint-baseline.xml",
9804 }
9805 }
9806 `
9807
9808 testCases := []struct {
9809 testCaseName string
9810 moduleDirectory string
9811 disallowedFlagExpected bool
9812 }{
9813 {
9814 testCaseName: "lintable module defined outside libcore",
9815 moduleDirectory: "",
9816 disallowedFlagExpected: true,
9817 },
9818 {
9819 testCaseName: "lintable module defined in libcore root directory",
9820 moduleDirectory: "libcore/",
9821 disallowedFlagExpected: false,
9822 },
9823 {
9824 testCaseName: "lintable module defined in libcore child directory",
9825 moduleDirectory: "libcore/childdir/",
9826 disallowedFlagExpected: true,
9827 },
9828 }
9829
9830 for _, testCase := range testCases {
9831 lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
9832 bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
9833 result := testApex(t, "", lintFileCreator, bpFileCreator)
9834 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9835 sboxProto := android.RuleBuilderSboxProtoForTests(t, result, myjavalib.Output("lint.sbox.textproto"))
9836 cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
9837 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
9838
9839 if disallowedFlagActual != testCase.disallowedFlagExpected {
9840 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9841 }
9842 }
9843}
9844
9845// checks transtive deps of an apex coming from bootclasspath_fragment
9846func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
9847 bp := `
9848 apex {
9849 name: "myapex",
9850 key: "myapex.key",
9851 bootclasspath_fragments: ["mybootclasspathfragment"],
9852 updatable: true,
9853 min_sdk_version: "29",
9854 }
9855 apex_key {
9856 name: "myapex.key",
9857 }
9858 bootclasspath_fragment {
9859 name: "mybootclasspathfragment",
9860 contents: ["myjavalib"],
9861 apex_available: ["myapex"],
9862 hidden_api: {
9863 split_packages: ["*"],
9864 },
9865 }
9866 java_library {
9867 name: "myjavalib",
9868 srcs: ["MyClass.java"],
9869 apex_available: [ "myapex" ],
9870 sdk_version: "current",
9871 min_sdk_version: "29",
9872 compile_dex: true,
9873 lint: {
9874 baseline_filename: "lint-baseline.xml",
9875 }
9876 }
9877 `
9878 fs := android.MockFS{
9879 "lint-baseline.xml": nil,
9880 }
9881
9882 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
9883 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9884 sboxProto := android.RuleBuilderSboxProtoForTests(t, result, myjavalib.Output("lint.sbox.textproto"))
9885 if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
9886 t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
9887 }
9888}
Spandan Das66773252022-01-15 00:23:18 +00009889
Jihoon Kang784c0052024-06-25 22:15:39 +00009890func TestApexLintBcpFragmentSdkLibDeps(t *testing.T) {
9891 bp := `
9892 apex {
9893 name: "myapex",
9894 key: "myapex.key",
9895 bootclasspath_fragments: ["mybootclasspathfragment"],
9896 min_sdk_version: "29",
Jihoon Kang85bc1932024-07-01 17:04:46 +00009897 java_libs: [
9898 "jacocoagent",
9899 ],
Jihoon Kang784c0052024-06-25 22:15:39 +00009900 }
9901 apex_key {
9902 name: "myapex.key",
9903 }
9904 bootclasspath_fragment {
9905 name: "mybootclasspathfragment",
9906 contents: ["foo"],
9907 apex_available: ["myapex"],
9908 hidden_api: {
9909 split_packages: ["*"],
9910 },
9911 }
9912 java_sdk_library {
9913 name: "foo",
9914 srcs: ["MyClass.java"],
9915 apex_available: [ "myapex" ],
9916 sdk_version: "current",
9917 min_sdk_version: "29",
9918 compile_dex: true,
9919 }
9920 `
9921 fs := android.MockFS{
9922 "lint-baseline.xml": nil,
9923 }
9924
9925 result := android.GroupFixturePreparers(
9926 prepareForApexTest,
9927 java.PrepareForTestWithJavaSdkLibraryFiles,
9928 java.PrepareForTestWithJacocoInstrumentation,
9929 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang784c0052024-06-25 22:15:39 +00009930 android.FixtureMergeMockFs(fs),
9931 ).RunTestWithBp(t, bp)
9932
9933 myapex := result.ModuleForTests("myapex", "android_common_myapex")
9934 lintReportInputs := strings.Join(myapex.Output("lint-report-xml.zip").Inputs.Strings(), " ")
9935 android.AssertStringDoesContain(t,
9936 "myapex lint report expected to contain that of the sdk library impl lib as an input",
9937 lintReportInputs, "foo.impl")
9938}
9939
Spandan Das42e89502022-05-06 22:12:55 +00009940// updatable apexes should propagate updatable=true to its apps
9941func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
9942 bp := `
9943 apex {
9944 name: "myapex",
9945 key: "myapex.key",
9946 updatable: %v,
9947 apps: [
9948 "myapp",
9949 ],
9950 min_sdk_version: "30",
9951 }
9952 apex_key {
9953 name: "myapex.key",
9954 }
9955 android_app {
9956 name: "myapp",
9957 updatable: %v,
9958 apex_available: [
9959 "myapex",
9960 ],
9961 sdk_version: "current",
9962 min_sdk_version: "30",
9963 }
9964 `
9965 testCases := []struct {
9966 name string
9967 apex_is_updatable_bp bool
9968 app_is_updatable_bp bool
9969 app_is_updatable_expected bool
9970 }{
9971 {
9972 name: "Non-updatable apex respects updatable property of non-updatable app",
9973 apex_is_updatable_bp: false,
9974 app_is_updatable_bp: false,
9975 app_is_updatable_expected: false,
9976 },
9977 {
9978 name: "Non-updatable apex respects updatable property of updatable app",
9979 apex_is_updatable_bp: false,
9980 app_is_updatable_bp: true,
9981 app_is_updatable_expected: true,
9982 },
9983 {
9984 name: "Updatable apex respects updatable property of updatable app",
9985 apex_is_updatable_bp: true,
9986 app_is_updatable_bp: true,
9987 app_is_updatable_expected: true,
9988 },
9989 {
9990 name: "Updatable apex sets updatable=true on non-updatable app",
9991 apex_is_updatable_bp: true,
9992 app_is_updatable_bp: false,
9993 app_is_updatable_expected: true,
9994 },
9995 }
9996 for _, testCase := range testCases {
9997 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
9998 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
9999 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
10000 }
10001}
10002
Dennis Shend4f5d932023-01-31 20:27:21 +000010003func TestTrimmedApex(t *testing.T) {
10004 bp := `
10005 apex {
10006 name: "myapex",
10007 key: "myapex.key",
10008 native_shared_libs: ["libfoo","libbaz"],
10009 min_sdk_version: "29",
10010 trim_against: "mydcla",
10011 }
10012 apex {
10013 name: "mydcla",
10014 key: "myapex.key",
10015 native_shared_libs: ["libfoo","libbar"],
10016 min_sdk_version: "29",
10017 file_contexts: ":myapex-file_contexts",
10018 dynamic_common_lib_apex: true,
10019 }
10020 apex_key {
10021 name: "myapex.key",
10022 }
10023 cc_library {
10024 name: "libfoo",
10025 shared_libs: ["libc"],
10026 apex_available: ["myapex","mydcla"],
10027 min_sdk_version: "29",
10028 }
10029 cc_library {
10030 name: "libbar",
10031 shared_libs: ["libc"],
10032 apex_available: ["myapex","mydcla"],
10033 min_sdk_version: "29",
10034 }
10035 cc_library {
10036 name: "libbaz",
10037 shared_libs: ["libc"],
10038 apex_available: ["myapex","mydcla"],
10039 min_sdk_version: "29",
10040 }
Dennis Shend4f5d932023-01-31 20:27:21 +000010041 `
10042 ctx := testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +090010043 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dennis Shend4f5d932023-01-31 20:27:21 +000010044 apexRule := module.MaybeRule("apexRule")
10045 if apexRule.Rule == nil {
10046 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10047 }
10048
10049 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
Jooyung Hana0503a52023-08-23 13:12:50 +090010050 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("TrimmedApexRule")
Dennis Shend4f5d932023-01-31 20:27:21 +000010051 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10052 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10053 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10054 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10055}
Jingwen Chendea7a642023-03-28 11:30:50 +000010056
10057func TestCannedFsConfig(t *testing.T) {
10058 ctx := testApex(t, `
10059 apex {
10060 name: "myapex",
10061 key: "myapex.key",
10062 updatable: false,
10063 }
10064
10065 apex_key {
10066 name: "myapex.key",
10067 public_key: "testkey.avbpubkey",
10068 private_key: "testkey.pem",
10069 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010070 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010071 generateFsRule := mod.Rule("generateFsConfig")
10072 cmd := generateFsRule.RuleParams.Command
10073
10074 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10075}
10076
10077func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
10078 ctx := testApex(t, `
10079 apex {
10080 name: "myapex",
10081 key: "myapex.key",
10082 canned_fs_config: "my_config",
10083 updatable: false,
10084 }
10085
10086 apex_key {
10087 name: "myapex.key",
10088 public_key: "testkey.avbpubkey",
10089 private_key: "testkey.pem",
10090 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010091 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010092 generateFsRule := mod.Rule("generateFsConfig")
10093 cmd := generateFsRule.RuleParams.Command
10094
10095 // Ensure that canned_fs_config has "cat my_config" at the end
10096 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10097}
Spandan Das20fce2d2023-04-12 17:21:39 +000010098
10099func TestStubLibrariesMultipleApexViolation(t *testing.T) {
10100 testCases := []struct {
10101 desc string
10102 hasStubs bool
10103 apexAvailable string
10104 expectedError string
10105 }{
10106 {
10107 desc: "non-stub library can have multiple apex_available",
10108 hasStubs: false,
10109 apexAvailable: `["myapex", "otherapex"]`,
10110 },
10111 {
10112 desc: "stub library should not be available to anyapex",
10113 hasStubs: true,
10114 apexAvailable: `["//apex_available:anyapex"]`,
10115 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10116 },
10117 {
10118 desc: "stub library should not be available to multiple apexes",
10119 hasStubs: true,
10120 apexAvailable: `["myapex", "otherapex"]`,
10121 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10122 },
10123 {
10124 desc: "stub library can be available to a core apex and a test apex",
10125 hasStubs: true,
10126 apexAvailable: `["myapex", "test_myapex"]`,
10127 },
10128 }
10129 bpTemplate := `
10130 cc_library {
10131 name: "libfoo",
10132 %v
10133 apex_available: %v,
10134 }
10135 apex {
10136 name: "myapex",
10137 key: "apex.key",
10138 updatable: false,
10139 native_shared_libs: ["libfoo"],
10140 }
10141 apex {
10142 name: "otherapex",
10143 key: "apex.key",
10144 updatable: false,
10145 }
10146 apex_test {
10147 name: "test_myapex",
10148 key: "apex.key",
10149 updatable: false,
10150 native_shared_libs: ["libfoo"],
10151 }
10152 apex_key {
10153 name: "apex.key",
10154 }
10155 `
10156 for _, tc := range testCases {
10157 stubs := ""
10158 if tc.hasStubs {
10159 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10160 }
10161 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10162 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10163 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10164 })
10165 if tc.expectedError == "" {
10166 testApex(t, bp, mockFsFixturePreparer)
10167 } else {
10168 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10169 }
10170 }
10171}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010172
10173func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
10174 context := android.GroupFixturePreparers(
10175 android.PrepareForIntegrationTestWithAndroid,
10176 cc.PrepareForIntegrationTestWithCc,
10177 PrepareForTestWithApexBuildComponents,
10178 prepareForTestWithMyapex,
10179 filesystem.PrepareForTestWithFilesystemBuildComponents,
10180 )
10181 result := context.RunTestWithBp(t, `
10182 android_system_image {
10183 name: "myfilesystem",
10184 deps: [
10185 "libfoo",
10186 ],
10187 linker_config_src: "linker.config.json",
10188 }
10189
10190 cc_library {
10191 name: "libfoo",
10192 shared_libs: [
10193 "libbar",
10194 ],
10195 stl: "none",
10196 }
10197
10198 cc_library {
10199 name: "libbar",
10200 stl: "none",
10201 apex_available: ["myapex"],
10202 }
10203
10204 apex {
10205 name: "myapex",
10206 native_shared_libs: ["libbar"],
10207 key: "myapex.key",
10208 updatable: false,
10209 }
10210
10211 apex_key {
10212 name: "myapex.key",
10213 public_key: "testkey.avbpubkey",
10214 private_key: "testkey.pem",
10215 }
10216 `)
10217
Cole Faust3b806d32024-03-11 15:15:03 -070010218 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img").Implicits
Colin Crossbd3a16b2023-04-25 11:30:51 -070010219 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10220 inputs.Strings(),
10221 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10222}
Yu Liueae7b362023-11-16 17:05:47 -080010223
10224var apex_default_bp = `
10225 apex_key {
10226 name: "myapex.key",
10227 public_key: "testkey.avbpubkey",
10228 private_key: "testkey.pem",
10229 }
10230
10231 filegroup {
10232 name: "myapex.manifest",
10233 srcs: ["apex_manifest.json"],
10234 }
10235
10236 filegroup {
10237 name: "myapex.androidmanifest",
10238 srcs: ["AndroidManifest.xml"],
10239 }
10240`
10241
10242func TestAconfigFilesJavaDeps(t *testing.T) {
10243 ctx := testApex(t, apex_default_bp+`
10244 apex {
10245 name: "myapex",
10246 manifest: ":myapex.manifest",
10247 androidManifest: ":myapex.androidmanifest",
10248 key: "myapex.key",
10249 java_libs: [
10250 "my_java_library_foo",
10251 "my_java_library_bar",
10252 ],
10253 updatable: false,
10254 }
10255
10256 java_library {
10257 name: "my_java_library_foo",
10258 srcs: ["foo/bar/MyClass.java"],
10259 sdk_version: "none",
10260 system_modules: "none",
10261 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010262 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010263 "myapex",
10264 ],
10265 }
10266
10267 java_library {
10268 name: "my_java_library_bar",
10269 srcs: ["foo/bar/MyClass.java"],
10270 sdk_version: "none",
10271 system_modules: "none",
10272 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010273 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010274 "myapex",
10275 ],
10276 }
10277
10278 aconfig_declarations {
10279 name: "my_aconfig_declarations_foo",
10280 package: "com.example.package",
10281 container: "myapex",
10282 srcs: ["foo.aconfig"],
10283 }
10284
10285 java_aconfig_library {
10286 name: "my_java_aconfig_library_foo",
10287 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010288 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010289 "myapex",
10290 ],
10291 }
10292
10293 aconfig_declarations {
10294 name: "my_aconfig_declarations_bar",
10295 package: "com.example.package",
10296 container: "myapex",
10297 srcs: ["bar.aconfig"],
10298 }
10299
10300 java_aconfig_library {
10301 name: "my_java_aconfig_library_bar",
10302 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010303 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010304 "myapex",
10305 ],
10306 }
10307 `)
10308
10309 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10310 s := mod.Rule("apexRule").Args["copy_commands"]
10311 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jooyung Hana3fddf42024-09-03 13:22:21 +090010312 if len(copyCmds) != 12 {
10313 t.Fatalf("Expected 12 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010314 }
10315
Jooyung Hana3fddf42024-09-03 13:22:21 +090010316 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10317 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10318 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10319 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Yu Liueae7b362023-11-16 17:05:47 -080010320
Yu Liubba555e2024-02-17 00:36:42 +000010321 inputs := []string{
10322 "my_aconfig_declarations_foo/intermediate.pb",
10323 "my_aconfig_declarations_bar/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010324 }
Yu Liubba555e2024-02-17 00:36:42 +000010325 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10326 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10327 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10328 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Yu Liueae7b362023-11-16 17:05:47 -080010329}
10330
10331func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
10332 ctx := testApex(t, apex_default_bp+`
10333 apex {
10334 name: "myapex",
10335 manifest: ":myapex.manifest",
10336 androidManifest: ":myapex.androidmanifest",
10337 key: "myapex.key",
10338 java_libs: [
10339 "my_java_library_foo",
10340 ],
10341 native_shared_libs: [
10342 "my_cc_library_bar",
10343 ],
10344 binaries: [
10345 "my_cc_binary_baz",
10346 ],
10347 updatable: false,
10348 }
10349
10350 java_library {
10351 name: "my_java_library_foo",
10352 srcs: ["foo/bar/MyClass.java"],
10353 sdk_version: "none",
10354 system_modules: "none",
10355 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010356 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010357 "myapex",
10358 ],
10359 }
10360
10361 cc_library {
10362 name: "my_cc_library_bar",
10363 srcs: ["foo/bar/MyClass.cc"],
Yu Liucec0e412023-11-30 16:45:50 -080010364 static_libs: [
10365 "my_cc_aconfig_library_bar",
10366 "my_cc_aconfig_library_baz",
10367 ],
Yu Liueae7b362023-11-16 17:05:47 -080010368 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010369 "myapex",
10370 ],
10371 }
10372
10373 cc_binary {
10374 name: "my_cc_binary_baz",
10375 srcs: ["foo/bar/MyClass.cc"],
10376 static_libs: ["my_cc_aconfig_library_baz"],
Yu Liueae7b362023-11-16 17:05:47 -080010377 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010378 "myapex",
10379 ],
10380 }
10381
10382 aconfig_declarations {
10383 name: "my_aconfig_declarations_foo",
10384 package: "com.example.package",
10385 container: "myapex",
10386 srcs: ["foo.aconfig"],
10387 }
10388
10389 java_aconfig_library {
10390 name: "my_java_aconfig_library_foo",
10391 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010392 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010393 "myapex",
10394 ],
10395 }
10396
10397 aconfig_declarations {
10398 name: "my_aconfig_declarations_bar",
10399 package: "com.example.package",
10400 container: "myapex",
10401 srcs: ["bar.aconfig"],
10402 }
10403
10404 cc_aconfig_library {
10405 name: "my_cc_aconfig_library_bar",
10406 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010407 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010408 "myapex",
10409 ],
10410 }
10411
10412 aconfig_declarations {
10413 name: "my_aconfig_declarations_baz",
10414 package: "com.example.package",
10415 container: "myapex",
10416 srcs: ["baz.aconfig"],
10417 }
10418
10419 cc_aconfig_library {
10420 name: "my_cc_aconfig_library_baz",
10421 aconfig_declarations: "my_aconfig_declarations_baz",
Yu Liueae7b362023-11-16 17:05:47 -080010422 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010423 "myapex",
10424 ],
10425 }
10426
10427 cc_library {
10428 name: "server_configurable_flags",
10429 srcs: ["server_configurable_flags.cc"],
10430 }
Ted Bauerf0f18592024-04-23 18:25:26 +000010431 cc_library {
10432 name: "libbase",
10433 srcs: ["libbase.cc"],
Ted Bauer1e96f8c2024-04-25 19:50:01 +000010434 apex_available: [
10435 "myapex",
10436 ],
Ted Bauerf0f18592024-04-23 18:25:26 +000010437 }
10438 cc_library {
10439 name: "libaconfig_storage_read_api_cc",
10440 srcs: ["libaconfig_storage_read_api_cc.cc"],
10441 }
Yu Liueae7b362023-11-16 17:05:47 -080010442 `)
10443
10444 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10445 s := mod.Rule("apexRule").Args["copy_commands"]
10446 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jooyung Hana3fddf42024-09-03 13:22:21 +090010447 if len(copyCmds) != 16 {
10448 t.Fatalf("Expected 16 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010449 }
10450
Jooyung Hana3fddf42024-09-03 13:22:21 +090010451 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10452 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10453 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10454 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Yu Liueae7b362023-11-16 17:05:47 -080010455
Yu Liubba555e2024-02-17 00:36:42 +000010456 inputs := []string{
10457 "my_aconfig_declarations_foo/intermediate.pb",
10458 "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/myapex/aconfig_merged.pb",
10459 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010460 }
Yu Liubba555e2024-02-17 00:36:42 +000010461 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10462 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10463 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10464 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Yu Liueae7b362023-11-16 17:05:47 -080010465}
10466
Yu Liucec0e412023-11-30 16:45:50 -080010467func TestAconfigFilesRustDeps(t *testing.T) {
10468 ctx := testApex(t, apex_default_bp+`
10469 apex {
10470 name: "myapex",
10471 manifest: ":myapex.manifest",
10472 androidManifest: ":myapex.androidmanifest",
10473 key: "myapex.key",
10474 native_shared_libs: [
10475 "libmy_rust_library",
10476 ],
10477 binaries: [
10478 "my_rust_binary",
10479 ],
10480 rust_dyn_libs: [
10481 "libmy_rust_dylib",
10482 ],
10483 updatable: false,
10484 }
10485
10486 rust_library {
10487 name: "libflags_rust", // test mock
10488 crate_name: "flags_rust",
10489 srcs: ["lib.rs"],
10490 apex_available: [
10491 "myapex",
10492 ],
10493 }
10494
10495 rust_library {
10496 name: "liblazy_static", // test mock
10497 crate_name: "lazy_static",
10498 srcs: ["src/lib.rs"],
10499 apex_available: [
10500 "myapex",
10501 ],
10502 }
10503
Ted Bauer02d475c2024-03-27 20:56:26 +000010504 rust_library {
10505 name: "libaconfig_storage_read_api", // test mock
10506 crate_name: "aconfig_storage_read_api",
10507 srcs: ["src/lib.rs"],
10508 apex_available: [
10509 "myapex",
10510 ],
10511 }
10512
Ted Bauer6ef40db2024-03-29 14:04:10 +000010513 rust_library {
10514 name: "liblogger", // test mock
10515 crate_name: "logger",
10516 srcs: ["src/lib.rs"],
10517 apex_available: [
10518 "myapex",
10519 ],
10520 }
10521
10522 rust_library {
10523 name: "liblog_rust", // test mock
10524 crate_name: "log_rust",
10525 srcs: ["src/lib.rs"],
10526 apex_available: [
10527 "myapex",
10528 ],
10529 }
10530
Yu Liucec0e412023-11-30 16:45:50 -080010531 rust_ffi_shared {
10532 name: "libmy_rust_library",
10533 srcs: ["src/lib.rs"],
10534 rustlibs: ["libmy_rust_aconfig_library_foo"],
10535 crate_name: "my_rust_library",
10536 apex_available: [
10537 "myapex",
10538 ],
10539 }
10540
10541 rust_library_dylib {
10542 name: "libmy_rust_dylib",
10543 srcs: ["foo/bar/MyClass.rs"],
10544 rustlibs: ["libmy_rust_aconfig_library_bar"],
10545 crate_name: "my_rust_dylib",
10546 apex_available: [
10547 "myapex",
10548 ],
10549 }
10550
10551 rust_binary {
10552 name: "my_rust_binary",
10553 srcs: ["foo/bar/MyClass.rs"],
10554 rustlibs: [
10555 "libmy_rust_aconfig_library_baz",
10556 "libmy_rust_dylib",
10557 ],
10558 apex_available: [
10559 "myapex",
10560 ],
10561 }
10562
10563 aconfig_declarations {
10564 name: "my_aconfig_declarations_foo",
10565 package: "com.example.package",
10566 container: "myapex",
10567 srcs: ["foo.aconfig"],
10568 }
10569
10570 aconfig_declarations {
10571 name: "my_aconfig_declarations_bar",
10572 package: "com.example.package",
10573 container: "myapex",
10574 srcs: ["bar.aconfig"],
10575 }
10576
10577 aconfig_declarations {
10578 name: "my_aconfig_declarations_baz",
10579 package: "com.example.package",
10580 container: "myapex",
10581 srcs: ["baz.aconfig"],
10582 }
10583
10584 rust_aconfig_library {
10585 name: "libmy_rust_aconfig_library_foo",
10586 aconfig_declarations: "my_aconfig_declarations_foo",
10587 crate_name: "my_rust_aconfig_library_foo",
10588 apex_available: [
10589 "myapex",
10590 ],
10591 }
10592
10593 rust_aconfig_library {
10594 name: "libmy_rust_aconfig_library_bar",
10595 aconfig_declarations: "my_aconfig_declarations_bar",
10596 crate_name: "my_rust_aconfig_library_bar",
10597 apex_available: [
10598 "myapex",
10599 ],
10600 }
10601
10602 rust_aconfig_library {
10603 name: "libmy_rust_aconfig_library_baz",
10604 aconfig_declarations: "my_aconfig_declarations_baz",
10605 crate_name: "my_rust_aconfig_library_baz",
10606 apex_available: [
10607 "myapex",
10608 ],
10609 }
10610 `)
10611
10612 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10613 s := mod.Rule("apexRule").Args["copy_commands"]
10614 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jooyung Hana3fddf42024-09-03 13:22:21 +090010615 if len(copyCmds) != 36 {
10616 t.Fatalf("Expected 36 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liucec0e412023-11-30 16:45:50 -080010617 }
10618
Jooyung Hana3fddf42024-09-03 13:22:21 +090010619 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10620 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10621 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10622 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Yu Liucec0e412023-11-30 16:45:50 -080010623
Yu Liubba555e2024-02-17 00:36:42 +000010624 inputs := []string{
10625 "my_aconfig_declarations_foo/intermediate.pb",
Yu Liuab31c822024-02-28 22:21:31 +000010626 "my_aconfig_declarations_bar/intermediate.pb",
10627 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liubba555e2024-02-17 00:36:42 +000010628 "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb",
10629 }
10630 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10631 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10632 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10633 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
10634}
10635
10636func VerifyAconfigRule(t *testing.T, mod *android.TestingModule, desc string, inputs []string, output string, container string, file_type string) {
10637 aconfigRule := mod.Description(desc)
10638 s := " " + aconfigRule.Args["cache_files"]
Yu Liucec0e412023-11-30 16:45:50 -080010639 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
Yu Liubba555e2024-02-17 00:36:42 +000010640 if len(aconfigArgs) != len(inputs) {
10641 t.Fatalf("Expected %d commands, got %d in:\n%s", len(inputs), len(aconfigArgs), s)
Yu Liucec0e412023-11-30 16:45:50 -080010642 }
Yu Liucec0e412023-11-30 16:45:50 -080010643
Yu Liubba555e2024-02-17 00:36:42 +000010644 ensureEquals(t, container, aconfigRule.Args["container"])
10645 ensureEquals(t, file_type, aconfigRule.Args["file_type"])
10646
10647 buildParams := aconfigRule.BuildParams
10648 for _, input := range inputs {
10649 android.EnsureListContainsSuffix(t, aconfigArgs, input)
10650 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), input)
Yu Liucec0e412023-11-30 16:45:50 -080010651 }
Yu Liubba555e2024-02-17 00:36:42 +000010652
10653 ensureContains(t, buildParams.Output.String(), output)
Yu Liucec0e412023-11-30 16:45:50 -080010654}
10655
Yu Liueae7b362023-11-16 17:05:47 -080010656func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
10657 ctx := testApex(t, apex_default_bp+`
10658 apex {
10659 name: "myapex",
10660 manifest: ":myapex.manifest",
10661 androidManifest: ":myapex.androidmanifest",
10662 key: "myapex.key",
10663 java_libs: [
10664 "my_java_library_foo",
10665 "other_java_library_bar",
10666 ],
10667 updatable: false,
10668 }
10669
10670 java_library {
10671 name: "my_java_library_foo",
10672 srcs: ["foo/bar/MyClass.java"],
10673 sdk_version: "none",
10674 system_modules: "none",
10675 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010676 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010677 "myapex",
10678 ],
10679 }
10680
10681 java_library {
10682 name: "other_java_library_bar",
10683 srcs: ["foo/bar/MyClass.java"],
10684 sdk_version: "none",
10685 system_modules: "none",
10686 static_libs: ["other_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010687 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010688 "myapex",
10689 ],
10690 }
10691
10692 aconfig_declarations {
10693 name: "my_aconfig_declarations_foo",
10694 package: "com.example.package",
10695 container: "myapex",
10696 srcs: ["foo.aconfig"],
10697 }
10698
10699 java_aconfig_library {
10700 name: "my_java_aconfig_library_foo",
10701 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010702 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010703 "myapex",
10704 ],
10705 }
10706
10707 aconfig_declarations {
10708 name: "other_aconfig_declarations_bar",
10709 package: "com.example.package",
10710 container: "otherapex",
10711 srcs: ["bar.aconfig"],
10712 }
10713
10714 java_aconfig_library {
10715 name: "other_java_aconfig_library_bar",
10716 aconfig_declarations: "other_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010717 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010718 "myapex",
10719 ],
10720 }
10721 `)
10722
10723 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10724 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10725 s := " " + combineAconfigRule.Args["cache_files"]
10726 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10727 if len(aconfigArgs) != 1 {
10728 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
10729 }
10730 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10731
10732 buildParams := combineAconfigRule.BuildParams
10733 if len(buildParams.Inputs) != 1 {
10734 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
10735 }
10736 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10737 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10738}
10739
10740func TestAconfigFilesRemoveDuplicates(t *testing.T) {
10741 ctx := testApex(t, apex_default_bp+`
10742 apex {
10743 name: "myapex",
10744 manifest: ":myapex.manifest",
10745 androidManifest: ":myapex.androidmanifest",
10746 key: "myapex.key",
10747 java_libs: [
10748 "my_java_library_foo",
10749 "my_java_library_bar",
10750 ],
10751 updatable: false,
10752 }
10753
10754 java_library {
10755 name: "my_java_library_foo",
10756 srcs: ["foo/bar/MyClass.java"],
10757 sdk_version: "none",
10758 system_modules: "none",
10759 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010760 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010761 "myapex",
10762 ],
10763 }
10764
10765 java_library {
10766 name: "my_java_library_bar",
10767 srcs: ["foo/bar/MyClass.java"],
10768 sdk_version: "none",
10769 system_modules: "none",
10770 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010771 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010772 "myapex",
10773 ],
10774 }
10775
10776 aconfig_declarations {
10777 name: "my_aconfig_declarations_foo",
10778 package: "com.example.package",
10779 container: "myapex",
10780 srcs: ["foo.aconfig"],
10781 }
10782
10783 java_aconfig_library {
10784 name: "my_java_aconfig_library_foo",
10785 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010786 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010787 "myapex",
10788 ],
10789 }
10790
10791 java_aconfig_library {
10792 name: "my_java_aconfig_library_bar",
10793 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010794 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010795 "myapex",
10796 ],
10797 }
10798 `)
10799
10800 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10801 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10802 s := " " + combineAconfigRule.Args["cache_files"]
10803 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10804 if len(aconfigArgs) != 1 {
10805 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
10806 }
10807 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10808
10809 buildParams := combineAconfigRule.BuildParams
10810 if len(buildParams.Inputs) != 1 {
10811 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
10812 }
10813 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10814 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10815}
Spandan Das5be63332023-12-13 00:06:32 +000010816
10817// Test that the boot jars come from the _selected_ apex prebuilt
10818// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
10819func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
10820 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
10821 t.Helper()
10822 s := ctx.ModuleForTests("dex_bootjars", "android_common")
10823 foundLibfooJar := false
10824 base := stem + ".jar"
10825 for _, output := range s.AllOutputs() {
10826 if filepath.Base(output) == base {
10827 foundLibfooJar = true
10828 buildRule := s.Output(output)
10829 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
10830 }
10831 }
10832 if !foundLibfooJar {
10833 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
10834 }
10835 }
10836
Spandan Das64c9e0c2023-12-20 20:13:34 +000010837 // Check that the boot jars of the selected apex are run through boot_jars_package_check
10838 // This validates that the jars on the bootclasspath do not contain packages outside an allowlist
10839 checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
10840 platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common")
10841 bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
10842 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)
10843 }
10844
10845 // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex
10846 checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
10847 monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command
10848 android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar)
10849 }
10850
Spandan Das5be63332023-12-13 00:06:32 +000010851 bp := `
10852 // Source APEX.
10853
10854 java_library {
10855 name: "framework-foo",
10856 srcs: ["foo.java"],
10857 installable: true,
10858 apex_available: [
10859 "com.android.foo",
10860 ],
10861 }
10862
10863 bootclasspath_fragment {
10864 name: "foo-bootclasspath-fragment",
10865 contents: ["framework-foo"],
10866 apex_available: [
10867 "com.android.foo",
10868 ],
10869 hidden_api: {
10870 split_packages: ["*"],
10871 },
10872 }
10873
10874 apex_key {
10875 name: "com.android.foo.key",
10876 public_key: "com.android.foo.avbpubkey",
10877 private_key: "com.android.foo.pem",
10878 }
10879
10880 apex {
10881 name: "com.android.foo",
10882 key: "com.android.foo.key",
10883 bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10884 updatable: false,
10885 }
10886
10887 // Prebuilt APEX.
10888
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010889 java_sdk_library_import {
Spandan Das5be63332023-12-13 00:06:32 +000010890 name: "framework-foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010891 public: {
10892 jars: ["foo.jar"],
10893 },
Spandan Das5be63332023-12-13 00:06:32 +000010894 apex_available: ["com.android.foo"],
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010895 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +000010896 }
10897
10898 prebuilt_bootclasspath_fragment {
10899 name: "foo-bootclasspath-fragment",
10900 contents: ["framework-foo"],
10901 hidden_api: {
10902 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
10903 metadata: "my-bootclasspath-fragment/metadata.csv",
10904 index: "my-bootclasspath-fragment/index.csv",
10905 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
10906 all_flags: "my-bootclasspath-fragment/all-flags.csv",
10907 },
10908 apex_available: [
10909 "com.android.foo",
10910 ],
10911 }
10912
10913 prebuilt_apex {
10914 name: "com.android.foo",
10915 apex_name: "com.android.foo",
10916 src: "com.android.foo-arm.apex",
10917 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10918 }
10919
10920 // Another Prebuilt ART APEX
10921 prebuilt_apex {
10922 name: "com.android.foo.v2",
10923 apex_name: "com.android.foo", // Used to determine the API domain
10924 src: "com.android.foo-arm.apex",
10925 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10926 }
10927
10928 // APEX contribution modules
10929
10930 apex_contributions {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010931 name: "foo.source.contributions",
Spandan Das5be63332023-12-13 00:06:32 +000010932 api_domain: "com.android.foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010933 contents: ["com.android.foo"],
10934 }
10935
10936 apex_contributions {
10937 name: "foo.prebuilt.contributions",
10938 api_domain: "com.android.foo",
10939 contents: ["prebuilt_com.android.foo"],
10940 }
10941
10942 apex_contributions {
10943 name: "foo.prebuilt.v2.contributions",
10944 api_domain: "com.android.foo",
10945 contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
Spandan Das5be63332023-12-13 00:06:32 +000010946 }
10947 `
10948
10949 testCases := []struct {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010950 desc string
10951 selectedApexContributions string
10952 expectedBootJar string
Spandan Das5be63332023-12-13 00:06:32 +000010953 }{
10954 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010955 desc: "Source apex com.android.foo is selected, bootjar should come from source java library",
10956 selectedApexContributions: "foo.source.contributions",
10957 expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_apex10000/hiddenapi-modular/encoded/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000010958 },
10959 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010960 desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
10961 selectedApexContributions: "foo.prebuilt.contributions",
10962 expectedBootJar: "out/soong/.intermediates/prebuilt_com.android.foo.deapexer/android_common/deapexer/javalib/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000010963 },
10964 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010965 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt",
10966 selectedApexContributions: "foo.prebuilt.v2.contributions",
10967 expectedBootJar: "out/soong/.intermediates/prebuilt_com.android.foo.v2.deapexer/android_common/deapexer/javalib/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000010968 },
10969 }
10970
10971 fragment := java.ApexVariantReference{
10972 Apex: proptools.StringPtr("com.android.foo"),
10973 Module: proptools.StringPtr("foo-bootclasspath-fragment"),
10974 }
10975
10976 for _, tc := range testCases {
10977 preparer := android.GroupFixturePreparers(
10978 java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"),
10979 android.FixtureMergeMockFs(map[string][]byte{
10980 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
10981 }),
Spandan Das81fe4d12024-05-15 18:43:47 +000010982 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
10983 // file creation.
10984 java.FixtureConfigureBootJars("platform:foo"),
10985 android.FixtureModifyMockFS(func(fs android.MockFS) {
10986 fs["platform/Android.bp"] = []byte(`
10987 java_library {
10988 name: "foo",
10989 srcs: ["Test.java"],
10990 compile_dex: true,
10991 }
10992 `)
10993 fs["platform/Test.java"] = nil
10994 }),
10995
Colin Crossa66b4632024-08-08 15:50:47 -070010996 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das5be63332023-12-13 00:06:32 +000010997 )
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010998 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das5be63332023-12-13 00:06:32 +000010999 checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar)
Spandan Das64c9e0c2023-12-20 20:13:34 +000011000 checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar)
11001 checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar)
Spandan Das5be63332023-12-13 00:06:32 +000011002 }
11003}
Spandan Das3576e762024-01-03 18:57:03 +000011004
11005// Test that product packaging installs the selected mainline module (either source or a specific prebuilt)
11006// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11007func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
Spandan Das3576e762024-01-03 18:57:03 +000011008 // for a mainline module family, check that only the flagged soong module is visible to make
11009 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) {
11010 variation := func(moduleName string) string {
11011 ret := "android_common_com.android.foo"
11012 if moduleName == "com.google.android.foo" {
Spandan Das50801e22024-05-13 18:29:45 +000011013 ret = "android_common_com.google.android.foo_com.google.android.foo"
Spandan Das3576e762024-01-03 18:57:03 +000011014 }
11015 return ret
11016 }
11017
11018 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11019 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11020
11021 for _, hiddenModuleName := range hiddenModuleNames {
11022 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11023 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11024
11025 }
11026 }
11027
11028 bp := `
11029 apex_key {
11030 name: "com.android.foo.key",
11031 public_key: "com.android.foo.avbpubkey",
11032 private_key: "com.android.foo.pem",
11033 }
11034
11035 // AOSP source apex
11036 apex {
11037 name: "com.android.foo",
11038 key: "com.android.foo.key",
11039 updatable: false,
11040 }
11041
11042 // Google source apex
11043 override_apex {
11044 name: "com.google.android.foo",
11045 base: "com.android.foo",
11046 key: "com.android.foo.key",
11047 }
11048
11049 // Prebuilt Google APEX.
11050
11051 prebuilt_apex {
11052 name: "com.google.android.foo",
11053 apex_name: "com.android.foo",
11054 src: "com.android.foo-arm.apex",
11055 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11056 }
11057
11058 // Another Prebuilt Google APEX
11059 prebuilt_apex {
11060 name: "com.google.android.foo.v2",
11061 apex_name: "com.android.foo",
Spandan Dasa8e2d612024-07-26 19:24:27 +000011062 source_apex_name: "com.google.android.foo",
Spandan Das3576e762024-01-03 18:57:03 +000011063 src: "com.android.foo-arm.apex",
11064 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11065 }
11066
11067 // APEX contribution modules
11068
11069 apex_contributions {
11070 name: "foo.source.contributions",
11071 api_domain: "com.android.foo",
11072 contents: ["com.google.android.foo"],
11073 }
11074
11075 apex_contributions {
11076 name: "foo.prebuilt.contributions",
11077 api_domain: "com.android.foo",
11078 contents: ["prebuilt_com.google.android.foo"],
11079 }
11080
11081 apex_contributions {
11082 name: "foo.prebuilt.v2.contributions",
11083 api_domain: "com.android.foo",
11084 contents: ["prebuilt_com.google.android.foo.v2"],
11085 }
11086
11087 // This is an incompatible module because it selects multiple versions of the same mainline module
11088 apex_contributions {
11089 name: "foo.prebuilt.duplicate.contributions",
11090 api_domain: "com.android.foo",
11091 contents: [
11092 "prebuilt_com.google.android.foo",
11093 "prebuilt_com.google.android.foo.v2",
11094 ],
11095 }
11096 `
11097
11098 testCases := []struct {
11099 desc string
11100 selectedApexContributions string
11101 expectedVisibleModuleName string
11102 expectedHiddenModuleNames []string
11103 expectedError string
11104 }{
11105 {
11106 desc: "Source apex is selected, prebuilts should be hidden from make",
11107 selectedApexContributions: "foo.source.contributions",
11108 expectedVisibleModuleName: "com.google.android.foo",
11109 expectedHiddenModuleNames: []string{"prebuilt_com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11110 },
11111 {
11112 desc: "Prebuilt apex prebuilt_com.android.foo is selected, source and the other prebuilt should be hidden from make",
11113 selectedApexContributions: "foo.prebuilt.contributions",
11114 expectedVisibleModuleName: "prebuilt_com.google.android.foo",
11115 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11116 },
11117 {
11118 desc: "Prebuilt apex prebuilt_com.android.fooi.v2 is selected, source and the other prebuilt should be hidden from make",
11119 selectedApexContributions: "foo.prebuilt.v2.contributions",
11120 expectedVisibleModuleName: "prebuilt_com.google.android.foo.v2",
11121 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo"},
11122 },
11123 {
11124 desc: "Multiple versions of a prebuilt apex is selected in the same release config",
11125 selectedApexContributions: "foo.prebuilt.duplicate.contributions",
11126 expectedError: "Found duplicate variations of the same module in apex_contributions: prebuilt_com.google.android.foo and prebuilt_com.google.android.foo.v2",
11127 },
11128 }
11129
11130 for _, tc := range testCases {
11131 preparer := android.GroupFixturePreparers(
11132 android.FixtureMergeMockFs(map[string][]byte{
11133 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11134 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011135 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das3576e762024-01-03 18:57:03 +000011136 )
11137 if tc.expectedError != "" {
11138 preparer = preparer.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(tc.expectedError))
11139 testApex(t, bp, preparer)
11140 return
11141 }
11142 ctx := testApex(t, bp, preparer)
11143
Spandan Das3576e762024-01-03 18:57:03 +000011144 // Check that
11145 // 1. The contents of the selected apex_contributions are visible to make
11146 // 2. The rest of the apexes in the mainline module family (source or other prebuilt) is hidden from make
11147 checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
11148 }
11149}
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011150
Spandan Das85bd4622024-08-01 00:51:20 +000011151// Test that product packaging installs the selected mainline module in workspaces withtout source mainline module
11152func TestInstallationRulesForMultipleApexPrebuiltsWithoutSource(t *testing.T) {
11153 // for a mainline module family, check that only the flagged soong module is visible to make
11154 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleNames []string, hiddenModuleNames []string) {
11155 variation := func(moduleName string) string {
11156 ret := "android_common_com.android.adservices"
11157 if moduleName == "com.google.android.foo" {
11158 ret = "android_common_com.google.android.foo_com.google.android.foo"
11159 }
11160 return ret
11161 }
11162
11163 for _, visibleModuleName := range visibleModuleNames {
11164 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11165 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11166 }
11167
11168 for _, hiddenModuleName := range hiddenModuleNames {
11169 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11170 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11171
11172 }
11173 }
11174
11175 bp := `
11176 apex_key {
11177 name: "com.android.adservices.key",
11178 public_key: "com.android.adservices.avbpubkey",
11179 private_key: "com.android.adservices.pem",
11180 }
11181
11182 // AOSP source apex
11183 apex {
11184 name: "com.android.adservices",
11185 key: "com.android.adservices.key",
11186 updatable: false,
11187 }
11188
11189 // Prebuilt Google APEX.
11190
11191 prebuilt_apex {
11192 name: "com.google.android.adservices",
11193 apex_name: "com.android.adservices",
11194 src: "com.android.foo-arm.apex",
11195 }
11196
11197 // Another Prebuilt Google APEX
11198 prebuilt_apex {
11199 name: "com.google.android.adservices.v2",
11200 apex_name: "com.android.adservices",
11201 src: "com.android.foo-arm.apex",
11202 }
11203
11204 // APEX contribution modules
11205
11206
11207 apex_contributions {
11208 name: "adservices.prebuilt.contributions",
11209 api_domain: "com.android.adservices",
11210 contents: ["prebuilt_com.google.android.adservices"],
11211 }
11212
11213 apex_contributions {
11214 name: "adservices.prebuilt.v2.contributions",
11215 api_domain: "com.android.adservices",
11216 contents: ["prebuilt_com.google.android.adservices.v2"],
11217 }
11218 `
11219
11220 testCases := []struct {
11221 desc string
11222 selectedApexContributions string
11223 expectedVisibleModuleNames []string
11224 expectedHiddenModuleNames []string
11225 }{
11226 {
11227 desc: "No apex contributions selected, source aosp apex should be visible, and mainline prebuilts should be hidden",
11228 selectedApexContributions: "",
11229 expectedVisibleModuleNames: []string{"com.android.adservices"},
11230 expectedHiddenModuleNames: []string{"com.google.android.adservices", "com.google.android.adservices.v2"},
11231 },
11232 {
11233 desc: "Prebuilt apex prebuilt_com.android.foo is selected",
11234 selectedApexContributions: "adservices.prebuilt.contributions",
11235 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices"},
11236 expectedHiddenModuleNames: []string{"com.google.android.adservices.v2"},
11237 },
11238 {
11239 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected",
11240 selectedApexContributions: "adservices.prebuilt.v2.contributions",
11241 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices.v2"},
11242 expectedHiddenModuleNames: []string{"com.google.android.adservices"},
11243 },
11244 }
11245
11246 for _, tc := range testCases {
11247 preparer := android.GroupFixturePreparers(
11248 android.FixtureMergeMockFs(map[string][]byte{
11249 "system/sepolicy/apex/com.android.adservices-file_contexts": nil,
11250 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011251 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das85bd4622024-08-01 00:51:20 +000011252 )
11253 ctx := testApex(t, bp, preparer)
11254
11255 checkHideFromMake(t, ctx, tc.expectedVisibleModuleNames, tc.expectedHiddenModuleNames)
11256 }
11257}
11258
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011259func TestAconfifDeclarationsValidation(t *testing.T) {
11260 aconfigDeclarationLibraryString := func(moduleNames []string) (ret string) {
11261 for _, moduleName := range moduleNames {
11262 ret += fmt.Sprintf(`
11263 aconfig_declarations {
11264 name: "%[1]s",
11265 package: "com.example.package",
Yu Liu315a53c2024-04-24 16:41:57 +000011266 container: "system",
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011267 srcs: [
11268 "%[1]s.aconfig",
11269 ],
11270 }
11271 java_aconfig_library {
11272 name: "%[1]s-lib",
11273 aconfig_declarations: "%[1]s",
11274 }
11275 `, moduleName)
11276 }
11277 return ret
11278 }
11279
11280 result := android.GroupFixturePreparers(
11281 prepareForApexTest,
11282 java.PrepareForTestWithJavaSdkLibraryFiles,
11283 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011284 ).RunTestWithBp(t, `
11285 java_library {
11286 name: "baz-java-lib",
11287 static_libs: [
11288 "baz-lib",
11289 ],
11290 }
11291 filegroup {
11292 name: "qux-filegroup",
11293 srcs: [
11294 ":qux-lib{.generated_srcjars}",
11295 ],
11296 }
11297 filegroup {
11298 name: "qux-another-filegroup",
11299 srcs: [
11300 ":qux-filegroup",
11301 ],
11302 }
11303 java_library {
11304 name: "quux-java-lib",
11305 srcs: [
11306 "a.java",
11307 ],
11308 libs: [
11309 "quux-lib",
11310 ],
11311 }
11312 java_sdk_library {
11313 name: "foo",
11314 srcs: [
11315 ":qux-another-filegroup",
11316 ],
11317 api_packages: ["foo"],
11318 system: {
11319 enabled: true,
11320 },
11321 module_lib: {
11322 enabled: true,
11323 },
11324 test: {
11325 enabled: true,
11326 },
11327 static_libs: [
11328 "bar-lib",
11329 ],
11330 libs: [
11331 "baz-java-lib",
11332 "quux-java-lib",
11333 ],
11334 aconfig_declarations: [
11335 "bar",
11336 ],
11337 }
11338 `+aconfigDeclarationLibraryString([]string{"bar", "baz", "qux", "quux"}))
11339
11340 m := result.ModuleForTests("foo.stubs.source", "android_common")
11341 outDir := "out/soong/.intermediates"
11342
11343 // Arguments passed to aconfig to retrieve the state of the flags defined in the
11344 // textproto files
11345 aconfigFlagArgs := m.Output("released-flagged-apis-exportable.txt").Args["flags_path"]
11346
11347 // "bar-lib" is a static_lib of "foo" and is passed to metalava as classpath. Thus the
11348 // cache file provided by the associated aconfig_declarations module "bar" should be passed
11349 // to aconfig.
11350 android.AssertStringDoesContain(t, "cache file of a java_aconfig_library static_lib "+
11351 "passed as an input",
11352 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "bar"))
11353
11354 // "baz-java-lib", which statically depends on "baz-lib", is a lib of "foo" and is passed
11355 // to metalava as classpath. Thus the cache file provided by the associated
11356 // aconfig_declarations module "baz" should be passed to aconfig.
11357 android.AssertStringDoesContain(t, "cache file of a lib that statically depends on "+
11358 "java_aconfig_library passed as an input",
11359 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "baz"))
11360
11361 // "qux-lib" is passed to metalava as src via the filegroup, thus the cache file provided by
11362 // the associated aconfig_declarations module "qux" should be passed to aconfig.
11363 android.AssertStringDoesContain(t, "cache file of srcs java_aconfig_library passed as an "+
11364 "input",
11365 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "qux"))
11366
11367 // "quux-java-lib" is a lib of "foo" and is passed to metalava as classpath, but does not
11368 // statically depend on "quux-lib". Therefore, the cache file provided by the associated
11369 // aconfig_declarations module "quux" should not be passed to aconfig.
11370 android.AssertStringDoesNotContain(t, "cache file of a lib that does not statically "+
11371 "depend on java_aconfig_library not passed as an input",
11372 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "quux"))
11373}
Cole Faust7c991b42024-05-15 11:17:55 -070011374
11375func TestMultiplePrebuiltsWithSameBase(t *testing.T) {
11376 ctx := testApex(t, `
11377 apex {
11378 name: "myapex",
11379 key: "myapex.key",
11380 prebuilts: ["myetc", "myetc2"],
11381 min_sdk_version: "29",
11382 }
11383 apex_key {
11384 name: "myapex.key",
11385 public_key: "testkey.avbpubkey",
11386 private_key: "testkey.pem",
11387 }
11388
11389 prebuilt_etc {
11390 name: "myetc",
11391 src: "myprebuilt",
11392 filename: "myfilename",
11393 }
11394 prebuilt_etc {
11395 name: "myetc2",
11396 sub_dir: "mysubdir",
11397 src: "myprebuilt",
11398 filename: "myfilename",
11399 }
11400 `, withFiles(android.MockFS{
11401 "packages/modules/common/build/allowed_deps.txt": nil,
11402 }))
11403
11404 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
11405 data := android.AndroidMkDataForTest(t, ctx, ab)
11406 var builder strings.Builder
11407 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
11408 androidMk := builder.String()
11409
11410 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_myfilename.myapex")
11411 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_mysubdir_myfilename.myapex")
11412}
Spandan Das50801e22024-05-13 18:29:45 +000011413
11414func TestApexMinSdkVersionOverride(t *testing.T) {
11415 checkMinSdkVersion := func(t *testing.T, module android.TestingModule, expectedMinSdkVersion string) {
11416 args := module.Rule("apexRule").Args
11417 optFlags := args["opt_flags"]
11418 if !strings.Contains(optFlags, "--min_sdk_version "+expectedMinSdkVersion) {
11419 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", module.Module(), expectedMinSdkVersion, optFlags)
11420 }
11421 }
11422
11423 checkHasDep := func(t *testing.T, ctx *android.TestContext, m android.Module, wantDep android.Module) {
11424 t.Helper()
11425 found := false
11426 ctx.VisitDirectDeps(m, func(dep blueprint.Module) {
11427 if dep == wantDep {
11428 found = true
11429 }
11430 })
11431 if !found {
11432 t.Errorf("Could not find a dependency from %v to %v\n", m, wantDep)
11433 }
11434 }
11435
11436 ctx := testApex(t, `
11437 apex {
11438 name: "com.android.apex30",
11439 min_sdk_version: "30",
11440 key: "apex30.key",
11441 java_libs: ["javalib"],
11442 }
11443
11444 java_library {
11445 name: "javalib",
11446 srcs: ["A.java"],
11447 apex_available: ["com.android.apex30"],
11448 min_sdk_version: "30",
11449 sdk_version: "current",
11450 }
11451
11452 override_apex {
11453 name: "com.mycompany.android.apex30",
11454 base: "com.android.apex30",
11455 }
11456
11457 override_apex {
11458 name: "com.mycompany.android.apex31",
11459 base: "com.android.apex30",
11460 min_sdk_version: "31",
11461 }
11462
11463 apex_key {
11464 name: "apex30.key",
11465 public_key: "testkey.avbpubkey",
11466 private_key: "testkey.pem",
11467 }
11468
11469 `, android.FixtureMergeMockFs(android.MockFS{
11470 "system/sepolicy/apex/com.android.apex30-file_contexts": nil,
11471 }),
11472 )
11473
11474 baseModule := ctx.ModuleForTests("com.android.apex30", "android_common_com.android.apex30")
11475 checkMinSdkVersion(t, baseModule, "30")
11476
11477 // Override module, but uses same min_sdk_version
11478 overridingModuleSameMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex30_com.mycompany.android.apex30")
11479 javalibApex30Variant := ctx.ModuleForTests("javalib", "android_common_apex30")
11480 checkMinSdkVersion(t, overridingModuleSameMinSdkVersion, "30")
11481 checkHasDep(t, ctx, overridingModuleSameMinSdkVersion.Module(), javalibApex30Variant.Module())
11482
11483 // Override module, uses different min_sdk_version
11484 overridingModuleDifferentMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex31_com.mycompany.android.apex31")
11485 javalibApex31Variant := ctx.ModuleForTests("javalib", "android_common_apex31")
11486 checkMinSdkVersion(t, overridingModuleDifferentMinSdkVersion, "31")
11487 checkHasDep(t, ctx, overridingModuleDifferentMinSdkVersion.Module(), javalibApex31Variant.Module())
11488}
Spandan Das0b28fa02024-05-28 23:40:17 +000011489
11490func TestOverrideApexWithPrebuiltApexPreferred(t *testing.T) {
11491 context := android.GroupFixturePreparers(
11492 android.PrepareForIntegrationTestWithAndroid,
11493 PrepareForTestWithApexBuildComponents,
11494 android.FixtureMergeMockFs(android.MockFS{
11495 "system/sepolicy/apex/foo-file_contexts": nil,
11496 }),
11497 )
11498 res := context.RunTestWithBp(t, `
11499 apex {
11500 name: "foo",
11501 key: "myapex.key",
11502 apex_available_name: "com.android.foo",
11503 variant_version: "0",
11504 updatable: false,
11505 }
11506 apex_key {
11507 name: "myapex.key",
11508 public_key: "testkey.avbpubkey",
11509 private_key: "testkey.pem",
11510 }
11511 prebuilt_apex {
11512 name: "foo",
11513 src: "foo.apex",
11514 prefer: true,
11515 }
11516 override_apex {
11517 name: "myoverrideapex",
11518 base: "foo",
11519 }
11520 `)
11521
11522 java.CheckModuleHasDependency(t, res.TestContext, "myoverrideapex", "android_common_myoverrideapex_myoverrideapex", "foo")
11523}
Spandan Dasca1d63e2024-07-01 22:53:49 +000011524
11525func TestUpdatableApexMinSdkVersionCurrent(t *testing.T) {
11526 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`, `
11527 apex {
11528 name: "myapex",
11529 key: "myapex.key",
11530 updatable: true,
11531 min_sdk_version: "current",
11532 }
11533
11534 apex_key {
11535 name: "myapex.key",
11536 public_key: "testkey.avbpubkey",
11537 private_key: "testkey.pem",
11538 }
11539 `)
11540}
Spandan Das2f68f192024-07-22 19:25:50 +000011541
11542func TestPrebuiltStubNoinstall(t *testing.T) {
11543 testFunc := func(t *testing.T, expectLibfooOnSystemLib bool, fs android.MockFS) {
11544 result := android.GroupFixturePreparers(
11545 prepareForApexTest,
11546 android.PrepareForTestWithAndroidMk,
11547 android.PrepareForTestWithMakevars,
11548 android.FixtureMergeMockFs(fs),
11549 ).RunTest(t)
11550
11551 ldRule := result.ModuleForTests("installedlib", "android_arm64_armv8-a_shared").Rule("ld")
Spandan Das357ffcc2024-07-24 18:07:48 +000011552 android.AssertStringDoesContain(t, "", ldRule.Args["libFlags"], "android_arm64_armv8-a_shared_current/libfoo.so")
Spandan Das2f68f192024-07-22 19:25:50 +000011553
11554 installRules := result.InstallMakeRulesForTesting(t)
11555
11556 var installedlibRule *android.InstallMakeRule
11557 for i, rule := range installRules {
11558 if rule.Target == "out/target/product/test_device/system/lib/installedlib.so" {
11559 if installedlibRule != nil {
11560 t.Errorf("Duplicate install rules for %s", rule.Target)
11561 }
11562 installedlibRule = &installRules[i]
11563 }
11564 }
11565 if installedlibRule == nil {
11566 t.Errorf("No install rule found for installedlib")
11567 return
11568 }
11569
11570 if expectLibfooOnSystemLib {
11571 android.AssertStringListContains(t,
11572 "installedlib doesn't have install dependency on libfoo impl",
11573 installedlibRule.OrderOnlyDeps,
11574 "out/target/product/test_device/system/lib/libfoo.so")
11575 } else {
11576 android.AssertStringListDoesNotContain(t,
11577 "installedlib has install dependency on libfoo stub",
11578 installedlibRule.Deps,
11579 "out/target/product/test_device/system/lib/libfoo.so")
11580 android.AssertStringListDoesNotContain(t,
11581 "installedlib has order-only install dependency on libfoo stub",
11582 installedlibRule.OrderOnlyDeps,
11583 "out/target/product/test_device/system/lib/libfoo.so")
11584 }
11585 }
11586
11587 prebuiltLibfooBp := []byte(`
11588 cc_prebuilt_library {
11589 name: "libfoo",
11590 prefer: true,
11591 srcs: ["libfoo.so"],
11592 stubs: {
11593 versions: ["1"],
11594 },
11595 apex_available: ["apexfoo"],
11596 }
11597 `)
11598
11599 apexfooBp := []byte(`
11600 apex {
11601 name: "apexfoo",
11602 key: "apexfoo.key",
11603 native_shared_libs: ["libfoo"],
11604 updatable: false,
11605 compile_multilib: "both",
11606 }
11607 apex_key {
11608 name: "apexfoo.key",
11609 public_key: "testkey.avbpubkey",
11610 private_key: "testkey.pem",
11611 }
11612 `)
11613
11614 installedlibBp := []byte(`
11615 cc_library {
11616 name: "installedlib",
11617 shared_libs: ["libfoo"],
11618 }
11619 `)
11620
11621 t.Run("prebuilt stub (without source): no install", func(t *testing.T) {
11622 testFunc(
11623 t,
11624 /*expectLibfooOnSystemLib=*/ false,
11625 android.MockFS{
11626 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11627 "apexfoo/Android.bp": apexfooBp,
11628 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11629 "Android.bp": installedlibBp,
11630 },
11631 )
11632 })
11633
11634 disabledSourceLibfooBp := []byte(`
11635 cc_library {
11636 name: "libfoo",
11637 enabled: false,
11638 stubs: {
11639 versions: ["1"],
11640 },
11641 apex_available: ["apexfoo"],
11642 }
11643 `)
11644
11645 t.Run("prebuilt stub (with disabled source): no install", func(t *testing.T) {
11646 testFunc(
11647 t,
11648 /*expectLibfooOnSystemLib=*/ false,
11649 android.MockFS{
11650 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11651 "impl/Android.bp": disabledSourceLibfooBp,
11652 "apexfoo/Android.bp": apexfooBp,
11653 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11654 "Android.bp": installedlibBp,
11655 },
11656 )
11657 })
11658}
Jihoon Kange246bb72024-09-18 22:26:22 +000011659
11660func TestSdkLibraryTransitiveClassLoaderContext(t *testing.T) {
11661 // This test case tests that listing the impl lib instead of the top level java_sdk_library
11662 // in libs of android_app and java_library does not lead to class loader context device/host
11663 // path mismatch errors.
11664 android.GroupFixturePreparers(
11665 prepareForApexTest,
11666 android.PrepareForIntegrationTestWithAndroid,
11667 PrepareForTestWithApexBuildComponents,
11668 android.FixtureModifyEnv(func(env map[string]string) {
11669 env["DISABLE_CONTAINER_CHECK"] = "true"
11670 }),
11671 withFiles(filesForSdkLibrary),
11672 android.FixtureMergeMockFs(android.MockFS{
11673 "system/sepolicy/apex/com.android.foo30-file_contexts": nil,
11674 }),
11675 ).RunTestWithBp(t, `
11676 apex {
11677 name: "com.android.foo30",
11678 key: "myapex.key",
11679 updatable: true,
11680 bootclasspath_fragments: [
11681 "foo-bootclasspath-fragment",
11682 ],
11683 java_libs: [
11684 "bar",
11685 ],
11686 apps: [
11687 "bar-app",
11688 ],
11689 min_sdk_version: "30",
11690 }
11691 apex_key {
11692 name: "myapex.key",
11693 public_key: "testkey.avbpubkey",
11694 private_key: "testkey.pem",
11695 }
11696 bootclasspath_fragment {
11697 name: "foo-bootclasspath-fragment",
11698 contents: [
11699 "framework-foo",
11700 ],
11701 apex_available: [
11702 "com.android.foo30",
11703 ],
11704 hidden_api: {
11705 split_packages: ["*"]
11706 },
11707 }
11708
11709 java_sdk_library {
11710 name: "framework-foo",
11711 srcs: [
11712 "A.java"
11713 ],
11714 unsafe_ignore_missing_latest_api: true,
11715 apex_available: [
11716 "com.android.foo30",
11717 ],
11718 compile_dex: true,
11719 sdk_version: "core_current",
11720 shared_library: false,
11721 }
11722
11723 java_library {
11724 name: "bar",
11725 srcs: [
11726 "A.java"
11727 ],
11728 libs: [
11729 "framework-foo.impl",
11730 ],
11731 apex_available: [
11732 "com.android.foo30",
11733 ],
11734 sdk_version: "core_current",
11735 }
11736
11737 java_library {
11738 name: "baz",
11739 srcs: [
11740 "A.java"
11741 ],
11742 libs: [
11743 "bar",
11744 ],
11745 sdk_version: "core_current",
11746 }
11747
11748 android_app {
11749 name: "bar-app",
11750 srcs: [
11751 "A.java"
11752 ],
11753 libs: [
11754 "baz",
11755 "framework-foo.impl",
11756 ],
11757 apex_available: [
11758 "com.android.foo30",
11759 ],
11760 sdk_version: "core_current",
11761 min_sdk_version: "30",
11762 manifest: "AndroidManifest.xml",
11763 }
11764 `)
11765}