blob: 6e929591118485c3cd92d5ac56e5dd89b0fb3c36 [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"
Colin Crossb614cd42024-10-11 12:52:21 -070023 "slices"
Jooyung Han31c470b2019-10-18 16:26:59 +090024 "sort"
Jiyong Parkd4a3a132021-03-17 20:21:35 +090025 "strconv"
Jiyong Park25fc6a92018-11-18 18:02:45 +090026 "strings"
27 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090028
Yu Liueae7b362023-11-16 17:05:47 -080029 "android/soong/aconfig/codegen"
Jooyung Han20348752023-12-05 15:23:56 +090030
Kiyoung Kim487689e2022-07-26 09:48:22 +090031 "github.com/google/blueprint"
Colin Crossb614cd42024-10-11 12:52:21 -070032 "github.com/google/blueprint/bpmodify"
Jiyong Parkda6eb592018-12-19 17:12:36 +090033 "github.com/google/blueprint/proptools"
34
35 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080036 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090037 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000038 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070039 prebuilt_etc "android/soong/etc"
Colin Crossbd3a16b2023-04-25 11:30:51 -070040 "android/soong/filesystem"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090041 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090042 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070043 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090044)
45
Jooyung Hand3639552019-08-09 12:57:43 +090046// names returns name list from white space separated string
47func names(s string) (ns []string) {
48 for _, n := range strings.Split(s, " ") {
49 if len(n) > 0 {
50 ns = append(ns, n)
51 }
52 }
53 return
54}
55
Paul Duffin40b62572021-03-20 11:39:01 +000056func testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) {
Jooyung Han344d5432019-08-23 11:17:39 +090057 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010058 android.GroupFixturePreparers(
59 prepareForApexTest,
60 android.GroupFixturePreparers(preparers...),
61 ).
Paul Duffine05480a2021-03-08 15:07:14 +000062 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
Paul Duffin40b62572021-03-20 11:39:01 +000063 RunTestWithBp(t, bp)
Jooyung Han5c998b92019-06-27 11:30:33 +090064}
65
Paul Duffin40b62572021-03-20 11:39:01 +000066func testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090067 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010068
69 optionalBpPreparer := android.NullFixturePreparer
Paul Duffin40b62572021-03-20 11:39:01 +000070 if bp != "" {
Paul Duffin284165a2021-03-29 01:50:31 +010071 optionalBpPreparer = android.FixtureWithRootAndroidBp(bp)
Paul Duffin40b62572021-03-20 11:39:01 +000072 }
Paul Duffin284165a2021-03-29 01:50:31 +010073
74 result := android.GroupFixturePreparers(
75 prepareForApexTest,
76 android.GroupFixturePreparers(preparers...),
77 optionalBpPreparer,
78 ).RunTest(t)
79
Paul Duffine05480a2021-03-08 15:07:14 +000080 return result.TestContext
Jooyung Han5c998b92019-06-27 11:30:33 +090081}
82
Paul Duffin810f33d2021-03-09 14:12:32 +000083func withFiles(files android.MockFS) android.FixturePreparer {
84 return files.AddToFixture()
Jooyung Han344d5432019-08-23 11:17:39 +090085}
86
Jooyung Han35155c42020-02-06 17:33:20 +090087// withNativeBridgeTargets sets configuration with targets including:
88// - X86_64 (primary)
89// - X86 (secondary)
90// - Arm64 on X86_64 (native bridge)
91// - Arm on X86 (native bridge)
Paul Duffin810f33d2021-03-09 14:12:32 +000092var withNativeBridgeEnabled = android.FixtureModifyConfig(
93 func(config android.Config) {
94 config.Targets[android.Android] = []android.Target{
95 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
96 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
97 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
98 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
99 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
100 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
101 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
102 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
103 }
104 },
105)
106
107func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
108 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
109 variables.ManifestPackageNameOverrides = specs
110 })
Jooyung Han35155c42020-02-06 17:33:20 +0900111}
112
Albert Martineefabcf2022-03-21 20:11:16 +0000113func withApexGlobalMinSdkVersionOverride(minSdkOverride *string) android.FixturePreparer {
114 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
115 variables.ApexGlobalMinSdkVersionOverride = minSdkOverride
116 })
117}
118
Paul Duffin810f33d2021-03-09 14:12:32 +0000119var withBinder32bit = android.FixtureModifyProductVariables(
120 func(variables android.FixtureProductVariables) {
121 variables.Binder32bit = proptools.BoolPtr(true)
122 },
123)
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900124
Paul Duffin810f33d2021-03-09 14:12:32 +0000125var withUnbundledBuild = android.FixtureModifyProductVariables(
126 func(variables android.FixtureProductVariables) {
127 variables.Unbundled_build = proptools.BoolPtr(true)
128 },
129)
Jiyong Park7cd10e32020-01-14 09:22:18 +0900130
Paul Duffin284165a2021-03-29 01:50:31 +0100131// Legacy preparer used for running tests within the apex package.
132//
133// This includes everything that was needed to run any test in the apex package prior to the
134// introduction of the test fixtures. Tests that are being converted to use fixtures directly
135// rather than through the testApex...() methods should avoid using this and instead use the
136// various preparers directly, using android.GroupFixturePreparers(...) to group them when
137// necessary.
138//
139// deprecated
140var prepareForApexTest = android.GroupFixturePreparers(
Paul Duffin37aad602021-03-08 09:47:16 +0000141 // General preparers in alphabetical order as test infrastructure will enforce correct
142 // registration order.
143 android.PrepareForTestWithAndroidBuildComponents,
144 bpf.PrepareForTestWithBpf,
145 cc.PrepareForTestWithCcBuildComponents,
Jiakai Zhangb95998b2023-05-11 16:39:27 +0100146 java.PrepareForTestWithDexpreopt,
Paul Duffin37aad602021-03-08 09:47:16 +0000147 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
148 rust.PrepareForTestWithRustDefaultModules,
149 sh.PrepareForTestWithShBuildComponents,
Yu Liueae7b362023-11-16 17:05:47 -0800150 codegen.PrepareForTestWithAconfigBuildComponents,
Paul Duffin37aad602021-03-08 09:47:16 +0000151
152 PrepareForTestWithApexBuildComponents,
153
154 // Additional apex test specific preparers.
155 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
156 filegroup {
157 name: "myapex-file_contexts",
158 srcs: [
159 "apex/myapex-file_contexts",
160 ],
161 }
162 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000163 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000164 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000165 "a.java": nil,
166 "PrebuiltAppFoo.apk": nil,
167 "PrebuiltAppFooPriv.apk": nil,
168 "apex_manifest.json": nil,
169 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000170 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
171 "system/sepolicy/apex/myapex2-file_contexts": nil,
172 "system/sepolicy/apex/otherapex-file_contexts": nil,
173 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
174 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Crossabc0dab2022-04-07 17:39:21 -0700175 "mylib.cpp": nil,
176 "mytest.cpp": nil,
177 "mytest1.cpp": nil,
178 "mytest2.cpp": nil,
179 "mytest3.cpp": nil,
180 "myprebuilt": nil,
181 "my_include": nil,
182 "foo/bar/MyClass.java": nil,
183 "prebuilt.jar": nil,
184 "prebuilt.so": nil,
185 "vendor/foo/devkeys/test.x509.pem": nil,
186 "vendor/foo/devkeys/test.pk8": nil,
187 "testkey.x509.pem": nil,
188 "testkey.pk8": nil,
189 "testkey.override.x509.pem": nil,
190 "testkey.override.pk8": nil,
191 "vendor/foo/devkeys/testkey.avbpubkey": nil,
192 "vendor/foo/devkeys/testkey.pem": nil,
193 "NOTICE": nil,
194 "custom_notice": nil,
195 "custom_notice_for_static_lib": nil,
196 "testkey2.avbpubkey": nil,
197 "testkey2.pem": nil,
198 "myapex-arm64.apex": nil,
199 "myapex-arm.apex": nil,
200 "myapex.apks": nil,
201 "frameworks/base/api/current.txt": nil,
202 "framework/aidl/a.aidl": nil,
203 "dummy.txt": nil,
204 "baz": nil,
205 "bar/baz": nil,
206 "testdata/baz": nil,
207 "AppSet.apks": nil,
208 "foo.rs": nil,
209 "libfoo.jar": nil,
210 "libbar.jar": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000211 },
212 ),
213
214 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
Paul Duffin37aad602021-03-08 09:47:16 +0000215 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
216 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
217 variables.Platform_sdk_codename = proptools.StringPtr("Q")
218 variables.Platform_sdk_final = proptools.BoolPtr(false)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000219 // "Tiramisu" needs to be in the next line for compatibility with soong code,
220 // not because of these tests specifically (it's not used by the tests)
221 variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000222 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
Paul Duffin37aad602021-03-08 09:47:16 +0000223 }),
224)
225
Paul Duffin52bfaa42021-03-23 23:40:12 +0000226var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
227 "system/sepolicy/apex/myapex-file_contexts": nil,
228})
229
Colin Crossb614cd42024-10-11 12:52:21 -0700230var prepareForTestWithOtherapex = android.FixtureMergeMockFs(android.MockFS{
231 "system/sepolicy/apex/otherapex-file_contexts": nil,
232})
233
Jooyung Han643adc42020-02-27 13:50:06 +0900234// ensure that 'result' equals 'expected'
235func ensureEquals(t *testing.T, result string, expected string) {
236 t.Helper()
237 if result != expected {
238 t.Errorf("%q != %q", expected, result)
239 }
240}
241
Jiyong Park25fc6a92018-11-18 18:02:45 +0900242// ensure that 'result' contains 'expected'
243func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900244 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900245 if !strings.Contains(result, expected) {
246 t.Errorf("%q is not found in %q", expected, result)
247 }
248}
249
Liz Kammer5bd365f2020-05-27 15:15:11 -0700250// ensure that 'result' contains 'expected' exactly one time
251func ensureContainsOnce(t *testing.T, result string, expected string) {
252 t.Helper()
253 count := strings.Count(result, expected)
254 if count != 1 {
255 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
256 }
257}
258
Jiyong Park25fc6a92018-11-18 18:02:45 +0900259// ensures that 'result' does not contain 'notExpected'
260func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900261 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900262 if strings.Contains(result, notExpected) {
263 t.Errorf("%q is found in %q", notExpected, result)
264 }
265}
266
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700267func ensureMatches(t *testing.T, result string, expectedRex string) {
Jooyung Hana3fddf42024-09-03 13:22:21 +0900268 t.Helper()
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700269 ok, err := regexp.MatchString(expectedRex, result)
270 if err != nil {
271 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
272 return
273 }
274 if !ok {
275 t.Errorf("%s does not match regular expession %s", result, expectedRex)
276 }
277}
278
Jooyung Hana3fddf42024-09-03 13:22:21 +0900279func ensureListContainsMatch(t *testing.T, result []string, expectedRex string) {
280 t.Helper()
281 p := regexp.MustCompile(expectedRex)
282 if android.IndexListPred(func(s string) bool { return p.MatchString(s) }, result) == -1 {
283 t.Errorf("%q is not found in %v", expectedRex, result)
284 }
285}
286
Jiyong Park25fc6a92018-11-18 18:02:45 +0900287func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900288 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900289 if !android.InList(expected, result) {
290 t.Errorf("%q is not found in %v", expected, result)
291 }
292}
293
294func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900295 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900296 if android.InList(notExpected, result) {
297 t.Errorf("%q is found in %v", notExpected, result)
298 }
299}
300
Jooyung Hane1633032019-08-01 17:41:43 +0900301func ensureListEmpty(t *testing.T, result []string) {
302 t.Helper()
303 if len(result) > 0 {
304 t.Errorf("%q is expected to be empty", result)
305 }
306}
307
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000308func ensureListNotEmpty(t *testing.T, result []string) {
309 t.Helper()
310 if len(result) == 0 {
311 t.Errorf("%q is expected to be not empty", result)
312 }
313}
314
Jiyong Park25fc6a92018-11-18 18:02:45 +0900315// Minimal test
316func TestBasicApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700317 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800318 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900319 apex_defaults {
320 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900321 manifest: ":myapex.manifest",
322 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900323 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900324 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900325 native_shared_libs: [
326 "mylib",
327 "libfoo.ffi",
328 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900329 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800330 multilib: {
331 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900332 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800333 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900334 },
Jiyong Park77acec62020-06-01 21:39:15 +0900335 java_libs: [
336 "myjar",
337 "myjar_dex",
338 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000339 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900340 }
341
Jiyong Park30ca9372019-02-07 16:27:23 +0900342 apex {
343 name: "myapex",
344 defaults: ["myapex-defaults"],
345 }
346
Jiyong Park25fc6a92018-11-18 18:02:45 +0900347 apex_key {
348 name: "myapex.key",
349 public_key: "testkey.avbpubkey",
350 private_key: "testkey.pem",
351 }
352
Jiyong Park809bb722019-02-13 21:33:49 +0900353 filegroup {
354 name: "myapex.manifest",
355 srcs: ["apex_manifest.json"],
356 }
357
358 filegroup {
359 name: "myapex.androidmanifest",
360 srcs: ["AndroidManifest.xml"],
361 }
362
Jiyong Park25fc6a92018-11-18 18:02:45 +0900363 cc_library {
364 name: "mylib",
365 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900366 shared_libs: [
367 "mylib2",
368 "libbar.ffi",
369 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900370 system_shared_libs: [],
371 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000372 // TODO: remove //apex_available:platform
373 apex_available: [
374 "//apex_available:platform",
375 "myapex",
376 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900377 }
378
Alex Light3d673592019-01-18 14:37:31 -0800379 cc_binary {
380 name: "foo",
381 srcs: ["mylib.cpp"],
382 compile_multilib: "both",
383 multilib: {
384 lib32: {
385 suffix: "32",
386 },
387 lib64: {
388 suffix: "64",
389 },
390 },
391 symlinks: ["foo_link_"],
392 symlink_preferred_arch: true,
393 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800394 stl: "none",
Jooyung Han40b79172024-08-16 16:00:33 +0900395 apex_available: [ "myapex" ],
Yifan Hongd22a84a2020-07-28 17:37:46 -0700396 }
397
Jiyong Park99644e92020-11-17 22:21:02 +0900398 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000399 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900400 srcs: ["foo.rs"],
401 rlibs: ["libfoo.rlib.rust"],
Colin Cross49f1a8f2024-10-23 13:04:15 -0700402 rustlibs: ["libfoo.transitive.dylib.rust"],
Jiyong Park99644e92020-11-17 22:21:02 +0900403 apex_available: ["myapex"],
404 }
405
406 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000407 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900408 srcs: ["foo.rs"],
409 crate_name: "foo",
410 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900411 shared_libs: ["libfoo.shared_from_rust"],
412 }
413
414 cc_library_shared {
415 name: "libfoo.shared_from_rust",
416 srcs: ["mylib.cpp"],
417 system_shared_libs: [],
418 stl: "none",
419 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900420 }
421
422 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000423 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900424 srcs: ["foo.rs"],
425 crate_name: "foo",
426 apex_available: ["myapex"],
427 }
428
Colin Cross49f1a8f2024-10-23 13:04:15 -0700429 rust_library_dylib {
430 name: "libfoo.transitive.dylib.rust",
431 srcs: ["foo.rs"],
432 crate_name: "foo",
433 apex_available: ["myapex"],
434 }
435
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900436 rust_ffi_shared {
437 name: "libfoo.ffi",
438 srcs: ["foo.rs"],
439 crate_name: "foo",
440 apex_available: ["myapex"],
441 }
442
443 rust_ffi_shared {
444 name: "libbar.ffi",
445 srcs: ["foo.rs"],
446 crate_name: "bar",
447 apex_available: ["myapex"],
448 }
449
Paul Duffindddd5462020-04-07 15:25:44 +0100450 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900451 name: "mylib2",
452 srcs: ["mylib.cpp"],
453 system_shared_libs: [],
454 stl: "none",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900455 static_libs: ["libstatic"],
456 // TODO: remove //apex_available:platform
457 apex_available: [
458 "//apex_available:platform",
459 "myapex",
460 ],
461 }
462
Paul Duffindddd5462020-04-07 15:25:44 +0100463 cc_prebuilt_library_shared {
464 name: "mylib2",
465 srcs: ["prebuilt.so"],
466 // TODO: remove //apex_available:platform
467 apex_available: [
468 "//apex_available:platform",
469 "myapex",
470 ],
Colin Cross49f1a8f2024-10-23 13:04:15 -0700471 }
Paul Duffindddd5462020-04-07 15:25:44 +0100472
Jiyong Park9918e1a2020-03-17 19:16:40 +0900473 cc_library_static {
474 name: "libstatic",
475 srcs: ["mylib.cpp"],
476 system_shared_libs: [],
477 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000478 // TODO: remove //apex_available:platform
479 apex_available: [
480 "//apex_available:platform",
481 "myapex",
482 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900483 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900484
485 java_library {
486 name: "myjar",
487 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900488 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900489 sdk_version: "none",
490 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900491 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900492 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000493 // TODO: remove //apex_available:platform
494 apex_available: [
495 "//apex_available:platform",
496 "myapex",
497 ],
Colin Crosse4f34882024-11-14 12:26:00 -0800498 compile_dex: true,
Jiyong Park7f7766d2019-07-25 22:02:35 +0900499 }
500
Jiyong Park77acec62020-06-01 21:39:15 +0900501 dex_import {
502 name: "myjar_dex",
503 jars: ["prebuilt.jar"],
504 apex_available: [
505 "//apex_available:platform",
506 "myapex",
507 ],
508 }
509
Jiyong Park7f7766d2019-07-25 22:02:35 +0900510 java_library {
511 name: "myotherjar",
512 srcs: ["foo/bar/MyClass.java"],
513 sdk_version: "none",
514 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900515 // TODO: remove //apex_available:platform
516 apex_available: [
517 "//apex_available:platform",
518 "myapex",
519 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900520 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900521
522 java_library {
523 name: "mysharedjar",
524 srcs: ["foo/bar/MyClass.java"],
525 sdk_version: "none",
526 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900527 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900528 `)
529
Jooyung Hana0503a52023-08-23 13:12:50 +0900530 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900531
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900532 // Make sure that Android.mk is created
Jooyung Hana0503a52023-08-23 13:12:50 +0900533 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700534 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900535 var builder strings.Builder
536 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
537
538 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +0000539 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900540 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
541
Jiyong Park42cca6c2019-04-01 11:15:50 +0900542 optFlags := apexRule.Args["opt_flags"]
543 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700544 // Ensure that the NOTICE output is being packaged as an asset.
Jooyung Hana0503a52023-08-23 13:12:50 +0900545 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900546
Jiyong Park25fc6a92018-11-18 18:02:45 +0900547 copyCmds := apexRule.Args["copy_commands"]
548
549 // Ensure that main rule creates an output
550 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
551
552 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700553 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
554 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
555 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900556 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900557 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900558
559 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700560 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
561 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900562 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
563 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Colin Cross49f1a8f2024-10-23 13:04:15 -0700564 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.transitive.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900565 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900566 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900567
568 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800569 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
570 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900571 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900572 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900573 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Colin Cross49f1a8f2024-10-23 13:04:15 -0700574 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.transitive.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900575 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
576 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900577 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900578 // .. but not for java libs
579 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900580 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800581
Colin Cross7113d202019-11-20 16:39:12 -0800582 // Ensure that the platform variant ends with _shared or _common
583 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
584 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900585 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
586 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900587 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
588
589 // Ensure that dynamic dependency to java libs are not included
590 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800591
592 // Ensure that all symlinks are present.
593 found_foo_link_64 := false
594 found_foo := false
595 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900596 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800597 if strings.HasSuffix(cmd, "bin/foo") {
598 found_foo = true
599 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
600 found_foo_link_64 = true
601 }
602 }
603 }
604 good := found_foo && found_foo_link_64
605 if !good {
606 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
607 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900608
Colin Crossf61d03d2023-11-02 16:56:39 -0700609 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
610 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100611 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100612 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
613 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
614 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100615
Colin Crossf61d03d2023-11-02 16:56:39 -0700616 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
617 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100618 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100619 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
620 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
621 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800622}
623
Jooyung Hanf21c7972019-12-16 22:32:06 +0900624func TestDefaults(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700625 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800626 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900627 apex_defaults {
628 name: "myapex-defaults",
629 key: "myapex.key",
630 prebuilts: ["myetc"],
631 native_shared_libs: ["mylib"],
632 java_libs: ["myjar"],
633 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900634 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800635 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000636 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900637 }
638
639 prebuilt_etc {
640 name: "myetc",
641 src: "myprebuilt",
642 }
643
644 apex {
645 name: "myapex",
646 defaults: ["myapex-defaults"],
647 }
648
649 apex_key {
650 name: "myapex.key",
651 public_key: "testkey.avbpubkey",
652 private_key: "testkey.pem",
653 }
654
655 cc_library {
656 name: "mylib",
657 system_shared_libs: [],
658 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000659 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900660 }
661
662 java_library {
663 name: "myjar",
664 srcs: ["foo/bar/MyClass.java"],
665 sdk_version: "none",
666 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000667 apex_available: [ "myapex" ],
Colin Crosse4f34882024-11-14 12:26:00 -0800668 compile_dex: true,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900669 }
670
671 android_app {
672 name: "AppFoo",
673 srcs: ["foo/bar/MyClass.java"],
674 sdk_version: "none",
675 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000676 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900677 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900678
679 runtime_resource_overlay {
680 name: "rro",
681 theme: "blue",
682 }
683
markchien2f59ec92020-09-02 16:23:38 +0800684 bpf {
685 name: "bpf",
686 srcs: ["bpf.c", "bpf2.c"],
687 }
688
Ken Chenfad7f9d2021-11-10 22:02:57 +0800689 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800690 name: "netdTest",
691 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800692 sub_dir: "netd",
693 }
694
Jooyung Hanf21c7972019-12-16 22:32:06 +0900695 `)
Jooyung Hana0503a52023-08-23 13:12:50 +0900696 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900697 "etc/myetc",
698 "javalib/myjar.jar",
699 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000700 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900701 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800702 "etc/bpf/bpf.o",
703 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800704 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900705 })
706}
707
Jooyung Han01a3ee22019-11-02 02:52:25 +0900708func TestApexManifest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700709 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800710 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900711 apex {
712 name: "myapex",
713 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000714 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900715 }
716
717 apex_key {
718 name: "myapex.key",
719 public_key: "testkey.avbpubkey",
720 private_key: "testkey.pem",
721 }
722 `)
723
Jooyung Hana0503a52023-08-23 13:12:50 +0900724 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +0900725 args := module.Rule("apexRule").Args
726 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
727 t.Error("manifest should be apex_manifest.pb, but " + manifest)
728 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900729}
730
Liz Kammer4854a7d2021-05-27 14:28:27 -0400731func TestApexManifestMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700732 t.Parallel()
Liz Kammer4854a7d2021-05-27 14:28:27 -0400733 ctx := testApex(t, `
734 apex_defaults {
735 name: "my_defaults",
736 key: "myapex.key",
737 product_specific: true,
738 file_contexts: ":my-file-contexts",
739 updatable: false,
740 }
741 apex {
742 name: "myapex_30",
743 min_sdk_version: "30",
744 defaults: ["my_defaults"],
745 }
746
747 apex {
748 name: "myapex_current",
749 min_sdk_version: "current",
750 defaults: ["my_defaults"],
751 }
752
753 apex {
754 name: "myapex_none",
755 defaults: ["my_defaults"],
756 }
757
758 apex_key {
759 name: "myapex.key",
760 public_key: "testkey.avbpubkey",
761 private_key: "testkey.pem",
762 }
763
764 filegroup {
765 name: "my-file-contexts",
766 srcs: ["product_specific_file_contexts"],
767 }
768 `, withFiles(map[string][]byte{
769 "product_specific_file_contexts": nil,
770 }), android.FixtureModifyProductVariables(
771 func(variables android.FixtureProductVariables) {
772 variables.Unbundled_build = proptools.BoolPtr(true)
773 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
774 }), android.FixtureMergeEnv(map[string]string{
775 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
776 }))
777
778 testCases := []struct {
779 module string
780 minSdkVersion string
781 }{
782 {
783 module: "myapex_30",
784 minSdkVersion: "30",
785 },
786 {
787 module: "myapex_current",
788 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
789 },
790 {
791 module: "myapex_none",
792 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
793 },
794 }
795 for _, tc := range testCases {
Jooyung Hana0503a52023-08-23 13:12:50 +0900796 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
Liz Kammer4854a7d2021-05-27 14:28:27 -0400797 args := module.Rule("apexRule").Args
798 optFlags := args["opt_flags"]
799 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
800 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
801 }
802 }
803}
804
Jihoon Kang842b9992024-02-08 01:41:51 +0000805func TestApexWithDessertSha(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700806 t.Parallel()
Jihoon Kang842b9992024-02-08 01:41:51 +0000807 ctx := testApex(t, `
808 apex_defaults {
809 name: "my_defaults",
810 key: "myapex.key",
811 product_specific: true,
812 file_contexts: ":my-file-contexts",
813 updatable: false,
814 }
815 apex {
816 name: "myapex_30",
817 min_sdk_version: "30",
818 defaults: ["my_defaults"],
819 }
820
821 apex {
822 name: "myapex_current",
823 min_sdk_version: "current",
824 defaults: ["my_defaults"],
825 }
826
827 apex {
828 name: "myapex_none",
829 defaults: ["my_defaults"],
830 }
831
832 apex_key {
833 name: "myapex.key",
834 public_key: "testkey.avbpubkey",
835 private_key: "testkey.pem",
836 }
837
838 filegroup {
839 name: "my-file-contexts",
840 srcs: ["product_specific_file_contexts"],
841 }
842 `, withFiles(map[string][]byte{
843 "product_specific_file_contexts": nil,
844 }), android.FixtureModifyProductVariables(
845 func(variables android.FixtureProductVariables) {
846 variables.Unbundled_build = proptools.BoolPtr(true)
847 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
848 }), android.FixtureMergeEnv(map[string]string{
849 "UNBUNDLED_BUILD_TARGET_SDK_WITH_DESSERT_SHA": "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
850 }))
851
852 testCases := []struct {
853 module string
854 minSdkVersion string
855 }{
856 {
857 module: "myapex_30",
858 minSdkVersion: "30",
859 },
860 {
861 module: "myapex_current",
862 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
863 },
864 {
865 module: "myapex_none",
866 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
867 },
868 }
869 for _, tc := range testCases {
870 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
871 args := module.Rule("apexRule").Args
872 optFlags := args["opt_flags"]
873 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
874 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
875 }
876 }
877}
878
Jooyung Hanaf730952023-02-28 14:13:38 +0900879func TestFileContexts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700880 t.Parallel()
Jooyung Hanbe953902023-05-31 16:42:16 +0900881 for _, vendor := range []bool{true, false} {
Jooyung Hanaf730952023-02-28 14:13:38 +0900882 prop := ""
Jooyung Hanbe953902023-05-31 16:42:16 +0900883 if vendor {
884 prop = "vendor: true,\n"
Jooyung Hanaf730952023-02-28 14:13:38 +0900885 }
886 ctx := testApex(t, `
887 apex {
888 name: "myapex",
889 key: "myapex.key",
Jooyung Hanaf730952023-02-28 14:13:38 +0900890 updatable: false,
Jooyung Hanaf730952023-02-28 14:13:38 +0900891 `+prop+`
892 }
893
894 apex_key {
895 name: "myapex.key",
896 public_key: "testkey.avbpubkey",
897 private_key: "testkey.pem",
898 }
Jooyung Hanbe953902023-05-31 16:42:16 +0900899 `)
Jooyung Hanaf730952023-02-28 14:13:38 +0900900
Jooyung Hana0503a52023-08-23 13:12:50 +0900901 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("file_contexts")
Jooyung Hanbe953902023-05-31 16:42:16 +0900902 if vendor {
903 android.AssertStringDoesContain(t, "should force-label as vendor_apex_metadata_file",
904 rule.RuleParams.Command,
905 "apex_manifest\\\\.pb u:object_r:vendor_apex_metadata_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900906 } else {
Jooyung Hanbe953902023-05-31 16:42:16 +0900907 android.AssertStringDoesContain(t, "should force-label as system_file",
908 rule.RuleParams.Command,
909 "apex_manifest\\\\.pb u:object_r:system_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900910 }
911 }
912}
913
Jiyong Park25fc6a92018-11-18 18:02:45 +0900914func TestApexWithStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700915 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800916 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900917 apex {
918 name: "myapex",
919 key: "myapex.key",
920 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900921 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000922 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900923 }
924
925 apex_key {
926 name: "myapex.key",
927 public_key: "testkey.avbpubkey",
928 private_key: "testkey.pem",
929 }
930
931 cc_library {
932 name: "mylib",
933 srcs: ["mylib.cpp"],
Colin Crossea91a172024-11-05 16:14:05 -0800934 shared_libs: ["mylib2", "mylib3#impl", "my_prebuilt_platform_lib", "my_prebuilt_platform_stub_only_lib"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900935 system_shared_libs: [],
936 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000937 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900938 }
939
940 cc_library {
941 name: "mylib2",
942 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900943 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900944 system_shared_libs: [],
945 stl: "none",
946 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +0000947 symbol_file: "mylib2.map.txt",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900948 versions: ["1", "2", "3"],
949 },
950 }
951
952 cc_library {
953 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900954 srcs: ["mylib.cpp"],
955 shared_libs: ["mylib4"],
956 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900957 stl: "none",
958 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +0000959 symbol_file: "mylib3.map.txt",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900960 versions: ["10", "11", "12"],
961 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000962 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900963 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900964
965 cc_library {
966 name: "mylib4",
967 srcs: ["mylib.cpp"],
968 system_shared_libs: [],
969 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000970 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900971 }
Jiyong Park105dc322021-06-11 17:22:09 +0900972
Spandan Das357ffcc2024-07-24 18:07:48 +0000973 cc_prebuilt_library_shared {
974 name: "my_prebuilt_platform_lib",
975 stubs: {
976 symbol_file: "my_prebuilt_platform_lib.map.txt",
977 versions: ["1", "2", "3"],
978 },
979 srcs: ["foo.so"],
980 }
981
982 // Similar to my_prebuilt_platform_lib, but this library only provides stubs, i.e. srcs is empty
983 cc_prebuilt_library_shared {
984 name: "my_prebuilt_platform_stub_only_lib",
985 stubs: {
986 symbol_file: "my_prebuilt_platform_stub_only_lib.map.txt",
987 versions: ["1", "2", "3"],
988 }
989 }
990
Jiyong Park105dc322021-06-11 17:22:09 +0900991 rust_binary {
992 name: "foo.rust",
993 srcs: ["foo.rs"],
994 shared_libs: ["libfoo.shared_from_rust"],
995 prefer_rlib: true,
996 apex_available: ["myapex"],
997 }
998
999 cc_library_shared {
1000 name: "libfoo.shared_from_rust",
1001 srcs: ["mylib.cpp"],
1002 system_shared_libs: [],
1003 stl: "none",
1004 stubs: {
1005 versions: ["10", "11", "12"],
1006 },
1007 }
1008
Jiyong Park25fc6a92018-11-18 18:02:45 +09001009 `)
1010
Jooyung Hana0503a52023-08-23 13:12:50 +09001011 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001012 copyCmds := apexRule.Args["copy_commands"]
1013
1014 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -08001015 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001016
1017 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -08001018 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001019
1020 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -08001021 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001022
Colin Crossaede88c2020-08-11 12:17:01 -07001023 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001024
1025 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001026 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001027 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +09001028 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001029
Colin Crossea91a172024-11-05 16:14:05 -08001030 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because the dependency is added with mylib3#impl)
Colin Crossaede88c2020-08-11 12:17:01 -07001031 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001032 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -07001033 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +09001034
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001035 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
1036 // is replaced by sharing of "cFlags" in cc/builder.go.
1037 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
1038 // module variable representing "cflags". So it was not detected by ensureNotContains.
1039 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
1040 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
1041 // including the original cflags's "-include mylib.h".
1042 //
Jiyong Park64379952018-12-13 18:37:29 +09001043 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001044 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1045 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +09001046
Jiyong Park85cc35a2022-07-17 11:30:47 +09001047 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1048 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
1049 // Ensure that genstub for apex-provided lib is invoked with --apex
1050 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +09001051
Jooyung Hana0503a52023-08-23 13:12:50 +09001052 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +09001053 "lib64/mylib.so",
1054 "lib64/mylib3.so",
1055 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +09001056 "bin/foo.rust",
1057 "lib64/libc++.so", // by the implicit dependency from foo.rust
1058 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +09001059 })
Jiyong Park105dc322021-06-11 17:22:09 +09001060
1061 // Ensure that stub dependency from a rust module is not included
1062 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1063 // The rust module is linked to the stub cc library
Colin Cross004bd3f2023-10-02 11:39:17 -07001064 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +09001065 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1066 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +09001067
Jooyung Hana0503a52023-08-23 13:12:50 +09001068 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jiyong Park34d5c332022-02-24 18:02:44 +09001069 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Spandan Das357ffcc2024-07-24 18:07:48 +00001070
1071 // Ensure that mylib is linking with the latest version of stubs for my_prebuilt_platform_lib
1072 ensureContains(t, mylibLdFlags, "my_prebuilt_platform_lib/android_arm64_armv8-a_shared_current/my_prebuilt_platform_lib.so")
1073 // ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib
1074 ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_lib.so")
1075 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1076 ensureContains(t, ctx.ModuleForTests("my_prebuilt_platform_lib", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
1077
1078 // Ensure that mylib is linking with the latest version of stubs for my_prebuilt_platform_lib
1079 ensureContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared_current/my_prebuilt_platform_stub_only_lib.so")
1080 // ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib
1081 ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_stub_only_lib.so")
1082 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1083 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 +09001084}
1085
Jooyung Han20348752023-12-05 15:23:56 +09001086func TestApexShouldNotEmbedStubVariant(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001087 t.Parallel()
Jooyung Han20348752023-12-05 15:23:56 +09001088 testApexError(t, `module "myapex" .*: native_shared_libs: "libbar" is a stub`, `
1089 apex {
1090 name: "myapex",
1091 key: "myapex.key",
1092 vendor: true,
1093 updatable: false,
1094 native_shared_libs: ["libbar"], // should not add an LLNDK stub in a vendor apex
1095 }
1096
1097 apex_key {
1098 name: "myapex.key",
1099 public_key: "testkey.avbpubkey",
1100 private_key: "testkey.pem",
1101 }
1102
1103 cc_library {
1104 name: "libbar",
1105 srcs: ["mylib.cpp"],
1106 llndk: {
1107 symbol_file: "libbar.map.txt",
1108 }
1109 }
1110 `)
1111}
1112
Jiyong Park1bc84122021-06-22 20:23:05 +09001113func TestApexCanUsePrivateApis(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001114 t.Parallel()
Jiyong Park1bc84122021-06-22 20:23:05 +09001115 ctx := testApex(t, `
1116 apex {
1117 name: "myapex",
1118 key: "myapex.key",
1119 native_shared_libs: ["mylib"],
1120 binaries: ["foo.rust"],
1121 updatable: false,
1122 platform_apis: true,
1123 }
1124
1125 apex_key {
1126 name: "myapex.key",
1127 public_key: "testkey.avbpubkey",
1128 private_key: "testkey.pem",
1129 }
1130
1131 cc_library {
1132 name: "mylib",
1133 srcs: ["mylib.cpp"],
1134 shared_libs: ["mylib2"],
1135 system_shared_libs: [],
1136 stl: "none",
1137 apex_available: [ "myapex" ],
1138 }
1139
1140 cc_library {
1141 name: "mylib2",
1142 srcs: ["mylib.cpp"],
1143 cflags: ["-include mylib.h"],
1144 system_shared_libs: [],
1145 stl: "none",
1146 stubs: {
1147 versions: ["1", "2", "3"],
1148 },
1149 }
1150
1151 rust_binary {
1152 name: "foo.rust",
1153 srcs: ["foo.rs"],
1154 shared_libs: ["libfoo.shared_from_rust"],
1155 prefer_rlib: true,
1156 apex_available: ["myapex"],
1157 }
1158
1159 cc_library_shared {
1160 name: "libfoo.shared_from_rust",
1161 srcs: ["mylib.cpp"],
1162 system_shared_libs: [],
1163 stl: "none",
1164 stubs: {
1165 versions: ["10", "11", "12"],
1166 },
1167 }
1168 `)
1169
Jooyung Hana0503a52023-08-23 13:12:50 +09001170 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park1bc84122021-06-22 20:23:05 +09001171 copyCmds := apexRule.Args["copy_commands"]
1172
1173 // Ensure that indirect stubs dep is not included
1174 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1175 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1176
1177 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1178 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001179 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001180 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1181 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Colin Cross004bd3f2023-10-02 11:39:17 -07001182 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001183 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1184 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1185}
1186
Colin Cross7812fd32020-09-25 12:35:10 -07001187func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1188 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001189 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001190 apex {
1191 name: "myapex",
1192 key: "myapex.key",
1193 native_shared_libs: ["mylib", "mylib3"],
1194 min_sdk_version: "29",
1195 }
1196
1197 apex_key {
1198 name: "myapex.key",
1199 public_key: "testkey.avbpubkey",
1200 private_key: "testkey.pem",
1201 }
1202
1203 cc_library {
1204 name: "mylib",
1205 srcs: ["mylib.cpp"],
Colin Crossea91a172024-11-05 16:14:05 -08001206 shared_libs: ["mylib2", "mylib3#impl"],
Colin Cross7812fd32020-09-25 12:35:10 -07001207 system_shared_libs: [],
1208 stl: "none",
1209 apex_available: [ "myapex" ],
1210 min_sdk_version: "28",
1211 }
1212
1213 cc_library {
1214 name: "mylib2",
1215 srcs: ["mylib.cpp"],
1216 cflags: ["-include mylib.h"],
1217 system_shared_libs: [],
1218 stl: "none",
1219 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +00001220 symbol_file: "mylib2.map.txt",
Colin Cross7812fd32020-09-25 12:35:10 -07001221 versions: ["28", "29", "30", "current"],
1222 },
1223 min_sdk_version: "28",
1224 }
1225
1226 cc_library {
1227 name: "mylib3",
1228 srcs: ["mylib.cpp"],
1229 shared_libs: ["mylib4"],
1230 system_shared_libs: [],
1231 stl: "none",
1232 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +00001233 symbol_file: "mylib3.map.txt",
Colin Cross7812fd32020-09-25 12:35:10 -07001234 versions: ["28", "29", "30", "current"],
1235 },
1236 apex_available: [ "myapex" ],
1237 min_sdk_version: "28",
1238 }
1239
1240 cc_library {
1241 name: "mylib4",
1242 srcs: ["mylib.cpp"],
1243 system_shared_libs: [],
1244 stl: "none",
1245 apex_available: [ "myapex" ],
1246 min_sdk_version: "28",
1247 }
1248 `)
1249
Jooyung Hana0503a52023-08-23 13:12:50 +09001250 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Colin Cross7812fd32020-09-25 12:35:10 -07001251 copyCmds := apexRule.Args["copy_commands"]
1252
1253 // Ensure that direct non-stubs dep is always included
1254 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1255
1256 // Ensure that indirect stubs dep is not included
1257 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1258
1259 // Ensure that direct stubs dep is included
1260 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1261
1262 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1263
Jiyong Park55549df2021-02-26 23:57:23 +09001264 // Ensure that mylib is linking with the latest version of stub for mylib2
1265 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001266 // ... and not linking to the non-stub (impl) variant of mylib2
1267 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1268
Colin Crossea91a172024-11-05 16:14:05 -08001269 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because the dependency is added with mylib3#impl)
Colin Cross7812fd32020-09-25 12:35:10 -07001270 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1271 // .. and not linking to the stubs variant of mylib3
1272 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1273
1274 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001275 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001276 ensureNotContains(t, mylib2Cflags, "-include ")
1277
Jiyong Park85cc35a2022-07-17 11:30:47 +09001278 // Ensure that genstub is invoked with --systemapi
1279 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001280
Jooyung Hana0503a52023-08-23 13:12:50 +09001281 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Colin Cross7812fd32020-09-25 12:35:10 -07001282 "lib64/mylib.so",
1283 "lib64/mylib3.so",
1284 "lib64/mylib4.so",
1285 })
1286}
1287
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001288func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1289 t.Parallel()
1290 // myapex (Z)
1291 // mylib -----------------.
1292 // |
1293 // otherapex (29) |
1294 // libstub's versions: 29 Z current
1295 // |
1296 // <platform> |
1297 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001298 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001299 apex {
1300 name: "myapex",
1301 key: "myapex.key",
1302 native_shared_libs: ["mylib"],
1303 min_sdk_version: "Z", // non-final
1304 }
1305
1306 cc_library {
1307 name: "mylib",
1308 srcs: ["mylib.cpp"],
1309 shared_libs: ["libstub"],
1310 apex_available: ["myapex"],
1311 min_sdk_version: "Z",
1312 }
1313
1314 apex_key {
1315 name: "myapex.key",
1316 public_key: "testkey.avbpubkey",
1317 private_key: "testkey.pem",
1318 }
1319
1320 apex {
1321 name: "otherapex",
1322 key: "myapex.key",
1323 native_shared_libs: ["libstub"],
1324 min_sdk_version: "29",
1325 }
1326
1327 cc_library {
1328 name: "libstub",
1329 srcs: ["mylib.cpp"],
1330 stubs: {
1331 versions: ["29", "Z", "current"],
1332 },
1333 apex_available: ["otherapex"],
1334 min_sdk_version: "29",
1335 }
1336
1337 // platform module depending on libstub from otherapex should use the latest stub("current")
1338 cc_library {
1339 name: "libplatform",
1340 srcs: ["mylib.cpp"],
1341 shared_libs: ["libstub"],
1342 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001343 `,
1344 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1345 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1346 variables.Platform_sdk_final = proptools.BoolPtr(false)
1347 variables.Platform_version_active_codenames = []string{"Z"}
1348 }),
1349 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001350
Jiyong Park55549df2021-02-26 23:57:23 +09001351 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001352 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001353 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001354 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001355 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001356
1357 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1358 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1359 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1360 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1361 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1362}
1363
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001364func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001365 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001366 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001367 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001368 name: "myapex2",
1369 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001370 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001371 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001372 }
1373
1374 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001375 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001376 public_key: "testkey.avbpubkey",
1377 private_key: "testkey.pem",
1378 }
1379
1380 cc_library {
1381 name: "mylib",
1382 srcs: ["mylib.cpp"],
1383 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001384 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001385 system_shared_libs: [],
1386 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001387 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001388 }
1389
1390 cc_library {
1391 name: "libfoo",
1392 srcs: ["mylib.cpp"],
1393 shared_libs: ["libbar"],
1394 system_shared_libs: [],
1395 stl: "none",
1396 stubs: {
1397 versions: ["10", "20", "30"],
1398 },
1399 }
1400
1401 cc_library {
1402 name: "libbar",
1403 srcs: ["mylib.cpp"],
1404 system_shared_libs: [],
1405 stl: "none",
1406 }
1407
Jiyong Park678c8812020-02-07 17:25:49 +09001408 cc_library_static {
1409 name: "libbaz",
1410 srcs: ["mylib.cpp"],
1411 system_shared_libs: [],
1412 stl: "none",
1413 apex_available: [ "myapex2" ],
1414 }
1415
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001416 `)
1417
Jooyung Hana0503a52023-08-23 13:12:50 +09001418 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001419 copyCmds := apexRule.Args["copy_commands"]
1420
1421 // Ensure that direct non-stubs dep is always included
1422 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1423
1424 // Ensure that indirect stubs dep is not included
1425 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1426
1427 // Ensure that dependency of stubs is not included
1428 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1429
Colin Crossaede88c2020-08-11 12:17:01 -07001430 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001431
1432 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001433 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001434 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001435 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001436
Jiyong Park3ff16992019-12-27 14:11:47 +09001437 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001438
1439 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1440 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001441
Colin Crossf61d03d2023-11-02 16:56:39 -07001442 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1443 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001444 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001445
Colin Crossf61d03d2023-11-02 16:56:39 -07001446 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1447 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001448 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001449}
1450
Jooyung Hand3639552019-08-09 12:57:43 +09001451func TestApexWithRuntimeLibsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001452 t.Parallel()
Jooyung Hand3639552019-08-09 12:57:43 +09001453 /*
1454 myapex
1455 |
1456 v (runtime_libs)
1457 mylib ------+------> libfoo [provides stub]
1458 |
1459 `------> libbar
1460 */
Colin Cross1c460562021-02-16 17:55:47 -08001461 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001462 apex {
1463 name: "myapex",
1464 key: "myapex.key",
1465 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001466 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001467 }
1468
1469 apex_key {
1470 name: "myapex.key",
1471 public_key: "testkey.avbpubkey",
1472 private_key: "testkey.pem",
1473 }
1474
1475 cc_library {
1476 name: "mylib",
1477 srcs: ["mylib.cpp"],
Liz Kammer5f108fa2023-05-11 14:33:17 -04001478 static_libs: ["libstatic"],
1479 shared_libs: ["libshared"],
Jooyung Hand3639552019-08-09 12:57:43 +09001480 runtime_libs: ["libfoo", "libbar"],
1481 system_shared_libs: [],
1482 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001483 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001484 }
1485
1486 cc_library {
1487 name: "libfoo",
1488 srcs: ["mylib.cpp"],
1489 system_shared_libs: [],
1490 stl: "none",
1491 stubs: {
1492 versions: ["10", "20", "30"],
1493 },
1494 }
1495
1496 cc_library {
1497 name: "libbar",
1498 srcs: ["mylib.cpp"],
1499 system_shared_libs: [],
1500 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001501 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001502 }
1503
Liz Kammer5f108fa2023-05-11 14:33:17 -04001504 cc_library {
1505 name: "libstatic",
1506 srcs: ["mylib.cpp"],
1507 system_shared_libs: [],
1508 stl: "none",
1509 apex_available: [ "myapex" ],
1510 runtime_libs: ["libstatic_to_runtime"],
1511 }
1512
1513 cc_library {
1514 name: "libshared",
1515 srcs: ["mylib.cpp"],
1516 system_shared_libs: [],
1517 stl: "none",
1518 apex_available: [ "myapex" ],
1519 runtime_libs: ["libshared_to_runtime"],
1520 }
1521
1522 cc_library {
1523 name: "libstatic_to_runtime",
1524 srcs: ["mylib.cpp"],
1525 system_shared_libs: [],
1526 stl: "none",
1527 apex_available: [ "myapex" ],
1528 }
1529
1530 cc_library {
1531 name: "libshared_to_runtime",
1532 srcs: ["mylib.cpp"],
1533 system_shared_libs: [],
1534 stl: "none",
1535 apex_available: [ "myapex" ],
1536 }
Jooyung Hand3639552019-08-09 12:57:43 +09001537 `)
1538
Jooyung Hana0503a52023-08-23 13:12:50 +09001539 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001540 copyCmds := apexRule.Args["copy_commands"]
1541
1542 // Ensure that direct non-stubs dep is always included
1543 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1544
1545 // Ensure that indirect stubs dep is not included
1546 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1547
1548 // Ensure that runtime_libs dep in included
1549 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
Liz Kammer5f108fa2023-05-11 14:33:17 -04001550 ensureContains(t, copyCmds, "image.apex/lib64/libshared.so")
1551 ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so")
1552
1553 ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001554
Jooyung Hana0503a52023-08-23 13:12:50 +09001555 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001556 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1557 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001558}
1559
Paul Duffina02cae32021-03-09 01:44:06 +00001560var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1561 cc.PrepareForTestWithCcBuildComponents,
1562 PrepareForTestWithApexBuildComponents,
1563 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001564 apex {
1565 name: "com.android.runtime",
1566 key: "com.android.runtime.key",
1567 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001568 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001569 }
1570
1571 apex_key {
1572 name: "com.android.runtime.key",
1573 public_key: "testkey.avbpubkey",
1574 private_key: "testkey.pem",
1575 }
Paul Duffina02cae32021-03-09 01:44:06 +00001576 `),
1577 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1578)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001579
Paul Duffina02cae32021-03-09 01:44:06 +00001580func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001581 t.Parallel()
Paul Duffin70d3bee2021-03-21 11:26:05 +00001582 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001583 cc_library {
1584 name: "libc",
1585 no_libcrt: true,
1586 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001587 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001588 stl: "none",
1589 system_shared_libs: [],
1590 stubs: { versions: ["1"] },
1591 apex_available: ["com.android.runtime"],
1592
1593 sanitize: {
1594 hwaddress: true,
1595 }
1596 }
1597
1598 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001599 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001600 no_libcrt: true,
1601 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001602 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001603 stl: "none",
1604 system_shared_libs: [],
1605 srcs: [""],
1606 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001607 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001608
1609 sanitize: {
1610 never: true,
1611 },
Spandan Das4de7b492023-05-05 21:13:01 +00001612 apex_available: [
1613 "//apex_available:anyapex",
1614 "//apex_available:platform",
1615 ],
Paul Duffina02cae32021-03-09 01:44:06 +00001616 } `)
1617 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001618
Jooyung Hana0503a52023-08-23 13:12:50 +09001619 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001620 "lib64/bionic/libc.so",
1621 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1622 })
1623
Colin Cross4c4c1be2022-02-10 11:41:18 -08001624 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001625
1626 installed := hwasan.Description("install libclang_rt.hwasan")
1627 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1628
1629 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1630 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1631 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1632}
1633
1634func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001635 t.Parallel()
Paul Duffin70d3bee2021-03-21 11:26:05 +00001636 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001637 prepareForTestOfRuntimeApexWithHwasan,
1638 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1639 variables.SanitizeDevice = []string{"hwaddress"}
1640 }),
1641 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001642 cc_library {
1643 name: "libc",
1644 no_libcrt: true,
1645 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001646 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001647 stl: "none",
1648 system_shared_libs: [],
1649 stubs: { versions: ["1"] },
1650 apex_available: ["com.android.runtime"],
1651 }
1652
1653 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001654 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001655 no_libcrt: true,
1656 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001657 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001658 stl: "none",
1659 system_shared_libs: [],
1660 srcs: [""],
1661 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001662 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001663
1664 sanitize: {
1665 never: true,
1666 },
Spandan Das4de7b492023-05-05 21:13:01 +00001667 apex_available: [
1668 "//apex_available:anyapex",
1669 "//apex_available:platform",
1670 ],
Jooyung Han8ce8db92020-05-15 19:05:05 +09001671 }
Paul Duffina02cae32021-03-09 01:44:06 +00001672 `)
1673 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001674
Jooyung Hana0503a52023-08-23 13:12:50 +09001675 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001676 "lib64/bionic/libc.so",
1677 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1678 })
1679
Colin Cross4c4c1be2022-02-10 11:41:18 -08001680 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001681
1682 installed := hwasan.Description("install libclang_rt.hwasan")
1683 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1684
1685 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1686 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1687 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1688}
1689
Jooyung Han61b66e92020-03-21 14:21:46 +00001690func TestApexDependsOnLLNDKTransitively(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001691 t.Parallel()
Jooyung Han61b66e92020-03-21 14:21:46 +00001692 testcases := []struct {
1693 name string
1694 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001695 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001696 shouldLink string
1697 shouldNotLink []string
1698 }{
1699 {
Jiyong Park55549df2021-02-26 23:57:23 +09001700 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001701 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001702 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001703 shouldLink: "current",
1704 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001705 },
1706 {
Jiyong Park55549df2021-02-26 23:57:23 +09001707 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001708 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001709 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001710 shouldLink: "current",
1711 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001712 },
1713 }
1714 for _, tc := range testcases {
1715 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001716 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001717 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001718 apex {
1719 name: "myapex",
1720 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001721 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001722 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001723 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001724 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001725
Jooyung Han61b66e92020-03-21 14:21:46 +00001726 apex_key {
1727 name: "myapex.key",
1728 public_key: "testkey.avbpubkey",
1729 private_key: "testkey.pem",
1730 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001731
Jooyung Han61b66e92020-03-21 14:21:46 +00001732 cc_library {
1733 name: "mylib",
1734 srcs: ["mylib.cpp"],
1735 vendor_available: true,
1736 shared_libs: ["libbar"],
1737 system_shared_libs: [],
1738 stl: "none",
1739 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001740 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001741 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001742
Jooyung Han61b66e92020-03-21 14:21:46 +00001743 cc_library {
1744 name: "libbar",
1745 srcs: ["mylib.cpp"],
1746 system_shared_libs: [],
1747 stl: "none",
1748 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001749 llndk: {
1750 symbol_file: "libbar.map.txt",
1751 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001752 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001753 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001754 withUnbundledBuild,
1755 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001756
Jooyung Han61b66e92020-03-21 14:21:46 +00001757 // Ensure that LLNDK dep is not included
Jooyung Hana0503a52023-08-23 13:12:50 +09001758 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han61b66e92020-03-21 14:21:46 +00001759 "lib64/mylib.so",
1760 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001761
Jooyung Han61b66e92020-03-21 14:21:46 +00001762 // Ensure that LLNDK dep is required
Jooyung Hana0503a52023-08-23 13:12:50 +09001763 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han61b66e92020-03-21 14:21:46 +00001764 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1765 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001766
Steven Moreland2c4000c2021-04-27 02:08:49 +00001767 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1768 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001769 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001770 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001771 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001772
Steven Moreland2c4000c2021-04-27 02:08:49 +00001773 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001774 ver := tc.shouldLink
1775 if tc.shouldLink == "current" {
1776 ver = strconv.Itoa(android.FutureApiLevelInt)
1777 }
1778 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001779 })
1780 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001781}
1782
Jiyong Park25fc6a92018-11-18 18:02:45 +09001783func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001784 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001785 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001786 apex {
1787 name: "myapex",
1788 key: "myapex.key",
1789 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001790 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001791 }
1792
1793 apex_key {
1794 name: "myapex.key",
1795 public_key: "testkey.avbpubkey",
1796 private_key: "testkey.pem",
1797 }
1798
1799 cc_library {
1800 name: "mylib",
1801 srcs: ["mylib.cpp"],
Colin Crossea91a172024-11-05 16:14:05 -08001802 system_shared_libs: ["libc"],
1803 shared_libs: ["libdl#27", "libm#impl"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001804 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001805 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001806 }
1807
1808 cc_library_shared {
1809 name: "mylib_shared",
1810 srcs: ["mylib.cpp"],
1811 shared_libs: ["libdl#27"],
1812 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001813 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001814 }
1815
1816 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001817 name: "libBootstrap",
1818 srcs: ["mylib.cpp"],
1819 stl: "none",
1820 bootstrap: true,
1821 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001822 `)
1823
Jooyung Hana0503a52023-08-23 13:12:50 +09001824 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001825 copyCmds := apexRule.Args["copy_commands"]
1826
1827 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001828 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001829 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1830 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001831
1832 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001833 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001834
Colin Crossaede88c2020-08-11 12:17:01 -07001835 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1836 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1837 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001838
1839 // For dependency to libc
1840 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001841 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001842 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001843 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001844 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001845 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1846 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001847
1848 // For dependency to libm
1849 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001850 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001851 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001852 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001853 // ... and is not compiling with the stub
1854 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1855 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1856
1857 // For dependency to libdl
1858 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001859 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001860 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001861 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1862 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001863 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001864 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001865 // ... Cflags from stub is correctly exported to mylib
1866 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1867 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001868
1869 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001870 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1871 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1872 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1873 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001874}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001875
Jooyung Han749dc692020-04-15 11:03:39 +09001876func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001877 t.Parallel()
Jiyong Park55549df2021-02-26 23:57:23 +09001878 // there are three links between liba --> libz.
1879 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001880 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001881 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001882 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001883 apex {
1884 name: "myapex",
1885 key: "myapex.key",
1886 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001887 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001888 }
1889
1890 apex {
1891 name: "otherapex",
1892 key: "myapex.key",
1893 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001894 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001895 }
1896
1897 apex_key {
1898 name: "myapex.key",
1899 public_key: "testkey.avbpubkey",
1900 private_key: "testkey.pem",
1901 }
1902
1903 cc_library {
1904 name: "libx",
1905 shared_libs: ["liba"],
1906 system_shared_libs: [],
1907 stl: "none",
1908 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001909 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001910 }
1911
1912 cc_library {
1913 name: "liby",
1914 shared_libs: ["liba"],
1915 system_shared_libs: [],
1916 stl: "none",
1917 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001918 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001919 }
1920
1921 cc_library {
1922 name: "liba",
1923 shared_libs: ["libz"],
1924 system_shared_libs: [],
1925 stl: "none",
1926 apex_available: [
1927 "//apex_available:anyapex",
1928 "//apex_available:platform",
1929 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001930 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001931 }
1932
1933 cc_library {
1934 name: "libz",
1935 system_shared_libs: [],
1936 stl: "none",
1937 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001938 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001939 },
1940 }
Jooyung Han749dc692020-04-15 11:03:39 +09001941 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001942
1943 expectLink := func(from, from_variant, to, to_variant string) {
1944 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1945 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1946 }
1947 expectNoLink := func(from, from_variant, to, to_variant string) {
1948 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1949 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1950 }
1951 // platform liba is linked to non-stub version
1952 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001953 // liba in myapex is linked to current
1954 expectLink("liba", "shared_apex29", "libz", "shared_current")
1955 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001956 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001957 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001958 // liba in otherapex is linked to current
1959 expectLink("liba", "shared_apex30", "libz", "shared_current")
1960 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001961 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1962 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001963}
1964
Jooyung Hanaed150d2020-04-02 01:41:41 +09001965func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001966 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001967 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001968 apex {
1969 name: "myapex",
1970 key: "myapex.key",
1971 native_shared_libs: ["libx"],
1972 min_sdk_version: "R",
1973 }
1974
1975 apex_key {
1976 name: "myapex.key",
1977 public_key: "testkey.avbpubkey",
1978 private_key: "testkey.pem",
1979 }
1980
1981 cc_library {
1982 name: "libx",
1983 shared_libs: ["libz"],
1984 system_shared_libs: [],
1985 stl: "none",
1986 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001987 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001988 }
1989
1990 cc_library {
1991 name: "libz",
1992 system_shared_libs: [],
1993 stl: "none",
1994 stubs: {
1995 versions: ["29", "R"],
1996 },
1997 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001998 `,
1999 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2000 variables.Platform_version_active_codenames = []string{"R"}
2001 }),
2002 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09002003
2004 expectLink := func(from, from_variant, to, to_variant string) {
2005 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2006 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2007 }
2008 expectNoLink := func(from, from_variant, to, to_variant string) {
2009 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2010 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2011 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002012 expectLink("libx", "shared_apex10000", "libz", "shared_current")
2013 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07002014 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
2015 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09002016}
2017
Jooyung Han4c4da062021-06-23 10:23:16 +09002018func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002019 t.Parallel()
Jooyung Han4c4da062021-06-23 10:23:16 +09002020 testApex(t, `
2021 apex {
2022 name: "myapex",
2023 key: "myapex.key",
2024 java_libs: ["libx"],
2025 min_sdk_version: "S",
2026 }
2027
2028 apex_key {
2029 name: "myapex.key",
2030 public_key: "testkey.avbpubkey",
2031 private_key: "testkey.pem",
2032 }
2033
2034 java_library {
2035 name: "libx",
2036 srcs: ["a.java"],
2037 apex_available: [ "myapex" ],
2038 sdk_version: "current",
2039 min_sdk_version: "S", // should be okay
Colin Crosse4f34882024-11-14 12:26:00 -08002040 compile_dex: true,
Jooyung Han4c4da062021-06-23 10:23:16 +09002041 }
2042 `,
2043 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2044 variables.Platform_version_active_codenames = []string{"S"}
2045 variables.Platform_sdk_codename = proptools.StringPtr("S")
2046 }),
2047 )
2048}
2049
Jooyung Han749dc692020-04-15 11:03:39 +09002050func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002051 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002052 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002053 apex {
2054 name: "myapex",
2055 key: "myapex.key",
2056 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002057 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002058 }
2059
2060 apex_key {
2061 name: "myapex.key",
2062 public_key: "testkey.avbpubkey",
2063 private_key: "testkey.pem",
2064 }
2065
2066 cc_library {
2067 name: "libx",
2068 shared_libs: ["libz"],
2069 system_shared_libs: [],
2070 stl: "none",
2071 apex_available: [ "myapex" ],
2072 }
2073
2074 cc_library {
2075 name: "libz",
2076 system_shared_libs: [],
2077 stl: "none",
2078 stubs: {
2079 versions: ["1", "2"],
2080 },
2081 }
2082 `)
2083
2084 expectLink := func(from, from_variant, to, to_variant string) {
2085 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2086 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2087 }
2088 expectNoLink := func(from, from_variant, to, to_variant string) {
2089 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2090 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2091 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002092 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002093 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002094 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07002095 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09002096}
2097
Jooyung Handfc864c2023-03-20 18:19:07 +09002098func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002099 t.Parallel()
Jiyong Park5df7bd32021-08-25 16:18:46 +09002100 ctx := testApex(t, `
2101 apex {
2102 name: "myapex",
2103 key: "myapex.key",
2104 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09002105 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002106 vendor: true,
2107 min_sdk_version: "29",
2108 }
2109
2110 apex_key {
2111 name: "myapex.key",
2112 public_key: "testkey.avbpubkey",
2113 private_key: "testkey.pem",
2114 }
2115
2116 cc_library {
2117 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09002118 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09002119 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002120 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09002121 shared_libs: ["libbar"],
2122 }
2123
2124 cc_library {
2125 name: "libbar",
2126 stubs: { versions: ["29", "30"] },
2127 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09002128 }
2129 `)
2130
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002131 vendorVariant := "android_vendor_arm64_armv8-a"
Jiyong Park5df7bd32021-08-25 16:18:46 +09002132
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002133 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29")
Jooyung Handfc864c2023-03-20 18:19:07 +09002134
2135 // Ensure that mylib links with "current" LLNDK
2136 libFlags := names(mylib.Rule("ld").Args["libFlags"])
Jooyung Han5e8994e2024-03-12 14:12:12 +09002137 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared/libbar.so")
Jooyung Handfc864c2023-03-20 18:19:07 +09002138
2139 // Ensure that mylib is targeting 29
2140 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
2141 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
2142
2143 // Ensure that the correct variant of crtbegin_so is used.
2144 crtBegin := mylib.Rule("ld").Args["crtBegin"]
2145 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09002146
2147 // Ensure that the crtbegin_so used by the APEX is targeting 29
2148 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
2149 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
2150}
2151
Jooyung Han4495f842023-04-25 16:39:59 +09002152func TestTrackAllowedDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002153 t.Parallel()
Jooyung Han4495f842023-04-25 16:39:59 +09002154 ctx := testApex(t, `
2155 apex {
2156 name: "myapex",
2157 key: "myapex.key",
2158 updatable: true,
2159 native_shared_libs: [
2160 "mylib",
2161 "yourlib",
2162 ],
2163 min_sdk_version: "29",
2164 }
2165
2166 apex {
2167 name: "myapex2",
2168 key: "myapex.key",
2169 updatable: false,
2170 native_shared_libs: ["yourlib"],
2171 }
2172
2173 apex_key {
2174 name: "myapex.key",
2175 public_key: "testkey.avbpubkey",
2176 private_key: "testkey.pem",
2177 }
2178
2179 cc_library {
2180 name: "mylib",
2181 srcs: ["mylib.cpp"],
2182 shared_libs: ["libbar"],
2183 min_sdk_version: "29",
2184 apex_available: ["myapex"],
2185 }
2186
2187 cc_library {
2188 name: "libbar",
2189 stubs: { versions: ["29", "30"] },
2190 }
2191
2192 cc_library {
2193 name: "yourlib",
2194 srcs: ["mylib.cpp"],
2195 min_sdk_version: "29",
2196 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2197 }
2198 `, withFiles(android.MockFS{
2199 "packages/modules/common/build/allowed_deps.txt": nil,
2200 }))
2201
2202 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2203 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2204 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002205 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002206 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002207 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002208
Jooyung Hana0503a52023-08-23 13:12:50 +09002209 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07002210 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2211 myapex.Output("depsinfo/flatlist.txt")), "\n")
Jooyung Han4495f842023-04-25 16:39:59 +09002212 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2213 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2214 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2215 flatlist, "mylib:(minSdkVersion:29)")
2216 android.AssertStringListContains(t, "track platform-available lib",
2217 flatlist, "yourlib(minSdkVersion:29)")
2218}
2219
Nouby Mohamed8609a552024-09-04 22:19:51 +00002220func TestTrackCustomAllowedDepsInvalidDefaultTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002221 t.Parallel()
Nouby Mohamed8609a552024-09-04 22:19:51 +00002222 ctx := testApex(t, `
2223 apex {
2224 name: "myapex",
2225 key: "myapex.key",
2226 updatable: true,
2227 native_shared_libs: [
2228 "mylib",
2229 "yourlib",
2230 ],
2231 min_sdk_version: "29",
2232 }
2233
2234 apex {
2235 name: "myapex2",
2236 key: "myapex.key",
2237 updatable: false,
2238 native_shared_libs: ["yourlib"],
2239 }
2240
2241 apex_key {
2242 name: "myapex.key",
2243 public_key: "testkey.avbpubkey",
2244 private_key: "testkey.pem",
2245 }
2246
2247 cc_library {
2248 name: "mylib",
2249 srcs: ["mylib.cpp"],
2250 shared_libs: ["libbar"],
2251 min_sdk_version: "29",
2252 apex_available: ["myapex"],
2253 }
2254
2255 cc_library {
2256 name: "libbar",
2257 stubs: { versions: ["29", "30"] },
2258 }
2259
2260 cc_library {
2261 name: "yourlib",
2262 srcs: ["mylib.cpp"],
2263 min_sdk_version: "29",
2264 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2265 }
2266 `, withFiles(android.MockFS{
2267 "packages/modules/common/build/custom_allowed_deps.txt": nil,
2268 }),
2269 android.FixtureModifyProductVariables(
2270 func(variables android.FixtureProductVariables) {
2271 variables.ExtraAllowedDepsTxt = proptools.StringPtr("packages/modules/common/build/custom_allowed_deps.txt")
2272 },
2273 ))
2274
2275 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2276 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2277 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
2278 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
2279 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
2280 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
2281
2282 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
2283 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2284 myapex.Output("depsinfo/flatlist.txt")), "\n")
2285 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2286 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2287 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2288 flatlist, "mylib:(minSdkVersion:29)")
2289 android.AssertStringListContains(t, "track platform-available lib",
2290 flatlist, "yourlib(minSdkVersion:29)")
2291}
2292
2293func TestTrackCustomAllowedDepsWithDefaultTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002294 t.Parallel()
Nouby Mohamed8609a552024-09-04 22:19:51 +00002295 ctx := testApex(t, `
2296 apex {
2297 name: "myapex",
2298 key: "myapex.key",
2299 updatable: true,
2300 native_shared_libs: [
2301 "mylib",
2302 "yourlib",
2303 ],
2304 min_sdk_version: "29",
2305 }
2306
2307 apex {
2308 name: "myapex2",
2309 key: "myapex.key",
2310 updatable: false,
2311 native_shared_libs: ["yourlib"],
2312 }
2313
2314 apex_key {
2315 name: "myapex.key",
2316 public_key: "testkey.avbpubkey",
2317 private_key: "testkey.pem",
2318 }
2319
2320 cc_library {
2321 name: "mylib",
2322 srcs: ["mylib.cpp"],
2323 shared_libs: ["libbar"],
2324 min_sdk_version: "29",
2325 apex_available: ["myapex"],
2326 }
2327
2328 cc_library {
2329 name: "libbar",
2330 stubs: { versions: ["29", "30"] },
2331 }
2332
2333 cc_library {
2334 name: "yourlib",
2335 srcs: ["mylib.cpp"],
2336 min_sdk_version: "29",
2337 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2338 }
2339 `, withFiles(android.MockFS{
2340 "packages/modules/common/build/custom_allowed_deps.txt": nil,
2341 "packages/modules/common/build/allowed_deps.txt": nil,
2342 }),
2343 android.FixtureModifyProductVariables(
2344 func(variables android.FixtureProductVariables) {
2345 variables.ExtraAllowedDepsTxt = proptools.StringPtr("packages/modules/common/build/custom_allowed_deps.txt")
2346 },
2347 ))
2348
2349 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2350 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2351 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
2352 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
2353 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
2354 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
2355
2356 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
2357 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2358 myapex.Output("depsinfo/flatlist.txt")), "\n")
2359 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2360 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2361 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2362 flatlist, "mylib:(minSdkVersion:29)")
2363 android.AssertStringListContains(t, "track platform-available lib",
2364 flatlist, "yourlib(minSdkVersion:29)")
2365}
2366
Jooyung Han4495f842023-04-25 16:39:59 +09002367func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002368 t.Parallel()
Jooyung Han4495f842023-04-25 16:39:59 +09002369 ctx := testApex(t, `
2370 apex {
2371 name: "myapex",
2372 key: "myapex.key",
2373 updatable: true,
2374 min_sdk_version: "29",
2375 }
2376
2377 apex_key {
2378 name: "myapex.key",
2379 public_key: "testkey.avbpubkey",
2380 private_key: "testkey.pem",
2381 }
2382 `)
2383 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2384 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2385 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2386 }
2387}
2388
Jooyung Han03b51852020-02-26 22:45:42 +09002389func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002390 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002391 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002392 apex {
2393 name: "myapex",
2394 key: "myapex.key",
2395 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002396 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002397 }
2398
2399 apex_key {
2400 name: "myapex.key",
2401 public_key: "testkey.avbpubkey",
2402 private_key: "testkey.pem",
2403 }
2404
2405 cc_library {
2406 name: "libx",
2407 system_shared_libs: [],
2408 stl: "none",
2409 apex_available: [ "myapex" ],
2410 stubs: {
2411 versions: ["1", "2"],
2412 },
2413 }
2414
2415 cc_library {
2416 name: "libz",
2417 shared_libs: ["libx"],
2418 system_shared_libs: [],
2419 stl: "none",
2420 }
2421 `)
2422
2423 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002424 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002425 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2426 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2427 }
2428 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002429 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002430 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2431 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2432 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002433 expectLink("libz", "shared", "libx", "shared_current")
2434 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002435 expectNoLink("libz", "shared", "libz", "shared_1")
2436 expectNoLink("libz", "shared", "libz", "shared")
2437}
2438
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002439var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2440 func(variables android.FixtureProductVariables) {
2441 variables.SanitizeDevice = []string{"hwaddress"}
2442 },
2443)
2444
Jooyung Han75568392020-03-20 04:29:24 +09002445func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002446 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002447 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002448 apex {
2449 name: "myapex",
2450 key: "myapex.key",
2451 native_shared_libs: ["libx"],
2452 min_sdk_version: "29",
2453 }
2454
2455 apex_key {
2456 name: "myapex.key",
2457 public_key: "testkey.avbpubkey",
2458 private_key: "testkey.pem",
2459 }
2460
2461 cc_library {
2462 name: "libx",
2463 shared_libs: ["libbar"],
2464 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002465 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002466 }
2467
2468 cc_library {
2469 name: "libbar",
2470 stubs: {
2471 versions: ["29", "30"],
2472 },
2473 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002474 `,
2475 prepareForTestWithSantitizeHwaddress,
2476 )
Jooyung Han03b51852020-02-26 22:45:42 +09002477 expectLink := func(from, from_variant, to, to_variant string) {
2478 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2479 libFlags := ld.Args["libFlags"]
2480 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2481 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002482 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002483}
2484
Jooyung Han75568392020-03-20 04:29:24 +09002485func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002486 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002487 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002488 apex {
2489 name: "myapex",
2490 key: "myapex.key",
2491 native_shared_libs: ["libx"],
2492 min_sdk_version: "29",
2493 }
2494
2495 apex_key {
2496 name: "myapex.key",
2497 public_key: "testkey.avbpubkey",
2498 private_key: "testkey.pem",
2499 }
2500
2501 cc_library {
2502 name: "libx",
2503 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002504 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002505 }
Jooyung Han75568392020-03-20 04:29:24 +09002506 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002507
2508 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002509 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002510 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002511 // note that platform variant is not.
2512 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002513 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002514}
2515
Jooyung Han749dc692020-04-15 11:03:39 +09002516func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002517 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002518 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002519 apex {
2520 name: "myapex",
2521 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002522 native_shared_libs: ["mylib"],
2523 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002524 }
2525
2526 apex_key {
2527 name: "myapex.key",
2528 public_key: "testkey.avbpubkey",
2529 private_key: "testkey.pem",
2530 }
Jooyung Han749dc692020-04-15 11:03:39 +09002531
2532 cc_library {
2533 name: "mylib",
2534 srcs: ["mylib.cpp"],
2535 system_shared_libs: [],
2536 stl: "none",
2537 apex_available: [
2538 "myapex",
2539 ],
2540 min_sdk_version: "30",
2541 }
2542 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002543
2544 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2545 apex {
2546 name: "myapex",
2547 key: "myapex.key",
2548 native_shared_libs: ["libfoo.ffi"],
2549 min_sdk_version: "29",
2550 }
2551
2552 apex_key {
2553 name: "myapex.key",
2554 public_key: "testkey.avbpubkey",
2555 private_key: "testkey.pem",
2556 }
2557
2558 rust_ffi_shared {
2559 name: "libfoo.ffi",
2560 srcs: ["foo.rs"],
2561 crate_name: "foo",
2562 apex_available: [
2563 "myapex",
2564 ],
2565 min_sdk_version: "30",
2566 }
2567 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002568
2569 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2570 apex {
2571 name: "myapex",
2572 key: "myapex.key",
2573 java_libs: ["libfoo"],
2574 min_sdk_version: "29",
2575 }
2576
2577 apex_key {
2578 name: "myapex.key",
2579 public_key: "testkey.avbpubkey",
2580 private_key: "testkey.pem",
2581 }
2582
2583 java_import {
2584 name: "libfoo",
2585 jars: ["libfoo.jar"],
2586 apex_available: [
2587 "myapex",
2588 ],
2589 min_sdk_version: "30",
Colin Crosse4f34882024-11-14 12:26:00 -08002590 compile_dex: true,
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002591 }
2592 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002593
2594 // Skip check for modules compiling against core API surface
2595 testApex(t, `
2596 apex {
2597 name: "myapex",
2598 key: "myapex.key",
2599 java_libs: ["libfoo"],
2600 min_sdk_version: "29",
2601 }
2602
2603 apex_key {
2604 name: "myapex.key",
2605 public_key: "testkey.avbpubkey",
2606 private_key: "testkey.pem",
2607 }
2608
2609 java_library {
2610 name: "libfoo",
2611 srcs: ["Foo.java"],
2612 apex_available: [
2613 "myapex",
2614 ],
2615 // Compile against core API surface
2616 sdk_version: "core_current",
2617 min_sdk_version: "30",
Colin Crosse4f34882024-11-14 12:26:00 -08002618 compile_dex: true,
Spandan Das7fa982c2023-02-24 18:38:56 +00002619 }
2620 `)
2621
Jooyung Han749dc692020-04-15 11:03:39 +09002622}
2623
2624func TestApexMinSdkVersion_Okay(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002625 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002626 testApex(t, `
2627 apex {
2628 name: "myapex",
2629 key: "myapex.key",
2630 native_shared_libs: ["libfoo"],
2631 java_libs: ["libbar"],
2632 min_sdk_version: "29",
2633 }
2634
2635 apex_key {
2636 name: "myapex.key",
2637 public_key: "testkey.avbpubkey",
2638 private_key: "testkey.pem",
2639 }
2640
2641 cc_library {
2642 name: "libfoo",
2643 srcs: ["mylib.cpp"],
2644 shared_libs: ["libfoo_dep"],
2645 apex_available: ["myapex"],
2646 min_sdk_version: "29",
2647 }
2648
2649 cc_library {
2650 name: "libfoo_dep",
2651 srcs: ["mylib.cpp"],
2652 apex_available: ["myapex"],
2653 min_sdk_version: "29",
2654 }
2655
2656 java_library {
2657 name: "libbar",
2658 sdk_version: "current",
2659 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002660 static_libs: [
2661 "libbar_dep",
2662 "libbar_import_dep",
2663 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002664 apex_available: ["myapex"],
2665 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -08002666 compile_dex: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002667 }
2668
2669 java_library {
2670 name: "libbar_dep",
2671 sdk_version: "current",
2672 srcs: ["a.java"],
2673 apex_available: ["myapex"],
2674 min_sdk_version: "29",
2675 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002676
2677 java_import {
2678 name: "libbar_import_dep",
2679 jars: ["libbar.jar"],
2680 apex_available: ["myapex"],
2681 min_sdk_version: "29",
2682 }
Jooyung Han03b51852020-02-26 22:45:42 +09002683 `)
2684}
2685
Colin Cross8ca61c12022-10-06 21:00:14 -07002686func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002687 t.Parallel()
Colin Cross8ca61c12022-10-06 21:00:14 -07002688 // Tests that an apex dependency with min_sdk_version higher than the
2689 // min_sdk_version of the apex is allowed as long as the dependency's
2690 // min_sdk_version is less than or equal to the api level that the
2691 // architecture was introduced in. In this case, arm64 didn't exist
2692 // until api level 21, so the arm64 code will never need to run on
2693 // an api level 20 device, even if other architectures of the apex
2694 // will.
2695 testApex(t, `
2696 apex {
2697 name: "myapex",
2698 key: "myapex.key",
2699 native_shared_libs: ["libfoo"],
2700 min_sdk_version: "20",
2701 }
2702
2703 apex_key {
2704 name: "myapex.key",
2705 public_key: "testkey.avbpubkey",
2706 private_key: "testkey.pem",
2707 }
2708
2709 cc_library {
2710 name: "libfoo",
2711 srcs: ["mylib.cpp"],
2712 apex_available: ["myapex"],
2713 min_sdk_version: "21",
2714 stl: "none",
2715 }
2716 `)
2717}
2718
Artur Satayev8cf899a2020-04-15 17:29:42 +01002719func TestJavaStableSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002720 t.Parallel()
Artur Satayev8cf899a2020-04-15 17:29:42 +01002721 testCases := []struct {
2722 name string
2723 expectedError string
2724 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002725 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002726 }{
2727 {
2728 name: "Non-updatable apex with non-stable dep",
2729 bp: `
2730 apex {
2731 name: "myapex",
2732 java_libs: ["myjar"],
2733 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002734 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002735 }
2736 apex_key {
2737 name: "myapex.key",
2738 public_key: "testkey.avbpubkey",
2739 private_key: "testkey.pem",
2740 }
2741 java_library {
2742 name: "myjar",
2743 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002744 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002745 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08002746 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002747 }
2748 `,
2749 },
2750 {
2751 name: "Updatable apex with stable dep",
2752 bp: `
2753 apex {
2754 name: "myapex",
2755 java_libs: ["myjar"],
2756 key: "myapex.key",
2757 updatable: true,
2758 min_sdk_version: "29",
2759 }
2760 apex_key {
2761 name: "myapex.key",
2762 public_key: "testkey.avbpubkey",
2763 private_key: "testkey.pem",
2764 }
2765 java_library {
2766 name: "myjar",
2767 srcs: ["foo/bar/MyClass.java"],
2768 sdk_version: "current",
2769 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002770 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -08002771 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002772 }
2773 `,
2774 },
2775 {
2776 name: "Updatable apex with non-stable dep",
2777 expectedError: "cannot depend on \"myjar\"",
2778 bp: `
2779 apex {
2780 name: "myapex",
2781 java_libs: ["myjar"],
2782 key: "myapex.key",
2783 updatable: true,
2784 }
2785 apex_key {
2786 name: "myapex.key",
2787 public_key: "testkey.avbpubkey",
2788 private_key: "testkey.pem",
2789 }
2790 java_library {
2791 name: "myjar",
2792 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002793 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002794 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08002795 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002796 }
2797 `,
2798 },
2799 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002800 name: "Updatable apex with non-stable legacy core platform dep",
2801 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2802 bp: `
2803 apex {
2804 name: "myapex",
2805 java_libs: ["myjar-uses-legacy"],
2806 key: "myapex.key",
2807 updatable: true,
2808 }
2809 apex_key {
2810 name: "myapex.key",
2811 public_key: "testkey.avbpubkey",
2812 private_key: "testkey.pem",
2813 }
2814 java_library {
2815 name: "myjar-uses-legacy",
2816 srcs: ["foo/bar/MyClass.java"],
2817 sdk_version: "core_platform",
2818 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08002819 compile_dex: true,
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002820 }
2821 `,
2822 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2823 },
2824 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002825 name: "Updatable apex with non-stable transitive dep",
2826 // This is not actually detecting that the transitive dependency is unstable, rather it is
2827 // detecting that the transitive dependency is building against a wider API surface than the
2828 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002829 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002830 bp: `
2831 apex {
2832 name: "myapex",
2833 java_libs: ["myjar"],
2834 key: "myapex.key",
2835 updatable: true,
2836 }
2837 apex_key {
2838 name: "myapex.key",
2839 public_key: "testkey.avbpubkey",
2840 private_key: "testkey.pem",
2841 }
2842 java_library {
2843 name: "myjar",
2844 srcs: ["foo/bar/MyClass.java"],
2845 sdk_version: "current",
2846 apex_available: ["myapex"],
2847 static_libs: ["transitive-jar"],
Colin Crosse4f34882024-11-14 12:26:00 -08002848 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002849 }
2850 java_library {
2851 name: "transitive-jar",
2852 srcs: ["foo/bar/MyClass.java"],
2853 sdk_version: "core_platform",
2854 apex_available: ["myapex"],
2855 }
2856 `,
2857 },
2858 }
2859
2860 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002861 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2862 continue
2863 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002864 t.Run(test.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002865 t.Parallel()
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002866 errorHandler := android.FixtureExpectsNoErrors
2867 if test.expectedError != "" {
2868 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002869 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002870 android.GroupFixturePreparers(
2871 java.PrepareForTestWithJavaDefaultModules,
2872 PrepareForTestWithApexBuildComponents,
2873 prepareForTestWithMyapex,
2874 android.OptionalFixturePreparer(test.preparer),
2875 ).
2876 ExtendWithErrorHandler(errorHandler).
2877 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002878 })
2879 }
2880}
2881
Jooyung Han749dc692020-04-15 11:03:39 +09002882func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2883 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2884 apex {
2885 name: "myapex",
2886 key: "myapex.key",
2887 native_shared_libs: ["mylib"],
2888 min_sdk_version: "29",
2889 }
2890
2891 apex_key {
2892 name: "myapex.key",
2893 public_key: "testkey.avbpubkey",
2894 private_key: "testkey.pem",
2895 }
2896
2897 cc_library {
2898 name: "mylib",
2899 srcs: ["mylib.cpp"],
2900 shared_libs: ["mylib2"],
2901 system_shared_libs: [],
2902 stl: "none",
2903 apex_available: [
2904 "myapex",
2905 ],
2906 min_sdk_version: "29",
2907 }
2908
2909 // indirect part of the apex
2910 cc_library {
2911 name: "mylib2",
2912 srcs: ["mylib.cpp"],
2913 system_shared_libs: [],
2914 stl: "none",
2915 apex_available: [
2916 "myapex",
2917 ],
2918 min_sdk_version: "30",
2919 }
2920 `)
2921}
2922
2923func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002924 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002925 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2926 apex {
2927 name: "myapex",
2928 key: "myapex.key",
2929 apps: ["AppFoo"],
2930 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002931 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002932 }
2933
2934 apex_key {
2935 name: "myapex.key",
2936 public_key: "testkey.avbpubkey",
2937 private_key: "testkey.pem",
2938 }
2939
2940 android_app {
2941 name: "AppFoo",
2942 srcs: ["foo/bar/MyClass.java"],
2943 sdk_version: "current",
2944 min_sdk_version: "29",
2945 system_modules: "none",
2946 stl: "none",
2947 static_libs: ["bar"],
2948 apex_available: [ "myapex" ],
2949 }
2950
2951 java_library {
2952 name: "bar",
2953 sdk_version: "current",
2954 srcs: ["a.java"],
2955 apex_available: [ "myapex" ],
2956 }
2957 `)
2958}
2959
2960func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002961 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002962 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002963 apex {
2964 name: "myapex",
2965 key: "myapex.key",
2966 native_shared_libs: ["mylib"],
2967 min_sdk_version: "29",
2968 }
2969
2970 apex_key {
2971 name: "myapex.key",
2972 public_key: "testkey.avbpubkey",
2973 private_key: "testkey.pem",
2974 }
2975
Colin Crossea91a172024-11-05 16:14:05 -08002976 // mylib will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002977 cc_library {
2978 name: "mylib",
2979 srcs: ["mylib.cpp"],
2980 shared_libs: ["mylib2"],
2981 system_shared_libs: [],
2982 stl: "none",
2983 apex_available: ["myapex", "otherapex"],
2984 min_sdk_version: "29",
2985 }
2986
2987 cc_library {
2988 name: "mylib2",
2989 srcs: ["mylib.cpp"],
2990 system_shared_libs: [],
2991 stl: "none",
2992 apex_available: ["otherapex"],
2993 stubs: { versions: ["29", "30"] },
2994 min_sdk_version: "30",
2995 }
2996
2997 apex {
2998 name: "otherapex",
2999 key: "myapex.key",
3000 native_shared_libs: ["mylib", "mylib2"],
3001 min_sdk_version: "30",
3002 }
3003 `)
3004 expectLink := func(from, from_variant, to, to_variant string) {
3005 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
3006 libFlags := ld.Args["libFlags"]
3007 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
3008 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09003009 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossea91a172024-11-05 16:14:05 -08003010 expectLink("mylib", "shared_apex30", "mylib2", "shared_current")
Jooyung Han749dc692020-04-15 11:03:39 +09003011}
3012
Jooyung Haned124c32021-01-26 11:43:46 +09003013func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003014 t.Parallel()
Paul Duffin0a49fdc2021-03-08 11:28:25 +00003015 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
3016 func(variables android.FixtureProductVariables) {
3017 variables.Platform_sdk_codename = proptools.StringPtr("S")
3018 variables.Platform_version_active_codenames = []string{"S"}
3019 },
3020 )
Jooyung Haned124c32021-01-26 11:43:46 +09003021 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
3022 apex {
3023 name: "myapex",
3024 key: "myapex.key",
3025 native_shared_libs: ["libfoo"],
3026 min_sdk_version: "S",
3027 }
3028 apex_key {
3029 name: "myapex.key",
3030 public_key: "testkey.avbpubkey",
3031 private_key: "testkey.pem",
3032 }
3033 cc_library {
3034 name: "libfoo",
3035 shared_libs: ["libbar"],
3036 apex_available: ["myapex"],
3037 min_sdk_version: "29",
3038 }
3039 cc_library {
3040 name: "libbar",
3041 apex_available: ["myapex"],
3042 }
3043 `, withSAsActiveCodeNames)
3044}
3045
3046func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003047 t.Parallel()
Paul Duffin0a49fdc2021-03-08 11:28:25 +00003048 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3049 variables.Platform_sdk_codename = proptools.StringPtr("S")
3050 variables.Platform_version_active_codenames = []string{"S", "T"}
3051 })
Colin Cross1c460562021-02-16 17:55:47 -08003052 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09003053 apex {
3054 name: "myapex",
3055 key: "myapex.key",
3056 native_shared_libs: ["libfoo"],
3057 min_sdk_version: "S",
3058 }
3059 apex_key {
3060 name: "myapex.key",
3061 public_key: "testkey.avbpubkey",
3062 private_key: "testkey.pem",
3063 }
3064 cc_library {
3065 name: "libfoo",
3066 shared_libs: ["libbar"],
3067 apex_available: ["myapex"],
3068 min_sdk_version: "S",
3069 }
3070 cc_library {
3071 name: "libbar",
3072 stubs: {
3073 symbol_file: "libbar.map.txt",
3074 versions: ["30", "S", "T"],
3075 },
3076 }
3077 `, withSAsActiveCodeNames)
3078
Jiyong Parkd4a3a132021-03-17 20:21:35 +09003079 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09003080 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
3081 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09003082 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09003083}
3084
Jiyong Park7c2ee712018-12-07 00:42:25 +09003085func TestFilesInSubDir(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003086 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003087 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09003088 apex {
3089 name: "myapex",
3090 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003091 native_shared_libs: ["mylib"],
Jooyung Han4ed512b2023-08-11 16:30:04 +09003092 binaries: ["mybin", "mybin.rust"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09003093 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003094 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003095 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09003096 }
3097
3098 apex_key {
3099 name: "myapex.key",
3100 public_key: "testkey.avbpubkey",
3101 private_key: "testkey.pem",
3102 }
3103
3104 prebuilt_etc {
3105 name: "myetc",
3106 src: "myprebuilt",
3107 sub_dir: "foo/bar",
3108 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003109
3110 cc_library {
3111 name: "mylib",
3112 srcs: ["mylib.cpp"],
3113 relative_install_path: "foo/bar",
3114 system_shared_libs: [],
3115 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003116 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003117 }
3118
3119 cc_binary {
3120 name: "mybin",
3121 srcs: ["mylib.cpp"],
3122 relative_install_path: "foo/bar",
3123 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003124 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003125 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003126 }
Jooyung Han4ed512b2023-08-11 16:30:04 +09003127
3128 rust_binary {
3129 name: "mybin.rust",
3130 srcs: ["foo.rs"],
3131 relative_install_path: "rust_subdir",
3132 apex_available: [ "myapex" ],
3133 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09003134 `)
3135
Jooyung Hana0503a52023-08-23 13:12:50 +09003136 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09003137 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09003138
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003139 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09003140 ensureContains(t, cmd, "/etc ")
3141 ensureContains(t, cmd, "/etc/foo ")
3142 ensureContains(t, cmd, "/etc/foo/bar ")
3143 ensureContains(t, cmd, "/lib64 ")
3144 ensureContains(t, cmd, "/lib64/foo ")
3145 ensureContains(t, cmd, "/lib64/foo/bar ")
3146 ensureContains(t, cmd, "/lib ")
3147 ensureContains(t, cmd, "/lib/foo ")
3148 ensureContains(t, cmd, "/lib/foo/bar ")
3149 ensureContains(t, cmd, "/bin ")
3150 ensureContains(t, cmd, "/bin/foo ")
3151 ensureContains(t, cmd, "/bin/foo/bar ")
Jooyung Han4ed512b2023-08-11 16:30:04 +09003152 ensureContains(t, cmd, "/bin/rust_subdir ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09003153}
Jiyong Parkda6eb592018-12-19 17:12:36 +09003154
Jooyung Han35155c42020-02-06 17:33:20 +09003155func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003156 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003157 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09003158 apex {
3159 name: "myapex",
3160 key: "myapex.key",
3161 multilib: {
3162 both: {
3163 native_shared_libs: ["mylib"],
3164 binaries: ["mybin"],
3165 },
3166 },
3167 compile_multilib: "both",
3168 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003169 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09003170 }
3171
3172 apex_key {
3173 name: "myapex.key",
3174 public_key: "testkey.avbpubkey",
3175 private_key: "testkey.pem",
3176 }
3177
3178 cc_library {
3179 name: "mylib",
3180 relative_install_path: "foo/bar",
3181 system_shared_libs: [],
3182 stl: "none",
3183 apex_available: [ "myapex" ],
3184 native_bridge_supported: true,
3185 }
3186
3187 cc_binary {
3188 name: "mybin",
3189 relative_install_path: "foo/bar",
3190 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09003191 stl: "none",
3192 apex_available: [ "myapex" ],
3193 native_bridge_supported: true,
3194 compile_multilib: "both", // default is "first" for binary
3195 multilib: {
3196 lib64: {
3197 suffix: "64",
3198 },
3199 },
3200 }
3201 `, withNativeBridgeEnabled)
Jooyung Hana0503a52023-08-23 13:12:50 +09003202 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han35155c42020-02-06 17:33:20 +09003203 "bin/foo/bar/mybin",
3204 "bin/foo/bar/mybin64",
3205 "bin/arm/foo/bar/mybin",
3206 "bin/arm64/foo/bar/mybin64",
3207 "lib/foo/bar/mylib.so",
3208 "lib/arm/foo/bar/mylib.so",
3209 "lib64/foo/bar/mylib.so",
3210 "lib64/arm64/foo/bar/mylib.so",
3211 })
3212}
3213
Jooyung Han85d61762020-06-24 23:50:26 +09003214func TestVendorApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003215 t.Parallel()
Colin Crossc68db4b2021-11-11 18:59:15 -08003216 result := android.GroupFixturePreparers(
3217 prepareForApexTest,
3218 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
3219 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09003220 apex {
3221 name: "myapex",
3222 key: "myapex.key",
3223 binaries: ["mybin"],
3224 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003225 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09003226 }
3227 apex_key {
3228 name: "myapex.key",
3229 public_key: "testkey.avbpubkey",
3230 private_key: "testkey.pem",
3231 }
3232 cc_binary {
3233 name: "mybin",
3234 vendor: true,
3235 shared_libs: ["libfoo"],
3236 }
3237 cc_library {
3238 name: "libfoo",
3239 proprietary: true,
3240 }
3241 `)
3242
Jooyung Hana0503a52023-08-23 13:12:50 +09003243 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09003244 "bin/mybin",
3245 "lib64/libfoo.so",
3246 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
3247 "lib64/libc++.so",
3248 })
3249
Jooyung Hana0503a52023-08-23 13:12:50 +09003250 apexBundle := result.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossc68db4b2021-11-11 18:59:15 -08003251 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09003252 name := apexBundle.BaseModuleName()
3253 prefix := "TARGET_"
3254 var builder strings.Builder
3255 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08003256 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01003257 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01003258 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003259
Jooyung Hana0503a52023-08-23 13:12:50 +09003260 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003261 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3262 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09003263}
3264
Justin Yun13decfb2021-03-08 19:25:55 +09003265func TestProductVariant(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003266 t.Parallel()
Justin Yun13decfb2021-03-08 19:25:55 +09003267 ctx := testApex(t, `
3268 apex {
3269 name: "myapex",
3270 key: "myapex.key",
3271 updatable: false,
3272 product_specific: true,
3273 binaries: ["foo"],
3274 }
3275
3276 apex_key {
3277 name: "myapex.key",
3278 public_key: "testkey.avbpubkey",
3279 private_key: "testkey.pem",
3280 }
3281
3282 cc_binary {
3283 name: "foo",
3284 product_available: true,
3285 apex_available: ["myapex"],
3286 srcs: ["foo.cpp"],
3287 }
Justin Yunaf1fde42023-09-27 16:22:10 +09003288 `)
Justin Yun13decfb2021-03-08 19:25:55 +09003289
3290 cflags := strings.Fields(
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003291 ctx.ModuleForTests("foo", "android_product_arm64_armv8-a_apex10000").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003292 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3293 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3294 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3295 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3296}
3297
Jooyung Han8e5685d2020-09-21 11:02:57 +09003298func TestApex_withPrebuiltFirmware(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003299 t.Parallel()
Jooyung Han8e5685d2020-09-21 11:02:57 +09003300 testCases := []struct {
3301 name string
3302 additionalProp string
3303 }{
3304 {"system apex with prebuilt_firmware", ""},
3305 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3306 }
3307 for _, tc := range testCases {
3308 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003309 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003310 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003311 apex {
3312 name: "myapex",
3313 key: "myapex.key",
3314 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003315 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003316 `+tc.additionalProp+`
3317 }
3318 apex_key {
3319 name: "myapex.key",
3320 public_key: "testkey.avbpubkey",
3321 private_key: "testkey.pem",
3322 }
3323 prebuilt_firmware {
3324 name: "myfirmware",
3325 src: "myfirmware.bin",
3326 filename_from_src: true,
3327 `+tc.additionalProp+`
3328 }
3329 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09003330 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han8e5685d2020-09-21 11:02:57 +09003331 "etc/firmware/myfirmware.bin",
3332 })
3333 })
3334 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003335}
3336
Jooyung Hanefb184e2020-06-25 17:14:25 +09003337func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003338 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003339 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003340 apex {
3341 name: "myapex",
3342 key: "myapex.key",
3343 vendor: true,
3344 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003345 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003346 }
3347
3348 apex_key {
3349 name: "myapex.key",
3350 public_key: "testkey.avbpubkey",
3351 private_key: "testkey.pem",
3352 }
3353
3354 cc_library {
3355 name: "mylib",
3356 vendor_available: true,
3357 }
3358 `)
3359
Jooyung Hana0503a52023-08-23 13:12:50 +09003360 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003361 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003362 name := apexBundle.BaseModuleName()
3363 prefix := "TARGET_"
3364 var builder strings.Builder
3365 data.Custom(&builder, name, prefix, "", data)
3366 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09003367 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 +09003368}
3369
Jooyung Han2ed99d02020-06-24 23:26:26 +09003370func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003371 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003372 apex {
3373 name: "myapex",
3374 key: "myapex.key",
3375 vintf_fragments: ["fragment.xml"],
3376 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003377 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003378 }
3379 apex_key {
3380 name: "myapex.key",
3381 public_key: "testkey.avbpubkey",
3382 private_key: "testkey.pem",
3383 }
3384 cc_binary {
3385 name: "mybin",
3386 }
3387 `)
3388
Jooyung Hana0503a52023-08-23 13:12:50 +09003389 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003390 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003391 name := apexBundle.BaseModuleName()
3392 prefix := "TARGET_"
3393 var builder strings.Builder
3394 data.Custom(&builder, name, prefix, "", data)
3395 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003396 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003397 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003398}
3399
Jiyong Park16e91a02018-12-20 18:18:08 +09003400func TestStaticLinking(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003401 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003402 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003403 apex {
3404 name: "myapex",
3405 key: "myapex.key",
3406 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003407 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003408 }
3409
3410 apex_key {
3411 name: "myapex.key",
3412 public_key: "testkey.avbpubkey",
3413 private_key: "testkey.pem",
3414 }
3415
3416 cc_library {
3417 name: "mylib",
3418 srcs: ["mylib.cpp"],
3419 system_shared_libs: [],
3420 stl: "none",
3421 stubs: {
3422 versions: ["1", "2", "3"],
3423 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003424 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003425 }
3426
3427 cc_binary {
3428 name: "not_in_apex",
3429 srcs: ["mylib.cpp"],
3430 static_libs: ["mylib"],
3431 static_executable: true,
3432 system_shared_libs: [],
3433 stl: "none",
3434 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003435 `)
3436
Colin Cross7113d202019-11-20 16:39:12 -08003437 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003438
3439 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003440 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003441}
Jiyong Park9335a262018-12-24 11:31:58 +09003442
3443func TestKeys(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003444 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003445 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003446 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003447 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003448 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003449 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003450 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003451 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003452 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003453 }
3454
3455 cc_library {
3456 name: "mylib",
3457 srcs: ["mylib.cpp"],
3458 system_shared_libs: [],
3459 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003460 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003461 }
3462
3463 apex_key {
3464 name: "myapex.key",
3465 public_key: "testkey.avbpubkey",
3466 private_key: "testkey.pem",
3467 }
3468
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003469 android_app_certificate {
3470 name: "myapex.certificate",
3471 certificate: "testkey",
3472 }
3473
3474 android_app_certificate {
3475 name: "myapex.certificate.override",
3476 certificate: "testkey.override",
3477 }
3478
Jiyong Park9335a262018-12-24 11:31:58 +09003479 `)
3480
3481 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003482 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003483
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003484 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3485 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003486 "vendor/foo/devkeys/testkey.avbpubkey")
3487 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003488 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3489 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003490 "vendor/foo/devkeys/testkey.pem")
3491 }
3492
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003493 // check the APK certs. It should be overridden to myapex.certificate.override
Jooyung Hana0503a52023-08-23 13:12:50 +09003494 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003495 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003496 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003497 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003498 }
3499}
Jiyong Park58e364a2019-01-19 19:24:06 +09003500
Jooyung Hanf121a652019-12-17 14:30:11 +09003501func TestCertificate(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003502 t.Parallel()
Jooyung Hanf121a652019-12-17 14:30:11 +09003503 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003504 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003505 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003506 apex {
3507 name: "myapex",
3508 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003509 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003510 }
3511 apex_key {
3512 name: "myapex.key",
3513 public_key: "testkey.avbpubkey",
3514 private_key: "testkey.pem",
3515 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003516 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003517 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3518 if actual := rule.Args["certificates"]; actual != expected {
3519 t.Errorf("certificates should be %q, not %q", expected, actual)
3520 }
3521 })
3522 t.Run("override when unspecified", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003523 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003524 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003525 apex {
3526 name: "myapex_keytest",
3527 key: "myapex.key",
3528 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003529 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003530 }
3531 apex_key {
3532 name: "myapex.key",
3533 public_key: "testkey.avbpubkey",
3534 private_key: "testkey.pem",
3535 }
3536 android_app_certificate {
3537 name: "myapex.certificate.override",
3538 certificate: "testkey.override",
3539 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003540 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003541 expected := "testkey.override.x509.pem testkey.override.pk8"
3542 if actual := rule.Args["certificates"]; actual != expected {
3543 t.Errorf("certificates should be %q, not %q", expected, actual)
3544 }
3545 })
3546 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003547 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003548 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003549 apex {
3550 name: "myapex",
3551 key: "myapex.key",
3552 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003553 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003554 }
3555 apex_key {
3556 name: "myapex.key",
3557 public_key: "testkey.avbpubkey",
3558 private_key: "testkey.pem",
3559 }
3560 android_app_certificate {
3561 name: "myapex.certificate",
3562 certificate: "testkey",
3563 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003564 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003565 expected := "testkey.x509.pem testkey.pk8"
3566 if actual := rule.Args["certificates"]; actual != expected {
3567 t.Errorf("certificates should be %q, not %q", expected, actual)
3568 }
3569 })
3570 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003571 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003572 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003573 apex {
3574 name: "myapex_keytest",
3575 key: "myapex.key",
3576 file_contexts: ":myapex-file_contexts",
3577 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003578 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003579 }
3580 apex_key {
3581 name: "myapex.key",
3582 public_key: "testkey.avbpubkey",
3583 private_key: "testkey.pem",
3584 }
3585 android_app_certificate {
3586 name: "myapex.certificate.override",
3587 certificate: "testkey.override",
3588 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003589 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003590 expected := "testkey.override.x509.pem testkey.override.pk8"
3591 if actual := rule.Args["certificates"]; actual != expected {
3592 t.Errorf("certificates should be %q, not %q", expected, actual)
3593 }
3594 })
3595 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003596 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003597 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003598 apex {
3599 name: "myapex",
3600 key: "myapex.key",
3601 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003602 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003603 }
3604 apex_key {
3605 name: "myapex.key",
3606 public_key: "testkey.avbpubkey",
3607 private_key: "testkey.pem",
3608 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003609 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003610 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3611 if actual := rule.Args["certificates"]; actual != expected {
3612 t.Errorf("certificates should be %q, not %q", expected, actual)
3613 }
3614 })
3615 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003616 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003617 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003618 apex {
3619 name: "myapex_keytest",
3620 key: "myapex.key",
3621 file_contexts: ":myapex-file_contexts",
3622 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003623 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003624 }
3625 apex_key {
3626 name: "myapex.key",
3627 public_key: "testkey.avbpubkey",
3628 private_key: "testkey.pem",
3629 }
3630 android_app_certificate {
3631 name: "myapex.certificate.override",
3632 certificate: "testkey.override",
3633 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003634 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003635 expected := "testkey.override.x509.pem testkey.override.pk8"
3636 if actual := rule.Args["certificates"]; actual != expected {
3637 t.Errorf("certificates should be %q, not %q", expected, actual)
3638 }
3639 })
3640}
3641
Jiyong Park58e364a2019-01-19 19:24:06 +09003642func TestMacro(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003643 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003644 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003645 apex {
3646 name: "myapex",
3647 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003648 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003649 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003650 }
3651
3652 apex {
3653 name: "otherapex",
3654 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003655 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003656 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003657 }
3658
3659 apex_key {
3660 name: "myapex.key",
3661 public_key: "testkey.avbpubkey",
3662 private_key: "testkey.pem",
3663 }
3664
3665 cc_library {
3666 name: "mylib",
3667 srcs: ["mylib.cpp"],
3668 system_shared_libs: [],
3669 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003670 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003671 "myapex",
3672 "otherapex",
3673 ],
Jooyung Han24282772020-03-21 23:20:55 +09003674 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003675 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003676 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003677 cc_library {
3678 name: "mylib2",
3679 srcs: ["mylib.cpp"],
3680 system_shared_libs: [],
3681 stl: "none",
3682 apex_available: [
3683 "myapex",
3684 "otherapex",
3685 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003686 static_libs: ["mylib3"],
3687 recovery_available: true,
3688 min_sdk_version: "29",
3689 }
3690 cc_library {
3691 name: "mylib3",
3692 srcs: ["mylib.cpp"],
3693 system_shared_libs: [],
3694 stl: "none",
3695 apex_available: [
3696 "myapex",
3697 "otherapex",
3698 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003699 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003700 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003701 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003702 `)
3703
Jooyung Hanc87a0592020-03-02 17:44:33 +09003704 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003705 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003706 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003707
Vinh Tranf9754732023-01-19 22:41:46 -05003708 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003709 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003710 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003711
Vinh Tranf9754732023-01-19 22:41:46 -05003712 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003713 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003714 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003715
Colin Crossaede88c2020-08-11 12:17:01 -07003716 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3717 // each variant defines additional macros to distinguish which apex variant it is built for
3718
3719 // non-APEX variant does not have __ANDROID_APEX__ defined
3720 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3721 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3722
Vinh Tranf9754732023-01-19 22:41:46 -05003723 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003724 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3725 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003726
Jooyung Hanc87a0592020-03-02 17:44:33 +09003727 // non-APEX variant does not have __ANDROID_APEX__ defined
3728 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3729 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3730
Vinh Tranf9754732023-01-19 22:41:46 -05003731 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003732 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003733 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003734}
Jiyong Park7e636d02019-01-28 16:16:54 +09003735
3736func TestHeaderLibsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003737 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003738 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003739 apex {
3740 name: "myapex",
3741 key: "myapex.key",
3742 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003743 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003744 }
3745
3746 apex_key {
3747 name: "myapex.key",
3748 public_key: "testkey.avbpubkey",
3749 private_key: "testkey.pem",
3750 }
3751
3752 cc_library_headers {
3753 name: "mylib_headers",
3754 export_include_dirs: ["my_include"],
3755 system_shared_libs: [],
3756 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003757 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003758 }
3759
3760 cc_library {
3761 name: "mylib",
3762 srcs: ["mylib.cpp"],
3763 system_shared_libs: [],
3764 stl: "none",
3765 header_libs: ["mylib_headers"],
3766 export_header_lib_headers: ["mylib_headers"],
3767 stubs: {
3768 versions: ["1", "2", "3"],
3769 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003770 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003771 }
3772
3773 cc_library {
3774 name: "otherlib",
3775 srcs: ["mylib.cpp"],
3776 system_shared_libs: [],
3777 stl: "none",
3778 shared_libs: ["mylib"],
3779 }
3780 `)
3781
Colin Cross7113d202019-11-20 16:39:12 -08003782 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003783
3784 // Ensure that the include path of the header lib is exported to 'otherlib'
3785 ensureContains(t, cFlags, "-Imy_include")
3786}
Alex Light9670d332019-01-29 18:07:33 -08003787
Jiyong Park7cd10e32020-01-14 09:22:18 +09003788type fileInApex struct {
3789 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003790 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003791 isLink bool
3792}
3793
Jooyung Han1724d582022-12-21 10:17:44 +09003794func (f fileInApex) String() string {
3795 return f.src + ":" + f.path
3796}
3797
3798func (f fileInApex) match(expectation string) bool {
3799 parts := strings.Split(expectation, ":")
3800 if len(parts) == 1 {
3801 match, _ := path.Match(parts[0], f.path)
3802 return match
3803 }
3804 if len(parts) == 2 {
3805 matchSrc, _ := path.Match(parts[0], f.src)
3806 matchDst, _ := path.Match(parts[1], f.path)
3807 return matchSrc && matchDst
3808 }
3809 panic("invalid expected file specification: " + expectation)
3810}
3811
Jooyung Hana57af4a2020-01-23 05:36:59 +00003812func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003813 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003814 module := ctx.ModuleForTests(moduleName, variant)
3815 apexRule := module.MaybeRule("apexRule")
3816 apexDir := "/image.apex/"
Jooyung Han31c470b2019-10-18 16:26:59 +09003817 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003818 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003819 for _, cmd := range strings.Split(copyCmds, "&&") {
3820 cmd = strings.TrimSpace(cmd)
3821 if cmd == "" {
3822 continue
3823 }
3824 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003825 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003826 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003827 switch terms[0] {
3828 case "mkdir":
3829 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003830 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003831 t.Fatal("copyCmds contains invalid cp command", cmd)
3832 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003833 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003834 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003835 isLink = false
3836 case "ln":
3837 if len(terms) != 3 && len(terms) != 4 {
3838 // ln LINK TARGET or ln -s LINK TARGET
3839 t.Fatal("copyCmds contains invalid ln command", cmd)
3840 }
3841 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003842 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003843 isLink = true
3844 default:
3845 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3846 }
3847 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003848 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003849 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003850 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003851 }
Jooyung Han1724d582022-12-21 10:17:44 +09003852 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003853 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003854 }
3855 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003856 return ret
3857}
3858
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003859func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003860 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003861 var failed bool
3862 var surplus []string
3863 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003864 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003865 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003866 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003867 if file.match(expected) {
3868 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003869 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003870 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003871 }
3872 }
Jooyung Han1724d582022-12-21 10:17:44 +09003873 if !matchFound {
3874 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003875 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003876 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003877
Jooyung Han31c470b2019-10-18 16:26:59 +09003878 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003879 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003880 t.Log("surplus files", surplus)
3881 failed = true
3882 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003883
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003884 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003885 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003886 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003887 if !filesMatched[expected] {
3888 missing = append(missing, expected)
3889 }
3890 }
3891 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003892 t.Log("missing files", missing)
3893 failed = true
3894 }
3895 if failed {
3896 t.Fail()
3897 }
3898}
3899
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003900func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3901 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3902}
3903
3904func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
Spandan Das52c01a12024-09-20 01:09:48 +00003905 deapexer := ctx.ModuleForTests(moduleName, variant).Description("deapex")
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003906 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3907 if deapexer.Output != nil {
3908 outputs = append(outputs, deapexer.Output.String())
3909 }
3910 for _, output := range deapexer.ImplicitOutputs {
3911 outputs = append(outputs, output.String())
3912 }
3913 actualFiles := make([]fileInApex, 0, len(outputs))
3914 for _, output := range outputs {
3915 dir := "/deapexer/"
3916 pos := strings.LastIndex(output, dir)
3917 if pos == -1 {
3918 t.Fatal("Unknown deapexer output ", output)
3919 }
3920 path := output[pos+len(dir):]
3921 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3922 }
3923 assertFileListEquals(t, files, actualFiles)
3924}
3925
Jooyung Han39edb6c2019-11-06 16:53:07 +09003926func vndkLibrariesTxtFiles(vers ...string) (result string) {
3927 for _, v := range vers {
Kiyoung Kim973cb6f2024-04-29 14:14:53 +09003928 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Justin Yund5784122023-10-25 13:25:32 +09003929 result += `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003930 prebuilt_etc {
3931 name: "` + txt + `.libraries.` + v + `.txt",
3932 src: "dummy.txt",
3933 }
3934 `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003935 }
3936 }
3937 return
3938}
3939
Jooyung Han344d5432019-08-23 11:17:39 +09003940func TestVndkApexVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003941 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003942 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003943 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003944 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003945 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003946 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003947 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003948 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003949 }
3950
3951 apex_key {
3952 name: "myapex.key",
3953 public_key: "testkey.avbpubkey",
3954 private_key: "testkey.pem",
3955 }
3956
Jooyung Han31c470b2019-10-18 16:26:59 +09003957 vndk_prebuilt_shared {
3958 name: "libvndk27",
3959 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003960 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003961 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003962 vndk: {
3963 enabled: true,
3964 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003965 target_arch: "arm64",
3966 arch: {
3967 arm: {
3968 srcs: ["libvndk27_arm.so"],
3969 },
3970 arm64: {
3971 srcs: ["libvndk27_arm64.so"],
3972 },
3973 },
Colin Cross2807f002021-03-02 10:15:29 -08003974 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003975 }
3976
3977 vndk_prebuilt_shared {
3978 name: "libvndk27",
3979 version: "27",
3980 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003981 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003982 vndk: {
3983 enabled: true,
3984 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003985 target_arch: "x86_64",
3986 arch: {
3987 x86: {
3988 srcs: ["libvndk27_x86.so"],
3989 },
3990 x86_64: {
3991 srcs: ["libvndk27_x86_64.so"],
3992 },
3993 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003994 }
3995 `+vndkLibrariesTxtFiles("27"),
3996 withFiles(map[string][]byte{
3997 "libvndk27_arm.so": nil,
3998 "libvndk27_arm64.so": nil,
3999 "libvndk27_x86.so": nil,
4000 "libvndk27_x86_64.so": nil,
4001 }))
Jooyung Han344d5432019-08-23 11:17:39 +09004002
Jooyung Hana0503a52023-08-23 13:12:50 +09004003 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004004 "lib/libvndk27_arm.so",
4005 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004006 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004007 })
Jooyung Han344d5432019-08-23 11:17:39 +09004008}
4009
Jooyung Han90eee022019-10-01 20:02:42 +09004010func TestVndkApexNameRule(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004011 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004012 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09004013 apex_vndk {
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004014 name: "com.android.vndk.v29",
Jooyung Han90eee022019-10-01 20:02:42 +09004015 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004016 file_contexts: ":myapex-file_contexts",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004017 vndk_version: "29",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004018 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004019 }
4020 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004021 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09004022 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004023 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09004024 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004025 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004026 }
4027 apex_key {
4028 name: "myapex.key",
4029 public_key: "testkey.avbpubkey",
4030 private_key: "testkey.pem",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004031 }`+vndkLibrariesTxtFiles("28", "29"))
Jooyung Han90eee022019-10-01 20:02:42 +09004032
4033 assertApexName := func(expected, moduleName string) {
Jooyung Hana0503a52023-08-23 13:12:50 +09004034 module := ctx.ModuleForTests(moduleName, "android_common")
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09004035 apexManifestRule := module.Rule("apexManifestRule")
4036 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004037 }
4038
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004039 assertApexName("com.android.vndk.v29", "com.android.vndk.v29")
Colin Cross2807f002021-03-02 10:15:29 -08004040 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004041}
4042
Jooyung Han344d5432019-08-23 11:17:39 +09004043func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004044 t.Parallel()
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004045 testApexError(t, `module "com.android.vndk.v30" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004046 apex_vndk {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004047 name: "com.android.vndk.v30",
4048 key: "com.android.vndk.v30.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004049 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004050 native_bridge_supported: true,
4051 }
4052
4053 apex_key {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004054 name: "com.android.vndk.v30.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004055 public_key: "testkey.avbpubkey",
4056 private_key: "testkey.pem",
4057 }
4058
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004059 vndk_prebuilt_shared {
Jooyung Han344d5432019-08-23 11:17:39 +09004060 name: "libvndk",
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004061 version: "30",
4062 target_arch: "arm",
Jooyung Han344d5432019-08-23 11:17:39 +09004063 srcs: ["mylib.cpp"],
4064 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004065 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004066 native_bridge_supported: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004067 vndk: {
4068 enabled: true,
4069 },
Jooyung Han344d5432019-08-23 11:17:39 +09004070 }
4071 `)
4072}
4073
Jooyung Han31c470b2019-10-18 16:26:59 +09004074func TestVndkApexWithBinder32(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004075 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004076 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09004077 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004078 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004079 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004080 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004081 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004082 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004083 }
4084
4085 apex_key {
4086 name: "myapex.key",
4087 public_key: "testkey.avbpubkey",
4088 private_key: "testkey.pem",
4089 }
4090
4091 vndk_prebuilt_shared {
4092 name: "libvndk27",
4093 version: "27",
4094 target_arch: "arm",
4095 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004096 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004097 vndk: {
4098 enabled: true,
4099 },
4100 arch: {
4101 arm: {
4102 srcs: ["libvndk27.so"],
4103 }
4104 },
4105 }
4106
4107 vndk_prebuilt_shared {
4108 name: "libvndk27",
4109 version: "27",
4110 target_arch: "arm",
4111 binder32bit: true,
4112 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004113 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004114 vndk: {
4115 enabled: true,
4116 },
4117 arch: {
4118 arm: {
4119 srcs: ["libvndk27binder32.so"],
4120 }
4121 },
Colin Cross2807f002021-03-02 10:15:29 -08004122 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004123 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004124 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004125 withFiles(map[string][]byte{
4126 "libvndk27.so": nil,
4127 "libvndk27binder32.so": nil,
4128 }),
4129 withBinder32bit,
Cole Faust69788792024-10-10 11:00:36 -07004130 android.FixtureModifyConfig(func(config android.Config) {
4131 target := android.Target{
4132 Os: android.Android,
4133 Arch: android.Arch{
4134 ArchType: android.Arm,
4135 ArchVariant: "armv7-a-neon",
4136 Abi: []string{"armeabi-v7a"},
4137 },
4138 NativeBridge: android.NativeBridgeDisabled,
4139 NativeBridgeHostArchName: "",
4140 NativeBridgeRelativePath: "",
4141 }
4142 config.Targets[android.Android] = []android.Target{target}
4143 config.AndroidFirstDeviceTarget = target
Jooyung Han31c470b2019-10-18 16:26:59 +09004144 }),
4145 )
4146
Jooyung Hana0503a52023-08-23 13:12:50 +09004147 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004148 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004149 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004150 })
4151}
4152
Jooyung Hane1633032019-08-01 17:41:43 +09004153func TestDependenciesInApexManifest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004154 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004155 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004156 apex {
4157 name: "myapex_nodep",
4158 key: "myapex.key",
4159 native_shared_libs: ["lib_nodep"],
4160 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004161 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004162 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004163 }
4164
4165 apex {
4166 name: "myapex_dep",
4167 key: "myapex.key",
4168 native_shared_libs: ["lib_dep"],
4169 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004170 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004171 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004172 }
4173
4174 apex {
4175 name: "myapex_provider",
4176 key: "myapex.key",
4177 native_shared_libs: ["libfoo"],
4178 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004179 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004180 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004181 }
4182
4183 apex {
4184 name: "myapex_selfcontained",
4185 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004186 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004187 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004188 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004189 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004190 }
4191
4192 apex_key {
4193 name: "myapex.key",
4194 public_key: "testkey.avbpubkey",
4195 private_key: "testkey.pem",
4196 }
4197
4198 cc_library {
4199 name: "lib_nodep",
4200 srcs: ["mylib.cpp"],
4201 system_shared_libs: [],
4202 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004203 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004204 }
4205
4206 cc_library {
4207 name: "lib_dep",
4208 srcs: ["mylib.cpp"],
4209 shared_libs: ["libfoo"],
4210 system_shared_libs: [],
4211 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004212 apex_available: [
4213 "myapex_dep",
4214 "myapex_provider",
4215 "myapex_selfcontained",
4216 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004217 }
4218
4219 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004220 name: "lib_dep_on_bar",
4221 srcs: ["mylib.cpp"],
4222 shared_libs: ["libbar"],
4223 system_shared_libs: [],
4224 stl: "none",
4225 apex_available: [
4226 "myapex_selfcontained",
4227 ],
4228 }
4229
4230
4231 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004232 name: "libfoo",
4233 srcs: ["mytest.cpp"],
4234 stubs: {
4235 versions: ["1"],
4236 },
4237 system_shared_libs: [],
4238 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004239 apex_available: [
4240 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004241 ],
4242 }
4243
4244 cc_library {
4245 name: "libbar",
4246 srcs: ["mytest.cpp"],
4247 stubs: {
4248 versions: ["1"],
4249 },
4250 system_shared_libs: [],
4251 stl: "none",
4252 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004253 "myapex_selfcontained",
4254 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004255 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004256
Jooyung Hane1633032019-08-01 17:41:43 +09004257 `)
4258
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004259 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004260 var provideNativeLibs, requireNativeLibs []string
4261
Jooyung Hana0503a52023-08-23 13:12:50 +09004262 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004263 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4264 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004265 ensureListEmpty(t, provideNativeLibs)
4266 ensureListEmpty(t, requireNativeLibs)
4267
Jooyung Hana0503a52023-08-23 13:12:50 +09004268 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004269 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4270 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004271 ensureListEmpty(t, provideNativeLibs)
4272 ensureListContains(t, requireNativeLibs, "libfoo.so")
4273
Jooyung Hana0503a52023-08-23 13:12:50 +09004274 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004275 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4276 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004277 ensureListContains(t, provideNativeLibs, "libfoo.so")
4278 ensureListEmpty(t, requireNativeLibs)
4279
Jooyung Hana0503a52023-08-23 13:12:50 +09004280 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004281 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4282 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004283 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004284 ensureListEmpty(t, requireNativeLibs)
4285}
4286
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004287func TestOverrideApexManifestDefaultVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004288 t.Parallel()
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004289 ctx := testApex(t, `
4290 apex {
4291 name: "myapex",
4292 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004293 native_shared_libs: ["mylib"],
4294 updatable: false,
4295 }
4296
4297 apex_key {
4298 name: "myapex.key",
4299 public_key: "testkey.avbpubkey",
4300 private_key: "testkey.pem",
4301 }
4302
4303 cc_library {
4304 name: "mylib",
4305 srcs: ["mylib.cpp"],
4306 system_shared_libs: [],
4307 stl: "none",
4308 apex_available: [
4309 "//apex_available:platform",
4310 "myapex",
4311 ],
4312 }
4313 `, android.FixtureMergeEnv(map[string]string{
4314 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4315 }))
4316
Jooyung Hana0503a52023-08-23 13:12:50 +09004317 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004318 apexManifestRule := module.Rule("apexManifestRule")
4319 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4320}
4321
Vinh Tran8f5310f2022-10-07 18:16:47 -04004322func TestCompileMultilibProp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004323 t.Parallel()
Vinh Tran8f5310f2022-10-07 18:16:47 -04004324 testCases := []struct {
4325 compileMultiLibProp string
4326 containedLibs []string
4327 notContainedLibs []string
4328 }{
4329 {
4330 containedLibs: []string{
4331 "image.apex/lib64/mylib.so",
4332 "image.apex/lib/mylib.so",
4333 },
4334 compileMultiLibProp: `compile_multilib: "both",`,
4335 },
4336 {
4337 containedLibs: []string{"image.apex/lib64/mylib.so"},
4338 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4339 compileMultiLibProp: `compile_multilib: "first",`,
4340 },
4341 {
4342 containedLibs: []string{"image.apex/lib64/mylib.so"},
4343 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4344 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4345 },
4346 {
4347 containedLibs: []string{"image.apex/lib64/mylib.so"},
4348 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4349 compileMultiLibProp: `compile_multilib: "64",`,
4350 },
4351 {
4352 containedLibs: []string{"image.apex/lib/mylib.so"},
4353 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4354 compileMultiLibProp: `compile_multilib: "32",`,
4355 },
4356 }
4357 for _, testCase := range testCases {
4358 ctx := testApex(t, fmt.Sprintf(`
4359 apex {
4360 name: "myapex",
4361 key: "myapex.key",
4362 %s
4363 native_shared_libs: ["mylib"],
4364 updatable: false,
4365 }
4366 apex_key {
4367 name: "myapex.key",
4368 public_key: "testkey.avbpubkey",
4369 private_key: "testkey.pem",
4370 }
4371 cc_library {
4372 name: "mylib",
4373 srcs: ["mylib.cpp"],
4374 apex_available: [
4375 "//apex_available:platform",
4376 "myapex",
4377 ],
4378 }
4379 `, testCase.compileMultiLibProp),
4380 )
Jooyung Hana0503a52023-08-23 13:12:50 +09004381 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Vinh Tran8f5310f2022-10-07 18:16:47 -04004382 apexRule := module.Rule("apexRule")
4383 copyCmds := apexRule.Args["copy_commands"]
4384 for _, containedLib := range testCase.containedLibs {
4385 ensureContains(t, copyCmds, containedLib)
4386 }
4387 for _, notContainedLib := range testCase.notContainedLibs {
4388 ensureNotContains(t, copyCmds, notContainedLib)
4389 }
4390 }
4391}
4392
Alex Light0851b882019-02-07 13:20:53 -08004393func TestNonTestApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004394 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004395 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004396 apex {
4397 name: "myapex",
4398 key: "myapex.key",
4399 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004400 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004401 }
4402
4403 apex_key {
4404 name: "myapex.key",
4405 public_key: "testkey.avbpubkey",
4406 private_key: "testkey.pem",
4407 }
4408
4409 cc_library {
4410 name: "mylib_common",
4411 srcs: ["mylib.cpp"],
4412 system_shared_libs: [],
4413 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004414 apex_available: [
4415 "//apex_available:platform",
4416 "myapex",
4417 ],
Alex Light0851b882019-02-07 13:20:53 -08004418 }
4419 `)
4420
Jooyung Hana0503a52023-08-23 13:12:50 +09004421 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004422 apexRule := module.Rule("apexRule")
4423 copyCmds := apexRule.Args["copy_commands"]
4424
4425 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4426 t.Log("Apex was a test apex!")
4427 t.Fail()
4428 }
4429 // Ensure that main rule creates an output
4430 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4431
4432 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004433 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004434
4435 // Ensure that both direct and indirect deps are copied into apex
4436 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4437
Colin Cross7113d202019-11-20 16:39:12 -08004438 // Ensure that the platform variant ends with _shared
4439 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004440
Colin Cross56a83212020-09-15 18:30:11 -07004441 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004442 t.Log("Found mylib_common not in any apex!")
4443 t.Fail()
4444 }
4445}
4446
4447func TestTestApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004448 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004449 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004450 apex_test {
4451 name: "myapex",
4452 key: "myapex.key",
4453 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004454 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004455 }
4456
4457 apex_key {
4458 name: "myapex.key",
4459 public_key: "testkey.avbpubkey",
4460 private_key: "testkey.pem",
4461 }
4462
4463 cc_library {
4464 name: "mylib_common_test",
4465 srcs: ["mylib.cpp"],
4466 system_shared_libs: [],
4467 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004468 // TODO: remove //apex_available:platform
4469 apex_available: [
4470 "//apex_available:platform",
4471 "myapex",
4472 ],
Alex Light0851b882019-02-07 13:20:53 -08004473 }
4474 `)
4475
Jooyung Hana0503a52023-08-23 13:12:50 +09004476 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004477 apexRule := module.Rule("apexRule")
4478 copyCmds := apexRule.Args["copy_commands"]
4479
4480 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4481 t.Log("Apex was not a test apex!")
4482 t.Fail()
4483 }
4484 // Ensure that main rule creates an output
4485 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4486
4487 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004488 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004489
4490 // Ensure that both direct and indirect deps are copied into apex
4491 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4492
Colin Cross7113d202019-11-20 16:39:12 -08004493 // Ensure that the platform variant ends with _shared
4494 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004495}
4496
Jooyung Han85707de2023-12-01 14:21:13 +09004497func TestLibzVendorIsntStable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004498 t.Parallel()
Jooyung Han85707de2023-12-01 14:21:13 +09004499 ctx := testApex(t, `
4500 apex {
4501 name: "myapex",
4502 key: "myapex.key",
4503 updatable: false,
4504 binaries: ["mybin"],
4505 }
4506 apex {
4507 name: "myvendorapex",
4508 key: "myapex.key",
4509 file_contexts: "myvendorapex_file_contexts",
4510 vendor: true,
4511 updatable: false,
4512 binaries: ["mybin"],
4513 }
4514 apex_key {
4515 name: "myapex.key",
4516 public_key: "testkey.avbpubkey",
4517 private_key: "testkey.pem",
4518 }
4519 cc_binary {
4520 name: "mybin",
4521 vendor_available: true,
4522 system_shared_libs: [],
4523 stl: "none",
4524 shared_libs: ["libz"],
4525 apex_available: ["//apex_available:anyapex"],
4526 }
4527 cc_library {
4528 name: "libz",
4529 vendor_available: true,
4530 system_shared_libs: [],
4531 stl: "none",
4532 stubs: {
4533 versions: ["28", "30"],
4534 },
4535 target: {
4536 vendor: {
4537 no_stubs: true,
4538 },
4539 },
4540 }
4541 `, withFiles(map[string][]byte{
4542 "myvendorapex_file_contexts": nil,
4543 }))
4544
4545 // libz provides stubs for core variant.
4546 {
4547 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
4548 "bin/mybin",
4549 })
4550 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
4551 android.AssertStringEquals(t, "should require libz", apexManifestRule.Args["requireNativeLibs"], "libz.so")
4552 }
4553 // libz doesn't provide stubs for vendor variant.
4554 {
4555 ensureExactContents(t, ctx, "myvendorapex", "android_common_myvendorapex", []string{
4556 "bin/mybin",
4557 "lib64/libz.so",
4558 })
4559 apexManifestRule := ctx.ModuleForTests("myvendorapex", "android_common_myvendorapex").Rule("apexManifestRule")
4560 android.AssertStringEquals(t, "should not require libz", apexManifestRule.Args["requireNativeLibs"], "")
4561 }
4562}
4563
Alex Light9670d332019-01-29 18:07:33 -08004564func TestApexWithTarget(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004565 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004566 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004567 apex {
4568 name: "myapex",
4569 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004570 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004571 multilib: {
4572 first: {
4573 native_shared_libs: ["mylib_common"],
4574 }
4575 },
4576 target: {
4577 android: {
4578 multilib: {
4579 first: {
4580 native_shared_libs: ["mylib"],
4581 }
4582 }
4583 },
4584 host: {
4585 multilib: {
4586 first: {
4587 native_shared_libs: ["mylib2"],
4588 }
4589 }
4590 }
4591 }
4592 }
4593
4594 apex_key {
4595 name: "myapex.key",
4596 public_key: "testkey.avbpubkey",
4597 private_key: "testkey.pem",
4598 }
4599
4600 cc_library {
4601 name: "mylib",
4602 srcs: ["mylib.cpp"],
4603 system_shared_libs: [],
4604 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004605 // TODO: remove //apex_available:platform
4606 apex_available: [
4607 "//apex_available:platform",
4608 "myapex",
4609 ],
Alex Light9670d332019-01-29 18:07:33 -08004610 }
4611
4612 cc_library {
4613 name: "mylib_common",
4614 srcs: ["mylib.cpp"],
4615 system_shared_libs: [],
4616 stl: "none",
4617 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004618 // TODO: remove //apex_available:platform
4619 apex_available: [
4620 "//apex_available:platform",
4621 "myapex",
4622 ],
Alex Light9670d332019-01-29 18:07:33 -08004623 }
4624
4625 cc_library {
4626 name: "mylib2",
4627 srcs: ["mylib.cpp"],
4628 system_shared_libs: [],
4629 stl: "none",
4630 compile_multilib: "first",
4631 }
4632 `)
4633
Jooyung Hana0503a52023-08-23 13:12:50 +09004634 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004635 copyCmds := apexRule.Args["copy_commands"]
4636
4637 // Ensure that main rule creates an output
4638 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4639
4640 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004641 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4642 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4643 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004644
4645 // Ensure that both direct and indirect deps are copied into apex
4646 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4647 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4648 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4649
Colin Cross7113d202019-11-20 16:39:12 -08004650 // Ensure that the platform variant ends with _shared
4651 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4652 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4653 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004654}
Jiyong Park04480cf2019-02-06 00:16:29 +09004655
Jiyong Park59140302020-12-14 18:44:04 +09004656func TestApexWithArch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004657 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004658 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004659 apex {
4660 name: "myapex",
4661 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004662 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004663 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004664 arch: {
4665 arm64: {
4666 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004667 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004668 },
4669 x86_64: {
4670 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004671 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004672 },
4673 }
4674 }
4675
4676 apex_key {
4677 name: "myapex.key",
4678 public_key: "testkey.avbpubkey",
4679 private_key: "testkey.pem",
4680 }
4681
4682 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004683 name: "mylib.generic",
4684 srcs: ["mylib.cpp"],
4685 system_shared_libs: [],
4686 stl: "none",
4687 // TODO: remove //apex_available:platform
4688 apex_available: [
4689 "//apex_available:platform",
4690 "myapex",
4691 ],
4692 }
4693
4694 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004695 name: "mylib.arm64",
4696 srcs: ["mylib.cpp"],
4697 system_shared_libs: [],
4698 stl: "none",
4699 // TODO: remove //apex_available:platform
4700 apex_available: [
4701 "//apex_available:platform",
4702 "myapex",
4703 ],
4704 }
4705
4706 cc_library {
4707 name: "mylib.x64",
4708 srcs: ["mylib.cpp"],
4709 system_shared_libs: [],
4710 stl: "none",
4711 // TODO: remove //apex_available:platform
4712 apex_available: [
4713 "//apex_available:platform",
4714 "myapex",
4715 ],
4716 }
4717 `)
4718
Jooyung Hana0503a52023-08-23 13:12:50 +09004719 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park59140302020-12-14 18:44:04 +09004720 copyCmds := apexRule.Args["copy_commands"]
4721
4722 // Ensure that apex variant is created for the direct dep
4723 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004724 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004725 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4726
4727 // Ensure that both direct and indirect deps are copied into apex
4728 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4729 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4730}
4731
Jiyong Park04480cf2019-02-06 00:16:29 +09004732func TestApexWithShBinary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004733 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004734 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004735 apex {
4736 name: "myapex",
4737 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004738 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004739 updatable: false,
Riya Thakur654461c2024-02-27 07:21:05 +00004740 compile_multilib: "both",
Jiyong Park04480cf2019-02-06 00:16:29 +09004741 }
4742
4743 apex_key {
4744 name: "myapex.key",
4745 public_key: "testkey.avbpubkey",
4746 private_key: "testkey.pem",
4747 }
4748
4749 sh_binary {
4750 name: "myscript",
4751 src: "mylib.cpp",
4752 filename: "myscript.sh",
4753 sub_dir: "script",
4754 }
4755 `)
4756
Jooyung Hana0503a52023-08-23 13:12:50 +09004757 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004758 copyCmds := apexRule.Args["copy_commands"]
4759
4760 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4761}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004762
Jooyung Han91df2082019-11-20 01:49:42 +09004763func TestApexInVariousPartition(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004764 t.Parallel()
Jooyung Han91df2082019-11-20 01:49:42 +09004765 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004766 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09004767 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004768 {"", "system"},
4769 {"product_specific: true", "product"},
4770 {"soc_specific: true", "vendor"},
4771 {"proprietary: true", "vendor"},
4772 {"vendor: true", "vendor"},
4773 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09004774 }
4775 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004776 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004777 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004778 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004779 apex {
4780 name: "myapex",
4781 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004782 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004783 `+tc.propName+`
4784 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004785
Jooyung Han91df2082019-11-20 01:49:42 +09004786 apex_key {
4787 name: "myapex.key",
4788 public_key: "testkey.avbpubkey",
4789 private_key: "testkey.pem",
4790 }
4791 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004792
Jooyung Hana0503a52023-08-23 13:12:50 +09004793 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004794 expected := "out/soong/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01004795 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004796 if actual != expected {
4797 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4798 }
Jooyung Han91df2082019-11-20 01:49:42 +09004799 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004800 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004801}
Jiyong Park67882562019-03-21 01:11:21 +09004802
Jooyung Han580eb4f2020-06-24 19:33:06 +09004803func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004804 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004805 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004806 apex {
4807 name: "myapex",
4808 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004809 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004810 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004811
Jooyung Han580eb4f2020-06-24 19:33:06 +09004812 apex_key {
4813 name: "myapex.key",
4814 public_key: "testkey.avbpubkey",
4815 private_key: "testkey.pem",
4816 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004817 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09004818 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004819 rule := module.Output("file_contexts")
4820 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4821}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004822
Jooyung Han580eb4f2020-06-24 19:33:06 +09004823func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004824 t.Parallel()
Jooyung Han54aca7b2019-11-20 02:26:02 +09004825 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004826 apex {
4827 name: "myapex",
4828 key: "myapex.key",
4829 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004830 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004831 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004832
Jooyung Han580eb4f2020-06-24 19:33:06 +09004833 apex_key {
4834 name: "myapex.key",
4835 public_key: "testkey.avbpubkey",
4836 private_key: "testkey.pem",
4837 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004838 `, withFiles(map[string][]byte{
4839 "my_own_file_contexts": nil,
4840 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004841}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004842
Jooyung Han580eb4f2020-06-24 19:33:06 +09004843func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004844 t.Parallel()
Jooyung Han54aca7b2019-11-20 02:26:02 +09004845 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004846 apex {
4847 name: "myapex",
4848 key: "myapex.key",
4849 product_specific: true,
4850 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004851 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004852 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004853
Jooyung Han580eb4f2020-06-24 19:33:06 +09004854 apex_key {
4855 name: "myapex.key",
4856 public_key: "testkey.avbpubkey",
4857 private_key: "testkey.pem",
4858 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004859 `)
4860
Colin Cross1c460562021-02-16 17:55:47 -08004861 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004862 apex {
4863 name: "myapex",
4864 key: "myapex.key",
4865 product_specific: true,
4866 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004867 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004868 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004869
Jooyung Han580eb4f2020-06-24 19:33:06 +09004870 apex_key {
4871 name: "myapex.key",
4872 public_key: "testkey.avbpubkey",
4873 private_key: "testkey.pem",
4874 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004875 `, withFiles(map[string][]byte{
4876 "product_specific_file_contexts": nil,
4877 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004878 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004879 rule := module.Output("file_contexts")
4880 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4881}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004882
Jooyung Han580eb4f2020-06-24 19:33:06 +09004883func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004884 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004885 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004886 apex {
4887 name: "myapex",
4888 key: "myapex.key",
4889 product_specific: true,
4890 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004891 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004892 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004893
Jooyung Han580eb4f2020-06-24 19:33:06 +09004894 apex_key {
4895 name: "myapex.key",
4896 public_key: "testkey.avbpubkey",
4897 private_key: "testkey.pem",
4898 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004899
Jooyung Han580eb4f2020-06-24 19:33:06 +09004900 filegroup {
4901 name: "my-file-contexts",
4902 srcs: ["product_specific_file_contexts"],
4903 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004904 `, withFiles(map[string][]byte{
4905 "product_specific_file_contexts": nil,
4906 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004907 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004908 rule := module.Output("file_contexts")
4909 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004910}
4911
Jiyong Park67882562019-03-21 01:11:21 +09004912func TestApexKeyFromOtherModule(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004913 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004914 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004915 apex_key {
4916 name: "myapex.key",
4917 public_key: ":my.avbpubkey",
4918 private_key: ":my.pem",
4919 product_specific: true,
4920 }
4921
4922 filegroup {
4923 name: "my.avbpubkey",
4924 srcs: ["testkey2.avbpubkey"],
4925 }
4926
4927 filegroup {
4928 name: "my.pem",
4929 srcs: ["testkey2.pem"],
4930 }
4931 `)
4932
4933 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4934 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004935 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004936 if actual_pubkey != expected_pubkey {
4937 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4938 }
4939 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004940 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004941 if actual_privkey != expected_privkey {
4942 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4943 }
4944}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004945
4946func TestPrebuilt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004947 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004948 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004949 prebuilt_apex {
4950 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004951 arch: {
4952 arm64: {
4953 src: "myapex-arm64.apex",
4954 },
4955 arm: {
4956 src: "myapex-arm.apex",
4957 },
4958 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004959 }
4960 `)
4961
Wei Li340ee8e2022-03-18 17:33:24 -07004962 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4963 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004964
Jiyong Parkc95714e2019-03-29 14:23:10 +09004965 expectedInput := "myapex-arm64.apex"
4966 if prebuilt.inputApex.String() != expectedInput {
4967 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4968 }
Wei Li340ee8e2022-03-18 17:33:24 -07004969 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4970 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4971 rule := testingModule.Rule("genProvenanceMetaData")
4972 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4973 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4974 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4975 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08004976
4977 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
4978 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004979}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004980
Paul Duffinc0609c62021-03-01 17:27:16 +00004981func TestPrebuiltMissingSrc(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004982 t.Parallel()
Paul Duffin6717d882021-06-15 19:09:41 +01004983 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004984 prebuilt_apex {
4985 name: "myapex",
4986 }
4987 `)
4988}
4989
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004990func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004991 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004992 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004993 prebuilt_apex {
4994 name: "myapex",
4995 src: "myapex-arm.apex",
4996 filename: "notmyapex.apex",
4997 }
4998 `)
4999
Wei Li340ee8e2022-03-18 17:33:24 -07005000 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5001 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005002
5003 expected := "notmyapex.apex"
5004 if p.installFilename != expected {
5005 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
5006 }
Wei Li340ee8e2022-03-18 17:33:24 -07005007 rule := testingModule.Rule("genProvenanceMetaData")
5008 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5009 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5010 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5011 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005012}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005013
Samiul Islam7c02e262021-09-08 17:48:28 +01005014func TestApexSetFilenameOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005015 t.Parallel()
Samiul Islam7c02e262021-09-08 17:48:28 +01005016 testApex(t, `
5017 apex_set {
5018 name: "com.company.android.myapex",
5019 apex_name: "com.android.myapex",
5020 set: "company-myapex.apks",
5021 filename: "com.company.android.myapex.apex"
5022 }
5023 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5024
5025 testApex(t, `
5026 apex_set {
5027 name: "com.company.android.myapex",
5028 apex_name: "com.android.myapex",
5029 set: "company-myapex.apks",
5030 filename: "com.company.android.myapex.capex"
5031 }
5032 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5033
5034 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
5035 apex_set {
5036 name: "com.company.android.myapex",
5037 apex_name: "com.android.myapex",
5038 set: "company-myapex.apks",
5039 filename: "some-random-suffix"
5040 }
5041 `)
5042}
5043
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005044func TestPrebuiltOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005045 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005046 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005047 prebuilt_apex {
5048 name: "myapex.prebuilt",
5049 src: "myapex-arm.apex",
5050 overrides: [
5051 "myapex",
5052 ],
5053 }
5054 `)
5055
Wei Li340ee8e2022-03-18 17:33:24 -07005056 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5057 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005058
5059 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005060 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005061 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005062 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005063 }
Wei Li340ee8e2022-03-18 17:33:24 -07005064 rule := testingModule.Rule("genProvenanceMetaData")
5065 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5066 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5067 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5068 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005069}
5070
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005071func TestPrebuiltApexName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005072 t.Parallel()
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005073 testApex(t, `
5074 prebuilt_apex {
5075 name: "com.company.android.myapex",
5076 apex_name: "com.android.myapex",
5077 src: "company-myapex-arm.apex",
5078 }
5079 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5080
5081 testApex(t, `
5082 apex_set {
5083 name: "com.company.android.myapex",
5084 apex_name: "com.android.myapex",
5085 set: "company-myapex.apks",
5086 }
5087 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5088}
5089
5090func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005091 t.Parallel()
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005092 _ = android.GroupFixturePreparers(
5093 java.PrepareForTestWithJavaDefaultModules,
5094 PrepareForTestWithApexBuildComponents,
5095 android.FixtureWithRootAndroidBp(`
5096 platform_bootclasspath {
5097 name: "platform-bootclasspath",
5098 fragments: [
5099 {
5100 apex: "com.android.art",
5101 module: "art-bootclasspath-fragment",
5102 },
5103 ],
5104 }
5105
5106 prebuilt_apex {
5107 name: "com.company.android.art",
5108 apex_name: "com.android.art",
5109 src: "com.company.android.art-arm.apex",
5110 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5111 }
5112
5113 prebuilt_bootclasspath_fragment {
5114 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005115 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005116 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005117 hidden_api: {
5118 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5119 metadata: "my-bootclasspath-fragment/metadata.csv",
5120 index: "my-bootclasspath-fragment/index.csv",
5121 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5122 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5123 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005124 }
5125
5126 java_import {
5127 name: "core-oj",
5128 jars: ["prebuilt.jar"],
5129 }
5130 `),
5131 ).RunTest(t)
5132}
5133
Spandan Das59a4a2b2024-01-09 21:35:56 +00005134// A minimal context object for use with DexJarBuildPath
5135type moduleErrorfTestCtx struct {
5136}
5137
5138func (ctx moduleErrorfTestCtx) ModuleErrorf(format string, args ...interface{}) {
5139}
5140
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005141func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005142 t.Parallel()
Paul Duffinb6f53c02021-05-14 07:52:42 +01005143 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005144 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005145 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5146 // is disabled.
5147 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
Spandan Das81fe4d12024-05-15 18:43:47 +00005148
5149 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
5150 // file creation.
5151 java.FixtureConfigureBootJars("platform:foo"),
5152 android.FixtureModifyMockFS(func(fs android.MockFS) {
5153 fs["platform/Android.bp"] = []byte(`
5154 java_library {
5155 name: "foo",
5156 srcs: ["Test.java"],
5157 compile_dex: true,
5158 }
5159 `)
5160 fs["platform/Test.java"] = nil
5161 }),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005162 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005163
Paul Duffin40a3f652021-07-19 13:11:24 +01005164 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005165 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005166 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005167 var rule android.TestingBuildParams
5168
5169 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5170 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005171 }
5172
Paul Duffin40a3f652021-07-19 13:11:24 +01005173 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5174 t.Helper()
5175 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5176 var rule android.TestingBuildParams
5177
5178 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5179 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5180 }
5181
Paul Duffin89f570a2021-06-16 01:42:33 +01005182 fragment := java.ApexVariantReference{
5183 Apex: proptools.StringPtr("myapex"),
5184 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5185 }
5186
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005187 t.Run("prebuilt only", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005188 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005189 bp := `
5190 prebuilt_apex {
5191 name: "myapex",
5192 arch: {
5193 arm64: {
5194 src: "myapex-arm64.apex",
5195 },
5196 arm: {
5197 src: "myapex-arm.apex",
5198 },
5199 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005200 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5201 }
5202
5203 prebuilt_bootclasspath_fragment {
5204 name: "my-bootclasspath-fragment",
5205 contents: ["libfoo", "libbar"],
5206 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005207 hidden_api: {
5208 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5209 metadata: "my-bootclasspath-fragment/metadata.csv",
5210 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005211 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5212 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5213 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005214 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005215 }
5216
Spandan Das52c01a12024-09-20 01:09:48 +00005217 java_sdk_library_import {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005218 name: "libfoo",
Spandan Das52c01a12024-09-20 01:09:48 +00005219 public: {
5220 jars: ["libfoo.jar"],
5221 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005222 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005223 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005224 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005225 }
Paul Duffin37856732021-02-26 14:24:15 +00005226
5227 java_sdk_library_import {
5228 name: "libbar",
5229 public: {
5230 jars: ["libbar.jar"],
5231 },
5232 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005233 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005234 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005235 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005236 `
5237
Paul Duffin89f570a2021-06-16 01:42:33 +01005238 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005239
Paul Duffin537ea3d2021-05-14 10:38:00 +01005240 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005241 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005242 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005243 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005244 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005245 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 +01005246 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005247 })
5248
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005249 t.Run("apex_set only", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005250 t.Parallel()
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005251 bp := `
5252 apex_set {
5253 name: "myapex",
5254 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005255 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005256 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5257 }
5258
Paul Duffin89f570a2021-06-16 01:42:33 +01005259 prebuilt_bootclasspath_fragment {
5260 name: "my-bootclasspath-fragment",
5261 contents: ["libfoo", "libbar"],
5262 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005263 hidden_api: {
5264 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5265 metadata: "my-bootclasspath-fragment/metadata.csv",
5266 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005267 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5268 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5269 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005270 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005271 }
5272
Liz Kammer2dc72442023-04-20 10:10:48 -04005273 prebuilt_systemserverclasspath_fragment {
5274 name: "my-systemserverclasspath-fragment",
5275 contents: ["libbaz"],
5276 apex_available: ["myapex"],
5277 }
5278
Spandan Das52c01a12024-09-20 01:09:48 +00005279 java_sdk_library_import {
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005280 name: "libfoo",
Spandan Das52c01a12024-09-20 01:09:48 +00005281 public: {
5282 jars: ["libfoo.jar"],
5283 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005284 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005285 shared_library: false,
5286 permitted_packages: ["libfoo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005287 }
5288
Spandan Das52c01a12024-09-20 01:09:48 +00005289
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005290 java_sdk_library_import {
5291 name: "libbar",
5292 public: {
5293 jars: ["libbar.jar"],
5294 },
5295 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005296 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005297 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005298 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005299
5300 java_sdk_library_import {
5301 name: "libbaz",
5302 public: {
5303 jars: ["libbaz.jar"],
5304 },
5305 apex_available: ["myapex"],
5306 shared_library: false,
5307 permitted_packages: ["baz"],
5308 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005309 `
5310
Paul Duffin89f570a2021-06-16 01:42:33 +01005311 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005312
Paul Duffin537ea3d2021-05-14 10:38:00 +01005313 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005314 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005315 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005316 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005317 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005318 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 +01005319 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005320
5321 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5322
5323 overrideNames := []string{
Spandan Dasa8e2d612024-07-26 19:24:27 +00005324 "",
Liz Kammer2dc72442023-04-20 10:10:48 -04005325 "myjavalib.myapex",
5326 "libfoo.myapex",
5327 "libbar.myapex",
5328 "libbaz.myapex",
5329 }
5330 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5331 for i, e := range mkEntries {
5332 g := e.OverrideName
5333 if w := overrideNames[i]; w != g {
5334 t.Errorf("Expected override name %q, got %q", w, g)
5335 }
5336 }
5337
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005338 })
5339
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005340 t.Run("prebuilt with source library preferred", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005341 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005342 bp := `
5343 prebuilt_apex {
5344 name: "myapex",
5345 arch: {
5346 arm64: {
5347 src: "myapex-arm64.apex",
5348 },
5349 arm: {
5350 src: "myapex-arm.apex",
5351 },
5352 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005353 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5354 }
5355
5356 prebuilt_bootclasspath_fragment {
5357 name: "my-bootclasspath-fragment",
5358 contents: ["libfoo", "libbar"],
5359 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005360 hidden_api: {
5361 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5362 metadata: "my-bootclasspath-fragment/metadata.csv",
5363 index: "my-bootclasspath-fragment/index.csv",
5364 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5365 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5366 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005367 }
5368
5369 java_import {
5370 name: "libfoo",
5371 jars: ["libfoo.jar"],
5372 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005373 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005374 }
5375
5376 java_library {
5377 name: "libfoo",
5378 srcs: ["foo/bar/MyClass.java"],
5379 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005380 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005381 }
Paul Duffin37856732021-02-26 14:24:15 +00005382
5383 java_sdk_library_import {
5384 name: "libbar",
5385 public: {
5386 jars: ["libbar.jar"],
5387 },
5388 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005389 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005390 }
5391
5392 java_sdk_library {
5393 name: "libbar",
5394 srcs: ["foo/bar/MyClass.java"],
5395 unsafe_ignore_missing_latest_api: true,
5396 apex_available: ["myapex"],
5397 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005398 `
5399
5400 // In this test the source (java_library) libfoo is active since the
5401 // prebuilt (java_import) defaults to prefer:false. However the
5402 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5403 // find the dex boot jar in it. We either need to disable the source libfoo
5404 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005405 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005406 // dexbootjar check is skipped if AllowMissingDependencies is true
5407 preparerAllowMissingDeps := android.GroupFixturePreparers(
5408 preparer,
5409 android.PrepareForTestWithAllowMissingDependencies,
5410 )
5411 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005412 })
5413
5414 t.Run("prebuilt library preferred with source", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005415 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005416 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005417 apex {
5418 name: "myapex",
5419 key: "myapex.key",
5420 updatable: false,
5421 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5422 }
5423
5424 apex_key {
5425 name: "myapex.key",
5426 public_key: "testkey.avbpubkey",
5427 private_key: "testkey.pem",
5428 }
5429
5430 bootclasspath_fragment {
5431 name: "my-bootclasspath-fragment",
5432 contents: ["libfoo", "libbar"],
5433 apex_available: ["myapex"],
5434 hidden_api: {
5435 split_packages: ["*"],
5436 },
5437 }
5438
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005439 prebuilt_apex {
5440 name: "myapex",
5441 arch: {
5442 arm64: {
5443 src: "myapex-arm64.apex",
5444 },
5445 arm: {
5446 src: "myapex-arm.apex",
5447 },
5448 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005449 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5450 }
5451
5452 prebuilt_bootclasspath_fragment {
5453 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005454 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005455 contents: ["libfoo", "libbar"],
5456 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005457 hidden_api: {
5458 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5459 metadata: "my-bootclasspath-fragment/metadata.csv",
5460 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005461 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5462 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5463 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005464 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005465 }
5466
Spandan Das52c01a12024-09-20 01:09:48 +00005467 java_sdk_library_import {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005468 name: "libfoo",
5469 prefer: true,
Spandan Das52c01a12024-09-20 01:09:48 +00005470 public: {
5471 jars: ["libfoo.jar"],
5472 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005473 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005474 shared_library: false,
5475 permitted_packages: ["libfoo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005476 }
5477
5478 java_library {
5479 name: "libfoo",
5480 srcs: ["foo/bar/MyClass.java"],
5481 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005482 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005483 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005484 }
Paul Duffin37856732021-02-26 14:24:15 +00005485
5486 java_sdk_library_import {
5487 name: "libbar",
5488 prefer: true,
5489 public: {
5490 jars: ["libbar.jar"],
5491 },
5492 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005493 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005494 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005495 }
5496
5497 java_sdk_library {
5498 name: "libbar",
5499 srcs: ["foo/bar/MyClass.java"],
5500 unsafe_ignore_missing_latest_api: true,
5501 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005502 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005503 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005504 `
5505
Paul Duffin89f570a2021-06-16 01:42:33 +01005506 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005507
Paul Duffin537ea3d2021-05-14 10:38:00 +01005508 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005509 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005510 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005511 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005512 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005513 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 +01005514 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005515 })
5516
5517 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005518 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005519 bp := `
5520 apex {
5521 name: "myapex",
5522 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005523 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005524 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005525 }
5526
5527 apex_key {
5528 name: "myapex.key",
5529 public_key: "testkey.avbpubkey",
5530 private_key: "testkey.pem",
5531 }
5532
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005533 bootclasspath_fragment {
5534 name: "my-bootclasspath-fragment",
5535 contents: ["libfoo", "libbar"],
5536 apex_available: ["myapex"],
5537 hidden_api: {
5538 split_packages: ["*"],
5539 },
5540 }
5541
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005542 prebuilt_apex {
5543 name: "myapex",
5544 arch: {
5545 arm64: {
5546 src: "myapex-arm64.apex",
5547 },
5548 arm: {
5549 src: "myapex-arm.apex",
5550 },
5551 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005552 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5553 }
5554
5555 prebuilt_bootclasspath_fragment {
5556 name: "my-bootclasspath-fragment",
5557 contents: ["libfoo", "libbar"],
5558 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005559 hidden_api: {
5560 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5561 metadata: "my-bootclasspath-fragment/metadata.csv",
5562 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005563 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5564 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5565 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005566 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005567 }
5568
5569 java_import {
5570 name: "libfoo",
5571 jars: ["libfoo.jar"],
5572 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005573 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005574 }
5575
5576 java_library {
5577 name: "libfoo",
5578 srcs: ["foo/bar/MyClass.java"],
5579 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005580 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005581 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005582 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005583 }
Paul Duffin37856732021-02-26 14:24:15 +00005584
5585 java_sdk_library_import {
5586 name: "libbar",
5587 public: {
5588 jars: ["libbar.jar"],
5589 },
5590 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005591 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005592 }
5593
5594 java_sdk_library {
5595 name: "libbar",
5596 srcs: ["foo/bar/MyClass.java"],
5597 unsafe_ignore_missing_latest_api: true,
5598 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005599 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005600 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005601 sdk_version: "core_current",
Paul Duffin37856732021-02-26 14:24:15 +00005602 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005603 `
5604
Paul Duffin89f570a2021-06-16 01:42:33 +01005605 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005606
Paul Duffin537ea3d2021-05-14 10:38:00 +01005607 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005608 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005609 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5610 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005611 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
5612 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 +01005613 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005614 })
5615
5616 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005617 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005618 bp := `
5619 apex {
5620 name: "myapex",
5621 enabled: false,
5622 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005623 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005624 }
5625
5626 apex_key {
5627 name: "myapex.key",
5628 public_key: "testkey.avbpubkey",
5629 private_key: "testkey.pem",
5630 }
5631
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005632 bootclasspath_fragment {
5633 name: "my-bootclasspath-fragment",
5634 enabled: false,
5635 contents: ["libfoo", "libbar"],
5636 apex_available: ["myapex"],
5637 hidden_api: {
5638 split_packages: ["*"],
5639 },
5640 }
5641
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005642 prebuilt_apex {
5643 name: "myapex",
5644 arch: {
5645 arm64: {
5646 src: "myapex-arm64.apex",
5647 },
5648 arm: {
5649 src: "myapex-arm.apex",
5650 },
5651 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005652 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5653 }
5654
5655 prebuilt_bootclasspath_fragment {
5656 name: "my-bootclasspath-fragment",
5657 contents: ["libfoo", "libbar"],
5658 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005659 hidden_api: {
5660 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5661 metadata: "my-bootclasspath-fragment/metadata.csv",
5662 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005663 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5664 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5665 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005666 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005667 }
5668
5669 java_import {
5670 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005671 jars: ["libfoo.jar"],
5672 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005673 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005674 }
5675
5676 java_library {
5677 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005678 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005679 srcs: ["foo/bar/MyClass.java"],
5680 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005681 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005682 }
Paul Duffin37856732021-02-26 14:24:15 +00005683
5684 java_sdk_library_import {
5685 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00005686 public: {
5687 jars: ["libbar.jar"],
5688 },
5689 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005690 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005691 permitted_packages: ["bar"],
Jihoon Kanga6d0aa82024-09-24 00:34:49 +00005692 prefer: true,
Paul Duffin37856732021-02-26 14:24:15 +00005693 }
5694
5695 java_sdk_library {
5696 name: "libbar",
5697 srcs: ["foo/bar/MyClass.java"],
5698 unsafe_ignore_missing_latest_api: true,
5699 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005700 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005701 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005702 `
Cole Fausta963b942024-04-11 17:43:00 -07005703 // This test disables libbar, which causes the ComponentDepsMutator to add
5704 // deps on libbar.stubs and other sub-modules that don't exist. We can
5705 // enable AllowMissingDependencies to work around that, but enabling that
5706 // causes extra checks for missing source files to dex_bootjars, so add those
5707 // to the mock fs as well.
5708 preparer2 := android.GroupFixturePreparers(
5709 preparer,
5710 android.PrepareForTestWithAllowMissingDependencies,
5711 android.FixtureMergeMockFs(map[string][]byte{
5712 "build/soong/scripts/check_boot_jars/package_allowed_list.txt": nil,
Colin Cross99939e92024-10-01 16:02:46 -07005713 "frameworks/base/boot/boot-profile.txt": nil,
Cole Fausta963b942024-04-11 17:43:00 -07005714 }),
5715 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005716
Cole Fausta963b942024-04-11 17:43:00 -07005717 ctx := testDexpreoptWithApexes(t, bp, "", preparer2, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005718
Paul Duffin537ea3d2021-05-14 10:38:00 +01005719 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005720 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005721 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005722 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005723 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005724 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 +01005725 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005726 })
Spandan Das3a392012024-01-17 18:26:27 +00005727
Spandan Dasf2c10572024-02-27 04:49:52 +00005728 t.Run("Co-existing unflagged apexes should create a duplicate module error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005729 t.Parallel()
Spandan Das3a392012024-01-17 18:26:27 +00005730 bp := `
5731 // Source
5732 apex {
5733 name: "myapex",
5734 enabled: false,
5735 key: "myapex.key",
5736 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5737 }
5738
5739 apex_key {
5740 name: "myapex.key",
5741 public_key: "testkey.avbpubkey",
5742 private_key: "testkey.pem",
5743 }
5744
5745 // Prebuilt
5746 prebuilt_apex {
5747 name: "myapex.v1",
5748 source_apex_name: "myapex",
5749 arch: {
5750 arm64: {
5751 src: "myapex-arm64.apex",
5752 },
5753 arm: {
5754 src: "myapex-arm.apex",
5755 },
5756 },
5757 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5758 prefer: true,
5759 }
5760 prebuilt_apex {
5761 name: "myapex.v2",
5762 source_apex_name: "myapex",
5763 arch: {
5764 arm64: {
5765 src: "myapex-arm64.apex",
5766 },
5767 arm: {
5768 src: "myapex-arm.apex",
5769 },
5770 },
5771 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5772 prefer: true,
5773 }
5774
5775 prebuilt_bootclasspath_fragment {
5776 name: "my-bootclasspath-fragment",
5777 contents: ["libfoo", "libbar"],
5778 apex_available: ["myapex"],
5779 hidden_api: {
5780 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5781 metadata: "my-bootclasspath-fragment/metadata.csv",
5782 index: "my-bootclasspath-fragment/index.csv",
5783 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5784 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5785 },
5786 prefer: true,
5787 }
5788
5789 java_import {
5790 name: "libfoo",
5791 jars: ["libfoo.jar"],
5792 apex_available: ["myapex"],
5793 prefer: true,
5794 }
5795 java_import {
5796 name: "libbar",
5797 jars: ["libbar.jar"],
5798 apex_available: ["myapex"],
5799 prefer: true,
5800 }
5801 `
5802
Spandan Dasf2c10572024-02-27 04:49:52 +00005803 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 +00005804 })
5805
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005806}
5807
Roland Levillain630846d2019-06-26 12:48:34 +01005808func TestApexWithTests(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005809 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005810 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005811 apex_test {
5812 name: "myapex",
5813 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005814 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005815 tests: [
5816 "mytest",
5817 ],
5818 }
5819
5820 apex_key {
5821 name: "myapex.key",
5822 public_key: "testkey.avbpubkey",
5823 private_key: "testkey.pem",
5824 }
5825
Liz Kammer1c14a212020-05-12 15:26:55 -07005826 filegroup {
5827 name: "fg",
5828 srcs: [
5829 "baz",
5830 "bar/baz"
5831 ],
5832 }
5833
Roland Levillain630846d2019-06-26 12:48:34 +01005834 cc_test {
5835 name: "mytest",
5836 gtest: false,
5837 srcs: ["mytest.cpp"],
5838 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005839 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005840 system_shared_libs: [],
5841 static_executable: true,
5842 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005843 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005844 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005845
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005846 cc_library {
5847 name: "mylib",
5848 srcs: ["mylib.cpp"],
5849 system_shared_libs: [],
5850 stl: "none",
5851 }
5852
Liz Kammer5bd365f2020-05-27 15:15:11 -07005853 filegroup {
5854 name: "fg2",
5855 srcs: [
5856 "testdata/baz"
5857 ],
5858 }
Roland Levillain630846d2019-06-26 12:48:34 +01005859 `)
5860
Jooyung Hana0503a52023-08-23 13:12:50 +09005861 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005862 copyCmds := apexRule.Args["copy_commands"]
5863
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005864 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005865 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005866 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005867
Liz Kammer1c14a212020-05-12 15:26:55 -07005868 //Ensure that test data are copied into apex.
5869 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5870 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5871
Roland Levillainf89cd092019-07-29 16:22:59 +01005872 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09005873 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005874 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005875 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005876 prefix := "TARGET_"
5877 var builder strings.Builder
5878 data.Custom(&builder, name, prefix, "", data)
5879 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00005880 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005881 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005882}
5883
Jooyung Hand48f3c32019-08-23 11:18:57 +09005884func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005885 t.Parallel()
Jooyung Hand48f3c32019-08-23 11:18:57 +09005886 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5887 apex {
5888 name: "myapex",
5889 key: "myapex.key",
5890 native_shared_libs: ["libfoo"],
5891 }
5892
5893 apex_key {
5894 name: "myapex.key",
5895 public_key: "testkey.avbpubkey",
5896 private_key: "testkey.pem",
5897 }
5898
5899 cc_library {
5900 name: "libfoo",
5901 stl: "none",
5902 system_shared_libs: [],
5903 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005904 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005905 }
5906 `)
5907 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5908 apex {
5909 name: "myapex",
5910 key: "myapex.key",
5911 java_libs: ["myjar"],
5912 }
5913
5914 apex_key {
5915 name: "myapex.key",
5916 public_key: "testkey.avbpubkey",
5917 private_key: "testkey.pem",
5918 }
5919
5920 java_library {
5921 name: "myjar",
5922 srcs: ["foo/bar/MyClass.java"],
5923 sdk_version: "none",
5924 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005925 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005926 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08005927 compile_dex: true,
Jooyung Hand48f3c32019-08-23 11:18:57 +09005928 }
5929 `)
5930}
5931
Bill Peckhama41a6962021-01-11 10:58:54 -08005932func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005933 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005934 apex {
5935 name: "myapex",
5936 key: "myapex.key",
5937 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005938 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005939 }
5940
5941 apex_key {
5942 name: "myapex.key",
5943 public_key: "testkey.avbpubkey",
5944 private_key: "testkey.pem",
5945 }
5946
5947 java_import {
5948 name: "myjavaimport",
5949 apex_available: ["myapex"],
5950 jars: ["my.jar"],
5951 compile_dex: true,
5952 }
5953 `)
5954
Jooyung Hana0503a52023-08-23 13:12:50 +09005955 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08005956 apexRule := module.Rule("apexRule")
5957 copyCmds := apexRule.Args["copy_commands"]
5958 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5959}
5960
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005961func TestApexWithApps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005962 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005963 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005964 apex {
5965 name: "myapex",
5966 key: "myapex.key",
5967 apps: [
5968 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005969 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005970 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005971 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005972 }
5973
5974 apex_key {
5975 name: "myapex.key",
5976 public_key: "testkey.avbpubkey",
5977 private_key: "testkey.pem",
5978 }
5979
5980 android_app {
5981 name: "AppFoo",
5982 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005983 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005984 system_modules: "none",
Jiyong Park970c5242024-05-17 22:58:54 +00005985 use_embedded_native_libs: true,
Jiyong Park8be103b2019-11-08 15:53:48 +09005986 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005987 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005988 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005989 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005990
5991 android_app {
5992 name: "AppFooPriv",
5993 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005994 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005995 system_modules: "none",
5996 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04005997 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08005998 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005999 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09006000 }
Jiyong Park8be103b2019-11-08 15:53:48 +09006001
6002 cc_library_shared {
6003 name: "libjni",
6004 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006005 shared_libs: ["libfoo"],
6006 stl: "none",
6007 system_shared_libs: [],
6008 apex_available: [ "myapex" ],
6009 sdk_version: "current",
6010 }
6011
6012 cc_library_shared {
6013 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09006014 stl: "none",
6015 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09006016 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006017 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006018 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006019 `)
6020
Jooyung Hana0503a52023-08-23 13:12:50 +09006021 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006022 apexRule := module.Rule("apexRule")
6023 copyCmds := apexRule.Args["copy_commands"]
6024
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006025 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6026 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006027 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006028
Colin Crossaede88c2020-08-11 12:17:01 -07006029 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006030 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006031 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006032 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006033 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006034 // JNI libraries including transitive deps are
6035 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006036 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006037 // ... embedded inside APK (jnilibs.zip)
6038 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6039 // ... and not directly inside the APEX
6040 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6041 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006042
6043 apexBundle := module.Module().(*apexBundle)
6044 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6045 var builder strings.Builder
6046 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6047 androidMk := builder.String()
6048 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6049 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6050 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6051 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6052 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6053 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 +01006054}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006055
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006056func TestApexWithAppImportBuildId(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006057 t.Parallel()
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006058 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6059 for _, id := range invalidBuildIds {
6060 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6061 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6062 variables.BuildId = proptools.StringPtr(id)
6063 })
6064 testApexError(t, message, `apex {
6065 name: "myapex",
6066 key: "myapex.key",
6067 apps: ["AppFooPrebuilt"],
6068 updatable: false,
6069 }
6070
6071 apex_key {
6072 name: "myapex.key",
6073 public_key: "testkey.avbpubkey",
6074 private_key: "testkey.pem",
6075 }
6076
6077 android_app_import {
6078 name: "AppFooPrebuilt",
6079 apk: "PrebuiltAppFoo.apk",
6080 presigned: true,
6081 apex_available: ["myapex"],
6082 }
6083 `, fixture)
6084 }
6085}
6086
Dario Frenicde2a032019-10-27 00:29:22 +01006087func TestApexWithAppImports(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006088 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006089 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006090 apex {
6091 name: "myapex",
6092 key: "myapex.key",
6093 apps: [
6094 "AppFooPrebuilt",
6095 "AppFooPrivPrebuilt",
6096 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006097 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006098 }
6099
6100 apex_key {
6101 name: "myapex.key",
6102 public_key: "testkey.avbpubkey",
6103 private_key: "testkey.pem",
6104 }
6105
6106 android_app_import {
6107 name: "AppFooPrebuilt",
6108 apk: "PrebuiltAppFoo.apk",
6109 presigned: true,
6110 dex_preopt: {
6111 enabled: false,
6112 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006113 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006114 }
6115
6116 android_app_import {
6117 name: "AppFooPrivPrebuilt",
6118 apk: "PrebuiltAppFooPriv.apk",
6119 privileged: true,
6120 presigned: true,
6121 dex_preopt: {
6122 enabled: false,
6123 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006124 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006125 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006126 }
6127 `)
6128
Jooyung Hana0503a52023-08-23 13:12:50 +09006129 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01006130 apexRule := module.Rule("apexRule")
6131 copyCmds := apexRule.Args["copy_commands"]
6132
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006133 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6134 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006135}
6136
6137func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006138 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006139 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006140 apex {
6141 name: "myapex",
6142 key: "myapex.key",
6143 apps: [
6144 "AppFoo",
6145 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006146 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006147 }
6148
6149 apex_key {
6150 name: "myapex.key",
6151 public_key: "testkey.avbpubkey",
6152 private_key: "testkey.pem",
6153 }
6154
6155 android_app {
6156 name: "AppFoo",
6157 srcs: ["foo/bar/MyClass.java"],
6158 sdk_version: "none",
6159 system_modules: "none",
6160 apex_available: [ "myapex" ],
6161 }
6162
6163 android_app_import {
6164 name: "AppFoo",
6165 apk: "AppFooPrebuilt.apk",
6166 filename: "AppFooPrebuilt.apk",
6167 presigned: true,
6168 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006169 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006170 }
6171 `, withFiles(map[string][]byte{
6172 "AppFooPrebuilt.apk": nil,
6173 }))
6174
Jooyung Hana0503a52023-08-23 13:12:50 +09006175 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006176 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006177 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006178}
6179
Dario Freni6f3937c2019-12-20 22:58:03 +00006180func TestApexWithTestHelperApp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006181 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006182 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006183 apex {
6184 name: "myapex",
6185 key: "myapex.key",
6186 apps: [
6187 "TesterHelpAppFoo",
6188 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006189 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006190 }
6191
6192 apex_key {
6193 name: "myapex.key",
6194 public_key: "testkey.avbpubkey",
6195 private_key: "testkey.pem",
6196 }
6197
6198 android_test_helper_app {
6199 name: "TesterHelpAppFoo",
6200 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006201 apex_available: [ "myapex" ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00006202 sdk_version: "test_current",
Dario Freni6f3937c2019-12-20 22:58:03 +00006203 }
6204
6205 `)
6206
Jooyung Hana0503a52023-08-23 13:12:50 +09006207 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00006208 apexRule := module.Rule("apexRule")
6209 copyCmds := apexRule.Args["copy_commands"]
6210
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006211 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006212}
6213
Jooyung Han18020ea2019-11-13 10:50:48 +09006214func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006215 t.Parallel()
Jooyung Han18020ea2019-11-13 10:50:48 +09006216 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006217 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006218 apex {
6219 name: "myapex",
6220 key: "myapex.key",
6221 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006222 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006223 }
6224
6225 apex_key {
6226 name: "myapex.key",
6227 public_key: "testkey.avbpubkey",
6228 private_key: "testkey.pem",
6229 }
6230
6231 apex {
6232 name: "otherapex",
6233 key: "myapex.key",
6234 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006235 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006236 }
6237
6238 cc_defaults {
6239 name: "libfoo-defaults",
6240 apex_available: ["otherapex"],
6241 }
6242
6243 cc_library {
6244 name: "libfoo",
6245 defaults: ["libfoo-defaults"],
6246 stl: "none",
6247 system_shared_libs: [],
6248 }`)
6249}
6250
Paul Duffine52e66f2020-03-30 17:54:29 +01006251func TestApexAvailable_DirectDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006252 t.Parallel()
Jiyong Park127b40b2019-09-30 16:04:35 +09006253 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006254 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006255 apex {
6256 name: "myapex",
6257 key: "myapex.key",
6258 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006259 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006260 }
6261
6262 apex_key {
6263 name: "myapex.key",
6264 public_key: "testkey.avbpubkey",
6265 private_key: "testkey.pem",
6266 }
6267
6268 apex {
6269 name: "otherapex",
6270 key: "otherapex.key",
6271 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006272 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006273 }
6274
6275 apex_key {
6276 name: "otherapex.key",
6277 public_key: "testkey.avbpubkey",
6278 private_key: "testkey.pem",
6279 }
6280
6281 cc_library {
6282 name: "libfoo",
6283 stl: "none",
6284 system_shared_libs: [],
6285 apex_available: ["otherapex"],
6286 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006287
6288 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6289 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6290 testApex(t, `
6291 apex {
6292 name: "com.sdv.myapex",
6293 key: "myapex.key",
6294 native_shared_libs: ["libfoo"],
6295 updatable: false,
6296 product_specific: true,
6297 }
6298
6299 apex_key {
6300 name: "myapex.key",
6301 public_key: "testkey.avbpubkey",
6302 private_key: "testkey.pem",
6303 }
6304
6305 apex {
6306 name: "com.any.otherapex",
6307 key: "otherapex.key",
6308 native_shared_libs: ["libfoo"],
6309 updatable: false,
6310 }
6311
6312 apex_key {
6313 name: "otherapex.key",
6314 public_key: "testkey.avbpubkey",
6315 private_key: "testkey.pem",
6316 }
6317
6318 cc_library {
6319 name: "libfoo",
6320 stl: "none",
6321 system_shared_libs: [],
6322 apex_available: ["com.any.otherapex"],
6323 product_specific: true,
6324 }`,
6325 android.FixtureMergeMockFs(android.MockFS{
6326 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6327 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6328 }))
6329
6330 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6331 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
6332 apex {
6333 name: "com.sdv.myapex",
6334 key: "myapex.key",
6335 native_shared_libs: ["libfoo"],
6336 updatable: false,
6337 }
6338
6339 apex_key {
6340 name: "myapex.key",
6341 public_key: "testkey.avbpubkey",
6342 private_key: "testkey.pem",
6343 }
6344
6345 apex {
6346 name: "com.any.otherapex",
6347 key: "otherapex.key",
6348 native_shared_libs: ["libfoo"],
6349 updatable: false,
6350 }
6351
6352 apex_key {
6353 name: "otherapex.key",
6354 public_key: "testkey.avbpubkey",
6355 private_key: "testkey.pem",
6356 }
6357
6358 cc_library {
6359 name: "libfoo",
6360 stl: "none",
6361 system_shared_libs: [],
6362 apex_available: ["com.any.otherapex"],
6363 }`,
6364 android.FixtureMergeMockFs(android.MockFS{
6365 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6366 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6367 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006368}
Jiyong Park127b40b2019-09-30 16:04:35 +09006369
Paul Duffine52e66f2020-03-30 17:54:29 +01006370func TestApexAvailable_IndirectDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006371 t.Parallel()
Jooyung Han5e9013b2020-03-10 06:23:13 +09006372 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006373 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006374.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006375.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006376.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006377.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006378.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006379.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006380 apex {
6381 name: "myapex",
6382 key: "myapex.key",
6383 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006384 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006385 }
6386
6387 apex_key {
6388 name: "myapex.key",
6389 public_key: "testkey.avbpubkey",
6390 private_key: "testkey.pem",
6391 }
6392
Jiyong Park127b40b2019-09-30 16:04:35 +09006393 cc_library {
6394 name: "libfoo",
6395 stl: "none",
6396 shared_libs: ["libbar"],
6397 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006398 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006399 }
6400
6401 cc_library {
6402 name: "libbar",
6403 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006404 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006405 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006406 apex_available: ["myapex"],
6407 }
6408
6409 cc_library {
6410 name: "libbaz",
6411 stl: "none",
6412 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006413 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006414
6415 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6416 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6417 testApex(t, `
6418 apex {
6419 name: "com.sdv.myapex",
6420 key: "myapex.key",
6421 native_shared_libs: ["libfoo"],
6422 updatable: false,
6423 product_specific: true,
6424 }
6425
6426 apex_key {
6427 name: "myapex.key",
6428 public_key: "testkey.avbpubkey",
6429 private_key: "testkey.pem",
6430 }
6431
6432 cc_library {
6433 name: "libfoo",
6434 stl: "none",
6435 shared_libs: ["libbar"],
6436 system_shared_libs: [],
6437 apex_available: ["com.sdv.myapex"],
6438 product_specific: true,
6439 }
6440
6441 cc_library {
6442 name: "libbar",
6443 stl: "none",
6444 shared_libs: ["libbaz"],
6445 system_shared_libs: [],
6446 apex_available: ["com.sdv.myapex"],
6447 product_specific: true,
6448 }
6449
6450 cc_library {
6451 name: "libbaz",
6452 stl: "none",
6453 system_shared_libs: [],
6454 product_specific: true,
6455 }`,
6456 android.FixtureMergeMockFs(android.MockFS{
6457 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6458 }))
6459
6460 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6461 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.`, `
6462 apex {
6463 name: "com.sdv.myapex",
6464 key: "myapex.key",
6465 native_shared_libs: ["libfoo"],
6466 updatable: false,
6467 }
6468
6469 apex_key {
6470 name: "myapex.key",
6471 public_key: "testkey.avbpubkey",
6472 private_key: "testkey.pem",
6473 }
6474
6475 cc_library {
6476 name: "libfoo",
6477 stl: "none",
6478 shared_libs: ["libbar"],
6479 system_shared_libs: [],
6480 apex_available: ["com.sdv.myapex"],
6481 }
6482
6483 cc_library {
6484 name: "libbar",
6485 stl: "none",
6486 shared_libs: ["libbaz"],
6487 system_shared_libs: [],
6488 apex_available: ["com.sdv.myapex"],
6489 }
6490
6491 cc_library {
6492 name: "libbaz",
6493 stl: "none",
6494 system_shared_libs: [],
6495 }`,
6496 android.FixtureMergeMockFs(android.MockFS{
6497 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6498 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006499}
Jiyong Park127b40b2019-09-30 16:04:35 +09006500
Liz Kammer5f108fa2023-05-11 14:33:17 -04006501func TestApexAvailable_IndirectStaticDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006502 t.Parallel()
Liz Kammer5f108fa2023-05-11 14:33:17 -04006503 testApex(t, `
6504 apex {
6505 name: "myapex",
6506 key: "myapex.key",
6507 native_shared_libs: ["libfoo"],
6508 updatable: false,
6509 }
6510
6511 apex_key {
6512 name: "myapex.key",
6513 public_key: "testkey.avbpubkey",
6514 private_key: "testkey.pem",
6515 }
6516
6517 cc_library {
6518 name: "libfoo",
6519 stl: "none",
6520 static_libs: ["libbar"],
6521 system_shared_libs: [],
6522 apex_available: ["myapex"],
6523 }
6524
6525 cc_library {
6526 name: "libbar",
6527 stl: "none",
6528 shared_libs: ["libbaz"],
6529 system_shared_libs: [],
6530 apex_available: ["myapex"],
6531 }
6532
6533 cc_library {
6534 name: "libbaz",
6535 stl: "none",
6536 system_shared_libs: [],
6537 }`)
6538
6539 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6540 apex {
6541 name: "myapex",
6542 key: "myapex.key",
6543 native_shared_libs: ["libfoo"],
6544 updatable: false,
6545 }
6546
6547 apex_key {
6548 name: "myapex.key",
6549 public_key: "testkey.avbpubkey",
6550 private_key: "testkey.pem",
6551 }
6552
6553 cc_library {
6554 name: "libfoo",
6555 stl: "none",
6556 static_libs: ["libbar"],
6557 system_shared_libs: [],
6558 apex_available: ["myapex"],
6559 }
6560
6561 cc_library {
6562 name: "libbar",
6563 stl: "none",
6564 system_shared_libs: [],
6565 }`)
6566}
6567
Paul Duffine52e66f2020-03-30 17:54:29 +01006568func TestApexAvailable_InvalidApexName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006569 t.Parallel()
Jiyong Park127b40b2019-09-30 16:04:35 +09006570 testApexError(t, "\"otherapex\" is not a valid module name", `
6571 apex {
6572 name: "myapex",
6573 key: "myapex.key",
6574 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006575 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006576 }
6577
6578 apex_key {
6579 name: "myapex.key",
6580 public_key: "testkey.avbpubkey",
6581 private_key: "testkey.pem",
6582 }
6583
6584 cc_library {
6585 name: "libfoo",
6586 stl: "none",
6587 system_shared_libs: [],
6588 apex_available: ["otherapex"],
6589 }`)
6590
Paul Duffine52e66f2020-03-30 17:54:29 +01006591 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006592 apex {
6593 name: "myapex",
6594 key: "myapex.key",
6595 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006596 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006597 }
6598
6599 apex_key {
6600 name: "myapex.key",
6601 public_key: "testkey.avbpubkey",
6602 private_key: "testkey.pem",
6603 }
6604
6605 cc_library {
6606 name: "libfoo",
6607 stl: "none",
6608 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006609 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006610 apex_available: ["myapex"],
6611 }
6612
6613 cc_library {
6614 name: "libbar",
6615 stl: "none",
6616 system_shared_libs: [],
6617 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006618 }
6619
6620 cc_library {
6621 name: "libbaz",
6622 stl: "none",
6623 system_shared_libs: [],
6624 stubs: {
6625 versions: ["10", "20", "30"],
6626 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006627 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006628}
Jiyong Park127b40b2019-09-30 16:04:35 +09006629
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006630func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006631 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006632 t.Run("negative variant_version produces error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006633 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006634 testApexError(t, "expected an integer between 0-9; got -1", `
6635 apex {
6636 name: "myapex",
6637 key: "myapex.key",
6638 apex_available_name: "com.android.foo",
6639 variant_version: "-1",
6640 updatable: false,
6641 }
6642 apex_key {
6643 name: "myapex.key",
6644 public_key: "testkey.avbpubkey",
6645 private_key: "testkey.pem",
6646 }
6647 `)
6648 })
6649
6650 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006651 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006652 testApexError(t, "expected an integer between 0-9; got 10", `
6653 apex {
6654 name: "myapex",
6655 key: "myapex.key",
6656 apex_available_name: "com.android.foo",
6657 variant_version: "10",
6658 updatable: false,
6659 }
6660 apex_key {
6661 name: "myapex.key",
6662 public_key: "testkey.avbpubkey",
6663 private_key: "testkey.pem",
6664 }
6665 `)
6666 })
6667}
6668
6669func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006670 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006671 context := android.GroupFixturePreparers(
6672 android.PrepareForIntegrationTestWithAndroid,
6673 PrepareForTestWithApexBuildComponents,
6674 android.FixtureMergeMockFs(android.MockFS{
6675 "system/sepolicy/apex/foo-file_contexts": nil,
6676 "system/sepolicy/apex/bar-file_contexts": nil,
6677 }),
6678 )
6679 result := context.RunTestWithBp(t, `
6680 apex {
6681 name: "foo",
6682 key: "myapex.key",
6683 apex_available_name: "com.android.foo",
6684 variant_version: "0",
6685 updatable: false,
6686 }
6687 apex {
6688 name: "bar",
6689 key: "myapex.key",
6690 apex_available_name: "com.android.foo",
6691 variant_version: "3",
6692 updatable: false,
6693 }
6694 apex_key {
6695 name: "myapex.key",
6696 public_key: "testkey.avbpubkey",
6697 private_key: "testkey.pem",
6698 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006699 override_apex {
6700 name: "myoverrideapex",
6701 base: "bar",
6702 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006703 `)
6704
Jooyung Hana0503a52023-08-23 13:12:50 +09006705 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +00006706 fooExpectedDefaultVersion := testDefaultUpdatableModuleVersion
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006707 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6708 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6709 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6710 }
6711
Jooyung Hana0503a52023-08-23 13:12:50 +09006712 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +00006713 defaultVersionInt, _ := strconv.Atoi(testDefaultUpdatableModuleVersion)
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006714 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6715 barActualDefaultVersion := barManifestRule.Args["default_version"]
6716 if barActualDefaultVersion != barExpectedDefaultVersion {
6717 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6718 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006719
Spandan Das50801e22024-05-13 18:29:45 +00006720 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_myoverrideapex").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04006721 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6722 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6723 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6724 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006725}
6726
Sam Delmericoca816532023-06-02 14:09:50 -04006727func TestApexAvailable_ApexAvailableName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006728 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006729 t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006730 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006731 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6732 apex {
6733 name: "myapex_sminus",
6734 key: "myapex.key",
6735 apps: ["AppFoo"],
6736 apex_available_name: "myapex",
6737 updatable: false,
6738 }
6739 apex {
6740 name: "myapex",
6741 key: "myapex.key",
6742 apps: ["AppFoo"],
6743 updatable: false,
6744 }
6745 apex_key {
6746 name: "myapex.key",
6747 public_key: "testkey.avbpubkey",
6748 private_key: "testkey.pem",
6749 }
6750 android_app {
6751 name: "AppFoo",
6752 srcs: ["foo/bar/MyClass.java"],
6753 sdk_version: "none",
6754 system_modules: "none",
6755 apex_available: [ "myapex_sminus" ],
6756 }`,
6757 android.FixtureMergeMockFs(android.MockFS{
6758 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6759 }),
6760 )
6761 })
6762
6763 t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006764 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006765 testApex(t, `
6766 apex {
6767 name: "myapex_sminus",
6768 key: "myapex.key",
6769 apps: ["AppFoo"],
6770 apex_available_name: "myapex",
6771 updatable: false,
6772 }
6773 apex {
6774 name: "myapex",
6775 key: "myapex.key",
6776 apps: ["AppFoo"],
6777 updatable: false,
6778 }
6779 apex_key {
6780 name: "myapex.key",
6781 public_key: "testkey.avbpubkey",
6782 private_key: "testkey.pem",
6783 }
6784 android_app {
6785 name: "AppFoo",
6786 srcs: ["foo/bar/MyClass.java"],
6787 sdk_version: "none",
6788 system_modules: "none",
6789 apex_available: [ "myapex" ],
6790 }`,
6791 android.FixtureMergeMockFs(android.MockFS{
6792 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6793 }),
6794 )
6795 })
6796
6797 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006798 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006799 testApex(t, `
6800 override_apex {
6801 name: "myoverrideapex_sminus",
6802 base: "myapex_sminus",
6803 key: "myapex.key",
6804 apps: ["AppFooOverride"],
6805 }
6806 override_apex {
6807 name: "myoverrideapex",
6808 base: "myapex",
6809 key: "myapex.key",
6810 apps: ["AppFooOverride"],
6811 }
6812 apex {
6813 name: "myapex_sminus",
6814 key: "myapex.key",
6815 apps: ["AppFoo"],
6816 apex_available_name: "myapex",
6817 updatable: false,
6818 }
6819 apex {
6820 name: "myapex",
6821 key: "myapex.key",
6822 apps: ["AppFoo"],
6823 updatable: false,
6824 }
6825 apex_key {
6826 name: "myapex.key",
6827 public_key: "testkey.avbpubkey",
6828 private_key: "testkey.pem",
6829 }
6830 android_app {
6831 name: "AppFooOverride",
6832 srcs: ["foo/bar/MyClass.java"],
6833 sdk_version: "none",
6834 system_modules: "none",
6835 apex_available: [ "myapex" ],
6836 }
6837 android_app {
6838 name: "AppFoo",
6839 srcs: ["foo/bar/MyClass.java"],
6840 sdk_version: "none",
6841 system_modules: "none",
6842 apex_available: [ "myapex" ],
6843 }`,
6844 android.FixtureMergeMockFs(android.MockFS{
6845 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6846 }),
6847 )
6848 })
6849}
6850
6851func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006852 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006853 context := android.GroupFixturePreparers(
6854 android.PrepareForIntegrationTestWithAndroid,
6855 PrepareForTestWithApexBuildComponents,
6856 java.PrepareForTestWithDexpreopt,
6857 android.FixtureMergeMockFs(android.MockFS{
6858 "system/sepolicy/apex/myapex-file_contexts": nil,
6859 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6860 }),
6861 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6862 variables.BuildId = proptools.StringPtr("buildid")
6863 }),
6864 )
6865 context.RunTestWithBp(t, `
6866 override_apex {
6867 name: "myoverrideapex_sminus",
6868 base: "myapex_sminus",
6869 }
6870 override_apex {
6871 name: "myoverrideapex",
6872 base: "myapex",
6873 }
6874 apex {
6875 name: "myapex",
6876 key: "myapex.key",
6877 apps: ["AppFoo"],
6878 updatable: false,
6879 }
6880 apex {
6881 name: "myapex_sminus",
6882 apex_available_name: "myapex",
6883 key: "myapex.key",
6884 apps: ["AppFoo_sminus"],
6885 updatable: false,
6886 }
6887 apex_key {
6888 name: "myapex.key",
6889 public_key: "testkey.avbpubkey",
6890 private_key: "testkey.pem",
6891 }
6892 android_app {
6893 name: "AppFoo",
6894 srcs: ["foo/bar/MyClass.java"],
6895 sdk_version: "none",
6896 system_modules: "none",
6897 apex_available: [ "myapex" ],
6898 }
6899 android_app {
6900 name: "AppFoo_sminus",
6901 srcs: ["foo/bar/MyClass.java"],
6902 sdk_version: "none",
6903 min_sdk_version: "29",
6904 system_modules: "none",
6905 apex_available: [ "myapex" ],
6906 }`)
6907}
6908
Jiyong Park89e850a2020-04-07 16:37:39 +09006909func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006910 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006911 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006912 apex {
6913 name: "myapex",
6914 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006915 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006916 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006917 }
6918
6919 apex_key {
6920 name: "myapex.key",
6921 public_key: "testkey.avbpubkey",
6922 private_key: "testkey.pem",
6923 }
6924
6925 cc_library {
6926 name: "libfoo",
6927 stl: "none",
6928 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006929 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006930 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006931 }
6932
6933 cc_library {
6934 name: "libfoo2",
6935 stl: "none",
6936 system_shared_libs: [],
6937 shared_libs: ["libbaz"],
6938 apex_available: ["//apex_available:platform"],
6939 }
6940
6941 cc_library {
6942 name: "libbar",
6943 stl: "none",
6944 system_shared_libs: [],
6945 apex_available: ["myapex"],
6946 }
6947
6948 cc_library {
6949 name: "libbaz",
6950 stl: "none",
6951 system_shared_libs: [],
6952 apex_available: ["myapex"],
6953 stubs: {
6954 versions: ["1"],
6955 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006956 }`)
6957
Jiyong Park89e850a2020-04-07 16:37:39 +09006958 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6959 // because it depends on libbar which isn't available to platform
6960 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6961 if libfoo.NotAvailableForPlatform() != true {
6962 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6963 }
6964
6965 // libfoo2 however can be available to platform because it depends on libbaz which provides
6966 // stubs
6967 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6968 if libfoo2.NotAvailableForPlatform() == true {
6969 t.Errorf("%q should be available to platform", libfoo2.String())
6970 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006971}
Jiyong Parka90ca002019-10-07 15:47:24 +09006972
Paul Duffine52e66f2020-03-30 17:54:29 +01006973func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006974 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006975 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006976 apex {
6977 name: "myapex",
6978 key: "myapex.key",
6979 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006980 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006981 }
6982
6983 apex_key {
6984 name: "myapex.key",
6985 public_key: "testkey.avbpubkey",
6986 private_key: "testkey.pem",
6987 }
6988
6989 cc_library {
6990 name: "libfoo",
6991 stl: "none",
6992 system_shared_libs: [],
6993 apex_available: ["myapex"],
6994 static: {
6995 apex_available: ["//apex_available:platform"],
6996 },
6997 }`)
6998
Jiyong Park89e850a2020-04-07 16:37:39 +09006999 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7000 if libfooShared.NotAvailableForPlatform() != true {
7001 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
7002 }
7003 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
7004 if libfooStatic.NotAvailableForPlatform() != false {
7005 t.Errorf("%q should be available to platform", libfooStatic.String())
7006 }
Jiyong Park127b40b2019-09-30 16:04:35 +09007007}
7008
Jooyung Han9a419e22024-08-16 17:14:21 +09007009func TestApexAvailable_PrefixMatch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007010 t.Parallel()
Jooyung Han9a419e22024-08-16 17:14:21 +09007011
7012 for _, tc := range []struct {
7013 name string
7014 apexAvailable string
7015 expectedError string
7016 }{
7017 {
7018 name: "prefix matches correctly",
7019 apexAvailable: "com.foo.*",
7020 },
7021 {
7022 name: "prefix doesn't match",
7023 apexAvailable: "com.bar.*",
7024 expectedError: `Consider .* "com.foo\.\*"`,
7025 },
7026 {
7027 name: "short prefix",
7028 apexAvailable: "com.*",
7029 expectedError: "requires two or more components",
7030 },
7031 {
7032 name: "wildcard not in the end",
7033 apexAvailable: "com.*.foo",
7034 expectedError: "should end with .*",
7035 },
7036 {
7037 name: "wildcard in the middle",
7038 apexAvailable: "com.foo*.*",
7039 expectedError: "not allowed in the middle",
7040 },
7041 {
7042 name: "hint with prefix pattern",
7043 apexAvailable: "//apex_available:platform",
7044 expectedError: "Consider adding \"com.foo.bar\" or \"com.foo.*\"",
7045 },
7046 } {
7047 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007048 t.Parallel()
Jooyung Han9a419e22024-08-16 17:14:21 +09007049 errorHandler := android.FixtureExpectsNoErrors
7050 if tc.expectedError != "" {
7051 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(tc.expectedError)
7052 }
7053 context := android.GroupFixturePreparers(
7054 prepareForApexTest,
7055 android.FixtureMergeMockFs(android.MockFS{
7056 "system/sepolicy/apex/com.foo.bar-file_contexts": nil,
7057 }),
7058 ).ExtendWithErrorHandler(errorHandler)
7059
7060 context.RunTestWithBp(t, `
7061 apex {
7062 name: "com.foo.bar",
7063 key: "myapex.key",
7064 native_shared_libs: ["libfoo"],
7065 updatable: false,
7066 }
7067
7068 apex_key {
7069 name: "myapex.key",
7070 public_key: "testkey.avbpubkey",
7071 private_key: "testkey.pem",
7072 }
7073
7074 cc_library {
7075 name: "libfoo",
7076 stl: "none",
7077 system_shared_libs: [],
7078 apex_available: ["`+tc.apexAvailable+`"],
7079 }`)
7080 })
7081 }
7082 testApexError(t, `Consider adding "com.foo" to`, `
7083 apex {
7084 name: "com.foo", // too short for a partner apex
7085 key: "myapex.key",
7086 native_shared_libs: ["libfoo"],
7087 updatable: false,
7088 }
7089
7090 apex_key {
7091 name: "myapex.key",
7092 public_key: "testkey.avbpubkey",
7093 private_key: "testkey.pem",
7094 }
7095
7096 cc_library {
7097 name: "libfoo",
7098 stl: "none",
7099 system_shared_libs: [],
7100 }
7101 `)
7102}
7103
Jooyung Hanb9518072024-11-22 14:05:20 +09007104func TestApexValidation_TestApexCanSkipInitRcCheck(t *testing.T) {
7105 t.Parallel()
7106 ctx := testApex(t, `
7107 apex_test {
7108 name: "myapex",
7109 key: "myapex.key",
7110 skip_validations: {
7111 host_apex_verifier: true,
7112 },
7113 updatable: false,
7114 }
7115 apex_key {
7116 name: "myapex.key",
7117 public_key: "testkey.avbpubkey",
7118 private_key: "testkey.pem",
7119 }
7120 `)
7121
7122 validations := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk").Validations.Strings()
7123 if android.SuffixInList(validations, "host_apex_verifier.timestamp") {
7124 t.Error("should not run host_apex_verifier")
7125 }
7126}
7127
7128func TestApexValidation_TestApexCheckInitRc(t *testing.T) {
7129 t.Parallel()
7130 ctx := testApex(t, `
7131 apex_test {
7132 name: "myapex",
7133 key: "myapex.key",
7134 updatable: false,
7135 }
7136 apex_key {
7137 name: "myapex.key",
7138 public_key: "testkey.avbpubkey",
7139 private_key: "testkey.pem",
7140 }
7141 `)
7142
7143 validations := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk").Validations.Strings()
7144 if !android.SuffixInList(validations, "host_apex_verifier.timestamp") {
7145 t.Error("should run host_apex_verifier")
7146 }
7147}
7148
Jiyong Park5d790c32019-11-15 18:40:32 +09007149func TestOverrideApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007150 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007151 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09007152 apex {
7153 name: "myapex",
7154 key: "myapex.key",
7155 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08007156 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007157 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007158 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007159 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09007160 }
7161
7162 override_apex {
7163 name: "override_myapex",
7164 base: "myapex",
7165 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08007166 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007167 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007168 overrides: ["unknownapex"],
Jesse Melhuishec60e252024-03-29 19:08:20 +00007169 compile_multilib: "first",
7170 multilib: {
7171 lib32: {
7172 native_shared_libs: ["mylib32"],
7173 },
7174 lib64: {
7175 native_shared_libs: ["mylib64"],
7176 },
7177 },
Baligh Uddin004d7172020-02-19 21:29:28 -08007178 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007179 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007180 key: "mynewapex.key",
7181 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09007182 }
7183
7184 apex_key {
7185 name: "myapex.key",
7186 public_key: "testkey.avbpubkey",
7187 private_key: "testkey.pem",
7188 }
7189
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007190 apex_key {
7191 name: "mynewapex.key",
7192 public_key: "testkey2.avbpubkey",
7193 private_key: "testkey2.pem",
7194 }
7195
7196 android_app_certificate {
7197 name: "myapex.certificate",
7198 certificate: "testkey",
7199 }
7200
Jiyong Park5d790c32019-11-15 18:40:32 +09007201 android_app {
7202 name: "app",
7203 srcs: ["foo/bar/MyClass.java"],
7204 package_name: "foo",
7205 sdk_version: "none",
7206 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007207 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09007208 }
7209
7210 override_android_app {
7211 name: "override_app",
7212 base: "app",
7213 package_name: "bar",
7214 }
markchien7c803b82021-08-26 22:10:06 +08007215
7216 bpf {
7217 name: "bpf",
7218 srcs: ["bpf.c"],
7219 }
7220
7221 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08007222 name: "overrideBpf",
7223 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08007224 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07007225
7226 prebuilt_etc {
7227 name: "myetc",
7228 src: "myprebuilt",
7229 }
7230
7231 prebuilt_etc {
7232 name: "override_myetc",
7233 src: "override_myprebuilt",
7234 }
Jesse Melhuishec60e252024-03-29 19:08:20 +00007235
7236 cc_library {
7237 name: "mylib32",
7238 apex_available: [ "myapex" ],
7239 }
7240
7241 cc_library {
7242 name: "mylib64",
7243 apex_available: [ "myapex" ],
7244 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007245 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007246
Jooyung Hana0503a52023-08-23 13:12:50 +09007247 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
Spandan Das50801e22024-05-13 18:29:45 +00007248 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09007249 if originalVariant.GetOverriddenBy() != "" {
7250 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7251 }
7252 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7253 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7254 }
7255
Spandan Das50801e22024-05-13 18:29:45 +00007256 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007257 apexRule := module.Rule("apexRule")
7258 copyCmds := apexRule.Args["copy_commands"]
7259
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007260 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7261 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007262
markchien7c803b82021-08-26 22:10:06 +08007263 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007264 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007265
Daniel Norman5a3ce132021-08-26 15:44:43 -07007266 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7267 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7268
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007269 apexBundle := module.Module().(*apexBundle)
7270 name := apexBundle.Name()
7271 if name != "override_myapex" {
7272 t.Errorf("name should be \"override_myapex\", but was %q", name)
7273 }
7274
Baligh Uddin004d7172020-02-19 21:29:28 -08007275 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7276 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7277 }
7278
Jiyong Park20bacab2020-03-03 11:45:41 +09007279 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007280 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007281 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7282
7283 signApkRule := module.Rule("signapk")
7284 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007285
Colin Crossaa255532020-07-03 13:18:24 -07007286 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007287 var builder strings.Builder
7288 data.Custom(&builder, name, "TARGET_", "", data)
7289 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007290 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7291 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007292 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007293 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007294 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007295 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007296 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007297 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007298}
7299
Albert Martineefabcf2022-03-21 20:11:16 +00007300func TestMinSdkVersionOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007301 t.Parallel()
Albert Martineefabcf2022-03-21 20:11:16 +00007302 // Override from 29 to 31
7303 minSdkOverride31 := "31"
7304 ctx := testApex(t, `
7305 apex {
7306 name: "myapex",
7307 key: "myapex.key",
7308 native_shared_libs: ["mylib"],
7309 updatable: true,
7310 min_sdk_version: "29"
7311 }
7312
7313 override_apex {
7314 name: "override_myapex",
7315 base: "myapex",
7316 logging_parent: "com.foo.bar",
7317 package_name: "test.overridden.package"
7318 }
7319
7320 apex_key {
7321 name: "myapex.key",
7322 public_key: "testkey.avbpubkey",
7323 private_key: "testkey.pem",
7324 }
7325
7326 cc_library {
7327 name: "mylib",
7328 srcs: ["mylib.cpp"],
7329 runtime_libs: ["libbar"],
7330 system_shared_libs: [],
7331 stl: "none",
7332 apex_available: [ "myapex" ],
7333 min_sdk_version: "apex_inherit"
7334 }
7335
7336 cc_library {
7337 name: "libbar",
7338 srcs: ["mylib.cpp"],
7339 system_shared_libs: [],
7340 stl: "none",
7341 apex_available: [ "myapex" ],
7342 min_sdk_version: "apex_inherit"
7343 }
7344
7345 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7346
Jooyung Hana0503a52023-08-23 13:12:50 +09007347 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007348 copyCmds := apexRule.Args["copy_commands"]
7349
7350 // Ensure that direct non-stubs dep is always included
7351 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7352
7353 // Ensure that runtime_libs dep in included
7354 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7355
7356 // Ensure libraries target overridden min_sdk_version value
7357 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7358}
7359
7360func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007361 t.Parallel()
Albert Martineefabcf2022-03-21 20:11:16 +00007362 // Attempt to override from 31 to 29, should be a NOOP
7363 minSdkOverride29 := "29"
7364 ctx := testApex(t, `
7365 apex {
7366 name: "myapex",
7367 key: "myapex.key",
7368 native_shared_libs: ["mylib"],
7369 updatable: true,
7370 min_sdk_version: "31"
7371 }
7372
7373 override_apex {
7374 name: "override_myapex",
7375 base: "myapex",
7376 logging_parent: "com.foo.bar",
7377 package_name: "test.overridden.package"
7378 }
7379
7380 apex_key {
7381 name: "myapex.key",
7382 public_key: "testkey.avbpubkey",
7383 private_key: "testkey.pem",
7384 }
7385
7386 cc_library {
7387 name: "mylib",
7388 srcs: ["mylib.cpp"],
7389 runtime_libs: ["libbar"],
7390 system_shared_libs: [],
7391 stl: "none",
7392 apex_available: [ "myapex" ],
7393 min_sdk_version: "apex_inherit"
7394 }
7395
7396 cc_library {
7397 name: "libbar",
7398 srcs: ["mylib.cpp"],
7399 system_shared_libs: [],
7400 stl: "none",
7401 apex_available: [ "myapex" ],
7402 min_sdk_version: "apex_inherit"
7403 }
7404
7405 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7406
Jooyung Hana0503a52023-08-23 13:12:50 +09007407 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007408 copyCmds := apexRule.Args["copy_commands"]
7409
7410 // Ensure that direct non-stubs dep is always included
7411 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7412
7413 // Ensure that runtime_libs dep in included
7414 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7415
7416 // Ensure libraries target the original min_sdk_version value rather than the overridden
7417 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7418}
7419
Jooyung Han214bf372019-11-12 13:03:50 +09007420func TestLegacyAndroid10Support(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007421 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007422 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007423 apex {
7424 name: "myapex",
7425 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007426 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007427 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007428 }
7429
7430 apex_key {
7431 name: "myapex.key",
7432 public_key: "testkey.avbpubkey",
7433 private_key: "testkey.pem",
7434 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007435
7436 cc_library {
7437 name: "mylib",
7438 srcs: ["mylib.cpp"],
7439 stl: "libc++",
7440 system_shared_libs: [],
7441 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007442 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007443 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007444 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007445
Jooyung Hana0503a52023-08-23 13:12:50 +09007446 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007447 args := module.Rule("apexRule").Args
7448 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00007449 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007450
7451 // The copies of the libraries in the apex should have one more dependency than
7452 // the ones outside the apex, namely the unwinder. Ideally we should check
7453 // the dependency names directly here but for some reason the names are blank in
7454 // this test.
7455 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007456 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007457 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7458 if len(apexImplicits) != len(nonApexImplicits)+1 {
7459 t.Errorf("%q missing unwinder dep", lib)
7460 }
7461 }
Jooyung Han214bf372019-11-12 13:03:50 +09007462}
7463
Paul Duffine05480a2021-03-08 15:07:14 +00007464var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007465 "api/current.txt": nil,
7466 "api/removed.txt": nil,
7467 "api/system-current.txt": nil,
7468 "api/system-removed.txt": nil,
7469 "api/test-current.txt": nil,
7470 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007471
Anton Hanssondff2c782020-12-21 17:10:01 +00007472 "100/public/api/foo.txt": nil,
7473 "100/public/api/foo-removed.txt": nil,
7474 "100/system/api/foo.txt": nil,
7475 "100/system/api/foo-removed.txt": nil,
7476
Paul Duffineedc5d52020-06-12 17:46:39 +01007477 // For java_sdk_library_import
7478 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007479}
7480
Jooyung Han58f26ab2019-12-18 15:34:32 +09007481func TestJavaSDKLibrary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007482 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007483 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007484 apex {
7485 name: "myapex",
7486 key: "myapex.key",
7487 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007488 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007489 }
7490
7491 apex_key {
7492 name: "myapex.key",
7493 public_key: "testkey.avbpubkey",
7494 private_key: "testkey.pem",
7495 }
7496
7497 java_sdk_library {
7498 name: "foo",
7499 srcs: ["a.java"],
7500 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007501 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007502 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007503
7504 prebuilt_apis {
7505 name: "sdk",
7506 api_dirs: ["100"],
7507 }
Paul Duffin9b879592020-05-26 13:21:35 +01007508 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007509
7510 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007511 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007512 "javalib/foo.jar",
7513 "etc/permissions/foo.xml",
7514 })
7515 // Permission XML should point to the activated path of impl jar of java_sdk_library
Paul Duffin1816cde2024-04-10 10:58:21 +01007516 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Output("foo.xml")
7517 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7518 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
Jooyung Han58f26ab2019-12-18 15:34:32 +09007519}
7520
Spandan Das3ee19692024-06-19 04:47:40 +00007521func TestJavaSDKLibraryOverrideApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007522 t.Parallel()
Spandan Das3ee19692024-06-19 04:47:40 +00007523 ctx := testApex(t, `
7524 override_apex {
7525 name: "mycompanyapex",
7526 base: "myapex",
7527 }
7528 apex {
7529 name: "myapex",
7530 key: "myapex.key",
7531 java_libs: ["foo"],
7532 updatable: false,
7533 }
7534
7535 apex_key {
7536 name: "myapex.key",
7537 public_key: "testkey.avbpubkey",
7538 private_key: "testkey.pem",
7539 }
7540
7541 java_sdk_library {
7542 name: "foo",
7543 srcs: ["a.java"],
7544 api_packages: ["foo"],
7545 apex_available: [ "myapex" ],
7546 }
7547
7548 prebuilt_apis {
7549 name: "sdk",
7550 api_dirs: ["100"],
7551 }
7552 `, withFiles(filesForSdkLibrary))
7553
7554 // Permission XML should point to the activated path of impl jar of java_sdk_library.
7555 // Since override variants (com.mycompany.android.foo) are installed in the same package as the overridden variant
7556 // (com.android.foo), the filepath should not contain override apex name.
7557 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_mycompanyapex").Output("foo.xml")
7558 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7559 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
7560}
7561
Paul Duffin9b879592020-05-26 13:21:35 +01007562func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007563 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007564 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007565 apex {
7566 name: "myapex",
7567 key: "myapex.key",
7568 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007569 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007570 }
7571
7572 apex_key {
7573 name: "myapex.key",
7574 public_key: "testkey.avbpubkey",
7575 private_key: "testkey.pem",
7576 }
7577
7578 java_sdk_library {
7579 name: "foo",
7580 srcs: ["a.java"],
7581 api_packages: ["foo"],
7582 apex_available: ["myapex"],
7583 sdk_version: "none",
7584 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007585 compile_dex: true,
Paul Duffin9b879592020-05-26 13:21:35 +01007586 }
7587
7588 java_library {
7589 name: "bar",
7590 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007591 libs: ["foo.impl"],
Paul Duffin9b879592020-05-26 13:21:35 +01007592 apex_available: ["myapex"],
7593 sdk_version: "none",
7594 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007595 compile_dex: true,
Paul Duffin9b879592020-05-26 13:21:35 +01007596 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007597
7598 prebuilt_apis {
7599 name: "sdk",
7600 api_dirs: ["100"],
7601 }
Paul Duffin9b879592020-05-26 13:21:35 +01007602 `, withFiles(filesForSdkLibrary))
7603
7604 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007605 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007606 "javalib/bar.jar",
7607 "javalib/foo.jar",
7608 "etc/permissions/foo.xml",
7609 })
7610
7611 // The bar library should depend on the implementation jar.
7612 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007613 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007614 t.Errorf("expected %q, found %#q", expected, actual)
7615 }
7616}
7617
7618func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007619 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007620 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007621 apex {
7622 name: "myapex",
7623 key: "myapex.key",
7624 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007625 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007626 }
7627
7628 apex_key {
7629 name: "myapex.key",
7630 public_key: "testkey.avbpubkey",
7631 private_key: "testkey.pem",
7632 }
7633
7634 java_sdk_library {
7635 name: "foo",
7636 srcs: ["a.java"],
7637 api_packages: ["foo"],
7638 apex_available: ["myapex"],
7639 sdk_version: "none",
7640 system_modules: "none",
7641 }
7642
7643 java_library {
7644 name: "bar",
7645 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007646 libs: ["foo.stubs"],
Paul Duffin9b879592020-05-26 13:21:35 +01007647 sdk_version: "none",
7648 system_modules: "none",
7649 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007650
7651 prebuilt_apis {
7652 name: "sdk",
7653 api_dirs: ["100"],
7654 }
Paul Duffin9b879592020-05-26 13:21:35 +01007655 `, withFiles(filesForSdkLibrary))
7656
7657 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007658 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007659 "javalib/foo.jar",
7660 "etc/permissions/foo.xml",
7661 })
7662
7663 // The bar library should depend on the stubs jar.
7664 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007665 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007666 t.Errorf("expected %q, found %#q", expected, actual)
7667 }
7668}
7669
Paul Duffineedc5d52020-06-12 17:46:39 +01007670func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007671 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007672 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007673 prebuilt_apis {
7674 name: "sdk",
7675 api_dirs: ["100"],
7676 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007677 withFiles(map[string][]byte{
7678 "apex/a.java": nil,
7679 "apex/apex_manifest.json": nil,
7680 "apex/Android.bp": []byte(`
7681 package {
7682 default_visibility: ["//visibility:private"],
7683 }
7684
7685 apex {
7686 name: "myapex",
7687 key: "myapex.key",
7688 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007689 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007690 }
7691
7692 apex_key {
7693 name: "myapex.key",
7694 public_key: "testkey.avbpubkey",
7695 private_key: "testkey.pem",
7696 }
7697
7698 java_library {
7699 name: "bar",
7700 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007701 libs: ["foo.impl"],
Paul Duffineedc5d52020-06-12 17:46:39 +01007702 apex_available: ["myapex"],
7703 sdk_version: "none",
7704 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007705 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01007706 }
7707`),
7708 "source/a.java": nil,
7709 "source/api/current.txt": nil,
7710 "source/api/removed.txt": nil,
7711 "source/Android.bp": []byte(`
7712 package {
7713 default_visibility: ["//visibility:private"],
7714 }
7715
7716 java_sdk_library {
7717 name: "foo",
7718 visibility: ["//apex"],
7719 srcs: ["a.java"],
7720 api_packages: ["foo"],
7721 apex_available: ["myapex"],
7722 sdk_version: "none",
7723 system_modules: "none",
7724 public: {
7725 enabled: true,
7726 },
Colin Crosse4f34882024-11-14 12:26:00 -08007727 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01007728 }
7729`),
7730 "prebuilt/a.jar": nil,
7731 "prebuilt/Android.bp": []byte(`
7732 package {
7733 default_visibility: ["//visibility:private"],
7734 }
7735
7736 java_sdk_library_import {
7737 name: "foo",
7738 visibility: ["//apex", "//source"],
7739 apex_available: ["myapex"],
7740 prefer: true,
7741 public: {
7742 jars: ["a.jar"],
7743 },
Colin Crosse4f34882024-11-14 12:26:00 -08007744 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01007745 }
7746`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007747 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007748 )
7749
7750 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007751 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007752 "javalib/bar.jar",
7753 "javalib/foo.jar",
7754 "etc/permissions/foo.xml",
7755 })
7756
7757 // The bar library should depend on the implementation jar.
7758 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007759 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007760 t.Errorf("expected %q, found %#q", expected, actual)
7761 }
7762}
7763
7764func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007765 t.Parallel()
Paul Duffineedc5d52020-06-12 17:46:39 +01007766 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7767 apex {
7768 name: "myapex",
7769 key: "myapex.key",
7770 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007771 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007772 }
7773
7774 apex_key {
7775 name: "myapex.key",
7776 public_key: "testkey.avbpubkey",
7777 private_key: "testkey.pem",
7778 }
7779
7780 java_sdk_library_import {
7781 name: "foo",
7782 apex_available: ["myapex"],
7783 prefer: true,
7784 public: {
7785 jars: ["a.jar"],
7786 },
7787 }
7788
7789 `, withFiles(filesForSdkLibrary))
7790}
7791
atrost6e126252020-01-27 17:01:16 +00007792func TestCompatConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007793 t.Parallel()
Paul Duffin284165a2021-03-29 01:50:31 +01007794 result := android.GroupFixturePreparers(
7795 prepareForApexTest,
7796 java.PrepareForTestWithPlatformCompatConfig,
7797 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007798 apex {
7799 name: "myapex",
7800 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007801 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007802 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007803 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007804 }
7805
7806 apex_key {
7807 name: "myapex.key",
7808 public_key: "testkey.avbpubkey",
7809 private_key: "testkey.pem",
7810 }
7811
7812 platform_compat_config {
7813 name: "myjar-platform-compat-config",
7814 src: ":myjar",
7815 }
7816
7817 java_library {
7818 name: "myjar",
7819 srcs: ["foo/bar/MyClass.java"],
7820 sdk_version: "none",
7821 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007822 apex_available: [ "myapex" ],
Colin Crosse4f34882024-11-14 12:26:00 -08007823 compile_dex: true,
atrost6e126252020-01-27 17:01:16 +00007824 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007825
7826 // Make sure that a preferred prebuilt does not affect the apex contents.
7827 prebuilt_platform_compat_config {
7828 name: "myjar-platform-compat-config",
7829 metadata: "compat-config/metadata.xml",
7830 prefer: true,
7831 }
atrost6e126252020-01-27 17:01:16 +00007832 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007833 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09007834 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00007835 "etc/compatconfig/myjar-platform-compat-config.xml",
7836 "javalib/myjar.jar",
7837 })
7838}
7839
Jooyung Han862c0d62022-12-21 10:15:37 +09007840func TestNoDupeApexFiles(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007841 t.Parallel()
Jooyung Han862c0d62022-12-21 10:15:37 +09007842 android.GroupFixturePreparers(
7843 android.PrepareForTestWithAndroidBuildComponents,
7844 PrepareForTestWithApexBuildComponents,
7845 prepareForTestWithMyapex,
7846 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7847 ).
7848 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7849 RunTestWithBp(t, `
7850 apex {
7851 name: "myapex",
7852 key: "myapex.key",
7853 prebuilts: ["foo", "bar"],
7854 updatable: false,
7855 }
7856
7857 apex_key {
7858 name: "myapex.key",
7859 public_key: "testkey.avbpubkey",
7860 private_key: "testkey.pem",
7861 }
7862
7863 prebuilt_etc {
7864 name: "foo",
7865 src: "myprebuilt",
7866 filename_from_src: true,
7867 }
7868
7869 prebuilt_etc {
7870 name: "bar",
7871 src: "myprebuilt",
7872 filename_from_src: true,
7873 }
7874 `)
7875}
7876
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007877func TestApexUnwantedTransitiveDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007878 t.Parallel()
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007879 bp := `
7880 apex {
7881 name: "myapex",
7882 key: "myapex.key",
7883 native_shared_libs: ["libfoo"],
7884 updatable: false,
7885 unwanted_transitive_deps: ["libbar"],
7886 }
7887
7888 apex_key {
7889 name: "myapex.key",
7890 public_key: "testkey.avbpubkey",
7891 private_key: "testkey.pem",
7892 }
7893
7894 cc_library {
7895 name: "libfoo",
7896 srcs: ["foo.cpp"],
7897 shared_libs: ["libbar"],
7898 apex_available: ["myapex"],
7899 }
7900
7901 cc_library {
7902 name: "libbar",
7903 srcs: ["bar.cpp"],
7904 apex_available: ["myapex"],
7905 }`
7906 ctx := testApex(t, bp)
7907 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7908 "*/libc++.so",
7909 "*/libfoo.so",
7910 // not libbar.so
7911 })
7912}
7913
Jiyong Park479321d2019-12-16 11:47:12 +09007914func TestRejectNonInstallableJavaLibrary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007915 t.Parallel()
Jiyong Park479321d2019-12-16 11:47:12 +09007916 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7917 apex {
7918 name: "myapex",
7919 key: "myapex.key",
7920 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007921 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007922 }
7923
7924 apex_key {
7925 name: "myapex.key",
7926 public_key: "testkey.avbpubkey",
7927 private_key: "testkey.pem",
7928 }
7929
7930 java_library {
7931 name: "myjar",
7932 srcs: ["foo/bar/MyClass.java"],
7933 sdk_version: "none",
7934 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007935 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007936 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007937 }
7938 `)
7939}
7940
Jiyong Park7afd1072019-12-30 16:56:33 +09007941func TestCarryRequiredModuleNames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007942 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007943 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007944 apex {
7945 name: "myapex",
7946 key: "myapex.key",
7947 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007948 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007949 }
7950
7951 apex_key {
7952 name: "myapex.key",
7953 public_key: "testkey.avbpubkey",
7954 private_key: "testkey.pem",
7955 }
7956
7957 cc_library {
7958 name: "mylib",
7959 srcs: ["mylib.cpp"],
7960 system_shared_libs: [],
7961 stl: "none",
7962 required: ["a", "b"],
7963 host_required: ["c", "d"],
7964 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007965 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007966 }
7967 `)
7968
Jooyung Hana0503a52023-08-23 13:12:50 +09007969 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007970 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007971 name := apexBundle.BaseModuleName()
7972 prefix := "TARGET_"
7973 var builder strings.Builder
7974 data.Custom(&builder, name, prefix, "", data)
7975 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007976 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08007977 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7978 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007979}
7980
Jiyong Park7cd10e32020-01-14 09:22:18 +09007981func TestSymlinksFromApexToSystem(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007982 t.Parallel()
Jiyong Park7cd10e32020-01-14 09:22:18 +09007983 bp := `
7984 apex {
7985 name: "myapex",
7986 key: "myapex.key",
7987 native_shared_libs: ["mylib"],
7988 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007989 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007990 }
7991
Jiyong Park9d677202020-02-19 16:29:35 +09007992 apex {
7993 name: "myapex.updatable",
7994 key: "myapex.key",
7995 native_shared_libs: ["mylib"],
7996 java_libs: ["myjar"],
7997 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007998 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007999 }
8000
Jiyong Park7cd10e32020-01-14 09:22:18 +09008001 apex_key {
8002 name: "myapex.key",
8003 public_key: "testkey.avbpubkey",
8004 private_key: "testkey.pem",
8005 }
8006
8007 cc_library {
8008 name: "mylib",
8009 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09008010 shared_libs: [
8011 "myotherlib",
8012 "myotherlib_ext",
8013 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09008014 system_shared_libs: [],
8015 stl: "none",
8016 apex_available: [
8017 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008018 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008019 "//apex_available:platform",
8020 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008021 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008022 }
8023
8024 cc_library {
8025 name: "myotherlib",
8026 srcs: ["mylib.cpp"],
8027 system_shared_libs: [],
8028 stl: "none",
8029 apex_available: [
8030 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008031 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008032 "//apex_available:platform",
8033 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008034 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008035 }
8036
Jiyong Parkce243632023-02-17 18:22:25 +09008037 cc_library {
8038 name: "myotherlib_ext",
8039 srcs: ["mylib.cpp"],
8040 system_shared_libs: [],
8041 system_ext_specific: true,
8042 stl: "none",
8043 apex_available: [
8044 "myapex",
8045 "myapex.updatable",
8046 "//apex_available:platform",
8047 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008048 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09008049 }
8050
Jiyong Park7cd10e32020-01-14 09:22:18 +09008051 java_library {
8052 name: "myjar",
8053 srcs: ["foo/bar/MyClass.java"],
8054 sdk_version: "none",
8055 system_modules: "none",
Jihoon Kang85bc1932024-07-01 17:04:46 +00008056 static_libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09008057 apex_available: [
8058 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008059 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008060 "//apex_available:platform",
8061 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008062 min_sdk_version: "33",
Colin Crosse4f34882024-11-14 12:26:00 -08008063 compile_dex: true,
Jiyong Park7cd10e32020-01-14 09:22:18 +09008064 }
8065
8066 java_library {
8067 name: "myotherjar",
8068 srcs: ["foo/bar/MyClass.java"],
8069 sdk_version: "none",
8070 system_modules: "none",
8071 apex_available: [
8072 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008073 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008074 "//apex_available:platform",
8075 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008076 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008077 }
8078 `
8079
8080 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
8081 for _, f := range files {
8082 if f.path == file {
8083 if f.isLink {
8084 t.Errorf("%q is not a real file", file)
8085 }
8086 return
8087 }
8088 }
8089 t.Errorf("%q is not found", file)
8090 }
8091
Jiyong Parkce243632023-02-17 18:22:25 +09008092 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09008093 for _, f := range files {
8094 if f.path == file {
8095 if !f.isLink {
8096 t.Errorf("%q is not a symlink", file)
8097 }
Jiyong Parkce243632023-02-17 18:22:25 +09008098 if f.src != target {
8099 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
8100 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09008101 return
8102 }
8103 }
8104 t.Errorf("%q is not found", file)
8105 }
8106
Jiyong Park9d677202020-02-19 16:29:35 +09008107 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
8108 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08008109 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09008110 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008111 ensureRealfileExists(t, files, "javalib/myjar.jar")
8112 ensureRealfileExists(t, files, "lib64/mylib.so")
8113 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008114 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008115
Jooyung Hana0503a52023-08-23 13:12:50 +09008116 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008117 ensureRealfileExists(t, files, "javalib/myjar.jar")
8118 ensureRealfileExists(t, files, "lib64/mylib.so")
8119 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008120 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09008121
8122 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08008123 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09008124 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008125 ensureRealfileExists(t, files, "javalib/myjar.jar")
8126 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008127 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
8128 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09008129
Jooyung Hana0503a52023-08-23 13:12:50 +09008130 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008131 ensureRealfileExists(t, files, "javalib/myjar.jar")
8132 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008133 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
8134 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09008135}
8136
Yo Chiange8128052020-07-23 20:09:18 +08008137func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008138 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008139 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08008140 apex {
8141 name: "myapex",
8142 key: "myapex.key",
8143 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008144 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08008145 }
8146
8147 apex_key {
8148 name: "myapex.key",
8149 public_key: "testkey.avbpubkey",
8150 private_key: "testkey.pem",
8151 }
8152
8153 cc_library_shared {
8154 name: "mylib",
8155 srcs: ["mylib.cpp"],
8156 shared_libs: ["myotherlib"],
8157 system_shared_libs: [],
8158 stl: "none",
8159 apex_available: [
8160 "myapex",
8161 "//apex_available:platform",
8162 ],
8163 }
8164
8165 cc_prebuilt_library_shared {
8166 name: "myotherlib",
8167 srcs: ["prebuilt.so"],
8168 system_shared_libs: [],
8169 stl: "none",
8170 apex_available: [
8171 "myapex",
8172 "//apex_available:platform",
8173 ],
8174 }
8175 `)
8176
Jooyung Hana0503a52023-08-23 13:12:50 +09008177 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008178 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08008179 var builder strings.Builder
8180 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8181 androidMk := builder.String()
8182 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008183 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08008184 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
8185 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
8186 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008187 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08008188}
8189
Jooyung Han643adc42020-02-27 13:50:06 +09008190func TestApexWithJniLibs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008191 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008192 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09008193 apex {
8194 name: "myapex",
8195 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008196 binaries: ["mybin"],
8197 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008198 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09008199 }
8200
8201 apex_key {
8202 name: "myapex.key",
8203 public_key: "testkey.avbpubkey",
8204 private_key: "testkey.pem",
8205 }
8206
8207 cc_library {
8208 name: "mylib",
8209 srcs: ["mylib.cpp"],
8210 shared_libs: ["mylib2"],
8211 system_shared_libs: [],
8212 stl: "none",
8213 apex_available: [ "myapex" ],
8214 }
8215
8216 cc_library {
8217 name: "mylib2",
8218 srcs: ["mylib.cpp"],
8219 system_shared_libs: [],
8220 stl: "none",
8221 apex_available: [ "myapex" ],
8222 }
Jiyong Park34d5c332022-02-24 18:02:44 +09008223
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008224 // Used as both a JNI library and a regular shared library.
8225 cc_library {
8226 name: "mylib3",
8227 srcs: ["mylib.cpp"],
8228 system_shared_libs: [],
8229 stl: "none",
8230 apex_available: [ "myapex" ],
8231 }
8232
8233 cc_binary {
8234 name: "mybin",
8235 srcs: ["mybin.cpp"],
8236 shared_libs: ["mylib3"],
8237 system_shared_libs: [],
8238 stl: "none",
8239 apex_available: [ "myapex" ],
8240 }
8241
Jiyong Park34d5c332022-02-24 18:02:44 +09008242 rust_ffi_shared {
8243 name: "libfoo.rust",
8244 crate_name: "foo",
8245 srcs: ["foo.rs"],
8246 shared_libs: ["libfoo.shared_from_rust"],
8247 prefer_rlib: true,
8248 apex_available: ["myapex"],
8249 }
8250
8251 cc_library_shared {
8252 name: "libfoo.shared_from_rust",
8253 srcs: ["mylib.cpp"],
8254 system_shared_libs: [],
8255 stl: "none",
8256 stubs: {
8257 versions: ["10", "11", "12"],
8258 },
8259 }
8260
Jooyung Han643adc42020-02-27 13:50:06 +09008261 `)
8262
Jooyung Hana0503a52023-08-23 13:12:50 +09008263 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09008264 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008265 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09008266 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008267 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09008268 "lib64/mylib.so",
8269 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008270 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09008271 "lib64/libfoo.rust.so",
8272 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
8273 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09008274 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008275
8276 // b/220397949
8277 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008278}
8279
Jooyung Han49f67012020-04-17 13:43:10 +09008280func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008281 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008282 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008283 apex {
8284 name: "myapex",
8285 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008286 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008287 }
8288 apex_key {
8289 name: "myapex.key",
8290 public_key: "testkey.avbpubkey",
8291 private_key: "testkey.pem",
8292 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008293 `,
8294 android.FixtureModifyConfig(func(config android.Config) {
8295 delete(config.Targets, android.Android)
8296 config.AndroidCommonTarget = android.Target{}
8297 }),
8298 )
Jooyung Han49f67012020-04-17 13:43:10 +09008299
8300 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8301 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8302 }
8303}
8304
Jiyong Parkbd159612020-02-28 15:22:21 +09008305func TestAppBundle(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008306 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008307 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008308 apex {
8309 name: "myapex",
8310 key: "myapex.key",
8311 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008312 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008313 }
8314
8315 apex_key {
8316 name: "myapex.key",
8317 public_key: "testkey.avbpubkey",
8318 private_key: "testkey.pem",
8319 }
8320
8321 android_app {
8322 name: "AppFoo",
8323 srcs: ["foo/bar/MyClass.java"],
8324 sdk_version: "none",
8325 system_modules: "none",
8326 apex_available: [ "myapex" ],
8327 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008328 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008329
Jooyung Hana0503a52023-08-23 13:12:50 +09008330 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008331 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Jiyong Parkbd159612020-02-28 15:22:21 +09008332
8333 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008334 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 +09008335}
8336
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008337func TestAppSetBundle(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008338 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008339 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008340 apex {
8341 name: "myapex",
8342 key: "myapex.key",
8343 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008344 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008345 }
8346
8347 apex_key {
8348 name: "myapex.key",
8349 public_key: "testkey.avbpubkey",
8350 private_key: "testkey.pem",
8351 }
8352
8353 android_app_set {
8354 name: "AppSet",
8355 set: "AppSet.apks",
8356 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09008357 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08008358 bundleConfigRule := mod.Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008359 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008360 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8361 s := mod.Rule("apexRule").Args["copy_commands"]
8362 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008363 if len(copyCmds) != 4 {
8364 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008365 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008366 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8367 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008368 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8369 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008370
8371 // Ensure that canned_fs_config has an entry for the app set zip file
8372 generateFsRule := mod.Rule("generateFsConfig")
8373 cmd := generateFsRule.RuleParams.Command
8374 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008375}
8376
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008377func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008378 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008379 apex_set {
8380 name: "myapex",
8381 filename: "foo_v2.apex",
8382 sanitized: {
8383 none: { set: "myapex.apks", },
8384 hwaddress: { set: "myapex.hwasan.apks", },
8385 },
Paul Duffin24704672021-04-06 16:09:30 +01008386 }
8387 `
8388 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008389
Paul Duffin24704672021-04-06 16:09:30 +01008390 // Check that the extractor produces the correct output file from the correct input file.
Spandan Das9d6e2092024-09-21 02:50:00 +00008391 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008392
Spandan Das9d6e2092024-09-21 02:50:00 +00008393 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin24704672021-04-06 16:09:30 +01008394 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008395
Paul Duffin24704672021-04-06 16:09:30 +01008396 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8397
8398 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008399 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8400 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008401
8402 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008403}
8404
Pranav Guptaeba03b02022-09-27 00:27:08 +00008405func TestApexSetApksModuleAssignment(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008406 t.Parallel()
Pranav Guptaeba03b02022-09-27 00:27:08 +00008407 ctx := testApex(t, `
8408 apex_set {
8409 name: "myapex",
8410 set: ":myapex_apks_file",
8411 }
8412
8413 filegroup {
8414 name: "myapex_apks_file",
8415 srcs: ["myapex.apks"],
8416 }
8417 `)
8418
Spandan Das9d6e2092024-09-21 02:50:00 +00008419 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Pranav Guptaeba03b02022-09-27 00:27:08 +00008420
8421 // Check that the extractor produces the correct apks file from the input module
Spandan Das9d6e2092024-09-21 02:50:00 +00008422 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.apks"
Pranav Guptaeba03b02022-09-27 00:27:08 +00008423 extractedApex := m.Output(extractorOutput)
8424
8425 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8426}
8427
Paul Duffin89f570a2021-06-16 01:42:33 +01008428func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008429 t.Helper()
8430
Paul Duffin55607122021-03-30 23:32:51 +01008431 fs := android.MockFS{
8432 "a.java": nil,
8433 "a.jar": nil,
8434 "apex_manifest.json": nil,
8435 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008436 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008437 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8438 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8439 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008440 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008441 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008442
Paul Duffin55607122021-03-30 23:32:51 +01008443 errorHandler := android.FixtureExpectsNoErrors
8444 if errmsg != "" {
8445 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008446 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008447
Paul Duffin55607122021-03-30 23:32:51 +01008448 result := android.GroupFixturePreparers(
8449 cc.PrepareForTestWithCcDefaultModules,
8450 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008451 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008452 java.PrepareForTestWithJavaSdkLibraryFiles,
8453 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008454 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008455 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008456 android.FixtureModifyMockFS(func(fs android.MockFS) {
8457 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8458 insert := ""
8459 for _, fragment := range fragments {
8460 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8461 }
8462 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8463 platform_bootclasspath {
8464 name: "platform-bootclasspath",
8465 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008466 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008467 %s
8468 ],
8469 }
8470 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008471 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008472 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008473 // Dexpreopt for boot jars requires the ART boot image profile.
8474 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8475 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008476 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008477 ).
8478 ExtendWithErrorHandler(errorHandler).
8479 RunTestWithBp(t, bp)
8480
8481 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008482}
8483
Jooyung Han548640b2020-04-27 12:10:30 +09008484func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008485 t.Parallel()
Jooyung Han548640b2020-04-27 12:10:30 +09008486 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8487 apex {
8488 name: "myapex",
8489 key: "myapex.key",
8490 updatable: true,
8491 }
8492
8493 apex_key {
8494 name: "myapex.key",
8495 public_key: "testkey.avbpubkey",
8496 private_key: "testkey.pem",
8497 }
8498 `)
8499}
8500
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008501func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008502 t.Parallel()
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008503 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8504 apex {
8505 name: "myapex",
8506 key: "myapex.key",
8507 }
8508
8509 apex_key {
8510 name: "myapex.key",
8511 public_key: "testkey.avbpubkey",
8512 private_key: "testkey.pem",
8513 }
8514 `)
8515}
8516
satayevb98371c2021-06-15 16:49:50 +01008517func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008518 t.Parallel()
satayevb98371c2021-06-15 16:49:50 +01008519 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8520 apex {
8521 name: "myapex",
8522 key: "myapex.key",
8523 systemserverclasspath_fragments: [
8524 "mysystemserverclasspathfragment",
8525 ],
8526 min_sdk_version: "29",
8527 updatable: true,
8528 }
8529
8530 apex_key {
8531 name: "myapex.key",
8532 public_key: "testkey.avbpubkey",
8533 private_key: "testkey.pem",
8534 }
8535
8536 java_library {
8537 name: "foo",
8538 srcs: ["b.java"],
8539 min_sdk_version: "29",
8540 installable: true,
8541 apex_available: [
8542 "myapex",
8543 ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00008544 sdk_version: "current",
satayevb98371c2021-06-15 16:49:50 +01008545 }
8546
8547 systemserverclasspath_fragment {
8548 name: "mysystemserverclasspathfragment",
8549 generate_classpaths_proto: false,
8550 contents: [
8551 "foo",
8552 ],
8553 apex_available: [
8554 "myapex",
8555 ],
8556 }
satayevabcd5972021-08-06 17:49:46 +01008557 `,
8558 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8559 )
satayevb98371c2021-06-15 16:49:50 +01008560}
8561
Paul Duffin064b70c2020-11-02 17:32:38 +00008562func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008563 t.Parallel()
satayevabcd5972021-08-06 17:49:46 +01008564 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008565 t.Run("prebuilt no source", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008566 t.Parallel()
Paul Duffin89f570a2021-06-16 01:42:33 +01008567 fragment := java.ApexVariantReference{
8568 Apex: proptools.StringPtr("myapex"),
8569 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8570 }
8571
Paul Duffin064b70c2020-11-02 17:32:38 +00008572 testDexpreoptWithApexes(t, `
8573 prebuilt_apex {
8574 name: "myapex" ,
8575 arch: {
8576 arm64: {
8577 src: "myapex-arm64.apex",
8578 },
8579 arm: {
8580 src: "myapex-arm.apex",
8581 },
8582 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008583 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8584 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008585
Paul Duffin89f570a2021-06-16 01:42:33 +01008586 prebuilt_bootclasspath_fragment {
8587 name: "my-bootclasspath-fragment",
8588 contents: ["libfoo"],
8589 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008590 hidden_api: {
8591 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8592 metadata: "my-bootclasspath-fragment/metadata.csv",
8593 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008594 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8595 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8596 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008597 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008598 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008599
Spandan Das52c01a12024-09-20 01:09:48 +00008600 java_sdk_library_import {
8601 name: "libfoo",
8602 prefer: true,
8603 public: {
Paul Duffin89f570a2021-06-16 01:42:33 +01008604 jars: ["libfoo.jar"],
Spandan Das52c01a12024-09-20 01:09:48 +00008605 },
8606 apex_available: ["myapex"],
8607 shared_library: false,
8608 permitted_packages: ["libfoo"],
8609 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008610 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008611 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008612}
8613
Spandan Dasf14e2542021-11-12 00:01:37 +00008614func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008615 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008616 bp += `
8617 apex_key {
8618 name: "myapex.key",
8619 public_key: "testkey.avbpubkey",
8620 private_key: "testkey.pem",
8621 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008622 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008623 "lib1/src/A.java": nil,
8624 "lib2/src/B.java": nil,
8625 "system/sepolicy/apex/myapex-file_contexts": nil,
8626 }
8627
Paul Duffin45338f02021-03-30 23:07:52 +01008628 errorHandler := android.FixtureExpectsNoErrors
8629 if errmsg != "" {
8630 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008631 }
Colin Crossae8600b2020-10-29 17:09:13 -07008632
Paul Duffin45338f02021-03-30 23:07:52 +01008633 android.GroupFixturePreparers(
8634 android.PrepareForTestWithAndroidBuildComponents,
8635 java.PrepareForTestWithJavaBuildComponents,
8636 PrepareForTestWithApexBuildComponents,
8637 android.PrepareForTestWithNeverallowRules(rules),
8638 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008639 apexBootJars := make([]string, 0, len(bootJars))
8640 for _, apexBootJar := range bootJars {
8641 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008642 }
satayevd604b212021-07-21 14:23:52 +01008643 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008644 }),
8645 fs.AddToFixture(),
8646 ).
8647 ExtendWithErrorHandler(errorHandler).
8648 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008649}
8650
8651func TestApexPermittedPackagesRules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008652 t.Parallel()
Andrei Onea115e7e72020-06-05 21:14:03 +01008653 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008654 name string
8655 expectedError string
8656 bp string
8657 bootJars []string
8658 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008659 }{
8660
8661 {
8662 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8663 expectedError: "",
8664 bp: `
8665 java_library {
8666 name: "bcp_lib1",
8667 srcs: ["lib1/src/*.java"],
8668 permitted_packages: ["foo.bar"],
8669 apex_available: ["myapex"],
8670 sdk_version: "none",
8671 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008672 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008673 }
8674 java_library {
8675 name: "nonbcp_lib2",
8676 srcs: ["lib2/src/*.java"],
8677 apex_available: ["myapex"],
8678 permitted_packages: ["a.b"],
8679 sdk_version: "none",
8680 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008681 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008682 }
8683 apex {
8684 name: "myapex",
8685 key: "myapex.key",
8686 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008687 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008688 }`,
8689 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008690 bcpPermittedPackages: map[string][]string{
8691 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008692 "foo.bar",
8693 },
8694 },
8695 },
8696 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008697 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008698 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 +01008699 bp: `
8700 java_library {
8701 name: "bcp_lib1",
8702 srcs: ["lib1/src/*.java"],
8703 apex_available: ["myapex"],
8704 permitted_packages: ["foo.bar"],
8705 sdk_version: "none",
8706 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008707 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008708 }
8709 java_library {
8710 name: "bcp_lib2",
8711 srcs: ["lib2/src/*.java"],
8712 apex_available: ["myapex"],
8713 permitted_packages: ["foo.bar", "bar.baz"],
8714 sdk_version: "none",
8715 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008716 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008717 }
8718 apex {
8719 name: "myapex",
8720 key: "myapex.key",
8721 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008722 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008723 }
8724 `,
8725 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008726 bcpPermittedPackages: map[string][]string{
8727 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008728 "foo.bar",
8729 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008730 "bcp_lib2": []string{
8731 "foo.bar",
8732 },
8733 },
8734 },
8735 {
8736 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8737 expectedError: "",
8738 bp: `
8739 java_library {
8740 name: "bcp_lib_restricted",
8741 srcs: ["lib1/src/*.java"],
8742 apex_available: ["myapex"],
8743 permitted_packages: ["foo.bar"],
8744 sdk_version: "none",
8745 min_sdk_version: "29",
8746 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008747 compile_dex: true,
Spandan Dasf14e2542021-11-12 00:01:37 +00008748 }
8749 java_library {
8750 name: "bcp_lib_unrestricted",
8751 srcs: ["lib2/src/*.java"],
8752 apex_available: ["myapex"],
8753 permitted_packages: ["foo.bar", "bar.baz"],
8754 sdk_version: "none",
8755 min_sdk_version: "29",
8756 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008757 compile_dex: true,
Spandan Dasf14e2542021-11-12 00:01:37 +00008758 }
8759 apex {
8760 name: "myapex",
8761 key: "myapex.key",
8762 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8763 updatable: true,
8764 min_sdk_version: "29",
8765 }
8766 `,
8767 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8768 bcpPermittedPackages: map[string][]string{
8769 "bcp_lib1_non_updateable": []string{
8770 "foo.bar",
8771 },
8772 // 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 +01008773 },
8774 },
8775 }
8776 for _, tc := range testcases {
8777 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008778 t.Parallel()
Spandan Dasf14e2542021-11-12 00:01:37 +00008779 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8780 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008781 })
8782 }
8783}
8784
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008785// TODO(jungjw): Move this to proptools
8786func intPtr(i int) *int {
8787 return &i
8788}
8789
8790func TestApexSet(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008791 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008792 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008793 apex_set {
8794 name: "myapex",
8795 set: "myapex.apks",
8796 filename: "foo_v2.apex",
8797 overrides: ["foo"],
8798 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008799 `,
8800 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8801 variables.Platform_sdk_version = intPtr(30)
8802 }),
8803 android.FixtureModifyConfig(func(config android.Config) {
8804 config.Targets[android.Android] = []android.Target{
8805 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8806 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8807 }
8808 }),
8809 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008810
Spandan Das9d6e2092024-09-21 02:50:00 +00008811 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008812
8813 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008814 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008815 actual := extractedApex.Args["abis"]
8816 expected := "ARMEABI_V7A,ARM64_V8A"
8817 if actual != expected {
8818 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8819 }
8820 actual = extractedApex.Args["sdk-version"]
8821 expected = "30"
8822 if actual != expected {
8823 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8824 }
8825
Paul Duffin6717d882021-06-15 19:09:41 +01008826 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008827 a := m.Module().(*ApexSet)
8828 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008829 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008830 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8831 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8832 }
8833}
8834
Anton Hansson805e0a52022-11-25 14:06:46 +00008835func TestApexSet_NativeBridge(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008836 t.Parallel()
Anton Hansson805e0a52022-11-25 14:06:46 +00008837 ctx := testApex(t, `
8838 apex_set {
8839 name: "myapex",
8840 set: "myapex.apks",
8841 filename: "foo_v2.apex",
8842 overrides: ["foo"],
8843 }
8844 `,
8845 android.FixtureModifyConfig(func(config android.Config) {
8846 config.Targets[android.Android] = []android.Target{
8847 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8848 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8849 }
8850 }),
8851 )
8852
Spandan Das9d6e2092024-09-21 02:50:00 +00008853 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Anton Hansson805e0a52022-11-25 14:06:46 +00008854
8855 // Check extract_apks tool parameters. No native bridge arch expected
8856 extractedApex := m.Output("extracted/myapex.apks")
8857 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8858}
8859
Jiyong Park7d95a512020-05-10 15:16:24 +09008860func TestNoStaticLinkingToStubsLib(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008861 t.Parallel()
Jiyong Park7d95a512020-05-10 15:16:24 +09008862 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8863 apex {
8864 name: "myapex",
8865 key: "myapex.key",
8866 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008867 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008868 }
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 static_libs: ["otherlib"],
8880 system_shared_libs: [],
8881 stl: "none",
8882 apex_available: [ "myapex" ],
8883 }
8884
8885 cc_library {
8886 name: "otherlib",
8887 srcs: ["mylib.cpp"],
8888 system_shared_libs: [],
8889 stl: "none",
8890 stubs: {
8891 versions: ["1", "2", "3"],
8892 },
8893 apex_available: [ "myapex" ],
8894 }
8895 `)
8896}
8897
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008898func TestApexKeysTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008899 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008900 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008901 apex {
8902 name: "myapex",
8903 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008904 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008905 custom_sign_tool: "sign_myapex",
8906 }
8907
8908 apex_key {
8909 name: "myapex.key",
8910 public_key: "testkey.avbpubkey",
8911 private_key: "testkey.pem",
8912 }
8913 `)
8914
Jooyung Han286957d2023-10-30 16:17:56 +09008915 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07008916 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008917 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 +09008918}
8919
8920func TestApexKeysTxtOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008921 t.Parallel()
Jooyung Han09c11ad2021-10-27 03:45:31 +09008922 ctx := testApex(t, `
8923 apex {
8924 name: "myapex",
8925 key: "myapex.key",
8926 updatable: false,
8927 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008928 }
8929
8930 apex_key {
8931 name: "myapex.key",
8932 public_key: "testkey.avbpubkey",
8933 private_key: "testkey.pem",
8934 }
8935
8936 prebuilt_apex {
8937 name: "myapex",
8938 prefer: true,
8939 arch: {
8940 arm64: {
8941 src: "myapex-arm64.apex",
8942 },
8943 arm: {
8944 src: "myapex-arm.apex",
8945 },
8946 },
8947 }
8948
8949 apex_set {
8950 name: "myapex_set",
8951 set: "myapex.apks",
8952 filename: "myapex_set.apex",
8953 overrides: ["myapex"],
8954 }
8955 `)
8956
Colin Crossf61d03d2023-11-02 16:56:39 -07008957 content := android.ContentFromFileRuleForTests(t, ctx,
8958 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09008959 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 -07008960 content = android.ContentFromFileRuleForTests(t, ctx,
8961 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008962 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 +09008963}
8964
Jooyung Han938b5932020-06-20 12:47:47 +09008965func TestAllowedFiles(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008966 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008967 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008968 apex {
8969 name: "myapex",
8970 key: "myapex.key",
8971 apps: ["app"],
8972 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008973 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008974 }
8975
8976 apex_key {
8977 name: "myapex.key",
8978 public_key: "testkey.avbpubkey",
8979 private_key: "testkey.pem",
8980 }
8981
8982 android_app {
8983 name: "app",
8984 srcs: ["foo/bar/MyClass.java"],
8985 package_name: "foo",
8986 sdk_version: "none",
8987 system_modules: "none",
8988 apex_available: [ "myapex" ],
8989 }
8990 `, withFiles(map[string][]byte{
8991 "sub/Android.bp": []byte(`
8992 override_apex {
8993 name: "override_myapex",
8994 base: "myapex",
8995 apps: ["override_app"],
8996 allowed_files: ":allowed",
8997 }
8998 // Overridable "path" property should be referenced indirectly
8999 filegroup {
9000 name: "allowed",
9001 srcs: ["allowed.txt"],
9002 }
9003 override_android_app {
9004 name: "override_app",
9005 base: "app",
9006 package_name: "bar",
9007 }
9008 `),
9009 }))
9010
Jooyung Hana0503a52023-08-23 13:12:50 +09009011 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009012 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
9013 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9014 }
9015
Spandan Das50801e22024-05-13 18:29:45 +00009016 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009017 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
9018 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9019 }
9020}
9021
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009022func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009023 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009024 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009025 apex {
9026 name: "myapex",
9027 key: "myapex.key",
9028 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009029 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009030 }
9031
9032 apex_key {
9033 name: "myapex.key",
9034 public_key: "testkey.avbpubkey",
9035 private_key: "testkey.pem",
9036 }
9037
9038 cc_library {
9039 name: "mylib",
9040 srcs: ["mylib.cpp"],
9041 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009042 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009043 },
9044 apex_available: ["myapex"],
9045 }
9046
9047 cc_prebuilt_library_shared {
9048 name: "mylib",
9049 prefer: false,
9050 srcs: ["prebuilt.so"],
9051 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009052 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009053 },
9054 apex_available: ["myapex"],
9055 }
9056 `)
9057}
9058
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009059func TestCompressedApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009060 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009061 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009062 apex {
9063 name: "myapex",
9064 key: "myapex.key",
9065 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009066 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009067 }
9068 apex_key {
9069 name: "myapex.key",
9070 public_key: "testkey.avbpubkey",
9071 private_key: "testkey.pem",
9072 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009073 `,
9074 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9075 variables.CompressedApex = proptools.BoolPtr(true)
9076 }),
9077 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009078
Jooyung Hana0503a52023-08-23 13:12:50 +09009079 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009080 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9081
Jooyung Hana0503a52023-08-23 13:12:50 +09009082 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009083 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9084
9085 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09009086 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009087 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9088
9089 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009090 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009091 var builder strings.Builder
9092 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9093 androidMk := builder.String()
9094 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9095}
9096
Jooyung Han26ec8482024-07-31 15:04:05 +09009097func TestApexSet_ShouldRespectCompressedApexFlag(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009098 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09009099 for _, compressionEnabled := range []bool{true, false} {
9100 t.Run(fmt.Sprintf("compressionEnabled=%v", compressionEnabled), func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009101 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09009102 ctx := testApex(t, `
9103 apex_set {
9104 name: "com.company.android.myapex",
9105 apex_name: "com.android.myapex",
9106 set: "company-myapex.apks",
9107 }
9108 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9109 variables.CompressedApex = proptools.BoolPtr(compressionEnabled)
9110 }),
9111 )
9112
9113 build := ctx.ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex").Output("com.company.android.myapex.apex")
9114 if compressionEnabled {
9115 ensureEquals(t, build.Rule.String(), "android/soong/android.Cp")
9116 } else {
9117 ensureEquals(t, build.Rule.String(), "android/apex.decompressApex")
9118 }
9119 })
9120 }
9121}
9122
Martin Stjernholm2856c662020-12-02 15:03:42 +00009123func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009124 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009125 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009126 apex {
9127 name: "myapex",
9128 key: "myapex.key",
9129 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009130 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009131 }
9132
9133 apex_key {
9134 name: "myapex.key",
9135 public_key: "testkey.avbpubkey",
9136 private_key: "testkey.pem",
9137 }
9138
9139 cc_library {
9140 name: "mylib",
9141 srcs: ["mylib.cpp"],
9142 apex_available: ["myapex"],
9143 shared_libs: ["otherlib"],
9144 system_shared_libs: [],
9145 }
9146
9147 cc_library {
9148 name: "otherlib",
9149 srcs: ["mylib.cpp"],
9150 stubs: {
9151 versions: ["current"],
9152 },
9153 }
9154
9155 cc_prebuilt_library_shared {
9156 name: "otherlib",
9157 prefer: true,
9158 srcs: ["prebuilt.so"],
9159 stubs: {
9160 versions: ["current"],
9161 },
9162 }
9163 `)
9164
Jooyung Hana0503a52023-08-23 13:12:50 +09009165 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009166 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009167 var builder strings.Builder
9168 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9169 androidMk := builder.String()
9170
9171 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9172 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009173 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009174}
9175
Jiyong Parke3867542020-12-03 17:28:25 +09009176func TestExcludeDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009177 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009178 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009179 apex {
9180 name: "myapex",
9181 key: "myapex.key",
9182 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009183 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009184 }
9185
9186 apex_key {
9187 name: "myapex.key",
9188 public_key: "testkey.avbpubkey",
9189 private_key: "testkey.pem",
9190 }
9191
9192 cc_library {
9193 name: "mylib",
9194 srcs: ["mylib.cpp"],
9195 system_shared_libs: [],
9196 stl: "none",
9197 apex_available: ["myapex"],
9198 shared_libs: ["mylib2"],
9199 target: {
9200 apex: {
9201 exclude_shared_libs: ["mylib2"],
9202 },
9203 },
9204 }
9205
9206 cc_library {
9207 name: "mylib2",
9208 srcs: ["mylib.cpp"],
9209 system_shared_libs: [],
9210 stl: "none",
9211 }
9212 `)
9213
9214 // Check if mylib is linked to mylib2 for the non-apex target
9215 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9216 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9217
9218 // Make sure that the link doesn't occur for the apex target
9219 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9220 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9221
9222 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009223 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009224 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9225}
9226
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009227func TestPrebuiltStubLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009228 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009229 bpBase := `
9230 apex {
9231 name: "myapex",
9232 key: "myapex.key",
9233 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009234 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009235 }
9236 apex_key {
9237 name: "myapex.key",
9238 public_key: "testkey.avbpubkey",
9239 private_key: "testkey.pem",
9240 }
9241 cc_library {
9242 name: "mylib",
9243 srcs: ["mylib.cpp"],
9244 apex_available: ["myapex"],
9245 shared_libs: ["stublib"],
9246 system_shared_libs: [],
9247 }
9248 apex {
9249 name: "otherapex",
9250 enabled: %s,
9251 key: "myapex.key",
9252 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009253 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009254 }
9255 `
9256
9257 stublibSourceBp := `
9258 cc_library {
9259 name: "stublib",
9260 srcs: ["mylib.cpp"],
9261 apex_available: ["otherapex"],
9262 system_shared_libs: [],
9263 stl: "none",
9264 stubs: {
9265 versions: ["1"],
9266 },
9267 }
9268 `
9269
9270 stublibPrebuiltBp := `
9271 cc_prebuilt_library_shared {
9272 name: "stublib",
9273 srcs: ["prebuilt.so"],
9274 apex_available: ["otherapex"],
9275 stubs: {
9276 versions: ["1"],
9277 },
9278 %s
9279 }
9280 `
9281
9282 tests := []struct {
9283 name string
9284 stublibBp string
9285 usePrebuilt bool
9286 modNames []string // Modules to collect AndroidMkEntries for
9287 otherApexEnabled []string
9288 }{
9289 {
9290 name: "only_source",
9291 stublibBp: stublibSourceBp,
9292 usePrebuilt: false,
9293 modNames: []string{"stublib"},
9294 otherApexEnabled: []string{"true", "false"},
9295 },
9296 {
9297 name: "source_preferred",
9298 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9299 usePrebuilt: false,
9300 modNames: []string{"stublib", "prebuilt_stublib"},
9301 otherApexEnabled: []string{"true", "false"},
9302 },
9303 {
9304 name: "prebuilt_preferred",
9305 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9306 usePrebuilt: true,
9307 modNames: []string{"stublib", "prebuilt_stublib"},
9308 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9309 },
9310 {
9311 name: "only_prebuilt",
9312 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9313 usePrebuilt: true,
9314 modNames: []string{"stublib"},
9315 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9316 },
9317 }
9318
9319 for _, test := range tests {
9320 t.Run(test.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009321 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009322 for _, otherApexEnabled := range test.otherApexEnabled {
9323 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009324 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009325 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009326
9327 type modAndMkEntries struct {
9328 mod *cc.Module
Yu Liue70976d2024-10-15 20:45:35 +00009329 mkEntries android.AndroidMkInfo
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009330 }
9331 entries := []*modAndMkEntries{}
9332
9333 // Gather shared lib modules that are installable
9334 for _, modName := range test.modNames {
9335 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9336 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9337 continue
9338 }
9339 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Cole Fausta963b942024-04-11 17:43:00 -07009340 if !mod.Enabled(android.PanickingConfigAndErrorContext(ctx)) || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009341 continue
9342 }
Yu Liue70976d2024-10-15 20:45:35 +00009343 info := android.AndroidMkInfoForTest(t, ctx, mod)
9344 ents := []android.AndroidMkInfo{info.PrimaryInfo}
9345 ents = append(ents, info.ExtraInfo...)
9346 for _, ent := range ents {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009347 if ent.Disabled {
9348 continue
9349 }
9350 entries = append(entries, &modAndMkEntries{
9351 mod: mod,
9352 mkEntries: ent,
9353 })
9354 }
9355 }
9356 }
9357
9358 var entry *modAndMkEntries = nil
9359 for _, ent := range entries {
9360 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9361 if entry != nil {
9362 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9363 } else {
9364 entry = ent
9365 }
9366 }
9367 }
9368
9369 if entry == nil {
9370 t.Errorf("AndroidMk entry for \"stublib\" missing")
9371 } else {
9372 isPrebuilt := entry.mod.Prebuilt() != nil
9373 if isPrebuilt != test.usePrebuilt {
9374 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9375 }
9376 if !entry.mod.IsStubs() {
9377 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9378 }
9379 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9380 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9381 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009382 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009383 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009384 if !android.InList(expected, cflags) {
9385 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9386 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009387 }
9388 })
9389 }
9390 })
9391 }
9392}
9393
Colin Crossc33e5212021-05-25 18:16:02 -07009394func TestApexJavaCoverage(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009395 t.Parallel()
Colin Crossc33e5212021-05-25 18:16:02 -07009396 bp := `
9397 apex {
9398 name: "myapex",
9399 key: "myapex.key",
9400 java_libs: ["mylib"],
9401 bootclasspath_fragments: ["mybootclasspathfragment"],
9402 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9403 updatable: false,
9404 }
9405
9406 apex_key {
9407 name: "myapex.key",
9408 public_key: "testkey.avbpubkey",
9409 private_key: "testkey.pem",
9410 }
9411
9412 java_library {
9413 name: "mylib",
9414 srcs: ["mylib.java"],
9415 apex_available: ["myapex"],
9416 compile_dex: true,
9417 }
9418
9419 bootclasspath_fragment {
9420 name: "mybootclasspathfragment",
9421 contents: ["mybootclasspathlib"],
9422 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009423 hidden_api: {
9424 split_packages: ["*"],
9425 },
Colin Crossc33e5212021-05-25 18:16:02 -07009426 }
9427
9428 java_library {
9429 name: "mybootclasspathlib",
9430 srcs: ["mybootclasspathlib.java"],
9431 apex_available: ["myapex"],
9432 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009433 sdk_version: "current",
Colin Crossc33e5212021-05-25 18:16:02 -07009434 }
9435
9436 systemserverclasspath_fragment {
9437 name: "mysystemserverclasspathfragment",
9438 contents: ["mysystemserverclasspathlib"],
9439 apex_available: ["myapex"],
9440 }
9441
9442 java_library {
9443 name: "mysystemserverclasspathlib",
9444 srcs: ["mysystemserverclasspathlib.java"],
9445 apex_available: ["myapex"],
9446 compile_dex: true,
9447 }
9448 `
9449
9450 result := android.GroupFixturePreparers(
9451 PrepareForTestWithApexBuildComponents,
9452 prepareForTestWithMyapex,
9453 java.PrepareForTestWithJavaDefaultModules,
9454 android.PrepareForTestWithAndroidBuildComponents,
9455 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009456 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9457 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009458 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009459 ).RunTest(t)
9460
9461 // Make sure jacoco ran on both mylib and mybootclasspathlib
9462 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9463 t.Errorf("Failed to find jacoco rule for mylib")
9464 }
9465 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9466 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9467 }
9468 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9469 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9470 }
9471}
9472
Jiyong Park192600a2021-08-03 07:52:17 +00009473func TestProhibitStaticExecutable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009474 t.Parallel()
Jiyong Park192600a2021-08-03 07:52:17 +00009475 testApexError(t, `executable mybin is static`, `
9476 apex {
9477 name: "myapex",
9478 key: "myapex.key",
9479 binaries: ["mybin"],
9480 min_sdk_version: "29",
9481 }
9482
9483 apex_key {
9484 name: "myapex.key",
9485 public_key: "testkey.avbpubkey",
9486 private_key: "testkey.pem",
9487 }
9488
9489 cc_binary {
9490 name: "mybin",
9491 srcs: ["mylib.cpp"],
9492 relative_install_path: "foo/bar",
9493 static_executable: true,
9494 system_shared_libs: [],
9495 stl: "none",
9496 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009497 min_sdk_version: "29",
9498 }
9499 `)
9500
9501 testApexError(t, `executable mybin.rust is static`, `
9502 apex {
9503 name: "myapex",
9504 key: "myapex.key",
9505 binaries: ["mybin.rust"],
9506 min_sdk_version: "29",
9507 }
9508
9509 apex_key {
9510 name: "myapex.key",
9511 public_key: "testkey.avbpubkey",
9512 private_key: "testkey.pem",
9513 }
9514
9515 rust_binary {
9516 name: "mybin.rust",
9517 srcs: ["foo.rs"],
9518 static_executable: true,
9519 apex_available: ["myapex"],
9520 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009521 }
9522 `)
9523}
9524
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009525func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009526 t.Parallel()
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009527 ctx := testApex(t, `
9528 apex {
9529 name: "myapex",
9530 key: "myapex.key",
9531 updatable: false,
9532 java_libs: ["foo"],
9533 }
9534
9535 apex_key {
9536 name: "myapex.key",
9537 public_key: "testkey.avbpubkey",
9538 private_key: "testkey.pem",
9539 }
9540
9541 java_library {
9542 name: "foo",
9543 srcs: ["foo.java"],
9544 apex_available: ["myapex"],
9545 installable: true,
9546 }
9547 `,
9548 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9549 )
9550
Jooyung Hana0503a52023-08-23 13:12:50 +09009551 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009552 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9553 var builder strings.Builder
9554 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9555 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009556 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 +00009557}
9558
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009559func TestAndroidMk_RequiredModules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009560 t.Parallel()
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009561 ctx := testApex(t, `
9562 apex {
9563 name: "myapex",
9564 key: "myapex.key",
9565 updatable: false,
9566 java_libs: ["foo"],
9567 required: ["otherapex"],
9568 }
9569
9570 apex {
9571 name: "otherapex",
9572 key: "myapex.key",
9573 updatable: false,
9574 java_libs: ["foo"],
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009575 }
9576
9577 apex_key {
9578 name: "myapex.key",
9579 public_key: "testkey.avbpubkey",
9580 private_key: "testkey.pem",
9581 }
9582
9583 java_library {
9584 name: "foo",
9585 srcs: ["foo.java"],
9586 apex_available: ["myapex", "otherapex"],
9587 installable: true,
9588 }
9589 `)
9590
Jooyung Hana0503a52023-08-23 13:12:50 +09009591 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009592 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9593 var builder strings.Builder
9594 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9595 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009596 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009597}
9598
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009599func TestAndroidMk_RequiredDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009600 t.Parallel()
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009601 ctx := testApex(t, `
9602 apex {
9603 name: "myapex",
9604 key: "myapex.key",
9605 updatable: false,
9606 }
9607
9608 apex_key {
9609 name: "myapex.key",
9610 public_key: "testkey.avbpubkey",
9611 private_key: "testkey.pem",
9612 }
9613 `)
9614
Jooyung Hana0503a52023-08-23 13:12:50 +09009615 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009616 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009617 data := android.AndroidMkDataForTest(t, ctx, bundle)
9618 var builder strings.Builder
9619 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9620 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009621 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009622}
9623
Jooyung Hana6d36672022-02-24 13:58:07 +09009624func TestApexOutputFileProducer(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009625 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009626 for _, tc := range []struct {
9627 name string
9628 ref string
9629 expected_data []string
9630 }{
9631 {
9632 name: "test_using_output",
9633 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009634 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009635 },
9636 {
9637 name: "test_using_apex",
9638 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009639 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009640 },
9641 } {
9642 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009643 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009644 ctx := testApex(t, `
9645 apex {
9646 name: "myapex",
9647 key: "myapex.key",
9648 compressible: true,
9649 updatable: false,
9650 }
9651
9652 apex_key {
9653 name: "myapex.key",
9654 public_key: "testkey.avbpubkey",
9655 private_key: "testkey.pem",
9656 }
9657
9658 java_test {
9659 name: "`+tc.name+`",
9660 srcs: ["a.java"],
9661 data: ["`+tc.ref+`"],
9662 }
9663 `,
9664 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9665 variables.CompressedApex = proptools.BoolPtr(true)
9666 }))
9667 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9668 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9669 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9670 })
9671 }
9672}
9673
satayev758968a2021-12-06 11:42:40 +00009674func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009675 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009676 preparer := android.GroupFixturePreparers(
9677 PrepareForTestWithApexBuildComponents,
9678 prepareForTestWithMyapex,
9679 java.PrepareForTestWithJavaSdkLibraryFiles,
9680 java.PrepareForTestWithJavaDefaultModules,
9681 android.PrepareForTestWithAndroidBuildComponents,
9682 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9683 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9684 )
9685
9686 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9687 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009688 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009689 preparer.RunTestWithBp(t, `
9690 apex {
9691 name: "myapex",
9692 key: "myapex.key",
9693 bootclasspath_fragments: ["mybootclasspathfragment"],
9694 min_sdk_version: "30",
9695 updatable: false,
9696 }
9697
9698 apex_key {
9699 name: "myapex.key",
9700 public_key: "testkey.avbpubkey",
9701 private_key: "testkey.pem",
9702 }
9703
9704 bootclasspath_fragment {
9705 name: "mybootclasspathfragment",
9706 contents: ["mybootclasspathlib"],
9707 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009708 hidden_api: {
9709 split_packages: ["*"],
9710 },
satayev758968a2021-12-06 11:42:40 +00009711 }
9712
9713 java_sdk_library {
9714 name: "mybootclasspathlib",
9715 srcs: ["mybootclasspathlib.java"],
9716 apex_available: ["myapex"],
9717 compile_dex: true,
9718 unsafe_ignore_missing_latest_api: true,
9719 min_sdk_version: "31",
9720 static_libs: ["util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009721 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009722 }
9723
9724 java_library {
9725 name: "util",
9726 srcs: ["a.java"],
9727 apex_available: ["myapex"],
9728 min_sdk_version: "31",
9729 static_libs: ["another_util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009730 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009731 }
9732
9733 java_library {
9734 name: "another_util",
9735 srcs: ["a.java"],
9736 min_sdk_version: "31",
9737 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009738 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009739 }
9740 `)
9741 })
9742
9743 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9744 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009745 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009746 preparer.RunTestWithBp(t, `
9747 apex {
9748 name: "myapex",
9749 key: "myapex.key",
9750 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9751 min_sdk_version: "30",
9752 updatable: false,
9753 }
9754
9755 apex_key {
9756 name: "myapex.key",
9757 public_key: "testkey.avbpubkey",
9758 private_key: "testkey.pem",
9759 }
9760
9761 systemserverclasspath_fragment {
9762 name: "mysystemserverclasspathfragment",
9763 contents: ["mysystemserverclasspathlib"],
9764 apex_available: ["myapex"],
9765 }
9766
9767 java_sdk_library {
9768 name: "mysystemserverclasspathlib",
9769 srcs: ["mysystemserverclasspathlib.java"],
9770 apex_available: ["myapex"],
9771 compile_dex: true,
9772 min_sdk_version: "32",
9773 unsafe_ignore_missing_latest_api: true,
9774 static_libs: ["util"],
9775 }
9776
9777 java_library {
9778 name: "util",
9779 srcs: ["a.java"],
9780 apex_available: ["myapex"],
9781 min_sdk_version: "31",
9782 static_libs: ["another_util"],
9783 }
9784
9785 java_library {
9786 name: "another_util",
9787 srcs: ["a.java"],
9788 min_sdk_version: "31",
9789 apex_available: ["myapex"],
9790 }
9791 `)
9792 })
9793
9794 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009795 t.Parallel()
Jihoon Kang85bc1932024-07-01 17:04:46 +00009796 preparer.
satayev758968a2021-12-06 11:42:40 +00009797 RunTestWithBp(t, `
9798 apex {
9799 name: "myapex",
9800 key: "myapex.key",
9801 bootclasspath_fragments: ["mybootclasspathfragment"],
9802 min_sdk_version: "30",
9803 updatable: false,
9804 }
9805
9806 apex_key {
9807 name: "myapex.key",
9808 public_key: "testkey.avbpubkey",
9809 private_key: "testkey.pem",
9810 }
9811
9812 bootclasspath_fragment {
9813 name: "mybootclasspathfragment",
9814 contents: ["mybootclasspathlib"],
9815 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009816 hidden_api: {
9817 split_packages: ["*"],
9818 },
satayev758968a2021-12-06 11:42:40 +00009819 }
9820
9821 java_sdk_library {
9822 name: "mybootclasspathlib",
9823 srcs: ["mybootclasspathlib.java"],
9824 apex_available: ["myapex"],
9825 compile_dex: true,
9826 unsafe_ignore_missing_latest_api: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009827 sdk_version: "current",
9828 min_sdk_version: "30",
satayev758968a2021-12-06 11:42:40 +00009829 }
9830 `)
9831 })
9832
9833 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009834 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009835 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9836 RunTestWithBp(t, `
9837 apex {
9838 name: "myapex",
9839 key: "myapex.key",
9840 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9841 min_sdk_version: "30",
9842 updatable: false,
9843 }
9844
9845 apex_key {
9846 name: "myapex.key",
9847 public_key: "testkey.avbpubkey",
9848 private_key: "testkey.pem",
9849 }
9850
9851 systemserverclasspath_fragment {
9852 name: "mysystemserverclasspathfragment",
9853 contents: ["mysystemserverclasspathlib"],
9854 apex_available: ["myapex"],
9855 }
9856
9857 java_sdk_library {
9858 name: "mysystemserverclasspathlib",
9859 srcs: ["mysystemserverclasspathlib.java"],
9860 apex_available: ["myapex"],
9861 compile_dex: true,
9862 unsafe_ignore_missing_latest_api: true,
9863 }
9864 `)
9865 })
9866}
9867
Jiakai Zhang6decef92022-01-12 17:56:19 +00009868// Verifies that the APEX depends on all the Make modules in the list.
9869func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9870 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9871 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009872 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009873 }
9874}
9875
9876// Verifies that the APEX does not depend on any of the Make modules in the list.
9877func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9878 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9879 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009880 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009881 }
9882}
9883
Cole Faust24e25c02024-01-19 14:12:17 -08009884func TestApexStrictUpdtabilityLint(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009885 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -08009886 bpTemplate := `
9887 apex {
9888 name: "myapex",
9889 key: "myapex.key",
9890 java_libs: ["myjavalib"],
9891 updatable: %v,
9892 min_sdk_version: "29",
9893 }
9894 apex_key {
9895 name: "myapex.key",
9896 }
9897 java_library {
9898 name: "myjavalib",
9899 srcs: ["MyClass.java"],
9900 apex_available: [ "myapex" ],
9901 lint: {
9902 strict_updatability_linting: %v,
9903 %s
9904 },
9905 sdk_version: "current",
9906 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -08009907 compile_dex: true,
Cole Faust24e25c02024-01-19 14:12:17 -08009908 }
9909 `
9910 fs := android.MockFS{
9911 "lint-baseline.xml": nil,
9912 }
9913
9914 testCases := []struct {
Colin Cross87427352024-09-25 15:41:19 -07009915 testCaseName string
9916 apexUpdatable bool
9917 javaStrictUpdtabilityLint bool
9918 lintFileExists bool
9919 disallowedFlagExpectedOnApex bool
9920 disallowedFlagExpectedOnJavalib bool
Cole Faust24e25c02024-01-19 14:12:17 -08009921 }{
9922 {
Colin Cross87427352024-09-25 15:41:19 -07009923 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9924 apexUpdatable: true,
9925 javaStrictUpdtabilityLint: true,
9926 lintFileExists: false,
9927 disallowedFlagExpectedOnApex: false,
9928 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -08009929 },
9930 {
Colin Cross87427352024-09-25 15:41:19 -07009931 testCaseName: "non-updatable apex respects strict_updatability of javalib",
9932 apexUpdatable: false,
9933 javaStrictUpdtabilityLint: false,
9934 lintFileExists: true,
9935 disallowedFlagExpectedOnApex: false,
9936 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -08009937 },
9938 {
Colin Cross87427352024-09-25 15:41:19 -07009939 testCaseName: "non-updatable apex respects strict updatability of javalib",
9940 apexUpdatable: false,
9941 javaStrictUpdtabilityLint: true,
9942 lintFileExists: true,
9943 disallowedFlagExpectedOnApex: false,
9944 disallowedFlagExpectedOnJavalib: true,
Cole Faust24e25c02024-01-19 14:12:17 -08009945 },
9946 {
Colin Cross87427352024-09-25 15:41:19 -07009947 testCaseName: "updatable apex checks strict updatability of javalib",
9948 apexUpdatable: true,
9949 javaStrictUpdtabilityLint: false,
9950 lintFileExists: true,
9951 disallowedFlagExpectedOnApex: true,
9952 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -08009953 },
9954 }
9955
9956 for _, testCase := range testCases {
Colin Cross87427352024-09-25 15:41:19 -07009957 t.Run(testCase.testCaseName, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009958 t.Parallel()
Colin Cross87427352024-09-25 15:41:19 -07009959 fixtures := []android.FixturePreparer{}
9960 baselineProperty := ""
9961 if testCase.lintFileExists {
9962 fixtures = append(fixtures, fs.AddToFixture())
9963 baselineProperty = "baseline_filename: \"lint-baseline.xml\""
9964 }
9965 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint, baselineProperty)
Cole Faust24e25c02024-01-19 14:12:17 -08009966
Colin Cross87427352024-09-25 15:41:19 -07009967 result := testApex(t, bp, fixtures...)
Cole Faust24e25c02024-01-19 14:12:17 -08009968
Colin Cross87427352024-09-25 15:41:19 -07009969 checkModule := func(m android.TestingBuildParams, name string, expectStrictUpdatability bool) {
9970 if expectStrictUpdatability {
9971 if m.Rule == nil {
9972 t.Errorf("expected strict updatability check rule on %s", name)
9973 } else {
9974 android.AssertStringDoesContain(t, fmt.Sprintf("strict updatability check rule for %s", name),
9975 m.RuleParams.Command, "--disallowed_issues NewApi")
9976 android.AssertStringListContains(t, fmt.Sprintf("strict updatability check baselines for %s", name),
9977 m.Inputs.Strings(), "lint-baseline.xml")
9978 }
9979 } else {
9980 if m.Rule != nil {
9981 t.Errorf("expected no strict updatability check rule on %s", name)
9982 }
9983 }
9984 }
9985
9986 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9987 apex := result.ModuleForTests("myapex", "android_common_myapex")
9988 apexStrictUpdatabilityCheck := apex.MaybeOutput("lint_strict_updatability_check.stamp")
9989 javalibStrictUpdatabilityCheck := myjavalib.MaybeOutput("lint_strict_updatability_check.stamp")
9990
9991 checkModule(apexStrictUpdatabilityCheck, "myapex", testCase.disallowedFlagExpectedOnApex)
9992 checkModule(javalibStrictUpdatabilityCheck, "myjavalib", testCase.disallowedFlagExpectedOnJavalib)
9993 })
Cole Faust24e25c02024-01-19 14:12:17 -08009994 }
9995}
9996
Cole Faust24e25c02024-01-19 14:12:17 -08009997// checks transtive deps of an apex coming from bootclasspath_fragment
9998func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009999 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -080010000 bp := `
10001 apex {
10002 name: "myapex",
10003 key: "myapex.key",
10004 bootclasspath_fragments: ["mybootclasspathfragment"],
10005 updatable: true,
10006 min_sdk_version: "29",
10007 }
10008 apex_key {
10009 name: "myapex.key",
10010 }
10011 bootclasspath_fragment {
10012 name: "mybootclasspathfragment",
10013 contents: ["myjavalib"],
10014 apex_available: ["myapex"],
10015 hidden_api: {
10016 split_packages: ["*"],
10017 },
10018 }
10019 java_library {
10020 name: "myjavalib",
10021 srcs: ["MyClass.java"],
10022 apex_available: [ "myapex" ],
10023 sdk_version: "current",
10024 min_sdk_version: "29",
10025 compile_dex: true,
10026 lint: {
10027 baseline_filename: "lint-baseline.xml",
10028 }
10029 }
10030 `
10031 fs := android.MockFS{
10032 "lint-baseline.xml": nil,
10033 }
10034
10035 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
Colin Cross87427352024-09-25 15:41:19 -070010036 apex := result.ModuleForTests("myapex", "android_common_myapex")
10037 apexStrictUpdatabilityCheck := apex.Output("lint_strict_updatability_check.stamp")
10038 android.AssertStringDoesContain(t, "strict updatability check rule for myapex",
10039 apexStrictUpdatabilityCheck.RuleParams.Command, "--disallowed_issues NewApi")
10040 android.AssertStringListContains(t, "strict updatability check baselines for myapex",
10041 apexStrictUpdatabilityCheck.Inputs.Strings(), "lint-baseline.xml")
Cole Faust24e25c02024-01-19 14:12:17 -080010042}
Spandan Das66773252022-01-15 00:23:18 +000010043
Jihoon Kang784c0052024-06-25 22:15:39 +000010044func TestApexLintBcpFragmentSdkLibDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010045 t.Parallel()
Jihoon Kang784c0052024-06-25 22:15:39 +000010046 bp := `
10047 apex {
10048 name: "myapex",
10049 key: "myapex.key",
10050 bootclasspath_fragments: ["mybootclasspathfragment"],
10051 min_sdk_version: "29",
Jihoon Kang85bc1932024-07-01 17:04:46 +000010052 java_libs: [
10053 "jacocoagent",
10054 ],
Jihoon Kang784c0052024-06-25 22:15:39 +000010055 }
10056 apex_key {
10057 name: "myapex.key",
10058 }
10059 bootclasspath_fragment {
10060 name: "mybootclasspathfragment",
10061 contents: ["foo"],
10062 apex_available: ["myapex"],
10063 hidden_api: {
10064 split_packages: ["*"],
10065 },
10066 }
10067 java_sdk_library {
10068 name: "foo",
10069 srcs: ["MyClass.java"],
10070 apex_available: [ "myapex" ],
10071 sdk_version: "current",
10072 min_sdk_version: "29",
10073 compile_dex: true,
10074 }
10075 `
10076 fs := android.MockFS{
10077 "lint-baseline.xml": nil,
10078 }
10079
10080 result := android.GroupFixturePreparers(
10081 prepareForApexTest,
10082 java.PrepareForTestWithJavaSdkLibraryFiles,
10083 java.PrepareForTestWithJacocoInstrumentation,
10084 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang784c0052024-06-25 22:15:39 +000010085 android.FixtureMergeMockFs(fs),
10086 ).RunTestWithBp(t, bp)
10087
10088 myapex := result.ModuleForTests("myapex", "android_common_myapex")
10089 lintReportInputs := strings.Join(myapex.Output("lint-report-xml.zip").Inputs.Strings(), " ")
10090 android.AssertStringDoesContain(t,
10091 "myapex lint report expected to contain that of the sdk library impl lib as an input",
10092 lintReportInputs, "foo.impl")
10093}
10094
Spandan Das42e89502022-05-06 22:12:55 +000010095// updatable apexes should propagate updatable=true to its apps
10096func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010097 t.Parallel()
Spandan Das42e89502022-05-06 22:12:55 +000010098 bp := `
10099 apex {
10100 name: "myapex",
10101 key: "myapex.key",
Colin Cross99939e92024-10-01 16:02:46 -070010102 updatable: true,
Spandan Das42e89502022-05-06 22:12:55 +000010103 apps: [
10104 "myapp",
10105 ],
10106 min_sdk_version: "30",
10107 }
10108 apex_key {
10109 name: "myapex.key",
10110 }
10111 android_app {
10112 name: "myapp",
Spandan Das42e89502022-05-06 22:12:55 +000010113 apex_available: [
10114 "myapex",
10115 ],
10116 sdk_version: "current",
10117 min_sdk_version: "30",
10118 }
10119 `
Colin Cross99939e92024-10-01 16:02:46 -070010120 _ = android.GroupFixturePreparers(
10121 prepareForApexTest,
10122 ).ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern("app dependency myapp must have updatable: true")).
10123 RunTestWithBp(t, bp)
Spandan Das42e89502022-05-06 22:12:55 +000010124}
10125
Jingwen Chendea7a642023-03-28 11:30:50 +000010126func TestCannedFsConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010127 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010128 ctx := testApex(t, `
10129 apex {
10130 name: "myapex",
10131 key: "myapex.key",
10132 updatable: false,
10133 }
10134
10135 apex_key {
10136 name: "myapex.key",
10137 public_key: "testkey.avbpubkey",
10138 private_key: "testkey.pem",
10139 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010140 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010141 generateFsRule := mod.Rule("generateFsConfig")
10142 cmd := generateFsRule.RuleParams.Command
10143
10144 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10145}
10146
10147func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010148 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010149 ctx := testApex(t, `
10150 apex {
10151 name: "myapex",
10152 key: "myapex.key",
10153 canned_fs_config: "my_config",
10154 updatable: false,
10155 }
10156
10157 apex_key {
10158 name: "myapex.key",
10159 public_key: "testkey.avbpubkey",
10160 private_key: "testkey.pem",
10161 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010162 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010163 generateFsRule := mod.Rule("generateFsConfig")
10164 cmd := generateFsRule.RuleParams.Command
10165
10166 // Ensure that canned_fs_config has "cat my_config" at the end
10167 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10168}
Spandan Das20fce2d2023-04-12 17:21:39 +000010169
10170func TestStubLibrariesMultipleApexViolation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010171 t.Parallel()
Spandan Das20fce2d2023-04-12 17:21:39 +000010172 testCases := []struct {
10173 desc string
10174 hasStubs bool
10175 apexAvailable string
10176 expectedError string
10177 }{
10178 {
10179 desc: "non-stub library can have multiple apex_available",
10180 hasStubs: false,
10181 apexAvailable: `["myapex", "otherapex"]`,
10182 },
10183 {
10184 desc: "stub library should not be available to anyapex",
10185 hasStubs: true,
10186 apexAvailable: `["//apex_available:anyapex"]`,
10187 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10188 },
10189 {
10190 desc: "stub library should not be available to multiple apexes",
10191 hasStubs: true,
10192 apexAvailable: `["myapex", "otherapex"]`,
10193 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10194 },
10195 {
10196 desc: "stub library can be available to a core apex and a test apex",
10197 hasStubs: true,
10198 apexAvailable: `["myapex", "test_myapex"]`,
10199 },
10200 }
10201 bpTemplate := `
10202 cc_library {
10203 name: "libfoo",
10204 %v
10205 apex_available: %v,
10206 }
10207 apex {
10208 name: "myapex",
10209 key: "apex.key",
10210 updatable: false,
10211 native_shared_libs: ["libfoo"],
10212 }
10213 apex {
10214 name: "otherapex",
10215 key: "apex.key",
10216 updatable: false,
10217 }
10218 apex_test {
10219 name: "test_myapex",
10220 key: "apex.key",
10221 updatable: false,
10222 native_shared_libs: ["libfoo"],
10223 }
10224 apex_key {
10225 name: "apex.key",
10226 }
10227 `
10228 for _, tc := range testCases {
10229 stubs := ""
10230 if tc.hasStubs {
10231 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10232 }
10233 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10234 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10235 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10236 })
10237 if tc.expectedError == "" {
10238 testApex(t, bp, mockFsFixturePreparer)
10239 } else {
10240 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10241 }
10242 }
10243}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010244
10245func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010246 t.Parallel()
Colin Crossbd3a16b2023-04-25 11:30:51 -070010247 context := android.GroupFixturePreparers(
10248 android.PrepareForIntegrationTestWithAndroid,
10249 cc.PrepareForIntegrationTestWithCc,
10250 PrepareForTestWithApexBuildComponents,
10251 prepareForTestWithMyapex,
10252 filesystem.PrepareForTestWithFilesystemBuildComponents,
10253 )
10254 result := context.RunTestWithBp(t, `
10255 android_system_image {
10256 name: "myfilesystem",
10257 deps: [
10258 "libfoo",
10259 ],
Spandan Das2047a4c2024-11-11 21:24:58 +000010260 linker_config: {
Kiyoung Kim67118212024-11-07 13:23:44 +090010261 gen_linker_config: true,
10262 linker_config_srcs: ["linker.config.json"],
10263 },
Colin Crossbd3a16b2023-04-25 11:30:51 -070010264 }
10265
10266 cc_library {
10267 name: "libfoo",
10268 shared_libs: [
10269 "libbar",
10270 ],
10271 stl: "none",
10272 }
10273
10274 cc_library {
10275 name: "libbar",
10276 stl: "none",
10277 apex_available: ["myapex"],
10278 }
10279
10280 apex {
10281 name: "myapex",
10282 native_shared_libs: ["libbar"],
10283 key: "myapex.key",
10284 updatable: false,
10285 }
10286
10287 apex_key {
10288 name: "myapex.key",
10289 public_key: "testkey.avbpubkey",
10290 private_key: "testkey.pem",
10291 }
10292 `)
10293
Cole Faust3b806d32024-03-11 15:15:03 -070010294 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img").Implicits
Colin Crossbd3a16b2023-04-25 11:30:51 -070010295 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10296 inputs.Strings(),
10297 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10298}
Yu Liueae7b362023-11-16 17:05:47 -080010299
10300var apex_default_bp = `
10301 apex_key {
10302 name: "myapex.key",
10303 public_key: "testkey.avbpubkey",
10304 private_key: "testkey.pem",
10305 }
10306
10307 filegroup {
10308 name: "myapex.manifest",
10309 srcs: ["apex_manifest.json"],
10310 }
10311
10312 filegroup {
10313 name: "myapex.androidmanifest",
10314 srcs: ["AndroidManifest.xml"],
10315 }
10316`
10317
10318func TestAconfigFilesJavaDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010319 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010320 ctx := testApex(t, apex_default_bp+`
10321 apex {
10322 name: "myapex",
10323 manifest: ":myapex.manifest",
10324 androidManifest: ":myapex.androidmanifest",
10325 key: "myapex.key",
10326 java_libs: [
10327 "my_java_library_foo",
10328 "my_java_library_bar",
10329 ],
10330 updatable: false,
10331 }
10332
10333 java_library {
10334 name: "my_java_library_foo",
10335 srcs: ["foo/bar/MyClass.java"],
10336 sdk_version: "none",
10337 system_modules: "none",
10338 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010339 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010340 "myapex",
10341 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010342 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010343 }
10344
10345 java_library {
10346 name: "my_java_library_bar",
10347 srcs: ["foo/bar/MyClass.java"],
10348 sdk_version: "none",
10349 system_modules: "none",
10350 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010351 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010352 "myapex",
10353 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010354 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010355 }
10356
10357 aconfig_declarations {
10358 name: "my_aconfig_declarations_foo",
10359 package: "com.example.package",
10360 container: "myapex",
10361 srcs: ["foo.aconfig"],
10362 }
10363
10364 java_aconfig_library {
10365 name: "my_java_aconfig_library_foo",
10366 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010367 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010368 "myapex",
10369 ],
10370 }
10371
10372 aconfig_declarations {
10373 name: "my_aconfig_declarations_bar",
10374 package: "com.example.package",
10375 container: "myapex",
10376 srcs: ["bar.aconfig"],
10377 }
10378
10379 java_aconfig_library {
10380 name: "my_java_aconfig_library_bar",
10381 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010382 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010383 "myapex",
10384 ],
10385 }
10386 `)
10387
10388 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10389 s := mod.Rule("apexRule").Args["copy_commands"]
10390 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010391 if len(copyCmds) != 14 {
10392 t.Fatalf("Expected 14 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010393 }
10394
Jooyung Hana3fddf42024-09-03 13:22:21 +090010395 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10396 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10397 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10398 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010399 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info.*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010400
Yu Liubba555e2024-02-17 00:36:42 +000010401 inputs := []string{
10402 "my_aconfig_declarations_foo/intermediate.pb",
10403 "my_aconfig_declarations_bar/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010404 }
Yu Liubba555e2024-02-17 00:36:42 +000010405 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10406 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10407 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10408 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010409 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010410}
10411
10412func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010413 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010414 ctx := testApex(t, apex_default_bp+`
10415 apex {
10416 name: "myapex",
10417 manifest: ":myapex.manifest",
10418 androidManifest: ":myapex.androidmanifest",
10419 key: "myapex.key",
10420 java_libs: [
10421 "my_java_library_foo",
10422 ],
10423 native_shared_libs: [
10424 "my_cc_library_bar",
10425 ],
10426 binaries: [
10427 "my_cc_binary_baz",
10428 ],
10429 updatable: false,
10430 }
10431
10432 java_library {
10433 name: "my_java_library_foo",
10434 srcs: ["foo/bar/MyClass.java"],
10435 sdk_version: "none",
10436 system_modules: "none",
10437 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010438 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010439 "myapex",
10440 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010441 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010442 }
10443
10444 cc_library {
10445 name: "my_cc_library_bar",
10446 srcs: ["foo/bar/MyClass.cc"],
Yu Liucec0e412023-11-30 16:45:50 -080010447 static_libs: [
10448 "my_cc_aconfig_library_bar",
10449 "my_cc_aconfig_library_baz",
10450 ],
Yu Liueae7b362023-11-16 17:05:47 -080010451 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010452 "myapex",
10453 ],
10454 }
10455
10456 cc_binary {
10457 name: "my_cc_binary_baz",
10458 srcs: ["foo/bar/MyClass.cc"],
10459 static_libs: ["my_cc_aconfig_library_baz"],
Yu Liueae7b362023-11-16 17:05:47 -080010460 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010461 "myapex",
10462 ],
10463 }
10464
10465 aconfig_declarations {
10466 name: "my_aconfig_declarations_foo",
10467 package: "com.example.package",
10468 container: "myapex",
10469 srcs: ["foo.aconfig"],
10470 }
10471
10472 java_aconfig_library {
10473 name: "my_java_aconfig_library_foo",
10474 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010475 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010476 "myapex",
10477 ],
10478 }
10479
10480 aconfig_declarations {
10481 name: "my_aconfig_declarations_bar",
10482 package: "com.example.package",
10483 container: "myapex",
10484 srcs: ["bar.aconfig"],
10485 }
10486
10487 cc_aconfig_library {
10488 name: "my_cc_aconfig_library_bar",
10489 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010490 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010491 "myapex",
10492 ],
10493 }
10494
10495 aconfig_declarations {
10496 name: "my_aconfig_declarations_baz",
10497 package: "com.example.package",
10498 container: "myapex",
10499 srcs: ["baz.aconfig"],
10500 }
10501
10502 cc_aconfig_library {
10503 name: "my_cc_aconfig_library_baz",
10504 aconfig_declarations: "my_aconfig_declarations_baz",
Yu Liueae7b362023-11-16 17:05:47 -080010505 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010506 "myapex",
10507 ],
10508 }
10509
10510 cc_library {
10511 name: "server_configurable_flags",
10512 srcs: ["server_configurable_flags.cc"],
10513 }
Ted Bauerf0f18592024-04-23 18:25:26 +000010514 cc_library {
10515 name: "libbase",
10516 srcs: ["libbase.cc"],
Ted Bauer1e96f8c2024-04-25 19:50:01 +000010517 apex_available: [
10518 "myapex",
10519 ],
Ted Bauerf0f18592024-04-23 18:25:26 +000010520 }
10521 cc_library {
10522 name: "libaconfig_storage_read_api_cc",
10523 srcs: ["libaconfig_storage_read_api_cc.cc"],
10524 }
Yu Liueae7b362023-11-16 17:05:47 -080010525 `)
10526
10527 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10528 s := mod.Rule("apexRule").Args["copy_commands"]
10529 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010530 if len(copyCmds) != 18 {
10531 t.Fatalf("Expected 18 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010532 }
10533
Jooyung Hana3fddf42024-09-03 13:22:21 +090010534 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10535 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10536 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10537 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010538 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010539
Yu Liubba555e2024-02-17 00:36:42 +000010540 inputs := []string{
10541 "my_aconfig_declarations_foo/intermediate.pb",
10542 "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/myapex/aconfig_merged.pb",
10543 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010544 }
Yu Liubba555e2024-02-17 00:36:42 +000010545 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10546 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10547 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10548 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010549 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010550}
10551
Yu Liucec0e412023-11-30 16:45:50 -080010552func TestAconfigFilesRustDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010553 t.Parallel()
Yu Liucec0e412023-11-30 16:45:50 -080010554 ctx := testApex(t, apex_default_bp+`
10555 apex {
10556 name: "myapex",
10557 manifest: ":myapex.manifest",
10558 androidManifest: ":myapex.androidmanifest",
10559 key: "myapex.key",
10560 native_shared_libs: [
10561 "libmy_rust_library",
10562 ],
10563 binaries: [
10564 "my_rust_binary",
10565 ],
10566 rust_dyn_libs: [
10567 "libmy_rust_dylib",
10568 ],
10569 updatable: false,
10570 }
10571
10572 rust_library {
10573 name: "libflags_rust", // test mock
10574 crate_name: "flags_rust",
10575 srcs: ["lib.rs"],
10576 apex_available: [
10577 "myapex",
10578 ],
10579 }
10580
10581 rust_library {
10582 name: "liblazy_static", // test mock
10583 crate_name: "lazy_static",
10584 srcs: ["src/lib.rs"],
10585 apex_available: [
10586 "myapex",
10587 ],
10588 }
10589
Ted Bauer02d475c2024-03-27 20:56:26 +000010590 rust_library {
10591 name: "libaconfig_storage_read_api", // test mock
10592 crate_name: "aconfig_storage_read_api",
10593 srcs: ["src/lib.rs"],
10594 apex_available: [
10595 "myapex",
10596 ],
10597 }
10598
Ted Bauer6ef40db2024-03-29 14:04:10 +000010599 rust_library {
10600 name: "liblogger", // test mock
10601 crate_name: "logger",
10602 srcs: ["src/lib.rs"],
10603 apex_available: [
10604 "myapex",
10605 ],
10606 }
10607
10608 rust_library {
10609 name: "liblog_rust", // test mock
10610 crate_name: "log_rust",
10611 srcs: ["src/lib.rs"],
10612 apex_available: [
10613 "myapex",
10614 ],
10615 }
10616
Yu Liucec0e412023-11-30 16:45:50 -080010617 rust_ffi_shared {
10618 name: "libmy_rust_library",
10619 srcs: ["src/lib.rs"],
10620 rustlibs: ["libmy_rust_aconfig_library_foo"],
10621 crate_name: "my_rust_library",
10622 apex_available: [
10623 "myapex",
10624 ],
10625 }
10626
10627 rust_library_dylib {
10628 name: "libmy_rust_dylib",
10629 srcs: ["foo/bar/MyClass.rs"],
10630 rustlibs: ["libmy_rust_aconfig_library_bar"],
10631 crate_name: "my_rust_dylib",
10632 apex_available: [
10633 "myapex",
10634 ],
10635 }
10636
10637 rust_binary {
10638 name: "my_rust_binary",
10639 srcs: ["foo/bar/MyClass.rs"],
10640 rustlibs: [
10641 "libmy_rust_aconfig_library_baz",
10642 "libmy_rust_dylib",
10643 ],
10644 apex_available: [
10645 "myapex",
10646 ],
10647 }
10648
10649 aconfig_declarations {
10650 name: "my_aconfig_declarations_foo",
10651 package: "com.example.package",
10652 container: "myapex",
10653 srcs: ["foo.aconfig"],
10654 }
10655
10656 aconfig_declarations {
10657 name: "my_aconfig_declarations_bar",
10658 package: "com.example.package",
10659 container: "myapex",
10660 srcs: ["bar.aconfig"],
10661 }
10662
10663 aconfig_declarations {
10664 name: "my_aconfig_declarations_baz",
10665 package: "com.example.package",
10666 container: "myapex",
10667 srcs: ["baz.aconfig"],
10668 }
10669
10670 rust_aconfig_library {
10671 name: "libmy_rust_aconfig_library_foo",
10672 aconfig_declarations: "my_aconfig_declarations_foo",
10673 crate_name: "my_rust_aconfig_library_foo",
10674 apex_available: [
10675 "myapex",
10676 ],
10677 }
10678
10679 rust_aconfig_library {
10680 name: "libmy_rust_aconfig_library_bar",
10681 aconfig_declarations: "my_aconfig_declarations_bar",
10682 crate_name: "my_rust_aconfig_library_bar",
10683 apex_available: [
10684 "myapex",
10685 ],
10686 }
10687
10688 rust_aconfig_library {
10689 name: "libmy_rust_aconfig_library_baz",
10690 aconfig_declarations: "my_aconfig_declarations_baz",
10691 crate_name: "my_rust_aconfig_library_baz",
10692 apex_available: [
10693 "myapex",
10694 ],
10695 }
10696 `)
10697
10698 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10699 s := mod.Rule("apexRule").Args["copy_commands"]
10700 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010701 if len(copyCmds) != 38 {
10702 t.Fatalf("Expected 38 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liucec0e412023-11-30 16:45:50 -080010703 }
10704
Jooyung Hana3fddf42024-09-03 13:22:21 +090010705 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10706 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10707 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10708 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010709 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liucec0e412023-11-30 16:45:50 -080010710
Yu Liubba555e2024-02-17 00:36:42 +000010711 inputs := []string{
10712 "my_aconfig_declarations_foo/intermediate.pb",
Yu Liuab31c822024-02-28 22:21:31 +000010713 "my_aconfig_declarations_bar/intermediate.pb",
10714 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liubba555e2024-02-17 00:36:42 +000010715 "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb",
10716 }
10717 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10718 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10719 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10720 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010721 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liubba555e2024-02-17 00:36:42 +000010722}
10723
10724func VerifyAconfigRule(t *testing.T, mod *android.TestingModule, desc string, inputs []string, output string, container string, file_type string) {
10725 aconfigRule := mod.Description(desc)
10726 s := " " + aconfigRule.Args["cache_files"]
Yu Liucec0e412023-11-30 16:45:50 -080010727 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
Yu Liubba555e2024-02-17 00:36:42 +000010728 if len(aconfigArgs) != len(inputs) {
10729 t.Fatalf("Expected %d commands, got %d in:\n%s", len(inputs), len(aconfigArgs), s)
Yu Liucec0e412023-11-30 16:45:50 -080010730 }
Yu Liucec0e412023-11-30 16:45:50 -080010731
Yu Liubba555e2024-02-17 00:36:42 +000010732 ensureEquals(t, container, aconfigRule.Args["container"])
10733 ensureEquals(t, file_type, aconfigRule.Args["file_type"])
10734
10735 buildParams := aconfigRule.BuildParams
10736 for _, input := range inputs {
10737 android.EnsureListContainsSuffix(t, aconfigArgs, input)
10738 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), input)
Yu Liucec0e412023-11-30 16:45:50 -080010739 }
Yu Liubba555e2024-02-17 00:36:42 +000010740
10741 ensureContains(t, buildParams.Output.String(), output)
Yu Liucec0e412023-11-30 16:45:50 -080010742}
10743
Yu Liueae7b362023-11-16 17:05:47 -080010744func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010745 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010746 ctx := testApex(t, apex_default_bp+`
10747 apex {
10748 name: "myapex",
10749 manifest: ":myapex.manifest",
10750 androidManifest: ":myapex.androidmanifest",
10751 key: "myapex.key",
10752 java_libs: [
10753 "my_java_library_foo",
10754 "other_java_library_bar",
10755 ],
10756 updatable: false,
10757 }
10758
10759 java_library {
10760 name: "my_java_library_foo",
10761 srcs: ["foo/bar/MyClass.java"],
10762 sdk_version: "none",
10763 system_modules: "none",
10764 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010765 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010766 "myapex",
10767 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010768 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010769 }
10770
10771 java_library {
10772 name: "other_java_library_bar",
10773 srcs: ["foo/bar/MyClass.java"],
10774 sdk_version: "none",
10775 system_modules: "none",
10776 static_libs: ["other_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010777 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010778 "myapex",
10779 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010780 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010781 }
10782
10783 aconfig_declarations {
10784 name: "my_aconfig_declarations_foo",
10785 package: "com.example.package",
10786 container: "myapex",
10787 srcs: ["foo.aconfig"],
10788 }
10789
10790 java_aconfig_library {
10791 name: "my_java_aconfig_library_foo",
10792 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010793 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010794 "myapex",
10795 ],
10796 }
10797
10798 aconfig_declarations {
10799 name: "other_aconfig_declarations_bar",
10800 package: "com.example.package",
10801 container: "otherapex",
10802 srcs: ["bar.aconfig"],
10803 }
10804
10805 java_aconfig_library {
10806 name: "other_java_aconfig_library_bar",
10807 aconfig_declarations: "other_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010808 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010809 "myapex",
10810 ],
10811 }
10812 `)
10813
10814 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10815 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10816 s := " " + combineAconfigRule.Args["cache_files"]
10817 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10818 if len(aconfigArgs) != 1 {
10819 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
10820 }
10821 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10822
10823 buildParams := combineAconfigRule.BuildParams
10824 if len(buildParams.Inputs) != 1 {
10825 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
10826 }
10827 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10828 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10829}
10830
10831func TestAconfigFilesRemoveDuplicates(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010832 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010833 ctx := testApex(t, apex_default_bp+`
10834 apex {
10835 name: "myapex",
10836 manifest: ":myapex.manifest",
10837 androidManifest: ":myapex.androidmanifest",
10838 key: "myapex.key",
10839 java_libs: [
10840 "my_java_library_foo",
10841 "my_java_library_bar",
10842 ],
10843 updatable: false,
10844 }
10845
10846 java_library {
10847 name: "my_java_library_foo",
10848 srcs: ["foo/bar/MyClass.java"],
10849 sdk_version: "none",
10850 system_modules: "none",
10851 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010852 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010853 "myapex",
10854 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010855 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010856 }
10857
10858 java_library {
10859 name: "my_java_library_bar",
10860 srcs: ["foo/bar/MyClass.java"],
10861 sdk_version: "none",
10862 system_modules: "none",
10863 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010864 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010865 "myapex",
10866 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010867 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010868 }
10869
10870 aconfig_declarations {
10871 name: "my_aconfig_declarations_foo",
10872 package: "com.example.package",
10873 container: "myapex",
10874 srcs: ["foo.aconfig"],
10875 }
10876
10877 java_aconfig_library {
10878 name: "my_java_aconfig_library_foo",
10879 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010880 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010881 "myapex",
10882 ],
10883 }
10884
10885 java_aconfig_library {
10886 name: "my_java_aconfig_library_bar",
10887 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010888 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010889 "myapex",
10890 ],
10891 }
10892 `)
10893
10894 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10895 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10896 s := " " + combineAconfigRule.Args["cache_files"]
10897 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10898 if len(aconfigArgs) != 1 {
10899 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
10900 }
10901 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10902
10903 buildParams := combineAconfigRule.BuildParams
10904 if len(buildParams.Inputs) != 1 {
10905 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
10906 }
10907 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10908 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10909}
Spandan Das5be63332023-12-13 00:06:32 +000010910
10911// Test that the boot jars come from the _selected_ apex prebuilt
10912// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
10913func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010914 t.Parallel()
Spandan Das5be63332023-12-13 00:06:32 +000010915 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
10916 t.Helper()
10917 s := ctx.ModuleForTests("dex_bootjars", "android_common")
10918 foundLibfooJar := false
10919 base := stem + ".jar"
10920 for _, output := range s.AllOutputs() {
10921 if filepath.Base(output) == base {
10922 foundLibfooJar = true
10923 buildRule := s.Output(output)
10924 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
10925 }
10926 }
10927 if !foundLibfooJar {
10928 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
10929 }
10930 }
10931
Spandan Das64c9e0c2023-12-20 20:13:34 +000010932 // Check that the boot jars of the selected apex are run through boot_jars_package_check
10933 // This validates that the jars on the bootclasspath do not contain packages outside an allowlist
10934 checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
10935 platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common")
10936 bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
10937 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)
10938 }
10939
10940 // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex
10941 checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
10942 monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command
10943 android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar)
10944 }
10945
Spandan Das5be63332023-12-13 00:06:32 +000010946 bp := `
10947 // Source APEX.
10948
10949 java_library {
10950 name: "framework-foo",
10951 srcs: ["foo.java"],
10952 installable: true,
10953 apex_available: [
10954 "com.android.foo",
10955 ],
10956 }
10957
10958 bootclasspath_fragment {
10959 name: "foo-bootclasspath-fragment",
10960 contents: ["framework-foo"],
10961 apex_available: [
10962 "com.android.foo",
10963 ],
10964 hidden_api: {
10965 split_packages: ["*"],
10966 },
10967 }
10968
10969 apex_key {
10970 name: "com.android.foo.key",
10971 public_key: "com.android.foo.avbpubkey",
10972 private_key: "com.android.foo.pem",
10973 }
10974
10975 apex {
10976 name: "com.android.foo",
10977 key: "com.android.foo.key",
10978 bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10979 updatable: false,
10980 }
10981
10982 // Prebuilt APEX.
10983
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010984 java_sdk_library_import {
Spandan Das5be63332023-12-13 00:06:32 +000010985 name: "framework-foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010986 public: {
10987 jars: ["foo.jar"],
10988 },
Spandan Das5be63332023-12-13 00:06:32 +000010989 apex_available: ["com.android.foo"],
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010990 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +000010991 }
10992
10993 prebuilt_bootclasspath_fragment {
10994 name: "foo-bootclasspath-fragment",
10995 contents: ["framework-foo"],
10996 hidden_api: {
10997 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
10998 metadata: "my-bootclasspath-fragment/metadata.csv",
10999 index: "my-bootclasspath-fragment/index.csv",
11000 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
11001 all_flags: "my-bootclasspath-fragment/all-flags.csv",
11002 },
11003 apex_available: [
11004 "com.android.foo",
11005 ],
11006 }
11007
11008 prebuilt_apex {
11009 name: "com.android.foo",
11010 apex_name: "com.android.foo",
11011 src: "com.android.foo-arm.apex",
11012 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11013 }
11014
11015 // Another Prebuilt ART APEX
11016 prebuilt_apex {
11017 name: "com.android.foo.v2",
11018 apex_name: "com.android.foo", // Used to determine the API domain
11019 src: "com.android.foo-arm.apex",
11020 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11021 }
11022
11023 // APEX contribution modules
11024
11025 apex_contributions {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011026 name: "foo.source.contributions",
Spandan Das5be63332023-12-13 00:06:32 +000011027 api_domain: "com.android.foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011028 contents: ["com.android.foo"],
11029 }
11030
11031 apex_contributions {
11032 name: "foo.prebuilt.contributions",
11033 api_domain: "com.android.foo",
11034 contents: ["prebuilt_com.android.foo"],
11035 }
11036
11037 apex_contributions {
11038 name: "foo.prebuilt.v2.contributions",
11039 api_domain: "com.android.foo",
11040 contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
Spandan Das5be63332023-12-13 00:06:32 +000011041 }
11042 `
11043
11044 testCases := []struct {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011045 desc string
11046 selectedApexContributions string
11047 expectedBootJar string
Spandan Das5be63332023-12-13 00:06:32 +000011048 }{
11049 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011050 desc: "Source apex com.android.foo is selected, bootjar should come from source java library",
11051 selectedApexContributions: "foo.source.contributions",
11052 expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_apex10000/hiddenapi-modular/encoded/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011053 },
11054 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011055 desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
11056 selectedApexContributions: "foo.prebuilt.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000011057 expectedBootJar: "out/soong/.intermediates/prebuilt_com.android.foo/android_common_com.android.foo/deapexer/javalib/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011058 },
11059 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011060 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt",
11061 selectedApexContributions: "foo.prebuilt.v2.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000011062 expectedBootJar: "out/soong/.intermediates/com.android.foo.v2/android_common_com.android.foo/deapexer/javalib/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011063 },
11064 }
11065
11066 fragment := java.ApexVariantReference{
11067 Apex: proptools.StringPtr("com.android.foo"),
11068 Module: proptools.StringPtr("foo-bootclasspath-fragment"),
11069 }
11070
11071 for _, tc := range testCases {
11072 preparer := android.GroupFixturePreparers(
11073 java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"),
11074 android.FixtureMergeMockFs(map[string][]byte{
11075 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11076 }),
Spandan Das81fe4d12024-05-15 18:43:47 +000011077 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
11078 // file creation.
11079 java.FixtureConfigureBootJars("platform:foo"),
11080 android.FixtureModifyMockFS(func(fs android.MockFS) {
11081 fs["platform/Android.bp"] = []byte(`
11082 java_library {
11083 name: "foo",
11084 srcs: ["Test.java"],
11085 compile_dex: true,
11086 }
11087 `)
11088 fs["platform/Test.java"] = nil
11089 }),
11090
Colin Crossa66b4632024-08-08 15:50:47 -070011091 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das5be63332023-12-13 00:06:32 +000011092 )
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011093 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das5be63332023-12-13 00:06:32 +000011094 checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar)
Spandan Das64c9e0c2023-12-20 20:13:34 +000011095 checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar)
11096 checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar)
Spandan Das5be63332023-12-13 00:06:32 +000011097 }
11098}
Spandan Das3576e762024-01-03 18:57:03 +000011099
11100// Test that product packaging installs the selected mainline module (either source or a specific prebuilt)
11101// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11102func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011103 t.Parallel()
Spandan Das3576e762024-01-03 18:57:03 +000011104 // for a mainline module family, check that only the flagged soong module is visible to make
11105 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) {
11106 variation := func(moduleName string) string {
11107 ret := "android_common_com.android.foo"
11108 if moduleName == "com.google.android.foo" {
Spandan Das50801e22024-05-13 18:29:45 +000011109 ret = "android_common_com.google.android.foo_com.google.android.foo"
Spandan Das3576e762024-01-03 18:57:03 +000011110 }
11111 return ret
11112 }
11113
11114 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11115 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11116
11117 for _, hiddenModuleName := range hiddenModuleNames {
11118 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11119 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11120
11121 }
11122 }
11123
11124 bp := `
11125 apex_key {
11126 name: "com.android.foo.key",
11127 public_key: "com.android.foo.avbpubkey",
11128 private_key: "com.android.foo.pem",
11129 }
11130
11131 // AOSP source apex
11132 apex {
11133 name: "com.android.foo",
11134 key: "com.android.foo.key",
11135 updatable: false,
11136 }
11137
11138 // Google source apex
11139 override_apex {
11140 name: "com.google.android.foo",
11141 base: "com.android.foo",
11142 key: "com.android.foo.key",
11143 }
11144
11145 // Prebuilt Google APEX.
11146
11147 prebuilt_apex {
11148 name: "com.google.android.foo",
11149 apex_name: "com.android.foo",
11150 src: "com.android.foo-arm.apex",
11151 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11152 }
11153
11154 // Another Prebuilt Google APEX
11155 prebuilt_apex {
11156 name: "com.google.android.foo.v2",
11157 apex_name: "com.android.foo",
Spandan Dasa8e2d612024-07-26 19:24:27 +000011158 source_apex_name: "com.google.android.foo",
Spandan Das3576e762024-01-03 18:57:03 +000011159 src: "com.android.foo-arm.apex",
11160 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11161 }
11162
11163 // APEX contribution modules
11164
11165 apex_contributions {
11166 name: "foo.source.contributions",
11167 api_domain: "com.android.foo",
11168 contents: ["com.google.android.foo"],
11169 }
11170
11171 apex_contributions {
11172 name: "foo.prebuilt.contributions",
11173 api_domain: "com.android.foo",
11174 contents: ["prebuilt_com.google.android.foo"],
11175 }
11176
11177 apex_contributions {
11178 name: "foo.prebuilt.v2.contributions",
11179 api_domain: "com.android.foo",
11180 contents: ["prebuilt_com.google.android.foo.v2"],
11181 }
11182
11183 // This is an incompatible module because it selects multiple versions of the same mainline module
11184 apex_contributions {
11185 name: "foo.prebuilt.duplicate.contributions",
11186 api_domain: "com.android.foo",
11187 contents: [
11188 "prebuilt_com.google.android.foo",
11189 "prebuilt_com.google.android.foo.v2",
11190 ],
11191 }
11192 `
11193
11194 testCases := []struct {
11195 desc string
11196 selectedApexContributions string
11197 expectedVisibleModuleName string
11198 expectedHiddenModuleNames []string
11199 expectedError string
11200 }{
11201 {
11202 desc: "Source apex is selected, prebuilts should be hidden from make",
11203 selectedApexContributions: "foo.source.contributions",
11204 expectedVisibleModuleName: "com.google.android.foo",
11205 expectedHiddenModuleNames: []string{"prebuilt_com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11206 },
11207 {
11208 desc: "Prebuilt apex prebuilt_com.android.foo is selected, source and the other prebuilt should be hidden from make",
11209 selectedApexContributions: "foo.prebuilt.contributions",
11210 expectedVisibleModuleName: "prebuilt_com.google.android.foo",
11211 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11212 },
11213 {
11214 desc: "Prebuilt apex prebuilt_com.android.fooi.v2 is selected, source and the other prebuilt should be hidden from make",
11215 selectedApexContributions: "foo.prebuilt.v2.contributions",
11216 expectedVisibleModuleName: "prebuilt_com.google.android.foo.v2",
11217 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo"},
11218 },
11219 {
11220 desc: "Multiple versions of a prebuilt apex is selected in the same release config",
11221 selectedApexContributions: "foo.prebuilt.duplicate.contributions",
11222 expectedError: "Found duplicate variations of the same module in apex_contributions: prebuilt_com.google.android.foo and prebuilt_com.google.android.foo.v2",
11223 },
11224 }
11225
11226 for _, tc := range testCases {
11227 preparer := android.GroupFixturePreparers(
11228 android.FixtureMergeMockFs(map[string][]byte{
11229 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11230 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011231 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das3576e762024-01-03 18:57:03 +000011232 )
11233 if tc.expectedError != "" {
11234 preparer = preparer.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(tc.expectedError))
11235 testApex(t, bp, preparer)
11236 return
11237 }
11238 ctx := testApex(t, bp, preparer)
11239
Spandan Das3576e762024-01-03 18:57:03 +000011240 // Check that
11241 // 1. The contents of the selected apex_contributions are visible to make
11242 // 2. The rest of the apexes in the mainline module family (source or other prebuilt) is hidden from make
11243 checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
11244 }
11245}
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011246
Spandan Das85bd4622024-08-01 00:51:20 +000011247// Test that product packaging installs the selected mainline module in workspaces withtout source mainline module
11248func TestInstallationRulesForMultipleApexPrebuiltsWithoutSource(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011249 t.Parallel()
Spandan Das85bd4622024-08-01 00:51:20 +000011250 // for a mainline module family, check that only the flagged soong module is visible to make
11251 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleNames []string, hiddenModuleNames []string) {
11252 variation := func(moduleName string) string {
11253 ret := "android_common_com.android.adservices"
11254 if moduleName == "com.google.android.foo" {
11255 ret = "android_common_com.google.android.foo_com.google.android.foo"
11256 }
11257 return ret
11258 }
11259
11260 for _, visibleModuleName := range visibleModuleNames {
11261 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11262 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11263 }
11264
11265 for _, hiddenModuleName := range hiddenModuleNames {
11266 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11267 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11268
11269 }
11270 }
11271
11272 bp := `
11273 apex_key {
11274 name: "com.android.adservices.key",
11275 public_key: "com.android.adservices.avbpubkey",
11276 private_key: "com.android.adservices.pem",
11277 }
11278
11279 // AOSP source apex
11280 apex {
11281 name: "com.android.adservices",
11282 key: "com.android.adservices.key",
11283 updatable: false,
11284 }
11285
11286 // Prebuilt Google APEX.
11287
11288 prebuilt_apex {
11289 name: "com.google.android.adservices",
11290 apex_name: "com.android.adservices",
11291 src: "com.android.foo-arm.apex",
11292 }
11293
11294 // Another Prebuilt Google APEX
11295 prebuilt_apex {
11296 name: "com.google.android.adservices.v2",
11297 apex_name: "com.android.adservices",
11298 src: "com.android.foo-arm.apex",
11299 }
11300
11301 // APEX contribution modules
11302
11303
11304 apex_contributions {
11305 name: "adservices.prebuilt.contributions",
11306 api_domain: "com.android.adservices",
11307 contents: ["prebuilt_com.google.android.adservices"],
11308 }
11309
11310 apex_contributions {
11311 name: "adservices.prebuilt.v2.contributions",
11312 api_domain: "com.android.adservices",
11313 contents: ["prebuilt_com.google.android.adservices.v2"],
11314 }
11315 `
11316
11317 testCases := []struct {
11318 desc string
11319 selectedApexContributions string
11320 expectedVisibleModuleNames []string
11321 expectedHiddenModuleNames []string
11322 }{
11323 {
11324 desc: "No apex contributions selected, source aosp apex should be visible, and mainline prebuilts should be hidden",
11325 selectedApexContributions: "",
11326 expectedVisibleModuleNames: []string{"com.android.adservices"},
11327 expectedHiddenModuleNames: []string{"com.google.android.adservices", "com.google.android.adservices.v2"},
11328 },
11329 {
11330 desc: "Prebuilt apex prebuilt_com.android.foo is selected",
11331 selectedApexContributions: "adservices.prebuilt.contributions",
11332 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices"},
11333 expectedHiddenModuleNames: []string{"com.google.android.adservices.v2"},
11334 },
11335 {
11336 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected",
11337 selectedApexContributions: "adservices.prebuilt.v2.contributions",
11338 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices.v2"},
11339 expectedHiddenModuleNames: []string{"com.google.android.adservices"},
11340 },
11341 }
11342
11343 for _, tc := range testCases {
11344 preparer := android.GroupFixturePreparers(
11345 android.FixtureMergeMockFs(map[string][]byte{
11346 "system/sepolicy/apex/com.android.adservices-file_contexts": nil,
11347 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011348 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das85bd4622024-08-01 00:51:20 +000011349 )
11350 ctx := testApex(t, bp, preparer)
11351
11352 checkHideFromMake(t, ctx, tc.expectedVisibleModuleNames, tc.expectedHiddenModuleNames)
11353 }
11354}
11355
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011356func TestAconfifDeclarationsValidation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011357 t.Parallel()
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011358 aconfigDeclarationLibraryString := func(moduleNames []string) (ret string) {
11359 for _, moduleName := range moduleNames {
11360 ret += fmt.Sprintf(`
11361 aconfig_declarations {
11362 name: "%[1]s",
11363 package: "com.example.package",
Yu Liu315a53c2024-04-24 16:41:57 +000011364 container: "system",
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011365 srcs: [
11366 "%[1]s.aconfig",
11367 ],
11368 }
11369 java_aconfig_library {
11370 name: "%[1]s-lib",
11371 aconfig_declarations: "%[1]s",
11372 }
11373 `, moduleName)
11374 }
11375 return ret
11376 }
11377
11378 result := android.GroupFixturePreparers(
11379 prepareForApexTest,
11380 java.PrepareForTestWithJavaSdkLibraryFiles,
11381 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011382 ).RunTestWithBp(t, `
11383 java_library {
11384 name: "baz-java-lib",
11385 static_libs: [
11386 "baz-lib",
11387 ],
11388 }
11389 filegroup {
11390 name: "qux-filegroup",
Cole Faust65cb40a2024-10-21 15:41:42 -070011391 device_common_srcs: [
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011392 ":qux-lib{.generated_srcjars}",
11393 ],
11394 }
11395 filegroup {
11396 name: "qux-another-filegroup",
11397 srcs: [
11398 ":qux-filegroup",
11399 ],
11400 }
11401 java_library {
11402 name: "quux-java-lib",
11403 srcs: [
11404 "a.java",
11405 ],
11406 libs: [
11407 "quux-lib",
11408 ],
11409 }
11410 java_sdk_library {
11411 name: "foo",
11412 srcs: [
11413 ":qux-another-filegroup",
11414 ],
11415 api_packages: ["foo"],
11416 system: {
11417 enabled: true,
11418 },
11419 module_lib: {
11420 enabled: true,
11421 },
11422 test: {
11423 enabled: true,
11424 },
11425 static_libs: [
11426 "bar-lib",
11427 ],
11428 libs: [
11429 "baz-java-lib",
11430 "quux-java-lib",
11431 ],
11432 aconfig_declarations: [
11433 "bar",
11434 ],
11435 }
11436 `+aconfigDeclarationLibraryString([]string{"bar", "baz", "qux", "quux"}))
11437
11438 m := result.ModuleForTests("foo.stubs.source", "android_common")
11439 outDir := "out/soong/.intermediates"
11440
11441 // Arguments passed to aconfig to retrieve the state of the flags defined in the
11442 // textproto files
11443 aconfigFlagArgs := m.Output("released-flagged-apis-exportable.txt").Args["flags_path"]
11444
11445 // "bar-lib" is a static_lib of "foo" and is passed to metalava as classpath. Thus the
11446 // cache file provided by the associated aconfig_declarations module "bar" should be passed
11447 // to aconfig.
11448 android.AssertStringDoesContain(t, "cache file of a java_aconfig_library static_lib "+
11449 "passed as an input",
11450 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "bar"))
11451
11452 // "baz-java-lib", which statically depends on "baz-lib", is a lib of "foo" and is passed
11453 // to metalava as classpath. Thus the cache file provided by the associated
11454 // aconfig_declarations module "baz" should be passed to aconfig.
11455 android.AssertStringDoesContain(t, "cache file of a lib that statically depends on "+
11456 "java_aconfig_library passed as an input",
11457 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "baz"))
11458
11459 // "qux-lib" is passed to metalava as src via the filegroup, thus the cache file provided by
11460 // the associated aconfig_declarations module "qux" should be passed to aconfig.
11461 android.AssertStringDoesContain(t, "cache file of srcs java_aconfig_library passed as an "+
11462 "input",
11463 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "qux"))
11464
11465 // "quux-java-lib" is a lib of "foo" and is passed to metalava as classpath, but does not
11466 // statically depend on "quux-lib". Therefore, the cache file provided by the associated
11467 // aconfig_declarations module "quux" should not be passed to aconfig.
11468 android.AssertStringDoesNotContain(t, "cache file of a lib that does not statically "+
11469 "depend on java_aconfig_library not passed as an input",
11470 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "quux"))
11471}
Cole Faust7c991b42024-05-15 11:17:55 -070011472
11473func TestMultiplePrebuiltsWithSameBase(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011474 t.Parallel()
Cole Faust7c991b42024-05-15 11:17:55 -070011475 ctx := testApex(t, `
11476 apex {
11477 name: "myapex",
11478 key: "myapex.key",
11479 prebuilts: ["myetc", "myetc2"],
11480 min_sdk_version: "29",
11481 }
11482 apex_key {
11483 name: "myapex.key",
11484 public_key: "testkey.avbpubkey",
11485 private_key: "testkey.pem",
11486 }
11487
11488 prebuilt_etc {
11489 name: "myetc",
11490 src: "myprebuilt",
11491 filename: "myfilename",
11492 }
11493 prebuilt_etc {
11494 name: "myetc2",
11495 sub_dir: "mysubdir",
11496 src: "myprebuilt",
11497 filename: "myfilename",
11498 }
11499 `, withFiles(android.MockFS{
11500 "packages/modules/common/build/allowed_deps.txt": nil,
11501 }))
11502
11503 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
11504 data := android.AndroidMkDataForTest(t, ctx, ab)
11505 var builder strings.Builder
11506 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
11507 androidMk := builder.String()
11508
11509 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_myfilename.myapex")
11510 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_mysubdir_myfilename.myapex")
11511}
Spandan Das50801e22024-05-13 18:29:45 +000011512
11513func TestApexMinSdkVersionOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011514 t.Parallel()
Spandan Das50801e22024-05-13 18:29:45 +000011515 checkMinSdkVersion := func(t *testing.T, module android.TestingModule, expectedMinSdkVersion string) {
11516 args := module.Rule("apexRule").Args
11517 optFlags := args["opt_flags"]
11518 if !strings.Contains(optFlags, "--min_sdk_version "+expectedMinSdkVersion) {
11519 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", module.Module(), expectedMinSdkVersion, optFlags)
11520 }
11521 }
11522
11523 checkHasDep := func(t *testing.T, ctx *android.TestContext, m android.Module, wantDep android.Module) {
11524 t.Helper()
11525 found := false
11526 ctx.VisitDirectDeps(m, func(dep blueprint.Module) {
11527 if dep == wantDep {
11528 found = true
11529 }
11530 })
11531 if !found {
11532 t.Errorf("Could not find a dependency from %v to %v\n", m, wantDep)
11533 }
11534 }
11535
11536 ctx := testApex(t, `
11537 apex {
11538 name: "com.android.apex30",
11539 min_sdk_version: "30",
11540 key: "apex30.key",
11541 java_libs: ["javalib"],
11542 }
11543
11544 java_library {
11545 name: "javalib",
11546 srcs: ["A.java"],
11547 apex_available: ["com.android.apex30"],
11548 min_sdk_version: "30",
11549 sdk_version: "current",
Colin Crosse4f34882024-11-14 12:26:00 -080011550 compile_dex: true,
Spandan Das50801e22024-05-13 18:29:45 +000011551 }
11552
11553 override_apex {
11554 name: "com.mycompany.android.apex30",
11555 base: "com.android.apex30",
11556 }
11557
11558 override_apex {
11559 name: "com.mycompany.android.apex31",
11560 base: "com.android.apex30",
11561 min_sdk_version: "31",
11562 }
11563
11564 apex_key {
11565 name: "apex30.key",
11566 public_key: "testkey.avbpubkey",
11567 private_key: "testkey.pem",
11568 }
11569
11570 `, android.FixtureMergeMockFs(android.MockFS{
11571 "system/sepolicy/apex/com.android.apex30-file_contexts": nil,
11572 }),
11573 )
11574
11575 baseModule := ctx.ModuleForTests("com.android.apex30", "android_common_com.android.apex30")
11576 checkMinSdkVersion(t, baseModule, "30")
11577
11578 // Override module, but uses same min_sdk_version
11579 overridingModuleSameMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex30_com.mycompany.android.apex30")
11580 javalibApex30Variant := ctx.ModuleForTests("javalib", "android_common_apex30")
11581 checkMinSdkVersion(t, overridingModuleSameMinSdkVersion, "30")
11582 checkHasDep(t, ctx, overridingModuleSameMinSdkVersion.Module(), javalibApex30Variant.Module())
11583
11584 // Override module, uses different min_sdk_version
11585 overridingModuleDifferentMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex31_com.mycompany.android.apex31")
11586 javalibApex31Variant := ctx.ModuleForTests("javalib", "android_common_apex31")
11587 checkMinSdkVersion(t, overridingModuleDifferentMinSdkVersion, "31")
11588 checkHasDep(t, ctx, overridingModuleDifferentMinSdkVersion.Module(), javalibApex31Variant.Module())
11589}
Spandan Das0b28fa02024-05-28 23:40:17 +000011590
11591func TestOverrideApexWithPrebuiltApexPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011592 t.Parallel()
Spandan Das0b28fa02024-05-28 23:40:17 +000011593 context := android.GroupFixturePreparers(
11594 android.PrepareForIntegrationTestWithAndroid,
11595 PrepareForTestWithApexBuildComponents,
11596 android.FixtureMergeMockFs(android.MockFS{
11597 "system/sepolicy/apex/foo-file_contexts": nil,
11598 }),
11599 )
11600 res := context.RunTestWithBp(t, `
11601 apex {
11602 name: "foo",
11603 key: "myapex.key",
11604 apex_available_name: "com.android.foo",
11605 variant_version: "0",
11606 updatable: false,
11607 }
11608 apex_key {
11609 name: "myapex.key",
11610 public_key: "testkey.avbpubkey",
11611 private_key: "testkey.pem",
11612 }
11613 prebuilt_apex {
11614 name: "foo",
11615 src: "foo.apex",
11616 prefer: true,
11617 }
11618 override_apex {
11619 name: "myoverrideapex",
11620 base: "foo",
11621 }
11622 `)
11623
11624 java.CheckModuleHasDependency(t, res.TestContext, "myoverrideapex", "android_common_myoverrideapex_myoverrideapex", "foo")
11625}
Spandan Dasca1d63e2024-07-01 22:53:49 +000011626
11627func TestUpdatableApexMinSdkVersionCurrent(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011628 t.Parallel()
Spandan Dasca1d63e2024-07-01 22:53:49 +000011629 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`, `
11630 apex {
11631 name: "myapex",
11632 key: "myapex.key",
11633 updatable: true,
11634 min_sdk_version: "current",
11635 }
11636
11637 apex_key {
11638 name: "myapex.key",
11639 public_key: "testkey.avbpubkey",
11640 private_key: "testkey.pem",
11641 }
11642 `)
11643}
Spandan Das2f68f192024-07-22 19:25:50 +000011644
11645func TestPrebuiltStubNoinstall(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011646 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011647 testFunc := func(t *testing.T, expectLibfooOnSystemLib bool, fs android.MockFS) {
11648 result := android.GroupFixturePreparers(
11649 prepareForApexTest,
11650 android.PrepareForTestWithAndroidMk,
11651 android.PrepareForTestWithMakevars,
11652 android.FixtureMergeMockFs(fs),
11653 ).RunTest(t)
11654
11655 ldRule := result.ModuleForTests("installedlib", "android_arm64_armv8-a_shared").Rule("ld")
Spandan Das357ffcc2024-07-24 18:07:48 +000011656 android.AssertStringDoesContain(t, "", ldRule.Args["libFlags"], "android_arm64_armv8-a_shared_current/libfoo.so")
Spandan Das2f68f192024-07-22 19:25:50 +000011657
11658 installRules := result.InstallMakeRulesForTesting(t)
11659
11660 var installedlibRule *android.InstallMakeRule
11661 for i, rule := range installRules {
11662 if rule.Target == "out/target/product/test_device/system/lib/installedlib.so" {
11663 if installedlibRule != nil {
11664 t.Errorf("Duplicate install rules for %s", rule.Target)
11665 }
11666 installedlibRule = &installRules[i]
11667 }
11668 }
11669 if installedlibRule == nil {
11670 t.Errorf("No install rule found for installedlib")
11671 return
11672 }
11673
11674 if expectLibfooOnSystemLib {
11675 android.AssertStringListContains(t,
11676 "installedlib doesn't have install dependency on libfoo impl",
11677 installedlibRule.OrderOnlyDeps,
11678 "out/target/product/test_device/system/lib/libfoo.so")
11679 } else {
11680 android.AssertStringListDoesNotContain(t,
11681 "installedlib has install dependency on libfoo stub",
11682 installedlibRule.Deps,
11683 "out/target/product/test_device/system/lib/libfoo.so")
11684 android.AssertStringListDoesNotContain(t,
11685 "installedlib has order-only install dependency on libfoo stub",
11686 installedlibRule.OrderOnlyDeps,
11687 "out/target/product/test_device/system/lib/libfoo.so")
11688 }
11689 }
11690
11691 prebuiltLibfooBp := []byte(`
11692 cc_prebuilt_library {
11693 name: "libfoo",
11694 prefer: true,
11695 srcs: ["libfoo.so"],
11696 stubs: {
11697 versions: ["1"],
11698 },
11699 apex_available: ["apexfoo"],
11700 }
11701 `)
11702
11703 apexfooBp := []byte(`
11704 apex {
11705 name: "apexfoo",
11706 key: "apexfoo.key",
11707 native_shared_libs: ["libfoo"],
11708 updatable: false,
11709 compile_multilib: "both",
11710 }
11711 apex_key {
11712 name: "apexfoo.key",
11713 public_key: "testkey.avbpubkey",
11714 private_key: "testkey.pem",
11715 }
11716 `)
11717
11718 installedlibBp := []byte(`
11719 cc_library {
11720 name: "installedlib",
11721 shared_libs: ["libfoo"],
11722 }
11723 `)
11724
11725 t.Run("prebuilt stub (without source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011726 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011727 testFunc(
11728 t,
11729 /*expectLibfooOnSystemLib=*/ false,
11730 android.MockFS{
11731 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11732 "apexfoo/Android.bp": apexfooBp,
11733 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11734 "Android.bp": installedlibBp,
11735 },
11736 )
11737 })
11738
11739 disabledSourceLibfooBp := []byte(`
11740 cc_library {
11741 name: "libfoo",
11742 enabled: false,
11743 stubs: {
11744 versions: ["1"],
11745 },
11746 apex_available: ["apexfoo"],
11747 }
11748 `)
11749
11750 t.Run("prebuilt stub (with disabled source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011751 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011752 testFunc(
11753 t,
11754 /*expectLibfooOnSystemLib=*/ false,
11755 android.MockFS{
11756 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11757 "impl/Android.bp": disabledSourceLibfooBp,
11758 "apexfoo/Android.bp": apexfooBp,
11759 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11760 "Android.bp": installedlibBp,
11761 },
11762 )
11763 })
11764}
Jihoon Kange246bb72024-09-18 22:26:22 +000011765
11766func TestSdkLibraryTransitiveClassLoaderContext(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011767 t.Parallel()
Jihoon Kange246bb72024-09-18 22:26:22 +000011768 // This test case tests that listing the impl lib instead of the top level java_sdk_library
11769 // in libs of android_app and java_library does not lead to class loader context device/host
11770 // path mismatch errors.
11771 android.GroupFixturePreparers(
11772 prepareForApexTest,
11773 android.PrepareForIntegrationTestWithAndroid,
11774 PrepareForTestWithApexBuildComponents,
11775 android.FixtureModifyEnv(func(env map[string]string) {
11776 env["DISABLE_CONTAINER_CHECK"] = "true"
11777 }),
11778 withFiles(filesForSdkLibrary),
11779 android.FixtureMergeMockFs(android.MockFS{
11780 "system/sepolicy/apex/com.android.foo30-file_contexts": nil,
11781 }),
11782 ).RunTestWithBp(t, `
11783 apex {
11784 name: "com.android.foo30",
11785 key: "myapex.key",
11786 updatable: true,
11787 bootclasspath_fragments: [
11788 "foo-bootclasspath-fragment",
11789 ],
11790 java_libs: [
11791 "bar",
11792 ],
11793 apps: [
11794 "bar-app",
11795 ],
11796 min_sdk_version: "30",
11797 }
11798 apex_key {
11799 name: "myapex.key",
11800 public_key: "testkey.avbpubkey",
11801 private_key: "testkey.pem",
11802 }
11803 bootclasspath_fragment {
11804 name: "foo-bootclasspath-fragment",
11805 contents: [
11806 "framework-foo",
11807 ],
11808 apex_available: [
11809 "com.android.foo30",
11810 ],
11811 hidden_api: {
11812 split_packages: ["*"]
11813 },
11814 }
11815
11816 java_sdk_library {
11817 name: "framework-foo",
11818 srcs: [
11819 "A.java"
11820 ],
11821 unsafe_ignore_missing_latest_api: true,
11822 apex_available: [
11823 "com.android.foo30",
11824 ],
11825 compile_dex: true,
11826 sdk_version: "core_current",
11827 shared_library: false,
11828 }
11829
11830 java_library {
11831 name: "bar",
11832 srcs: [
11833 "A.java"
11834 ],
11835 libs: [
11836 "framework-foo.impl",
11837 ],
11838 apex_available: [
11839 "com.android.foo30",
11840 ],
11841 sdk_version: "core_current",
Colin Crosse4f34882024-11-14 12:26:00 -080011842 compile_dex: true,
Jihoon Kange246bb72024-09-18 22:26:22 +000011843 }
11844
11845 java_library {
11846 name: "baz",
11847 srcs: [
11848 "A.java"
11849 ],
11850 libs: [
11851 "bar",
11852 ],
11853 sdk_version: "core_current",
11854 }
11855
11856 android_app {
11857 name: "bar-app",
11858 srcs: [
11859 "A.java"
11860 ],
11861 libs: [
11862 "baz",
11863 "framework-foo.impl",
11864 ],
11865 apex_available: [
11866 "com.android.foo30",
11867 ],
11868 sdk_version: "core_current",
11869 min_sdk_version: "30",
11870 manifest: "AndroidManifest.xml",
Colin Cross99939e92024-10-01 16:02:46 -070011871 updatable: true,
Jihoon Kange246bb72024-09-18 22:26:22 +000011872 }
11873 `)
11874}
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000011875
11876// If an apex sets system_ext_specific: true, its systemserverclasspath libraries must set this property as well.
11877func TestApexSSCPJarMustBeInSamePartitionAsApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011878 t.Parallel()
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000011879 testApexError(t, `foo is an apex systemserver jar, but its partition does not match the partition of its containing apex`, `
11880 apex {
11881 name: "myapex",
11882 key: "myapex.key",
11883 systemserverclasspath_fragments: [
11884 "mysystemserverclasspathfragment",
11885 ],
11886 min_sdk_version: "29",
11887 updatable: true,
11888 system_ext_specific: true,
11889 }
11890
11891 apex_key {
11892 name: "myapex.key",
11893 public_key: "testkey.avbpubkey",
11894 private_key: "testkey.pem",
11895 }
11896
11897 java_library {
11898 name: "foo",
11899 srcs: ["b.java"],
11900 min_sdk_version: "29",
11901 installable: true,
11902 apex_available: [
11903 "myapex",
11904 ],
11905 sdk_version: "current",
11906 }
11907
11908 systemserverclasspath_fragment {
11909 name: "mysystemserverclasspathfragment",
11910 contents: [
11911 "foo",
11912 ],
11913 apex_available: [
11914 "myapex",
11915 ],
11916 }
11917 `,
11918 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
11919 )
11920}
Spandan Das72d86c62024-10-15 19:27:41 +000011921
11922// partitions should not package the artifacts that are included inside the apex.
11923func TestFilesystemWithApexDeps(t *testing.T) {
11924 t.Parallel()
11925 result := testApex(t, `
11926 android_filesystem {
11927 name: "myfilesystem",
11928 deps: ["myapex"],
11929 }
11930 apex {
11931 name: "myapex",
11932 key: "myapex.key",
11933 binaries: ["binfoo"],
11934 native_shared_libs: ["libfoo"],
11935 apps: ["appfoo"],
11936 updatable: false,
11937 }
11938 apex_key {
11939 name: "myapex.key",
11940 }
11941 cc_binary {
11942 name: "binfoo",
11943 apex_available: ["myapex"],
11944 }
11945 cc_library {
11946 name: "libfoo",
11947 apex_available: ["myapex"],
11948 }
11949 android_app {
11950 name: "appfoo",
11951 sdk_version: "current",
11952 apex_available: ["myapex"],
11953 }
11954 `, filesystem.PrepareForTestWithFilesystemBuildComponents)
11955
11956 partition := result.ModuleForTests("myfilesystem", "android_common")
11957 fileList := android.ContentFromFileRuleForTests(t, result, partition.Output("fileList"))
11958 android.AssertDeepEquals(t, "filesystem with apex", "apex/myapex.apex\n", fileList)
11959}
Colin Crossb614cd42024-10-11 12:52:21 -070011960
11961func TestApexVerifyNativeImplementationLibs(t *testing.T) {
11962 t.Parallel()
11963
11964 extractDepenencyPathFromErrors := func(errs []error) []string {
11965 i := slices.IndexFunc(errs, func(err error) bool {
11966 return strings.Contains(err.Error(), "dependency path:")
11967 })
11968 if i < 0 {
11969 return nil
11970 }
11971 var dependencyPath []string
11972 for _, err := range errs[i+1:] {
11973 s := err.Error()
11974 lastSpace := strings.LastIndexByte(s, ' ')
11975 if lastSpace >= 0 {
11976 dependencyPath = append(dependencyPath, s[lastSpace+1:])
11977 }
11978 }
11979 return dependencyPath
11980 }
11981
11982 checkErrors := func(wantDependencyPath []string) func(t *testing.T, result *android.TestResult) {
11983 return func(t *testing.T, result *android.TestResult) {
11984 t.Helper()
11985 if len(result.Errs) == 0 {
11986 t.Fatalf("expected errors")
11987 }
11988 t.Log("found errors:")
11989 for _, err := range result.Errs {
11990 t.Log(err)
11991 }
11992 if g, w := result.Errs[0].Error(), "library in apex transitively linked against implementation library"; !strings.Contains(g, w) {
11993 t.Fatalf("expected error %q, got %q", w, g)
11994 }
11995 dependencyPath := extractDepenencyPathFromErrors(result.Errs)
11996 if g, w := dependencyPath, wantDependencyPath; !slices.Equal(g, w) {
11997 t.Errorf("expected dependency path %q, got %q", w, g)
11998 }
11999 }
12000 }
12001
12002 addToSharedLibs := func(module, lib string) func(bp *bpmodify.Blueprint) {
12003 return func(bp *bpmodify.Blueprint) {
12004 m := bp.ModulesByName(module)
12005 props, err := m.GetOrCreateProperty(bpmodify.List, "shared_libs")
12006 if err != nil {
12007 panic(err)
12008 }
12009 props.AddStringToList(lib)
12010 }
12011 }
12012
12013 bpTemplate := `
12014 apex {
12015 name: "myapex",
12016 key: "myapex.key",
12017 native_shared_libs: ["mylib"],
12018 rust_dyn_libs: ["libmyrust"],
12019 binaries: ["mybin", "myrustbin"],
12020 jni_libs: ["libjni"],
12021 apps: ["myapp"],
12022 updatable: false,
12023 }
12024
12025 apex {
12026 name: "otherapex",
12027 key: "myapex.key",
12028 native_shared_libs: ["libotherapex"],
12029 updatable: false,
12030 }
12031
12032 apex_key {
12033 name: "myapex.key",
12034 public_key: "testkey.avbpubkey",
12035 private_key: "testkey.pem",
12036 }
12037
12038 cc_library {
12039 name: "mylib",
12040 srcs: ["foo.cpp"],
12041 apex_available: ["myapex"],
12042 }
12043
12044 cc_binary {
12045 name: "mybin",
12046 srcs: ["foo.cpp"],
12047 apex_available: ["myapex"],
12048 }
12049
12050 rust_library {
12051 name: "libmyrust",
12052 crate_name: "myrust",
12053 srcs: ["src/lib.rs"],
12054 rustlibs: ["libmyrust_transitive_dylib"],
12055 rlibs: ["libmyrust_transitive_rlib"],
12056 apex_available: ["myapex"],
12057 }
12058
12059 rust_library{
12060 name: "libmyrust_transitive_dylib",
12061 crate_name: "myrust_transitive_dylib",
12062 srcs: ["src/lib.rs"],
12063 apex_available: ["myapex"],
12064 }
12065
12066 rust_library {
12067 name: "libmyrust_transitive_rlib",
12068 crate_name: "myrust_transitive_rlib",
12069 srcs: ["src/lib.rs"],
12070 apex_available: ["myapex"],
12071 }
12072
12073 rust_binary {
12074 name: "myrustbin",
12075 srcs: ["src/main.rs"],
12076 apex_available: ["myapex"],
12077 }
12078
12079 cc_library {
12080 name: "libbar",
12081 sdk_version: "current",
12082 srcs: ["bar.cpp"],
12083 apex_available: ["myapex"],
12084 stl: "none",
12085 }
12086
12087 android_app {
12088 name: "myapp",
12089 jni_libs: ["libembeddedjni"],
12090 use_embedded_native_libs: true,
12091 sdk_version: "current",
12092 apex_available: ["myapex"],
12093 }
12094
12095 cc_library {
12096 name: "libembeddedjni",
12097 sdk_version: "current",
12098 srcs: ["bar.cpp"],
12099 apex_available: ["myapex"],
12100 stl: "none",
12101 }
12102
12103 cc_library {
12104 name: "libjni",
12105 sdk_version: "current",
12106 srcs: ["bar.cpp"],
12107 apex_available: ["myapex"],
12108 stl: "none",
12109 }
12110
12111 cc_library {
12112 name: "libotherapex",
12113 sdk_version: "current",
12114 srcs: ["otherapex.cpp"],
12115 apex_available: ["otherapex"],
12116 stubs: {
12117 symbol_file: "libotherapex.map.txt",
12118 versions: ["1", "2", "3"],
12119 },
12120 stl: "none",
12121 }
12122
12123 cc_library {
12124 name: "libplatform",
12125 sdk_version: "current",
12126 srcs: ["libplatform.cpp"],
12127 stubs: {
12128 symbol_file: "libplatform.map.txt",
12129 versions: ["1", "2", "3"],
12130 },
12131 stl: "none",
12132 system_shared_libs: [],
12133 }
12134 `
12135
12136 testCases := []struct {
12137 name string
12138 bpModifier func(bp *bpmodify.Blueprint)
12139 dependencyPath []string
12140 }{
12141 {
12142 name: "library dependency in other apex",
12143 bpModifier: addToSharedLibs("mylib", "libotherapex#impl"),
12144 dependencyPath: []string{"myapex", "mylib", "libotherapex"},
12145 },
12146 {
12147 name: "transitive library dependency in other apex",
12148 bpModifier: func(bp *bpmodify.Blueprint) {
12149 addToSharedLibs("mylib", "libbar")(bp)
12150 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12151 },
12152 dependencyPath: []string{"myapex", "mylib", "libbar", "libotherapex"},
12153 },
12154 {
12155 name: "library dependency in platform",
12156 bpModifier: addToSharedLibs("mylib", "libplatform#impl"),
12157 dependencyPath: []string{"myapex", "mylib", "libplatform"},
12158 },
12159 {
12160 name: "jni library dependency in other apex",
12161 bpModifier: addToSharedLibs("libjni", "libotherapex#impl"),
12162 dependencyPath: []string{"myapex", "libjni", "libotherapex"},
12163 },
12164 {
12165 name: "transitive jni library dependency in other apex",
12166 bpModifier: func(bp *bpmodify.Blueprint) {
12167 addToSharedLibs("libjni", "libbar")(bp)
12168 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12169 },
12170 dependencyPath: []string{"myapex", "libjni", "libbar", "libotherapex"},
12171 },
12172 {
12173 name: "jni library dependency in platform",
12174 bpModifier: addToSharedLibs("libjni", "libplatform#impl"),
12175 dependencyPath: []string{"myapex", "libjni", "libplatform"},
12176 },
12177 {
12178 name: "transitive jni library dependency in platform",
12179 bpModifier: func(bp *bpmodify.Blueprint) {
12180 addToSharedLibs("libjni", "libbar")(bp)
12181 addToSharedLibs("libbar", "libplatform#impl")(bp)
12182 },
12183 dependencyPath: []string{"myapex", "libjni", "libbar", "libplatform"},
12184 },
12185 // TODO: embedded JNI in apps should be checked too, but Soong currently just packages the transitive
12186 // JNI libraries even if they came from another apex.
12187 //{
12188 // name: "app jni library dependency in other apex",
12189 // bpModifier: addToSharedLibs("libembeddedjni", "libotherapex#impl"),
12190 // dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libotherapex"},
12191 //},
12192 //{
12193 // name: "transitive app jni library dependency in other apex",
12194 // bpModifier: func(bp *bpmodify.Blueprint) {
12195 // addToSharedLibs("libembeddedjni", "libbar")(bp)
12196 // addToSharedLibs("libbar", "libotherapex#impl")(bp)
12197 // },
12198 // dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libotherapex"},
12199 //},
12200 //{
12201 // name: "app jni library dependency in platform",
12202 // bpModifier: addToSharedLibs("libembeddedjni", "libplatform#impl"),
12203 // dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libplatform"},
12204 //},
12205 //{
12206 // name: "transitive app jni library dependency in platform",
12207 // bpModifier: func(bp *bpmodify.Blueprint) {
12208 // addToSharedLibs("libembeddedjni", "libbar")(bp)
12209 // addToSharedLibs("libbar", "libplatform#impl")(bp)
12210 // },
12211 // dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libplatform"},
12212 //},
12213 {
12214 name: "binary dependency in other apex",
12215 bpModifier: addToSharedLibs("mybin", "libotherapex#impl"),
12216 dependencyPath: []string{"myapex", "mybin", "libotherapex"},
12217 },
12218 {
12219 name: "transitive binary dependency in other apex",
12220 bpModifier: func(bp *bpmodify.Blueprint) {
12221 addToSharedLibs("mybin", "libbar")(bp)
12222 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12223 },
12224 dependencyPath: []string{"myapex", "mybin", "libbar", "libotherapex"},
12225 },
12226 {
12227 name: "binary dependency in platform",
12228 bpModifier: addToSharedLibs("mybin", "libplatform#impl"),
12229 dependencyPath: []string{"myapex", "mybin", "libplatform"},
12230 },
12231 {
12232 name: "transitive binary dependency in platform",
12233 bpModifier: func(bp *bpmodify.Blueprint) {
12234 addToSharedLibs("mybin", "libbar")(bp)
12235 addToSharedLibs("libbar", "libplatform#impl")(bp)
12236 },
12237 dependencyPath: []string{"myapex", "mybin", "libbar", "libplatform"},
12238 },
12239
12240 {
12241 name: "rust library dependency in other apex",
12242 bpModifier: addToSharedLibs("libmyrust", "libotherapex#impl"),
12243 dependencyPath: []string{"myapex", "libmyrust", "libotherapex"},
12244 },
12245 {
12246 name: "transitive rust library dependency in other apex",
12247 bpModifier: func(bp *bpmodify.Blueprint) {
12248 addToSharedLibs("libmyrust", "libbar")(bp)
12249 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12250 },
12251 dependencyPath: []string{"myapex", "libmyrust", "libbar", "libotherapex"},
12252 },
12253 {
12254 name: "rust library dependency in platform",
12255 bpModifier: addToSharedLibs("libmyrust", "libplatform#impl"),
12256 dependencyPath: []string{"myapex", "libmyrust", "libplatform"},
12257 },
12258 {
12259 name: "transitive rust library dependency in platform",
12260 bpModifier: func(bp *bpmodify.Blueprint) {
12261 addToSharedLibs("libmyrust", "libbar")(bp)
12262 addToSharedLibs("libbar", "libplatform#impl")(bp)
12263 },
12264 dependencyPath: []string{"myapex", "libmyrust", "libbar", "libplatform"},
12265 },
12266 {
12267 name: "transitive rust library dylib dependency in other apex",
12268 bpModifier: func(bp *bpmodify.Blueprint) {
12269 addToSharedLibs("libmyrust_transitive_dylib", "libotherapex#impl")(bp)
12270 },
12271 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libotherapex"},
12272 },
12273 {
12274 name: "transitive rust library dylib dependency in platform",
12275 bpModifier: func(bp *bpmodify.Blueprint) {
12276 addToSharedLibs("libmyrust_transitive_dylib", "libplatform#impl")(bp)
12277 },
12278 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libplatform"},
12279 },
12280 {
12281 name: "transitive rust library rlib dependency in other apex",
12282 bpModifier: func(bp *bpmodify.Blueprint) {
12283 addToSharedLibs("libmyrust_transitive_rlib", "libotherapex#impl")(bp)
12284 },
12285 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libotherapex"},
12286 },
12287 {
12288 name: "transitive rust library rlib dependency in platform",
12289 bpModifier: func(bp *bpmodify.Blueprint) {
12290 addToSharedLibs("libmyrust_transitive_rlib", "libplatform#impl")(bp)
12291 },
12292 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libplatform"},
12293 },
12294 {
12295 name: "rust binary dependency in other apex",
12296 bpModifier: addToSharedLibs("myrustbin", "libotherapex#impl"),
12297 dependencyPath: []string{"myapex", "myrustbin", "libotherapex"},
12298 },
12299 {
12300 name: "transitive rust binary dependency in other apex",
12301 bpModifier: func(bp *bpmodify.Blueprint) {
12302 addToSharedLibs("myrustbin", "libbar")(bp)
12303 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12304 },
12305 dependencyPath: []string{"myapex", "myrustbin", "libbar", "libotherapex"},
12306 },
12307 {
12308 name: "rust binary dependency in platform",
12309 bpModifier: addToSharedLibs("myrustbin", "libplatform#impl"),
12310 dependencyPath: []string{"myapex", "myrustbin", "libplatform"},
12311 },
12312 {
12313 name: "transitive rust binary dependency in platform",
12314 bpModifier: func(bp *bpmodify.Blueprint) {
12315 addToSharedLibs("myrustbin", "libbar")(bp)
12316 addToSharedLibs("libbar", "libplatform#impl")(bp)
12317 },
12318 dependencyPath: []string{"myapex", "myrustbin", "libbar", "libplatform"},
12319 },
12320 }
12321
12322 for _, testCase := range testCases {
12323 t.Run(testCase.name, func(t *testing.T) {
12324 t.Parallel()
12325 bp, err := bpmodify.NewBlueprint("", []byte(bpTemplate))
12326 if err != nil {
12327 t.Fatal(err)
12328 }
12329 if testCase.bpModifier != nil {
12330 func() {
12331 defer func() {
12332 if r := recover(); r != nil {
12333 t.Fatalf("panic in bpModifier: %v", r)
12334 }
12335 }()
12336 testCase.bpModifier(bp)
12337 }()
12338 }
12339 android.GroupFixturePreparers(
12340 android.PrepareForTestWithAndroidBuildComponents,
12341 cc.PrepareForTestWithCcBuildComponents,
12342 java.PrepareForTestWithDexpreopt,
12343 rust.PrepareForTestWithRustDefaultModules,
12344 PrepareForTestWithApexBuildComponents,
12345 prepareForTestWithMyapex,
12346 prepareForTestWithOtherapex,
12347 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
12348 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
12349 }),
12350 ).ExtendWithErrorHandler(android.FixtureCustomErrorHandler(checkErrors(testCase.dependencyPath))).
12351 RunTestWithBp(t, bp.String())
12352 })
12353 }
12354}