Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
// Copyright 2018 Google Inc. All rights reserved.
|
|
|
|
//
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
// you may not use this file except in compliance with the License.
|
|
|
|
// You may obtain a copy of the License at
|
|
|
|
//
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
//
|
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
// See the License for the specific language governing permissions and
|
|
|
|
// limitations under the License.
|
|
|
|
|
|
|
|
package apex
|
|
|
|
|
|
|
|
import (
|
|
|
|
"io/ioutil"
|
|
|
|
"os"
|
2019-11-06 08:53:07 +01:00
|
|
|
"path"
|
2019-07-17 03:25:41 +02:00
|
|
|
"reflect"
|
2019-10-18 09:26:59 +02:00
|
|
|
"sort"
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
"strings"
|
|
|
|
"testing"
|
2018-12-19 09:12:36 +01:00
|
|
|
|
|
|
|
"github.com/google/blueprint/proptools"
|
|
|
|
|
|
|
|
"android/soong/android"
|
|
|
|
"android/soong/cc"
|
2019-02-11 03:38:15 +01:00
|
|
|
"android/soong/java"
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
)
|
|
|
|
|
2019-06-18 22:09:13 +02:00
|
|
|
var buildDir string
|
|
|
|
|
2019-08-09 05:57:43 +02:00
|
|
|
// names returns name list from white space separated string
|
|
|
|
func names(s string) (ns []string) {
|
|
|
|
for _, n := range strings.Split(s, " ") {
|
|
|
|
if len(n) > 0 {
|
|
|
|
ns = append(ns, n)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2019-08-23 04:17:39 +02:00
|
|
|
func testApexError(t *testing.T, pattern, bp string, handlers ...testCustomizer) {
|
|
|
|
t.Helper()
|
|
|
|
ctx, config := testApexContext(t, bp, handlers...)
|
2019-06-27 04:30:33 +02:00
|
|
|
_, errs := ctx.ParseFileList(".", []string{"Android.bp"})
|
|
|
|
if len(errs) > 0 {
|
|
|
|
android.FailIfNoMatchingErrors(t, pattern, errs)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
_, errs = ctx.PrepareBuildActions(config)
|
|
|
|
if len(errs) > 0 {
|
|
|
|
android.FailIfNoMatchingErrors(t, pattern, errs)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
t.Fatalf("missing expected error %q (0 errors are returned)", pattern)
|
|
|
|
}
|
|
|
|
|
2019-08-23 04:17:39 +02:00
|
|
|
func testApex(t *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
|
|
|
|
t.Helper()
|
|
|
|
ctx, config := testApexContext(t, bp, handlers...)
|
2019-06-27 04:30:33 +02:00
|
|
|
_, errs := ctx.ParseFileList(".", []string{"Android.bp"})
|
|
|
|
android.FailIfErrored(t, errs)
|
|
|
|
_, errs = ctx.PrepareBuildActions(config)
|
|
|
|
android.FailIfErrored(t, errs)
|
2019-07-17 03:25:41 +02:00
|
|
|
return ctx, config
|
2019-06-27 04:30:33 +02:00
|
|
|
}
|
|
|
|
|
2019-08-23 04:17:39 +02:00
|
|
|
type testCustomizer func(fs map[string][]byte, config android.Config)
|
|
|
|
|
|
|
|
func withFiles(files map[string][]byte) testCustomizer {
|
|
|
|
return func(fs map[string][]byte, config android.Config) {
|
|
|
|
for k, v := range files {
|
|
|
|
fs[k] = v
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func withTargets(targets map[android.OsType][]android.Target) testCustomizer {
|
|
|
|
return func(fs map[string][]byte, config android.Config) {
|
|
|
|
for k, v := range targets {
|
|
|
|
config.Targets[k] = v
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-10-18 09:26:59 +02:00
|
|
|
func withBinder32bit(fs map[string][]byte, config android.Config) {
|
|
|
|
config.TestProductVariables.Binder32bit = proptools.BoolPtr(true)
|
|
|
|
}
|
|
|
|
|
2019-08-23 04:17:39 +02:00
|
|
|
func testApexContext(t *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) {
|
2019-06-25 20:20:53 +02:00
|
|
|
config := android.TestArchConfig(buildDir, nil)
|
|
|
|
config.TestProductVariables.DeviceVndkVersion = proptools.StringPtr("current")
|
|
|
|
config.TestProductVariables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
|
|
|
|
config.TestProductVariables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
|
|
|
|
config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("Q")
|
|
|
|
config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(false)
|
2019-08-23 04:17:39 +02:00
|
|
|
config.TestProductVariables.Platform_vndk_version = proptools.StringPtr("VER")
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
|
|
|
|
ctx := android.NewTestArchContext()
|
2019-11-23 00:25:03 +01:00
|
|
|
ctx.RegisterModuleType("apex", BundleFactory)
|
|
|
|
ctx.RegisterModuleType("apex_test", testApexBundleFactory)
|
|
|
|
ctx.RegisterModuleType("apex_vndk", vndkApexBundleFactory)
|
|
|
|
ctx.RegisterModuleType("apex_key", ApexKeyFactory)
|
|
|
|
ctx.RegisterModuleType("apex_defaults", defaultsFactory)
|
|
|
|
ctx.RegisterModuleType("prebuilt_apex", PrebuiltFactory)
|
|
|
|
ctx.RegisterModuleType("override_apex", overrideApexFactory)
|
|
|
|
|
|
|
|
ctx.RegisterModuleType("cc_library", cc.LibraryFactory)
|
|
|
|
ctx.RegisterModuleType("cc_library_shared", cc.LibrarySharedFactory)
|
|
|
|
ctx.RegisterModuleType("cc_library_headers", cc.LibraryHeaderFactory)
|
|
|
|
ctx.RegisterModuleType("cc_prebuilt_library_shared", cc.PrebuiltSharedLibraryFactory)
|
|
|
|
ctx.RegisterModuleType("cc_prebuilt_library_static", cc.PrebuiltStaticLibraryFactory)
|
|
|
|
ctx.RegisterModuleType("cc_binary", cc.BinaryFactory)
|
|
|
|
ctx.RegisterModuleType("cc_object", cc.ObjectFactory)
|
|
|
|
ctx.RegisterModuleType("cc_defaults", func() android.Module {
|
2019-11-13 02:50:48 +01:00
|
|
|
return cc.DefaultsFactory()
|
2019-11-23 00:25:03 +01:00
|
|
|
})
|
|
|
|
ctx.RegisterModuleType("cc_test", cc.TestFactory)
|
|
|
|
ctx.RegisterModuleType("llndk_library", cc.LlndkLibraryFactory)
|
|
|
|
ctx.RegisterModuleType("vndk_prebuilt_shared", cc.VndkPrebuiltSharedFactory)
|
|
|
|
ctx.RegisterModuleType("vndk_libraries_txt", cc.VndkLibrariesTxtFactory)
|
|
|
|
ctx.RegisterModuleType("toolchain_library", cc.ToolchainLibraryFactory)
|
|
|
|
ctx.RegisterModuleType("prebuilt_etc", android.PrebuiltEtcFactory)
|
|
|
|
ctx.RegisterModuleType("sh_binary", android.ShBinaryFactory)
|
|
|
|
ctx.RegisterModuleType("android_app_certificate", java.AndroidAppCertificateFactory)
|
|
|
|
ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
|
|
|
|
ctx.RegisterModuleType("java_library", java.LibraryFactory)
|
|
|
|
ctx.RegisterModuleType("java_import", java.ImportFactory)
|
|
|
|
ctx.RegisterModuleType("java_system_modules", java.SystemModulesFactory)
|
|
|
|
ctx.RegisterModuleType("android_app", java.AndroidAppFactory)
|
|
|
|
ctx.RegisterModuleType("android_app_import", java.AndroidAppImportFactory)
|
|
|
|
ctx.RegisterModuleType("override_android_app", java.OverrideAndroidAppModuleFactory)
|
2019-07-25 15:02:35 +02:00
|
|
|
|
2019-08-23 04:17:39 +02:00
|
|
|
ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
|
2019-03-26 23:07:36 +01:00
|
|
|
ctx.PreArchMutators(func(ctx android.RegisterMutatorsContext) {
|
|
|
|
ctx.BottomUp("prebuilts", android.PrebuiltMutator).Parallel()
|
|
|
|
})
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
|
2018-12-19 09:12:36 +01:00
|
|
|
ctx.BottomUp("vndk", cc.VndkMutator).Parallel()
|
2019-11-12 05:03:50 +01:00
|
|
|
ctx.BottomUp("link", cc.LinkageMutator).Parallel()
|
2019-06-28 16:41:19 +02:00
|
|
|
ctx.BottomUp("test_per_src", cc.TestPerSrcMutator).Parallel()
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
ctx.BottomUp("version", cc.VersionMutator).Parallel()
|
|
|
|
ctx.BottomUp("begin", cc.BeginMutator).Parallel()
|
2019-08-23 04:17:39 +02:00
|
|
|
})
|
2019-10-18 09:26:59 +02:00
|
|
|
ctx.PreDepsMutators(RegisterPreDepsMutators)
|
2019-11-15 10:40:32 +01:00
|
|
|
ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
|
2019-10-18 09:26:59 +02:00
|
|
|
ctx.PostDepsMutators(RegisterPostDepsMutators)
|
2019-08-23 04:17:39 +02:00
|
|
|
ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
|
|
|
|
ctx.TopDown("prebuilt_select", android.PrebuiltSelectModuleMutator).Parallel()
|
|
|
|
ctx.BottomUp("prebuilt_postdeps", android.PrebuiltPostDepsMutator).Parallel()
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
})
|
|
|
|
|
|
|
|
ctx.Register()
|
|
|
|
|
|
|
|
bp = bp + `
|
|
|
|
toolchain_library {
|
|
|
|
name: "libcompiler_rt-extras",
|
|
|
|
src: "",
|
2018-12-19 09:12:36 +01:00
|
|
|
vendor_available: true,
|
|
|
|
recovery_available: true,
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
toolchain_library {
|
|
|
|
name: "libatomic",
|
|
|
|
src: "",
|
2018-12-19 09:12:36 +01:00
|
|
|
vendor_available: true,
|
|
|
|
recovery_available: true,
|
2019-08-23 04:17:39 +02:00
|
|
|
native_bridge_supported: true,
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
toolchain_library {
|
|
|
|
name: "libgcc",
|
|
|
|
src: "",
|
2018-12-19 09:12:36 +01:00
|
|
|
vendor_available: true,
|
|
|
|
recovery_available: true,
|
2019-03-30 04:05:14 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
toolchain_library {
|
|
|
|
name: "libgcc_stripped",
|
|
|
|
src: "",
|
|
|
|
vendor_available: true,
|
|
|
|
recovery_available: true,
|
2019-08-23 04:17:39 +02:00
|
|
|
native_bridge_supported: true,
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
toolchain_library {
|
|
|
|
name: "libclang_rt.builtins-aarch64-android",
|
|
|
|
src: "",
|
2018-12-19 09:12:36 +01:00
|
|
|
vendor_available: true,
|
|
|
|
recovery_available: true,
|
2019-08-23 04:17:39 +02:00
|
|
|
native_bridge_supported: true,
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
toolchain_library {
|
|
|
|
name: "libclang_rt.builtins-arm-android",
|
|
|
|
src: "",
|
2018-12-19 09:12:36 +01:00
|
|
|
vendor_available: true,
|
|
|
|
recovery_available: true,
|
2019-08-23 04:17:39 +02:00
|
|
|
native_bridge_supported: true,
|
|
|
|
}
|
|
|
|
|
|
|
|
toolchain_library {
|
|
|
|
name: "libclang_rt.builtins-x86_64-android",
|
|
|
|
src: "",
|
|
|
|
vendor_available: true,
|
|
|
|
recovery_available: true,
|
|
|
|
native_bridge_supported: true,
|
|
|
|
}
|
|
|
|
|
|
|
|
toolchain_library {
|
|
|
|
name: "libclang_rt.builtins-i686-android",
|
|
|
|
src: "",
|
|
|
|
vendor_available: true,
|
|
|
|
recovery_available: true,
|
|
|
|
native_bridge_supported: true,
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
cc_object {
|
|
|
|
name: "crtbegin_so",
|
|
|
|
stl: "none",
|
2018-12-19 09:12:36 +01:00
|
|
|
vendor_available: true,
|
|
|
|
recovery_available: true,
|
2019-08-23 04:17:39 +02:00
|
|
|
native_bridge_supported: true,
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
cc_object {
|
|
|
|
name: "crtend_so",
|
|
|
|
stl: "none",
|
2018-12-19 09:12:36 +01:00
|
|
|
vendor_available: true,
|
|
|
|
recovery_available: true,
|
2019-08-23 04:17:39 +02:00
|
|
|
native_bridge_supported: true,
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
}
|
|
|
|
|
2019-01-18 23:37:31 +01:00
|
|
|
cc_object {
|
|
|
|
name: "crtbegin_static",
|
|
|
|
stl: "none",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_object {
|
|
|
|
name: "crtend_android",
|
|
|
|
stl: "none",
|
|
|
|
}
|
|
|
|
|
2018-12-19 09:12:36 +01:00
|
|
|
llndk_library {
|
|
|
|
name: "libc",
|
|
|
|
symbol_file: "",
|
2019-08-23 04:17:39 +02:00
|
|
|
native_bridge_supported: true,
|
2018-12-19 09:12:36 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
llndk_library {
|
|
|
|
name: "libm",
|
|
|
|
symbol_file: "",
|
2019-08-23 04:17:39 +02:00
|
|
|
native_bridge_supported: true,
|
2018-12-19 09:12:36 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
llndk_library {
|
|
|
|
name: "libdl",
|
|
|
|
symbol_file: "",
|
2019-08-23 04:17:39 +02:00
|
|
|
native_bridge_supported: true,
|
2018-12-19 09:12:36 +01:00
|
|
|
}
|
2019-11-19 18:26:02 +01:00
|
|
|
|
|
|
|
filegroup {
|
|
|
|
name: "myapex-file_contexts",
|
|
|
|
srcs: [
|
|
|
|
"system/sepolicy/apex/myapex-file_contexts",
|
|
|
|
],
|
|
|
|
}
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
`
|
2019-10-27 01:29:22 +02:00
|
|
|
bp = bp + java.GatherRequiredDepsForTest()
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
|
2019-08-23 04:17:39 +02:00
|
|
|
fs := map[string][]byte{
|
2019-11-19 18:26:02 +01:00
|
|
|
"Android.bp": []byte(bp),
|
|
|
|
"a.java": nil,
|
|
|
|
"PrebuiltAppFoo.apk": nil,
|
|
|
|
"PrebuiltAppFooPriv.apk": nil,
|
|
|
|
"build/make/target/product/security": nil,
|
|
|
|
"apex_manifest.json": nil,
|
|
|
|
"AndroidManifest.xml": nil,
|
|
|
|
"system/sepolicy/apex/myapex-file_contexts": nil,
|
|
|
|
"system/sepolicy/apex/otherapex-file_contexts": nil,
|
|
|
|
"system/sepolicy/apex/commonapex-file_contexts": nil,
|
|
|
|
"system/sepolicy/apex/com.android.vndk-file_contexts": nil,
|
|
|
|
"mylib.cpp": nil,
|
|
|
|
"mylib_common.cpp": nil,
|
|
|
|
"mytest.cpp": nil,
|
|
|
|
"mytest1.cpp": nil,
|
|
|
|
"mytest2.cpp": nil,
|
|
|
|
"mytest3.cpp": nil,
|
|
|
|
"myprebuilt": nil,
|
|
|
|
"my_include": nil,
|
|
|
|
"foo/bar/MyClass.java": nil,
|
|
|
|
"prebuilt.jar": nil,
|
|
|
|
"vendor/foo/devkeys/test.x509.pem": nil,
|
|
|
|
"vendor/foo/devkeys/test.pk8": nil,
|
|
|
|
"testkey.x509.pem": nil,
|
|
|
|
"testkey.pk8": nil,
|
|
|
|
"testkey.override.x509.pem": nil,
|
|
|
|
"testkey.override.pk8": nil,
|
|
|
|
"vendor/foo/devkeys/testkey.avbpubkey": nil,
|
|
|
|
"vendor/foo/devkeys/testkey.pem": nil,
|
|
|
|
"NOTICE": nil,
|
|
|
|
"custom_notice": nil,
|
|
|
|
"testkey2.avbpubkey": nil,
|
|
|
|
"testkey2.pem": nil,
|
|
|
|
"myapex-arm64.apex": nil,
|
|
|
|
"myapex-arm.apex": nil,
|
|
|
|
"frameworks/base/api/current.txt": nil,
|
|
|
|
"framework/aidl/a.aidl": nil,
|
|
|
|
"build/make/core/proguard.flags": nil,
|
|
|
|
"build/make/core/proguard_basic_keeps.flags": nil,
|
|
|
|
"dummy.txt": nil,
|
2019-08-23 04:17:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
for _, handler := range handlers {
|
|
|
|
handler(fs, config)
|
|
|
|
}
|
|
|
|
|
|
|
|
ctx.MockFileSystem(fs)
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
|
2019-06-27 04:30:33 +02:00
|
|
|
return ctx, config
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
}
|
|
|
|
|
2019-06-25 20:20:53 +02:00
|
|
|
func setUp() {
|
|
|
|
var err error
|
|
|
|
buildDir, err = ioutil.TempDir("", "soong_apex_test")
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
if err != nil {
|
2019-06-25 20:20:53 +02:00
|
|
|
panic(err)
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-06-25 20:20:53 +02:00
|
|
|
func tearDown() {
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
os.RemoveAll(buildDir)
|
|
|
|
}
|
|
|
|
|
|
|
|
// ensure that 'result' contains 'expected'
|
|
|
|
func ensureContains(t *testing.T, result string, expected string) {
|
2019-06-27 04:30:33 +02:00
|
|
|
t.Helper()
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
if !strings.Contains(result, expected) {
|
|
|
|
t.Errorf("%q is not found in %q", expected, result)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// ensures that 'result' does not contain 'notExpected'
|
|
|
|
func ensureNotContains(t *testing.T, result string, notExpected string) {
|
2019-06-27 04:30:33 +02:00
|
|
|
t.Helper()
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
if strings.Contains(result, notExpected) {
|
|
|
|
t.Errorf("%q is found in %q", notExpected, result)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func ensureListContains(t *testing.T, result []string, expected string) {
|
2019-06-27 04:30:33 +02:00
|
|
|
t.Helper()
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
if !android.InList(expected, result) {
|
|
|
|
t.Errorf("%q is not found in %v", expected, result)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func ensureListNotContains(t *testing.T, result []string, notExpected string) {
|
2019-06-27 04:30:33 +02:00
|
|
|
t.Helper()
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
if android.InList(notExpected, result) {
|
|
|
|
t.Errorf("%q is found in %v", notExpected, result)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-08-01 10:41:43 +02:00
|
|
|
func ensureListEmpty(t *testing.T, result []string) {
|
|
|
|
t.Helper()
|
|
|
|
if len(result) > 0 {
|
|
|
|
t.Errorf("%q is expected to be empty", result)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
// Minimal test
|
|
|
|
func TestBasicApex(t *testing.T) {
|
2019-07-17 03:25:41 +02:00
|
|
|
ctx, _ := testApex(t, `
|
2019-02-07 08:27:23 +01:00
|
|
|
apex_defaults {
|
|
|
|
name: "myapex-defaults",
|
2019-02-13 13:33:49 +01:00
|
|
|
manifest: ":myapex.manifest",
|
|
|
|
androidManifest: ":myapex.androidmanifest",
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
key: "myapex.key",
|
|
|
|
native_shared_libs: ["mylib"],
|
2019-01-18 23:37:31 +01:00
|
|
|
multilib: {
|
|
|
|
both: {
|
|
|
|
binaries: ["foo",],
|
|
|
|
}
|
2019-07-25 15:02:35 +02:00
|
|
|
},
|
2019-08-09 13:39:45 +02:00
|
|
|
java_libs: ["myjar", "myprebuiltjar"],
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
}
|
|
|
|
|
2019-02-07 08:27:23 +01:00
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
defaults: ["myapex-defaults"],
|
|
|
|
}
|
|
|
|
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
|
2019-02-13 13:33:49 +01:00
|
|
|
filegroup {
|
|
|
|
name: "myapex.manifest",
|
|
|
|
srcs: ["apex_manifest.json"],
|
|
|
|
}
|
|
|
|
|
|
|
|
filegroup {
|
|
|
|
name: "myapex.androidmanifest",
|
|
|
|
srcs: ["AndroidManifest.xml"],
|
|
|
|
}
|
|
|
|
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
cc_library {
|
|
|
|
name: "mylib",
|
|
|
|
srcs: ["mylib.cpp"],
|
|
|
|
shared_libs: ["mylib2"],
|
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
|
|
|
}
|
|
|
|
|
2019-01-18 23:37:31 +01:00
|
|
|
cc_binary {
|
|
|
|
name: "foo",
|
|
|
|
srcs: ["mylib.cpp"],
|
|
|
|
compile_multilib: "both",
|
|
|
|
multilib: {
|
|
|
|
lib32: {
|
|
|
|
suffix: "32",
|
|
|
|
},
|
|
|
|
lib64: {
|
|
|
|
suffix: "64",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
symlinks: ["foo_link_"],
|
|
|
|
symlink_preferred_arch: true,
|
|
|
|
system_shared_libs: [],
|
|
|
|
static_executable: true,
|
|
|
|
stl: "none",
|
|
|
|
}
|
|
|
|
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
cc_library {
|
|
|
|
name: "mylib2",
|
|
|
|
srcs: ["mylib.cpp"],
|
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
2019-03-18 04:01:38 +01:00
|
|
|
notice: "custom_notice",
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
}
|
2019-07-25 15:02:35 +02:00
|
|
|
|
|
|
|
java_library {
|
|
|
|
name: "myjar",
|
|
|
|
srcs: ["foo/bar/MyClass.java"],
|
|
|
|
sdk_version: "none",
|
|
|
|
system_modules: "none",
|
|
|
|
compile_dex: true,
|
|
|
|
static_libs: ["myotherjar"],
|
|
|
|
}
|
|
|
|
|
|
|
|
java_library {
|
|
|
|
name: "myotherjar",
|
|
|
|
srcs: ["foo/bar/MyClass.java"],
|
|
|
|
sdk_version: "none",
|
|
|
|
system_modules: "none",
|
|
|
|
compile_dex: true,
|
|
|
|
}
|
2019-08-09 13:39:45 +02:00
|
|
|
|
|
|
|
java_import {
|
|
|
|
name: "myprebuiltjar",
|
|
|
|
jars: ["prebuilt.jar"],
|
|
|
|
installable: true,
|
|
|
|
}
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
`)
|
|
|
|
|
2019-10-22 06:58:29 +02:00
|
|
|
apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
|
2019-04-01 04:15:50 +02:00
|
|
|
|
|
|
|
optFlags := apexRule.Args["opt_flags"]
|
|
|
|
ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
|
2019-06-18 22:09:13 +02:00
|
|
|
// Ensure that the NOTICE output is being packaged as an asset.
|
2019-10-22 06:58:29 +02:00
|
|
|
ensureContains(t, optFlags, "--assets_dir "+buildDir+"/.intermediates/myapex/android_common_myapex_image/NOTICE")
|
2019-04-01 04:15:50 +02:00
|
|
|
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
copyCmds := apexRule.Args["copy_commands"]
|
|
|
|
|
|
|
|
// Ensure that main rule creates an output
|
|
|
|
ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
|
|
|
|
|
|
|
|
// Ensure that apex variant is created for the direct dep
|
2019-11-21 01:39:12 +01:00
|
|
|
ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
|
2019-07-25 15:02:35 +02:00
|
|
|
ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_myapex")
|
2019-08-09 13:39:45 +02:00
|
|
|
ensureListContains(t, ctx.ModuleVariantsForTests("myprebuiltjar"), "android_common_myapex")
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
|
|
|
|
// Ensure that apex variant is created for the indirect dep
|
2019-11-21 01:39:12 +01:00
|
|
|
ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
|
2019-07-25 15:02:35 +02:00
|
|
|
ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_myapex")
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
|
|
|
|
// Ensure that both direct and indirect deps are copied into apex
|
2018-11-30 02:12:15 +01:00
|
|
|
ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
|
|
|
|
ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
|
2019-07-25 15:02:35 +02:00
|
|
|
ensureContains(t, copyCmds, "image.apex/javalib/myjar.jar")
|
2019-08-09 13:39:45 +02:00
|
|
|
ensureContains(t, copyCmds, "image.apex/javalib/myprebuiltjar.jar")
|
2019-07-25 15:02:35 +02:00
|
|
|
// .. but not for java libs
|
|
|
|
ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
|
2018-12-26 08:32:21 +01:00
|
|
|
|
2019-11-21 01:39:12 +01:00
|
|
|
// Ensure that the platform variant ends with _shared or _common
|
|
|
|
ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
|
|
|
|
ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
|
2019-07-25 15:02:35 +02:00
|
|
|
ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
|
|
|
|
ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
|
2019-08-09 13:39:45 +02:00
|
|
|
ensureListContains(t, ctx.ModuleVariantsForTests("myprebuiltjar"), "android_common")
|
2019-01-18 23:37:31 +01:00
|
|
|
|
|
|
|
// Ensure that all symlinks are present.
|
|
|
|
found_foo_link_64 := false
|
|
|
|
found_foo := false
|
|
|
|
for _, cmd := range strings.Split(copyCmds, " && ") {
|
|
|
|
if strings.HasPrefix(cmd, "ln -s foo64") {
|
|
|
|
if strings.HasSuffix(cmd, "bin/foo") {
|
|
|
|
found_foo = true
|
|
|
|
} else if strings.HasSuffix(cmd, "bin/foo_link_64") {
|
|
|
|
found_foo_link_64 = true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
good := found_foo && found_foo_link_64
|
|
|
|
if !good {
|
|
|
|
t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
|
|
|
|
}
|
2019-03-18 04:01:38 +01:00
|
|
|
|
2019-10-22 06:58:29 +02:00
|
|
|
mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("mergeNoticesRule")
|
2019-06-18 02:40:56 +02:00
|
|
|
noticeInputs := mergeNoticesRule.Inputs.Strings()
|
2019-06-18 22:09:13 +02:00
|
|
|
if len(noticeInputs) != 2 {
|
|
|
|
t.Errorf("number of input notice files: expected = 2, actual = %q", len(noticeInputs))
|
2019-03-18 04:01:38 +01:00
|
|
|
}
|
|
|
|
ensureListContains(t, noticeInputs, "NOTICE")
|
|
|
|
ensureListContains(t, noticeInputs, "custom_notice")
|
2018-11-30 02:12:15 +01:00
|
|
|
}
|
|
|
|
|
2019-12-16 14:32:06 +01:00
|
|
|
func TestDefaults(t *testing.T) {
|
|
|
|
ctx, _ := testApex(t, `
|
|
|
|
apex_defaults {
|
|
|
|
name: "myapex-defaults",
|
|
|
|
key: "myapex.key",
|
|
|
|
prebuilts: ["myetc"],
|
|
|
|
native_shared_libs: ["mylib"],
|
|
|
|
java_libs: ["myjar"],
|
|
|
|
apps: ["AppFoo"],
|
|
|
|
}
|
|
|
|
|
|
|
|
prebuilt_etc {
|
|
|
|
name: "myetc",
|
|
|
|
src: "myprebuilt",
|
|
|
|
}
|
|
|
|
|
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
defaults: ["myapex-defaults"],
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "mylib",
|
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
|
|
|
}
|
|
|
|
|
|
|
|
java_library {
|
|
|
|
name: "myjar",
|
|
|
|
srcs: ["foo/bar/MyClass.java"],
|
|
|
|
sdk_version: "none",
|
|
|
|
system_modules: "none",
|
|
|
|
compile_dex: true,
|
|
|
|
}
|
|
|
|
|
|
|
|
android_app {
|
|
|
|
name: "AppFoo",
|
|
|
|
srcs: ["foo/bar/MyClass.java"],
|
|
|
|
sdk_version: "none",
|
|
|
|
system_modules: "none",
|
|
|
|
}
|
|
|
|
`)
|
|
|
|
ensureExactContents(t, ctx, "myapex", []string{
|
|
|
|
"etc/myetc",
|
|
|
|
"javalib/myjar.jar",
|
|
|
|
"lib64/mylib.so",
|
|
|
|
"app/AppFoo/AppFoo.apk",
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2019-11-01 18:52:25 +01:00
|
|
|
func TestApexManifest(t *testing.T) {
|
|
|
|
ctx, _ := testApex(t, `
|
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
`)
|
|
|
|
|
|
|
|
module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
|
2019-11-12 05:03:50 +01:00
|
|
|
args := module.Rule("apexRule").Args
|
|
|
|
if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
|
|
|
|
t.Error("manifest should be apex_manifest.pb, but " + manifest)
|
|
|
|
}
|
2019-11-01 18:52:25 +01:00
|
|
|
}
|
|
|
|
|
2018-11-30 02:12:15 +01:00
|
|
|
func TestBasicZipApex(t *testing.T) {
|
2019-07-17 03:25:41 +02:00
|
|
|
ctx, _ := testApex(t, `
|
2018-11-30 02:12:15 +01:00
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
payload_type: "zip",
|
|
|
|
native_shared_libs: ["mylib"],
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "mylib",
|
|
|
|
srcs: ["mylib.cpp"],
|
|
|
|
shared_libs: ["mylib2"],
|
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "mylib2",
|
|
|
|
srcs: ["mylib.cpp"],
|
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
|
|
|
}
|
|
|
|
`)
|
|
|
|
|
2019-10-22 06:58:29 +02:00
|
|
|
zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
|
2018-11-30 02:12:15 +01:00
|
|
|
copyCmds := zipApexRule.Args["copy_commands"]
|
|
|
|
|
|
|
|
// Ensure that main rule creates an output
|
|
|
|
ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
|
|
|
|
|
|
|
|
// Ensure that APEX variant is created for the direct dep
|
2019-11-21 01:39:12 +01:00
|
|
|
ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
|
2018-11-30 02:12:15 +01:00
|
|
|
|
|
|
|
// Ensure that APEX variant is created for the indirect dep
|
2019-11-21 01:39:12 +01:00
|
|
|
ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
|
2018-11-30 02:12:15 +01:00
|
|
|
|
|
|
|
// Ensure that both direct and indirect deps are copied into apex
|
|
|
|
ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
|
|
|
|
ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestApexWithStubs(t *testing.T) {
|
2019-07-17 03:25:41 +02:00
|
|
|
ctx, _ := testApex(t, `
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
native_shared_libs: ["mylib", "mylib3"],
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "mylib",
|
|
|
|
srcs: ["mylib.cpp"],
|
|
|
|
shared_libs: ["mylib2", "mylib3"],
|
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "mylib2",
|
|
|
|
srcs: ["mylib.cpp"],
|
2018-12-13 10:37:29 +01:00
|
|
|
cflags: ["-include mylib.h"],
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
|
|
|
stubs: {
|
|
|
|
versions: ["1", "2", "3"],
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "mylib3",
|
2018-12-07 14:42:47 +01:00
|
|
|
srcs: ["mylib.cpp"],
|
|
|
|
shared_libs: ["mylib4"],
|
|
|
|
system_shared_libs: [],
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
stl: "none",
|
|
|
|
stubs: {
|
|
|
|
versions: ["10", "11", "12"],
|
|
|
|
},
|
|
|
|
}
|
2018-12-07 14:42:47 +01:00
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "mylib4",
|
|
|
|
srcs: ["mylib.cpp"],
|
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
|
|
|
}
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
`)
|
|
|
|
|
2019-10-22 06:58:29 +02:00
|
|
|
apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
copyCmds := apexRule.Args["copy_commands"]
|
|
|
|
|
|
|
|
// Ensure that direct non-stubs dep is always included
|
2018-11-30 02:12:15 +01:00
|
|
|
ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
|
|
|
|
// Ensure that indirect stubs dep is not included
|
2018-11-30 02:12:15 +01:00
|
|
|
ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
|
|
|
|
// Ensure that direct stubs dep is included
|
2018-11-30 02:12:15 +01:00
|
|
|
ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
|
2019-11-21 01:39:12 +01:00
|
|
|
mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
|
|
|
|
// Ensure that mylib is linking with the latest version of stubs for mylib2
|
2019-11-21 01:39:12 +01:00
|
|
|
ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_3_myapex/mylib2.so")
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
// ... and not linking to the non-stub (impl) variant of mylib2
|
2019-11-21 01:39:12 +01:00
|
|
|
ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_myapex/mylib2.so")
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
|
|
|
|
// Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
|
2019-11-21 01:39:12 +01:00
|
|
|
ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_myapex/mylib3.so")
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
// .. and not linking to the stubs variant of mylib3
|
2019-11-21 01:39:12 +01:00
|
|
|
ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12_myapex/mylib3.so")
|
2018-12-13 10:37:29 +01:00
|
|
|
|
|
|
|
// Ensure that stubs libs are built without -include flags
|
2019-11-21 01:39:12 +01:00
|
|
|
mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
|
2018-12-13 10:37:29 +01:00
|
|
|
ensureNotContains(t, mylib2Cflags, "-include ")
|
2018-12-07 08:25:39 +01:00
|
|
|
|
|
|
|
// Ensure that genstub is invoked with --apex
|
2019-11-21 01:39:12 +01:00
|
|
|
ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_3_myapex").Rule("genStubSrc").Args["flags"])
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
}
|
|
|
|
|
Don't create unnecessary APEX variations
This change fixes a problem that APEX variations are created for the
modules that actually shouldn't built for any APEX. For example,
consider this case.
apex { name: "myapex", native_shared_libs: ["mylib"],}
cc_library { name: "mylib", shared_libs: ["libfoo#10"],}
cc_library { name: "libfoo",
shared_libs: ["libbar"],
stubs: { versions: ["10"], }, }
cc_library { name: "libbar", ...}
Before this change, both the stubs and non-stubs variations of libfoo
were mutated with apexMuator, which is incorrect for the non-stubs
varia; there is no dependency chain from the apex "myapex" to the
non-stubs variation, but to the stubs variation due to the #10 syntax.
This was happening becauses we used the name of the module to determine
whether it should be built for APEX or not. Both stubs and non-stubs
variations have the same module name "libfoo".
Fixing this issue by recording the list of APEX variations required
directly on the module. So, the stubs variation of libfoo has myapex in
its apex variations list, but the non-stubs variation doesn't, and thus
apexMutator does not pick up the non-stubs variation.
Test: m (apex_test updated and passing)
Test: cherry-pick ag/5747464 and m
Change-Id: I31e618626809a828a55fff513ef5f81f79637afa
2018-12-10 17:35:25 +01:00
|
|
|
func TestApexWithExplicitStubsDependency(t *testing.T) {
|
2019-07-17 03:25:41 +02:00
|
|
|
ctx, _ := testApex(t, `
|
Don't create unnecessary APEX variations
This change fixes a problem that APEX variations are created for the
modules that actually shouldn't built for any APEX. For example,
consider this case.
apex { name: "myapex", native_shared_libs: ["mylib"],}
cc_library { name: "mylib", shared_libs: ["libfoo#10"],}
cc_library { name: "libfoo",
shared_libs: ["libbar"],
stubs: { versions: ["10"], }, }
cc_library { name: "libbar", ...}
Before this change, both the stubs and non-stubs variations of libfoo
were mutated with apexMuator, which is incorrect for the non-stubs
varia; there is no dependency chain from the apex "myapex" to the
non-stubs variation, but to the stubs variation due to the #10 syntax.
This was happening becauses we used the name of the module to determine
whether it should be built for APEX or not. Both stubs and non-stubs
variations have the same module name "libfoo".
Fixing this issue by recording the list of APEX variations required
directly on the module. So, the stubs variation of libfoo has myapex in
its apex variations list, but the non-stubs variation doesn't, and thus
apexMutator does not pick up the non-stubs variation.
Test: m (apex_test updated and passing)
Test: cherry-pick ag/5747464 and m
Change-Id: I31e618626809a828a55fff513ef5f81f79637afa
2018-12-10 17:35:25 +01:00
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
native_shared_libs: ["mylib"],
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "mylib",
|
|
|
|
srcs: ["mylib.cpp"],
|
|
|
|
shared_libs: ["libfoo#10"],
|
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "libfoo",
|
|
|
|
srcs: ["mylib.cpp"],
|
|
|
|
shared_libs: ["libbar"],
|
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
|
|
|
stubs: {
|
|
|
|
versions: ["10", "20", "30"],
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "libbar",
|
|
|
|
srcs: ["mylib.cpp"],
|
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
|
|
|
}
|
|
|
|
|
|
|
|
`)
|
|
|
|
|
2019-10-22 06:58:29 +02:00
|
|
|
apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
|
Don't create unnecessary APEX variations
This change fixes a problem that APEX variations are created for the
modules that actually shouldn't built for any APEX. For example,
consider this case.
apex { name: "myapex", native_shared_libs: ["mylib"],}
cc_library { name: "mylib", shared_libs: ["libfoo#10"],}
cc_library { name: "libfoo",
shared_libs: ["libbar"],
stubs: { versions: ["10"], }, }
cc_library { name: "libbar", ...}
Before this change, both the stubs and non-stubs variations of libfoo
were mutated with apexMuator, which is incorrect for the non-stubs
varia; there is no dependency chain from the apex "myapex" to the
non-stubs variation, but to the stubs variation due to the #10 syntax.
This was happening becauses we used the name of the module to determine
whether it should be built for APEX or not. Both stubs and non-stubs
variations have the same module name "libfoo".
Fixing this issue by recording the list of APEX variations required
directly on the module. So, the stubs variation of libfoo has myapex in
its apex variations list, but the non-stubs variation doesn't, and thus
apexMutator does not pick up the non-stubs variation.
Test: m (apex_test updated and passing)
Test: cherry-pick ag/5747464 and m
Change-Id: I31e618626809a828a55fff513ef5f81f79637afa
2018-12-10 17:35:25 +01:00
|
|
|
copyCmds := apexRule.Args["copy_commands"]
|
|
|
|
|
|
|
|
// Ensure that direct non-stubs dep is always included
|
|
|
|
ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
|
|
|
|
|
|
|
|
// Ensure that indirect stubs dep is not included
|
|
|
|
ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
|
|
|
|
|
|
|
|
// Ensure that dependency of stubs is not included
|
|
|
|
ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
|
|
|
|
|
2019-11-21 01:39:12 +01:00
|
|
|
mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
|
Don't create unnecessary APEX variations
This change fixes a problem that APEX variations are created for the
modules that actually shouldn't built for any APEX. For example,
consider this case.
apex { name: "myapex", native_shared_libs: ["mylib"],}
cc_library { name: "mylib", shared_libs: ["libfoo#10"],}
cc_library { name: "libfoo",
shared_libs: ["libbar"],
stubs: { versions: ["10"], }, }
cc_library { name: "libbar", ...}
Before this change, both the stubs and non-stubs variations of libfoo
were mutated with apexMuator, which is incorrect for the non-stubs
varia; there is no dependency chain from the apex "myapex" to the
non-stubs variation, but to the stubs variation due to the #10 syntax.
This was happening becauses we used the name of the module to determine
whether it should be built for APEX or not. Both stubs and non-stubs
variations have the same module name "libfoo".
Fixing this issue by recording the list of APEX variations required
directly on the module. So, the stubs variation of libfoo has myapex in
its apex variations list, but the non-stubs variation doesn't, and thus
apexMutator does not pick up the non-stubs variation.
Test: m (apex_test updated and passing)
Test: cherry-pick ag/5747464 and m
Change-Id: I31e618626809a828a55fff513ef5f81f79637afa
2018-12-10 17:35:25 +01:00
|
|
|
|
|
|
|
// Ensure that mylib is linking with version 10 of libfoo
|
2019-11-21 01:39:12 +01:00
|
|
|
ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10_myapex/libfoo.so")
|
Don't create unnecessary APEX variations
This change fixes a problem that APEX variations are created for the
modules that actually shouldn't built for any APEX. For example,
consider this case.
apex { name: "myapex", native_shared_libs: ["mylib"],}
cc_library { name: "mylib", shared_libs: ["libfoo#10"],}
cc_library { name: "libfoo",
shared_libs: ["libbar"],
stubs: { versions: ["10"], }, }
cc_library { name: "libbar", ...}
Before this change, both the stubs and non-stubs variations of libfoo
were mutated with apexMuator, which is incorrect for the non-stubs
varia; there is no dependency chain from the apex "myapex" to the
non-stubs variation, but to the stubs variation due to the #10 syntax.
This was happening becauses we used the name of the module to determine
whether it should be built for APEX or not. Both stubs and non-stubs
variations have the same module name "libfoo".
Fixing this issue by recording the list of APEX variations required
directly on the module. So, the stubs variation of libfoo has myapex in
its apex variations list, but the non-stubs variation doesn't, and thus
apexMutator does not pick up the non-stubs variation.
Test: m (apex_test updated and passing)
Test: cherry-pick ag/5747464 and m
Change-Id: I31e618626809a828a55fff513ef5f81f79637afa
2018-12-10 17:35:25 +01:00
|
|
|
// ... and not linking to the non-stub (impl) variant of libfoo
|
2019-11-21 01:39:12 +01:00
|
|
|
ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_myapex/libfoo.so")
|
Don't create unnecessary APEX variations
This change fixes a problem that APEX variations are created for the
modules that actually shouldn't built for any APEX. For example,
consider this case.
apex { name: "myapex", native_shared_libs: ["mylib"],}
cc_library { name: "mylib", shared_libs: ["libfoo#10"],}
cc_library { name: "libfoo",
shared_libs: ["libbar"],
stubs: { versions: ["10"], }, }
cc_library { name: "libbar", ...}
Before this change, both the stubs and non-stubs variations of libfoo
were mutated with apexMuator, which is incorrect for the non-stubs
varia; there is no dependency chain from the apex "myapex" to the
non-stubs variation, but to the stubs variation due to the #10 syntax.
This was happening becauses we used the name of the module to determine
whether it should be built for APEX or not. Both stubs and non-stubs
variations have the same module name "libfoo".
Fixing this issue by recording the list of APEX variations required
directly on the module. So, the stubs variation of libfoo has myapex in
its apex variations list, but the non-stubs variation doesn't, and thus
apexMutator does not pick up the non-stubs variation.
Test: m (apex_test updated and passing)
Test: cherry-pick ag/5747464 and m
Change-Id: I31e618626809a828a55fff513ef5f81f79637afa
2018-12-10 17:35:25 +01:00
|
|
|
|
2019-11-21 01:39:12 +01:00
|
|
|
libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10_myapex").Rule("ld").Args["libFlags"]
|
Don't create unnecessary APEX variations
This change fixes a problem that APEX variations are created for the
modules that actually shouldn't built for any APEX. For example,
consider this case.
apex { name: "myapex", native_shared_libs: ["mylib"],}
cc_library { name: "mylib", shared_libs: ["libfoo#10"],}
cc_library { name: "libfoo",
shared_libs: ["libbar"],
stubs: { versions: ["10"], }, }
cc_library { name: "libbar", ...}
Before this change, both the stubs and non-stubs variations of libfoo
were mutated with apexMuator, which is incorrect for the non-stubs
varia; there is no dependency chain from the apex "myapex" to the
non-stubs variation, but to the stubs variation due to the #10 syntax.
This was happening becauses we used the name of the module to determine
whether it should be built for APEX or not. Both stubs and non-stubs
variations have the same module name "libfoo".
Fixing this issue by recording the list of APEX variations required
directly on the module. So, the stubs variation of libfoo has myapex in
its apex variations list, but the non-stubs variation doesn't, and thus
apexMutator does not pick up the non-stubs variation.
Test: m (apex_test updated and passing)
Test: cherry-pick ag/5747464 and m
Change-Id: I31e618626809a828a55fff513ef5f81f79637afa
2018-12-10 17:35:25 +01:00
|
|
|
|
|
|
|
// Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
|
|
|
|
ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
|
|
|
|
}
|
|
|
|
|
2019-08-09 05:57:43 +02:00
|
|
|
func TestApexWithRuntimeLibsDependency(t *testing.T) {
|
|
|
|
/*
|
|
|
|
myapex
|
|
|
|
|
|
|
|
|
v (runtime_libs)
|
|
|
|
mylib ------+------> libfoo [provides stub]
|
|
|
|
|
|
|
|
|
`------> libbar
|
|
|
|
*/
|
|
|
|
ctx, _ := testApex(t, `
|
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
native_shared_libs: ["mylib"],
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "mylib",
|
|
|
|
srcs: ["mylib.cpp"],
|
|
|
|
runtime_libs: ["libfoo", "libbar"],
|
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "libfoo",
|
|
|
|
srcs: ["mylib.cpp"],
|
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
|
|
|
stubs: {
|
|
|
|
versions: ["10", "20", "30"],
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "libbar",
|
|
|
|
srcs: ["mylib.cpp"],
|
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
|
|
|
}
|
|
|
|
|
|
|
|
`)
|
|
|
|
|
2019-10-22 06:58:29 +02:00
|
|
|
apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
|
2019-08-09 05:57:43 +02:00
|
|
|
copyCmds := apexRule.Args["copy_commands"]
|
|
|
|
|
|
|
|
// Ensure that direct non-stubs dep is always included
|
|
|
|
ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
|
|
|
|
|
|
|
|
// Ensure that indirect stubs dep is not included
|
|
|
|
ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
|
|
|
|
|
|
|
|
// Ensure that runtime_libs dep in included
|
|
|
|
ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
|
|
|
|
|
2019-10-22 06:58:29 +02:00
|
|
|
apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
|
2019-09-26 17:38:03 +02:00
|
|
|
ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
|
|
|
|
ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
|
2019-08-09 05:57:43 +02:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2019-08-20 10:30:57 +02:00
|
|
|
func TestApexDependencyToLLNDK(t *testing.T) {
|
|
|
|
ctx, _ := testApex(t, `
|
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
use_vendor: true,
|
|
|
|
native_shared_libs: ["mylib"],
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "mylib",
|
|
|
|
srcs: ["mylib.cpp"],
|
|
|
|
vendor_available: true,
|
|
|
|
shared_libs: ["libbar"],
|
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "libbar",
|
|
|
|
srcs: ["mylib.cpp"],
|
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
|
|
|
}
|
|
|
|
|
|
|
|
llndk_library {
|
|
|
|
name: "libbar",
|
|
|
|
symbol_file: "",
|
|
|
|
}
|
2019-10-31 19:14:38 +01:00
|
|
|
`, func(fs map[string][]byte, config android.Config) {
|
|
|
|
setUseVendorWhitelistForTest(config, []string{"myapex"})
|
|
|
|
})
|
2019-08-20 10:30:57 +02:00
|
|
|
|
2019-10-22 06:58:29 +02:00
|
|
|
apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
|
2019-08-20 10:30:57 +02:00
|
|
|
copyCmds := apexRule.Args["copy_commands"]
|
|
|
|
|
|
|
|
// Ensure that LLNDK dep is not included
|
|
|
|
ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
|
|
|
|
|
2019-10-22 06:58:29 +02:00
|
|
|
apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
|
2019-09-26 17:38:03 +02:00
|
|
|
ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
|
2019-08-20 10:30:57 +02:00
|
|
|
|
|
|
|
// Ensure that LLNDK dep is required
|
2019-09-26 17:38:03 +02:00
|
|
|
ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
|
2019-08-20 10:30:57 +02:00
|
|
|
|
|
|
|
}
|
|
|
|
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
func TestApexWithSystemLibsStubs(t *testing.T) {
|
2019-07-17 03:25:41 +02:00
|
|
|
ctx, _ := testApex(t, `
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "mylib",
|
|
|
|
srcs: ["mylib.cpp"],
|
|
|
|
shared_libs: ["libdl#27"],
|
|
|
|
stl: "none",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library_shared {
|
|
|
|
name: "mylib_shared",
|
|
|
|
srcs: ["mylib.cpp"],
|
|
|
|
shared_libs: ["libdl#27"],
|
|
|
|
stl: "none",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "libc",
|
2019-06-02 09:53:50 +02:00
|
|
|
no_libcrt: true,
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
nocrt: true,
|
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
|
|
|
stubs: {
|
|
|
|
versions: ["27", "28", "29"],
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "libm",
|
2019-06-02 09:53:50 +02:00
|
|
|
no_libcrt: true,
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
nocrt: true,
|
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
|
|
|
stubs: {
|
|
|
|
versions: ["27", "28", "29"],
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "libdl",
|
2019-06-02 09:53:50 +02:00
|
|
|
no_libcrt: true,
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
nocrt: true,
|
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
|
|
|
stubs: {
|
|
|
|
versions: ["27", "28", "29"],
|
|
|
|
},
|
|
|
|
}
|
2018-12-20 14:10:17 +01:00
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "libBootstrap",
|
|
|
|
srcs: ["mylib.cpp"],
|
|
|
|
stl: "none",
|
|
|
|
bootstrap: true,
|
|
|
|
}
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
`)
|
|
|
|
|
2019-10-22 06:58:29 +02:00
|
|
|
apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
copyCmds := apexRule.Args["copy_commands"]
|
|
|
|
|
|
|
|
// Ensure that mylib, libm, libdl are included.
|
2018-11-30 02:12:15 +01:00
|
|
|
ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
|
2018-12-20 14:10:17 +01:00
|
|
|
ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
|
|
|
|
ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
|
|
|
|
// Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
|
2018-12-20 14:10:17 +01:00
|
|
|
ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
|
2019-11-21 01:39:12 +01:00
|
|
|
mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
|
|
|
|
mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
|
|
|
|
mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_myapex").Rule("cc").Args["cFlags"]
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
|
|
|
|
// For dependency to libc
|
|
|
|
// Ensure that mylib is linking with the latest version of stubs
|
2019-11-21 01:39:12 +01:00
|
|
|
ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_29_myapex/libc.so")
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
// ... and not linking to the non-stub (impl) variant
|
2019-11-21 01:39:12 +01:00
|
|
|
ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_myapex/libc.so")
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
// ... Cflags from stub is correctly exported to mylib
|
|
|
|
ensureContains(t, mylibCFlags, "__LIBC_API__=29")
|
|
|
|
ensureContains(t, mylibSharedCFlags, "__LIBC_API__=29")
|
|
|
|
|
|
|
|
// For dependency to libm
|
|
|
|
// Ensure that mylib is linking with the non-stub (impl) variant
|
2019-11-21 01:39:12 +01:00
|
|
|
ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_myapex/libm.so")
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
// ... and not linking to the stub variant
|
2019-11-21 01:39:12 +01:00
|
|
|
ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29_myapex/libm.so")
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
// ... and is not compiling with the stub
|
|
|
|
ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
|
|
|
|
ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
|
|
|
|
|
|
|
|
// For dependency to libdl
|
|
|
|
// Ensure that mylib is linking with the specified version of stubs
|
2019-11-21 01:39:12 +01:00
|
|
|
ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27_myapex/libdl.so")
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
// ... and not linking to the other versions of stubs
|
2019-11-21 01:39:12 +01:00
|
|
|
ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28_myapex/libdl.so")
|
|
|
|
ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29_myapex/libdl.so")
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
// ... and not linking to the non-stub (impl) variant
|
2019-11-21 01:39:12 +01:00
|
|
|
ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_myapex/libdl.so")
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
// ... Cflags from stub is correctly exported to mylib
|
|
|
|
ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
|
|
|
|
ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
|
2018-12-20 14:10:17 +01:00
|
|
|
|
|
|
|
// Ensure that libBootstrap is depending on the platform variant of bionic libs
|
2019-11-21 01:39:12 +01:00
|
|
|
libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
|
|
|
|
ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
|
|
|
|
ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
|
|
|
|
ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
|
Stubs variant is used when building for APEX
When a native module is built for an APEX and is depending on a native
library having stubs (i.e. stubs.versions property is set), the stubs
variant is used unless the dependent lib is directly included in the
same APEX with the depending module.
Example:
apex {
name: "myapex",
native_shared_libs: ["libX", "libY"],
}
cc_library {
name: "libX",
shared_libs: ["libY", "libZ"],
}
cc_library {
name: "libY",
stubs: { versions: ["1", "2"], },
}
cc_library {
name: "libZ",
stubs: { versions: ["1", "2"], },
}
In this case, libX is linking to the impl variant of libY (that provides
private APIs) while libY is linking to the version 2 stubs of libZ. This is
because libY is directly included in the same apex via
native_shared_libs property, but libZ isn't.
Bug: 112672359
Test: apex_test added
Change-Id: If9871b70dc74a06bd828dd4cd1aeebd2e68b837c
2018-11-18 10:02:45 +01:00
|
|
|
}
|
2018-12-06 16:42:25 +01:00
|
|
|
|
|
|
|
func TestFilesInSubDir(t *testing.T) {
|
2019-07-17 03:25:41 +02:00
|
|
|
ctx, _ := testApex(t, `
|
2018-12-06 16:42:25 +01:00
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
2019-02-01 04:03:59 +01:00
|
|
|
native_shared_libs: ["mylib"],
|
|
|
|
binaries: ["mybin"],
|
2018-12-06 16:42:25 +01:00
|
|
|
prebuilts: ["myetc"],
|
2019-02-01 04:03:59 +01:00
|
|
|
compile_multilib: "both",
|
2018-12-06 16:42:25 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
|
|
|
|
prebuilt_etc {
|
|
|
|
name: "myetc",
|
|
|
|
src: "myprebuilt",
|
|
|
|
sub_dir: "foo/bar",
|
|
|
|
}
|
2019-02-01 04:03:59 +01:00
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "mylib",
|
|
|
|
srcs: ["mylib.cpp"],
|
|
|
|
relative_install_path: "foo/bar",
|
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_binary {
|
|
|
|
name: "mybin",
|
|
|
|
srcs: ["mylib.cpp"],
|
|
|
|
relative_install_path: "foo/bar",
|
|
|
|
system_shared_libs: [],
|
|
|
|
static_executable: true,
|
|
|
|
stl: "none",
|
|
|
|
}
|
2018-12-06 16:42:25 +01:00
|
|
|
`)
|
|
|
|
|
2019-10-22 06:58:29 +02:00
|
|
|
generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
|
2018-12-06 16:42:25 +01:00
|
|
|
dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
|
|
|
|
|
2019-02-01 04:03:59 +01:00
|
|
|
// Ensure that the subdirectories are all listed
|
2018-12-06 16:42:25 +01:00
|
|
|
ensureListContains(t, dirs, "etc")
|
|
|
|
ensureListContains(t, dirs, "etc/foo")
|
|
|
|
ensureListContains(t, dirs, "etc/foo/bar")
|
2019-02-01 04:03:59 +01:00
|
|
|
ensureListContains(t, dirs, "lib64")
|
|
|
|
ensureListContains(t, dirs, "lib64/foo")
|
|
|
|
ensureListContains(t, dirs, "lib64/foo/bar")
|
|
|
|
ensureListContains(t, dirs, "lib")
|
|
|
|
ensureListContains(t, dirs, "lib/foo")
|
|
|
|
ensureListContains(t, dirs, "lib/foo/bar")
|
|
|
|
|
2019-03-15 10:10:35 +01:00
|
|
|
ensureListContains(t, dirs, "bin")
|
|
|
|
ensureListContains(t, dirs, "bin/foo")
|
|
|
|
ensureListContains(t, dirs, "bin/foo/bar")
|
2018-12-06 16:42:25 +01:00
|
|
|
}
|
2018-12-19 09:12:36 +01:00
|
|
|
|
|
|
|
func TestUseVendor(t *testing.T) {
|
2019-07-17 03:25:41 +02:00
|
|
|
ctx, _ := testApex(t, `
|
2018-12-19 09:12:36 +01:00
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
native_shared_libs: ["mylib"],
|
|
|
|
use_vendor: true,
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "mylib",
|
|
|
|
srcs: ["mylib.cpp"],
|
|
|
|
shared_libs: ["mylib2"],
|
|
|
|
system_shared_libs: [],
|
|
|
|
vendor_available: true,
|
|
|
|
stl: "none",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "mylib2",
|
|
|
|
srcs: ["mylib.cpp"],
|
|
|
|
system_shared_libs: [],
|
|
|
|
vendor_available: true,
|
|
|
|
stl: "none",
|
|
|
|
}
|
2019-10-31 19:14:38 +01:00
|
|
|
`, func(fs map[string][]byte, config android.Config) {
|
|
|
|
setUseVendorWhitelistForTest(config, []string{"myapex"})
|
|
|
|
})
|
2018-12-19 09:12:36 +01:00
|
|
|
|
|
|
|
inputsList := []string{}
|
2019-10-22 06:58:29 +02:00
|
|
|
for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
|
2018-12-19 09:12:36 +01:00
|
|
|
for _, implicit := range i.Implicits {
|
|
|
|
inputsList = append(inputsList, implicit.String())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
inputsString := strings.Join(inputsList, " ")
|
|
|
|
|
|
|
|
// ensure that the apex includes vendor variants of the direct and indirect deps
|
2019-08-26 09:52:35 +02:00
|
|
|
ensureContains(t, inputsString, "android_arm64_armv8-a_vendor.VER_shared_myapex/mylib.so")
|
|
|
|
ensureContains(t, inputsString, "android_arm64_armv8-a_vendor.VER_shared_myapex/mylib2.so")
|
2018-12-19 09:12:36 +01:00
|
|
|
|
|
|
|
// ensure that the apex does not include core variants
|
2019-11-21 01:39:12 +01:00
|
|
|
ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_myapex/mylib.so")
|
|
|
|
ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_myapex/mylib2.so")
|
2018-12-19 09:12:36 +01:00
|
|
|
}
|
2018-12-20 10:18:08 +01:00
|
|
|
|
2019-10-31 19:14:38 +01:00
|
|
|
func TestUseVendorRestriction(t *testing.T) {
|
|
|
|
testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
|
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
use_vendor: true,
|
|
|
|
}
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
`, func(fs map[string][]byte, config android.Config) {
|
|
|
|
setUseVendorWhitelistForTest(config, []string{""})
|
|
|
|
})
|
|
|
|
// no error with whitelist
|
|
|
|
testApex(t, `
|
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
use_vendor: true,
|
|
|
|
}
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
`, func(fs map[string][]byte, config android.Config) {
|
|
|
|
setUseVendorWhitelistForTest(config, []string{"myapex"})
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2019-06-27 04:30:33 +02:00
|
|
|
func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
|
|
|
|
testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
|
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
native_shared_libs: ["mylib"],
|
|
|
|
use_vendor: true,
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "mylib",
|
|
|
|
srcs: ["mylib.cpp"],
|
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
|
|
|
}
|
|
|
|
`)
|
|
|
|
}
|
|
|
|
|
2018-12-20 10:18:08 +01:00
|
|
|
func TestStaticLinking(t *testing.T) {
|
2019-07-17 03:25:41 +02:00
|
|
|
ctx, _ := testApex(t, `
|
2018-12-20 10:18:08 +01:00
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
native_shared_libs: ["mylib"],
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "mylib",
|
|
|
|
srcs: ["mylib.cpp"],
|
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
|
|
|
stubs: {
|
|
|
|
versions: ["1", "2", "3"],
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_binary {
|
|
|
|
name: "not_in_apex",
|
|
|
|
srcs: ["mylib.cpp"],
|
|
|
|
static_libs: ["mylib"],
|
|
|
|
static_executable: true,
|
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
|
|
|
}
|
|
|
|
`)
|
|
|
|
|
2019-11-21 01:39:12 +01:00
|
|
|
ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
|
2018-12-20 10:18:08 +01:00
|
|
|
|
|
|
|
// Ensure that not_in_apex is linking with the static variant of mylib
|
2019-11-21 01:39:12 +01:00
|
|
|
ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
|
2018-12-20 10:18:08 +01:00
|
|
|
}
|
2018-12-24 03:31:58 +01:00
|
|
|
|
|
|
|
func TestKeys(t *testing.T) {
|
2019-07-17 03:25:41 +02:00
|
|
|
ctx, _ := testApex(t, `
|
2018-12-24 03:31:58 +01:00
|
|
|
apex {
|
2019-02-11 03:38:15 +01:00
|
|
|
name: "myapex_keytest",
|
2018-12-24 03:31:58 +01:00
|
|
|
key: "myapex.key",
|
2019-02-11 03:38:15 +01:00
|
|
|
certificate: ":myapex.certificate",
|
2018-12-24 03:31:58 +01:00
|
|
|
native_shared_libs: ["mylib"],
|
2019-11-19 18:26:02 +01:00
|
|
|
file_contexts: ":myapex-file_contexts",
|
2018-12-24 03:31:58 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "mylib",
|
|
|
|
srcs: ["mylib.cpp"],
|
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
|
2019-02-11 03:38:15 +01:00
|
|
|
android_app_certificate {
|
|
|
|
name: "myapex.certificate",
|
|
|
|
certificate: "testkey",
|
|
|
|
}
|
|
|
|
|
|
|
|
android_app_certificate {
|
|
|
|
name: "myapex.certificate.override",
|
|
|
|
certificate: "testkey.override",
|
|
|
|
}
|
|
|
|
|
2018-12-24 03:31:58 +01:00
|
|
|
`)
|
|
|
|
|
|
|
|
// check the APEX keys
|
2019-03-14 18:13:21 +01:00
|
|
|
keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
|
2018-12-24 03:31:58 +01:00
|
|
|
|
|
|
|
if keys.public_key_file.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
|
|
|
|
t.Errorf("public key %q is not %q", keys.public_key_file.String(),
|
|
|
|
"vendor/foo/devkeys/testkey.avbpubkey")
|
|
|
|
}
|
|
|
|
if keys.private_key_file.String() != "vendor/foo/devkeys/testkey.pem" {
|
|
|
|
t.Errorf("private key %q is not %q", keys.private_key_file.String(),
|
|
|
|
"vendor/foo/devkeys/testkey.pem")
|
|
|
|
}
|
|
|
|
|
2019-02-11 03:38:15 +01:00
|
|
|
// check the APK certs. It should be overridden to myapex.certificate.override
|
2019-10-22 06:58:29 +02:00
|
|
|
certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
|
2019-02-11 03:38:15 +01:00
|
|
|
if certs != "testkey.override.x509.pem testkey.override.pk8" {
|
2018-12-24 03:31:58 +01:00
|
|
|
t.Errorf("cert and private key %q are not %q", certs,
|
2019-02-11 03:38:15 +01:00
|
|
|
"testkey.override.509.pem testkey.override.pk8")
|
2018-12-24 03:31:58 +01:00
|
|
|
}
|
|
|
|
}
|
2019-01-19 11:24:06 +01:00
|
|
|
|
|
|
|
func TestMacro(t *testing.T) {
|
2019-07-17 03:25:41 +02:00
|
|
|
ctx, _ := testApex(t, `
|
2019-01-19 11:24:06 +01:00
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
native_shared_libs: ["mylib"],
|
|
|
|
}
|
|
|
|
|
|
|
|
apex {
|
|
|
|
name: "otherapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
native_shared_libs: ["mylib"],
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "mylib",
|
|
|
|
srcs: ["mylib.cpp"],
|
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
|
|
|
}
|
|
|
|
`)
|
|
|
|
|
2019-10-30 00:29:25 +01:00
|
|
|
// non-APEX variant does not have __ANDROID_APEX(_NAME)__ defined
|
2019-11-21 01:39:12 +01:00
|
|
|
mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
|
2019-10-30 00:29:25 +01:00
|
|
|
ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
|
2019-10-18 09:26:16 +02:00
|
|
|
ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
|
|
|
|
ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
|
2019-01-19 11:24:06 +01:00
|
|
|
|
2019-10-30 00:29:25 +01:00
|
|
|
// APEX variant has __ANDROID_APEX(_NAME)__ defined
|
2019-11-21 01:39:12 +01:00
|
|
|
mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
|
2019-10-30 00:29:25 +01:00
|
|
|
ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
|
2019-10-18 09:26:16 +02:00
|
|
|
ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
|
|
|
|
ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
|
2019-01-19 11:24:06 +01:00
|
|
|
|
2019-10-30 00:29:25 +01:00
|
|
|
// APEX variant has __ANDROID_APEX(_NAME)__ defined
|
2019-11-21 01:39:12 +01:00
|
|
|
mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
|
2019-10-30 00:29:25 +01:00
|
|
|
ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
|
2019-10-18 09:26:16 +02:00
|
|
|
ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
|
|
|
|
ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
|
2019-01-19 11:24:06 +01:00
|
|
|
}
|
2019-01-28 08:16:54 +01:00
|
|
|
|
|
|
|
func TestHeaderLibsDependency(t *testing.T) {
|
2019-07-17 03:25:41 +02:00
|
|
|
ctx, _ := testApex(t, `
|
2019-01-28 08:16:54 +01:00
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
native_shared_libs: ["mylib"],
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library_headers {
|
|
|
|
name: "mylib_headers",
|
|
|
|
export_include_dirs: ["my_include"],
|
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "mylib",
|
|
|
|
srcs: ["mylib.cpp"],
|
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
|
|
|
header_libs: ["mylib_headers"],
|
|
|
|
export_header_lib_headers: ["mylib_headers"],
|
|
|
|
stubs: {
|
|
|
|
versions: ["1", "2", "3"],
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "otherlib",
|
|
|
|
srcs: ["mylib.cpp"],
|
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
|
|
|
shared_libs: ["mylib"],
|
|
|
|
}
|
|
|
|
`)
|
|
|
|
|
2019-11-21 01:39:12 +01:00
|
|
|
cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
|
2019-01-28 08:16:54 +01:00
|
|
|
|
|
|
|
// Ensure that the include path of the header lib is exported to 'otherlib'
|
|
|
|
ensureContains(t, cFlags, "-Imy_include")
|
|
|
|
}
|
2019-01-30 03:07:33 +01:00
|
|
|
|
2019-10-18 09:26:59 +02:00
|
|
|
func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName string, files []string) {
|
|
|
|
t.Helper()
|
2019-10-22 06:58:29 +02:00
|
|
|
apexRule := ctx.ModuleForTests(moduleName, "android_common_"+moduleName+"_image").Rule("apexRule")
|
2019-10-18 09:26:59 +02:00
|
|
|
copyCmds := apexRule.Args["copy_commands"]
|
|
|
|
imageApexDir := "/image.apex/"
|
2019-11-06 08:53:07 +01:00
|
|
|
var failed bool
|
|
|
|
var surplus []string
|
|
|
|
filesMatched := make(map[string]bool)
|
|
|
|
addContent := func(content string) {
|
|
|
|
for _, expected := range files {
|
|
|
|
if matched, _ := path.Match(expected, content); matched {
|
|
|
|
filesMatched[expected] = true
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
surplus = append(surplus, content)
|
|
|
|
}
|
2019-10-18 09:26:59 +02:00
|
|
|
for _, cmd := range strings.Split(copyCmds, "&&") {
|
|
|
|
cmd = strings.TrimSpace(cmd)
|
|
|
|
if cmd == "" {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
terms := strings.Split(cmd, " ")
|
|
|
|
switch terms[0] {
|
|
|
|
case "mkdir":
|
|
|
|
case "cp":
|
|
|
|
if len(terms) != 3 {
|
|
|
|
t.Fatal("copyCmds contains invalid cp command", cmd)
|
|
|
|
}
|
|
|
|
dst := terms[2]
|
|
|
|
index := strings.Index(dst, imageApexDir)
|
|
|
|
if index == -1 {
|
|
|
|
t.Fatal("copyCmds should copy a file to image.apex/", cmd)
|
|
|
|
}
|
|
|
|
dstFile := dst[index+len(imageApexDir):]
|
2019-11-06 08:53:07 +01:00
|
|
|
addContent(dstFile)
|
2019-10-18 09:26:59 +02:00
|
|
|
default:
|
|
|
|
t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(surplus) > 0 {
|
2019-11-06 08:53:07 +01:00
|
|
|
sort.Strings(surplus)
|
2019-10-18 09:26:59 +02:00
|
|
|
t.Log("surplus files", surplus)
|
|
|
|
failed = true
|
|
|
|
}
|
2019-11-06 08:53:07 +01:00
|
|
|
|
|
|
|
if len(files) > len(filesMatched) {
|
|
|
|
var missing []string
|
|
|
|
for _, expected := range files {
|
|
|
|
if !filesMatched[expected] {
|
|
|
|
missing = append(missing, expected)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
sort.Strings(missing)
|
2019-10-18 09:26:59 +02:00
|
|
|
t.Log("missing files", missing)
|
|
|
|
failed = true
|
|
|
|
}
|
|
|
|
if failed {
|
|
|
|
t.Fail()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-08-23 04:17:39 +02:00
|
|
|
func TestVndkApexCurrent(t *testing.T) {
|
|
|
|
ctx, _ := testApex(t, `
|
|
|
|
apex_vndk {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "libvndk",
|
|
|
|
srcs: ["mylib.cpp"],
|
|
|
|
vendor_available: true,
|
|
|
|
vndk: {
|
|
|
|
enabled: true,
|
|
|
|
},
|
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "libvndksp",
|
|
|
|
srcs: ["mylib.cpp"],
|
|
|
|
vendor_available: true,
|
|
|
|
vndk: {
|
|
|
|
enabled: true,
|
|
|
|
support_system_process: true,
|
|
|
|
},
|
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
|
|
|
}
|
2019-11-06 08:53:07 +01:00
|
|
|
`+vndkLibrariesTxtFiles("current"))
|
2019-08-23 04:17:39 +02:00
|
|
|
|
2019-10-18 09:26:59 +02:00
|
|
|
ensureExactContents(t, ctx, "myapex", []string{
|
|
|
|
"lib/libvndk.so",
|
|
|
|
"lib/libvndksp.so",
|
|
|
|
"lib64/libvndk.so",
|
|
|
|
"lib64/libvndksp.so",
|
2019-11-06 08:53:07 +01:00
|
|
|
"etc/llndk.libraries.VER.txt",
|
|
|
|
"etc/vndkcore.libraries.VER.txt",
|
|
|
|
"etc/vndksp.libraries.VER.txt",
|
|
|
|
"etc/vndkprivate.libraries.VER.txt",
|
|
|
|
"etc/vndkcorevariant.libraries.VER.txt",
|
2019-10-18 09:26:59 +02:00
|
|
|
})
|
2019-08-23 04:17:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestVndkApexWithPrebuilt(t *testing.T) {
|
|
|
|
ctx, _ := testApex(t, `
|
|
|
|
apex_vndk {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_prebuilt_library_shared {
|
2019-10-18 09:26:59 +02:00
|
|
|
name: "libvndk",
|
|
|
|
srcs: ["libvndk.so"],
|
|
|
|
vendor_available: true,
|
|
|
|
vndk: {
|
|
|
|
enabled: true,
|
|
|
|
},
|
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_prebuilt_library_shared {
|
|
|
|
name: "libvndk.arm",
|
|
|
|
srcs: ["libvndk.arm.so"],
|
2019-08-23 04:17:39 +02:00
|
|
|
vendor_available: true,
|
|
|
|
vndk: {
|
|
|
|
enabled: true,
|
|
|
|
},
|
2019-10-18 09:26:59 +02:00
|
|
|
enabled: false,
|
|
|
|
arch: {
|
|
|
|
arm: {
|
|
|
|
enabled: true,
|
|
|
|
},
|
|
|
|
},
|
2019-08-23 04:17:39 +02:00
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
|
|
|
}
|
2019-11-06 08:53:07 +01:00
|
|
|
`+vndkLibrariesTxtFiles("current"),
|
|
|
|
withFiles(map[string][]byte{
|
|
|
|
"libvndk.so": nil,
|
|
|
|
"libvndk.arm.so": nil,
|
|
|
|
}))
|
2019-08-23 04:17:39 +02:00
|
|
|
|
2019-10-18 09:26:59 +02:00
|
|
|
ensureExactContents(t, ctx, "myapex", []string{
|
|
|
|
"lib/libvndk.so",
|
|
|
|
"lib/libvndk.arm.so",
|
|
|
|
"lib64/libvndk.so",
|
2019-11-06 08:53:07 +01:00
|
|
|
"etc/*",
|
2019-10-18 09:26:59 +02:00
|
|
|
})
|
2019-08-23 04:17:39 +02:00
|
|
|
}
|
|
|
|
|
2019-11-06 08:53:07 +01:00
|
|
|
func vndkLibrariesTxtFiles(vers ...string) (result string) {
|
|
|
|
for _, v := range vers {
|
|
|
|
if v == "current" {
|
|
|
|
for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkcorevariant"} {
|
|
|
|
result += `
|
|
|
|
vndk_libraries_txt {
|
|
|
|
name: "` + txt + `.libraries.txt",
|
|
|
|
}
|
|
|
|
`
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate"} {
|
|
|
|
result += `
|
|
|
|
prebuilt_etc {
|
|
|
|
name: "` + txt + `.libraries.` + v + `.txt",
|
|
|
|
src: "dummy.txt",
|
|
|
|
}
|
|
|
|
`
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2019-08-23 04:17:39 +02:00
|
|
|
func TestVndkApexVersion(t *testing.T) {
|
|
|
|
ctx, _ := testApex(t, `
|
|
|
|
apex_vndk {
|
|
|
|
name: "myapex_v27",
|
|
|
|
key: "myapex.key",
|
2019-11-19 18:26:02 +01:00
|
|
|
file_contexts: ":myapex-file_contexts",
|
2019-08-23 04:17:39 +02:00
|
|
|
vndk_version: "27",
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
|
2019-10-18 09:26:59 +02:00
|
|
|
vndk_prebuilt_shared {
|
|
|
|
name: "libvndk27",
|
|
|
|
version: "27",
|
2019-08-23 04:17:39 +02:00
|
|
|
vendor_available: true,
|
|
|
|
vndk: {
|
|
|
|
enabled: true,
|
|
|
|
},
|
2019-10-18 09:26:59 +02:00
|
|
|
target_arch: "arm64",
|
|
|
|
arch: {
|
|
|
|
arm: {
|
|
|
|
srcs: ["libvndk27_arm.so"],
|
|
|
|
},
|
|
|
|
arm64: {
|
|
|
|
srcs: ["libvndk27_arm64.so"],
|
|
|
|
},
|
|
|
|
},
|
2019-08-23 04:17:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
vndk_prebuilt_shared {
|
|
|
|
name: "libvndk27",
|
|
|
|
version: "27",
|
|
|
|
vendor_available: true,
|
|
|
|
vndk: {
|
|
|
|
enabled: true,
|
|
|
|
},
|
2019-10-18 09:26:59 +02:00
|
|
|
target_arch: "x86_64",
|
|
|
|
arch: {
|
|
|
|
x86: {
|
|
|
|
srcs: ["libvndk27_x86.so"],
|
|
|
|
},
|
|
|
|
x86_64: {
|
|
|
|
srcs: ["libvndk27_x86_64.so"],
|
|
|
|
},
|
|
|
|
},
|
2019-11-06 08:53:07 +01:00
|
|
|
}
|
|
|
|
`+vndkLibrariesTxtFiles("27"),
|
|
|
|
withFiles(map[string][]byte{
|
|
|
|
"libvndk27_arm.so": nil,
|
|
|
|
"libvndk27_arm64.so": nil,
|
|
|
|
"libvndk27_x86.so": nil,
|
|
|
|
"libvndk27_x86_64.so": nil,
|
|
|
|
}))
|
2019-08-23 04:17:39 +02:00
|
|
|
|
2019-10-18 09:26:59 +02:00
|
|
|
ensureExactContents(t, ctx, "myapex_v27", []string{
|
|
|
|
"lib/libvndk27_arm.so",
|
|
|
|
"lib64/libvndk27_arm64.so",
|
2019-11-06 08:53:07 +01:00
|
|
|
"etc/*",
|
2019-10-18 09:26:59 +02:00
|
|
|
})
|
2019-08-23 04:17:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestVndkApexErrorWithDuplicateVersion(t *testing.T) {
|
|
|
|
testApexError(t, `module "myapex_v27.*" .*: vndk_version: 27 is already defined in "myapex_v27.*"`, `
|
|
|
|
apex_vndk {
|
|
|
|
name: "myapex_v27",
|
|
|
|
key: "myapex.key",
|
2019-11-19 18:26:02 +01:00
|
|
|
file_contexts: ":myapex-file_contexts",
|
2019-08-23 04:17:39 +02:00
|
|
|
vndk_version: "27",
|
|
|
|
}
|
|
|
|
apex_vndk {
|
|
|
|
name: "myapex_v27_other",
|
|
|
|
key: "myapex.key",
|
2019-11-19 18:26:02 +01:00
|
|
|
file_contexts: ":myapex-file_contexts",
|
2019-08-23 04:17:39 +02:00
|
|
|
vndk_version: "27",
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "libvndk",
|
|
|
|
srcs: ["mylib.cpp"],
|
|
|
|
vendor_available: true,
|
|
|
|
vndk: {
|
|
|
|
enabled: true,
|
|
|
|
},
|
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
|
|
|
}
|
|
|
|
|
|
|
|
vndk_prebuilt_shared {
|
|
|
|
name: "libvndk",
|
|
|
|
version: "27",
|
|
|
|
vendor_available: true,
|
|
|
|
vndk: {
|
|
|
|
enabled: true,
|
|
|
|
},
|
|
|
|
srcs: ["libvndk.so"],
|
|
|
|
}
|
|
|
|
`, withFiles(map[string][]byte{
|
|
|
|
"libvndk.so": nil,
|
|
|
|
}))
|
|
|
|
}
|
|
|
|
|
2019-10-01 13:02:42 +02:00
|
|
|
func TestVndkApexNameRule(t *testing.T) {
|
|
|
|
ctx, _ := testApex(t, `
|
|
|
|
apex_vndk {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
2019-11-19 18:26:02 +01:00
|
|
|
file_contexts: ":myapex-file_contexts",
|
2019-10-01 13:02:42 +02:00
|
|
|
}
|
|
|
|
apex_vndk {
|
|
|
|
name: "myapex_v28",
|
|
|
|
key: "myapex.key",
|
2019-11-19 18:26:02 +01:00
|
|
|
file_contexts: ":myapex-file_contexts",
|
2019-10-01 13:02:42 +02:00
|
|
|
vndk_version: "28",
|
|
|
|
}
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
2019-11-06 08:53:07 +01:00
|
|
|
}`+vndkLibrariesTxtFiles("28", "current"))
|
2019-10-01 13:02:42 +02:00
|
|
|
|
|
|
|
assertApexName := func(expected, moduleName string) {
|
2019-10-22 06:58:29 +02:00
|
|
|
bundle := ctx.ModuleForTests(moduleName, "android_common_"+moduleName+"_image").Module().(*apexBundle)
|
2019-10-01 13:02:42 +02:00
|
|
|
actual := proptools.String(bundle.properties.Apex_name)
|
|
|
|
if !reflect.DeepEqual(actual, expected) {
|
|
|
|
t.Errorf("Got '%v', expected '%v'", actual, expected)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
assertApexName("com.android.vndk.vVER", "myapex")
|
|
|
|
assertApexName("com.android.vndk.v28", "myapex_v28")
|
|
|
|
}
|
|
|
|
|
2019-08-23 04:17:39 +02:00
|
|
|
func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
|
|
|
|
ctx, _ := testApex(t, `
|
|
|
|
apex_vndk {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
2019-11-19 18:26:02 +01:00
|
|
|
file_contexts: ":myapex-file_contexts",
|
2019-08-23 04:17:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "libvndk",
|
|
|
|
srcs: ["mylib.cpp"],
|
|
|
|
vendor_available: true,
|
|
|
|
native_bridge_supported: true,
|
|
|
|
host_supported: true,
|
|
|
|
vndk: {
|
|
|
|
enabled: true,
|
|
|
|
},
|
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
|
|
|
}
|
2019-11-06 08:53:07 +01:00
|
|
|
`+vndkLibrariesTxtFiles("current"),
|
|
|
|
withTargets(map[android.OsType][]android.Target{
|
|
|
|
android.Android: []android.Target{
|
|
|
|
{Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
|
|
|
|
{Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}, NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
|
|
|
|
{Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "arm64", NativeBridgeRelativePath: "x86_64"},
|
|
|
|
{Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}}, NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "arm", NativeBridgeRelativePath: "x86"},
|
|
|
|
},
|
|
|
|
}))
|
2019-08-23 04:17:39 +02:00
|
|
|
|
2019-10-18 09:26:59 +02:00
|
|
|
ensureExactContents(t, ctx, "myapex", []string{
|
|
|
|
"lib/libvndk.so",
|
|
|
|
"lib64/libvndk.so",
|
2019-11-06 08:53:07 +01:00
|
|
|
"etc/*",
|
2019-10-18 09:26:59 +02:00
|
|
|
})
|
2019-08-23 04:17:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
|
|
|
|
testApexError(t, `module "myapex" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
|
|
|
|
apex_vndk {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
2019-11-19 18:26:02 +01:00
|
|
|
file_contexts: ":myapex-file_contexts",
|
2019-08-23 04:17:39 +02:00
|
|
|
native_bridge_supported: true,
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "libvndk",
|
|
|
|
srcs: ["mylib.cpp"],
|
|
|
|
vendor_available: true,
|
|
|
|
native_bridge_supported: true,
|
|
|
|
host_supported: true,
|
|
|
|
vndk: {
|
|
|
|
enabled: true,
|
|
|
|
},
|
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
|
|
|
}
|
|
|
|
`)
|
|
|
|
}
|
|
|
|
|
2019-10-18 09:26:59 +02:00
|
|
|
func TestVndkApexWithBinder32(t *testing.T) {
|
2019-11-06 08:53:07 +01:00
|
|
|
ctx, _ := testApex(t, `
|
2019-10-18 09:26:59 +02:00
|
|
|
apex_vndk {
|
|
|
|
name: "myapex_v27",
|
|
|
|
key: "myapex.key",
|
2019-11-19 18:26:02 +01:00
|
|
|
file_contexts: ":myapex-file_contexts",
|
2019-10-18 09:26:59 +02:00
|
|
|
vndk_version: "27",
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
|
|
|
|
vndk_prebuilt_shared {
|
|
|
|
name: "libvndk27",
|
|
|
|
version: "27",
|
|
|
|
target_arch: "arm",
|
|
|
|
vendor_available: true,
|
|
|
|
vndk: {
|
|
|
|
enabled: true,
|
|
|
|
},
|
|
|
|
arch: {
|
|
|
|
arm: {
|
|
|
|
srcs: ["libvndk27.so"],
|
|
|
|
}
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
vndk_prebuilt_shared {
|
|
|
|
name: "libvndk27",
|
|
|
|
version: "27",
|
|
|
|
target_arch: "arm",
|
|
|
|
binder32bit: true,
|
|
|
|
vendor_available: true,
|
|
|
|
vndk: {
|
|
|
|
enabled: true,
|
|
|
|
},
|
|
|
|
arch: {
|
|
|
|
arm: {
|
|
|
|
srcs: ["libvndk27binder32.so"],
|
|
|
|
}
|
|
|
|
},
|
|
|
|
}
|
2019-11-06 08:53:07 +01:00
|
|
|
`+vndkLibrariesTxtFiles("27"),
|
2019-10-18 09:26:59 +02:00
|
|
|
withFiles(map[string][]byte{
|
|
|
|
"libvndk27.so": nil,
|
|
|
|
"libvndk27binder32.so": nil,
|
|
|
|
}),
|
|
|
|
withBinder32bit,
|
|
|
|
withTargets(map[android.OsType][]android.Target{
|
|
|
|
android.Android: []android.Target{
|
|
|
|
{Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}, NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
|
|
|
|
},
|
|
|
|
}),
|
|
|
|
)
|
|
|
|
|
|
|
|
ensureExactContents(t, ctx, "myapex_v27", []string{
|
|
|
|
"lib/libvndk27binder32.so",
|
2019-11-06 08:53:07 +01:00
|
|
|
"etc/*",
|
2019-10-18 09:26:59 +02:00
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2019-08-01 10:41:43 +02:00
|
|
|
func TestDependenciesInApexManifest(t *testing.T) {
|
|
|
|
ctx, _ := testApex(t, `
|
|
|
|
apex {
|
|
|
|
name: "myapex_nodep",
|
|
|
|
key: "myapex.key",
|
|
|
|
native_shared_libs: ["lib_nodep"],
|
|
|
|
compile_multilib: "both",
|
2019-11-19 18:26:02 +01:00
|
|
|
file_contexts: ":myapex-file_contexts",
|
2019-08-01 10:41:43 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
apex {
|
|
|
|
name: "myapex_dep",
|
|
|
|
key: "myapex.key",
|
|
|
|
native_shared_libs: ["lib_dep"],
|
|
|
|
compile_multilib: "both",
|
2019-11-19 18:26:02 +01:00
|
|
|
file_contexts: ":myapex-file_contexts",
|
2019-08-01 10:41:43 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
apex {
|
|
|
|
name: "myapex_provider",
|
|
|
|
key: "myapex.key",
|
|
|
|
native_shared_libs: ["libfoo"],
|
|
|
|
compile_multilib: "both",
|
2019-11-19 18:26:02 +01:00
|
|
|
file_contexts: ":myapex-file_contexts",
|
2019-08-01 10:41:43 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
apex {
|
|
|
|
name: "myapex_selfcontained",
|
|
|
|
key: "myapex.key",
|
|
|
|
native_shared_libs: ["lib_dep", "libfoo"],
|
|
|
|
compile_multilib: "both",
|
2019-11-19 18:26:02 +01:00
|
|
|
file_contexts: ":myapex-file_contexts",
|
2019-08-01 10:41:43 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "lib_nodep",
|
|
|
|
srcs: ["mylib.cpp"],
|
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "lib_dep",
|
|
|
|
srcs: ["mylib.cpp"],
|
|
|
|
shared_libs: ["libfoo"],
|
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "libfoo",
|
|
|
|
srcs: ["mytest.cpp"],
|
|
|
|
stubs: {
|
|
|
|
versions: ["1"],
|
|
|
|
},
|
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
|
|
|
}
|
|
|
|
`)
|
|
|
|
|
2019-09-26 17:38:03 +02:00
|
|
|
var apexManifestRule android.TestingBuildParams
|
2019-08-01 10:41:43 +02:00
|
|
|
var provideNativeLibs, requireNativeLibs []string
|
|
|
|
|
2019-10-22 06:58:29 +02:00
|
|
|
apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
|
2019-09-26 17:38:03 +02:00
|
|
|
provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
|
|
|
|
requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
|
2019-08-01 10:41:43 +02:00
|
|
|
ensureListEmpty(t, provideNativeLibs)
|
|
|
|
ensureListEmpty(t, requireNativeLibs)
|
|
|
|
|
2019-10-22 06:58:29 +02:00
|
|
|
apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
|
2019-09-26 17:38:03 +02:00
|
|
|
provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
|
|
|
|
requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
|
2019-08-01 10:41:43 +02:00
|
|
|
ensureListEmpty(t, provideNativeLibs)
|
|
|
|
ensureListContains(t, requireNativeLibs, "libfoo.so")
|
|
|
|
|
2019-10-22 06:58:29 +02:00
|
|
|
apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
|
2019-09-26 17:38:03 +02:00
|
|
|
provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
|
|
|
|
requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
|
2019-08-01 10:41:43 +02:00
|
|
|
ensureListContains(t, provideNativeLibs, "libfoo.so")
|
|
|
|
ensureListEmpty(t, requireNativeLibs)
|
|
|
|
|
2019-10-22 06:58:29 +02:00
|
|
|
apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
|
2019-09-26 17:38:03 +02:00
|
|
|
provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
|
|
|
|
requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
|
2019-08-01 10:41:43 +02:00
|
|
|
ensureListContains(t, provideNativeLibs, "libfoo.so")
|
|
|
|
ensureListEmpty(t, requireNativeLibs)
|
|
|
|
}
|
|
|
|
|
2019-09-26 17:38:03 +02:00
|
|
|
func TestApexName(t *testing.T) {
|
|
|
|
ctx, _ := testApex(t, `
|
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
apex_name: "com.android.myapex",
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
`)
|
|
|
|
|
2019-10-22 06:58:29 +02:00
|
|
|
module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
|
2019-09-26 17:38:03 +02:00
|
|
|
apexManifestRule := module.Rule("apexManifestRule")
|
|
|
|
ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
|
|
|
|
apexRule := module.Rule("apexRule")
|
|
|
|
ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
|
|
|
|
}
|
|
|
|
|
2019-02-07 22:20:53 +01:00
|
|
|
func TestNonTestApex(t *testing.T) {
|
2019-07-17 03:25:41 +02:00
|
|
|
ctx, _ := testApex(t, `
|
2019-02-07 22:20:53 +01:00
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
native_shared_libs: ["mylib_common"],
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "mylib_common",
|
|
|
|
srcs: ["mylib.cpp"],
|
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
|
|
|
}
|
|
|
|
`)
|
|
|
|
|
2019-10-22 06:58:29 +02:00
|
|
|
module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
|
2019-02-07 22:20:53 +01:00
|
|
|
apexRule := module.Rule("apexRule")
|
|
|
|
copyCmds := apexRule.Args["copy_commands"]
|
|
|
|
|
|
|
|
if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
|
|
|
|
t.Log("Apex was a test apex!")
|
|
|
|
t.Fail()
|
|
|
|
}
|
|
|
|
// Ensure that main rule creates an output
|
|
|
|
ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
|
|
|
|
|
|
|
|
// Ensure that apex variant is created for the direct dep
|
2019-11-21 01:39:12 +01:00
|
|
|
ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_myapex")
|
2019-02-07 22:20:53 +01:00
|
|
|
|
|
|
|
// Ensure that both direct and indirect deps are copied into apex
|
|
|
|
ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
|
|
|
|
|
2019-11-21 01:39:12 +01:00
|
|
|
// Ensure that the platform variant ends with _shared
|
|
|
|
ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
|
2019-02-07 22:20:53 +01:00
|
|
|
|
|
|
|
if !android.InAnyApex("mylib_common") {
|
|
|
|
t.Log("Found mylib_common not in any apex!")
|
|
|
|
t.Fail()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestTestApex(t *testing.T) {
|
|
|
|
if android.InAnyApex("mylib_common_test") {
|
|
|
|
t.Fatal("mylib_common_test must not be used in any other tests since this checks that global state is not updated in an illegal way!")
|
|
|
|
}
|
2019-07-17 03:25:41 +02:00
|
|
|
ctx, _ := testApex(t, `
|
2019-02-07 22:20:53 +01:00
|
|
|
apex_test {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
native_shared_libs: ["mylib_common_test"],
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "mylib_common_test",
|
|
|
|
srcs: ["mylib.cpp"],
|
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
|
|
|
}
|
|
|
|
`)
|
|
|
|
|
2019-10-22 06:58:29 +02:00
|
|
|
module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
|
2019-02-07 22:20:53 +01:00
|
|
|
apexRule := module.Rule("apexRule")
|
|
|
|
copyCmds := apexRule.Args["copy_commands"]
|
|
|
|
|
|
|
|
if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
|
|
|
|
t.Log("Apex was not a test apex!")
|
|
|
|
t.Fail()
|
|
|
|
}
|
|
|
|
// Ensure that main rule creates an output
|
|
|
|
ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
|
|
|
|
|
|
|
|
// Ensure that apex variant is created for the direct dep
|
2019-11-21 01:39:12 +01:00
|
|
|
ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_myapex")
|
2019-02-07 22:20:53 +01:00
|
|
|
|
|
|
|
// Ensure that both direct and indirect deps are copied into apex
|
|
|
|
ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
|
|
|
|
|
2019-11-21 01:39:12 +01:00
|
|
|
// Ensure that the platform variant ends with _shared
|
|
|
|
ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
|
2019-02-07 22:20:53 +01:00
|
|
|
|
|
|
|
if android.InAnyApex("mylib_common_test") {
|
|
|
|
t.Log("Found mylib_common_test in some apex!")
|
|
|
|
t.Fail()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-01-30 03:07:33 +01:00
|
|
|
func TestApexWithTarget(t *testing.T) {
|
2019-07-17 03:25:41 +02:00
|
|
|
ctx, _ := testApex(t, `
|
2019-01-30 03:07:33 +01:00
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
multilib: {
|
|
|
|
first: {
|
|
|
|
native_shared_libs: ["mylib_common"],
|
|
|
|
}
|
|
|
|
},
|
|
|
|
target: {
|
|
|
|
android: {
|
|
|
|
multilib: {
|
|
|
|
first: {
|
|
|
|
native_shared_libs: ["mylib"],
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
host: {
|
|
|
|
multilib: {
|
|
|
|
first: {
|
|
|
|
native_shared_libs: ["mylib2"],
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "mylib",
|
|
|
|
srcs: ["mylib.cpp"],
|
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "mylib_common",
|
|
|
|
srcs: ["mylib.cpp"],
|
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
|
|
|
compile_multilib: "first",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "mylib2",
|
|
|
|
srcs: ["mylib.cpp"],
|
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
|
|
|
compile_multilib: "first",
|
|
|
|
}
|
|
|
|
`)
|
|
|
|
|
2019-10-22 06:58:29 +02:00
|
|
|
apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
|
2019-01-30 03:07:33 +01:00
|
|
|
copyCmds := apexRule.Args["copy_commands"]
|
|
|
|
|
|
|
|
// Ensure that main rule creates an output
|
|
|
|
ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
|
|
|
|
|
|
|
|
// Ensure that apex variant is created for the direct dep
|
2019-11-21 01:39:12 +01:00
|
|
|
ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
|
|
|
|
ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_myapex")
|
|
|
|
ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_myapex")
|
2019-01-30 03:07:33 +01:00
|
|
|
|
|
|
|
// Ensure that both direct and indirect deps are copied into apex
|
|
|
|
ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
|
|
|
|
ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
|
|
|
|
ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
|
|
|
|
|
2019-11-21 01:39:12 +01:00
|
|
|
// Ensure that the platform variant ends with _shared
|
|
|
|
ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
|
|
|
|
ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
|
|
|
|
ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
|
2019-01-30 03:07:33 +01:00
|
|
|
}
|
2019-02-05 16:16:29 +01:00
|
|
|
|
|
|
|
func TestApexWithShBinary(t *testing.T) {
|
2019-07-17 03:25:41 +02:00
|
|
|
ctx, _ := testApex(t, `
|
2019-02-05 16:16:29 +01:00
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
binaries: ["myscript"],
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
|
|
|
|
sh_binary {
|
|
|
|
name: "myscript",
|
|
|
|
src: "mylib.cpp",
|
|
|
|
filename: "myscript.sh",
|
|
|
|
sub_dir: "script",
|
|
|
|
}
|
|
|
|
`)
|
|
|
|
|
2019-10-22 06:58:29 +02:00
|
|
|
apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
|
2019-02-05 16:16:29 +01:00
|
|
|
copyCmds := apexRule.Args["copy_commands"]
|
|
|
|
|
|
|
|
ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
|
|
|
|
}
|
2019-03-14 18:13:21 +01:00
|
|
|
|
2019-11-19 17:49:42 +01:00
|
|
|
func TestApexInVariousPartition(t *testing.T) {
|
|
|
|
testcases := []struct {
|
|
|
|
propName, parition, flattenedPartition string
|
|
|
|
}{
|
|
|
|
{"", "system", "system_ext"},
|
|
|
|
{"product_specific: true", "product", "product"},
|
|
|
|
{"soc_specific: true", "vendor", "vendor"},
|
|
|
|
{"proprietary: true", "vendor", "vendor"},
|
|
|
|
{"vendor: true", "vendor", "vendor"},
|
|
|
|
{"system_ext_specific: true", "system_ext", "system_ext"},
|
|
|
|
}
|
|
|
|
for _, tc := range testcases {
|
|
|
|
t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
|
|
|
|
ctx, _ := testApex(t, `
|
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
`+tc.propName+`
|
|
|
|
}
|
2019-03-14 18:13:21 +01:00
|
|
|
|
2019-11-19 17:49:42 +01:00
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
`)
|
2019-03-14 18:13:21 +01:00
|
|
|
|
2019-11-19 17:49:42 +01:00
|
|
|
apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
|
|
|
|
expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
|
|
|
|
actual := apex.installDir.String()
|
|
|
|
if actual != expected {
|
|
|
|
t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
|
|
|
|
}
|
2019-03-14 18:13:21 +01:00
|
|
|
|
2019-11-19 17:49:42 +01:00
|
|
|
flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
|
|
|
|
expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
|
|
|
|
actual = flattened.installDir.String()
|
|
|
|
if actual != expected {
|
|
|
|
t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
|
|
|
|
}
|
|
|
|
})
|
2019-03-14 18:13:21 +01:00
|
|
|
}
|
|
|
|
}
|
2019-03-20 17:11:21 +01:00
|
|
|
|
2019-11-19 18:26:02 +01:00
|
|
|
func TestFileContexts(t *testing.T) {
|
|
|
|
ctx, _ := testApex(t, `
|
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
`)
|
|
|
|
module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
|
|
|
|
apexRule := module.Rule("apexRule")
|
|
|
|
actual := apexRule.Args["file_contexts"]
|
|
|
|
expected := "system/sepolicy/apex/myapex-file_contexts"
|
|
|
|
if actual != expected {
|
|
|
|
t.Errorf("wrong file_contexts. expected %q. actual %q", expected, actual)
|
|
|
|
}
|
|
|
|
|
|
|
|
testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
|
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
file_contexts: "my_own_file_contexts",
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
`, withFiles(map[string][]byte{
|
|
|
|
"my_own_file_contexts": nil,
|
|
|
|
}))
|
|
|
|
|
|
|
|
testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
|
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
product_specific: true,
|
|
|
|
file_contexts: "product_specific_file_contexts",
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
`)
|
|
|
|
|
|
|
|
ctx, _ = testApex(t, `
|
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
product_specific: true,
|
|
|
|
file_contexts: "product_specific_file_contexts",
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
`, withFiles(map[string][]byte{
|
|
|
|
"product_specific_file_contexts": nil,
|
|
|
|
}))
|
|
|
|
module = ctx.ModuleForTests("myapex", "android_common_myapex_image")
|
|
|
|
apexRule = module.Rule("apexRule")
|
|
|
|
actual = apexRule.Args["file_contexts"]
|
|
|
|
expected = "product_specific_file_contexts"
|
|
|
|
if actual != expected {
|
|
|
|
t.Errorf("wrong file_contexts. expected %q. actual %q", expected, actual)
|
|
|
|
}
|
|
|
|
|
|
|
|
ctx, _ = testApex(t, `
|
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
product_specific: true,
|
|
|
|
file_contexts: ":my-file-contexts",
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
|
|
|
|
filegroup {
|
|
|
|
name: "my-file-contexts",
|
|
|
|
srcs: ["product_specific_file_contexts"],
|
|
|
|
}
|
|
|
|
`, withFiles(map[string][]byte{
|
|
|
|
"product_specific_file_contexts": nil,
|
|
|
|
}))
|
|
|
|
module = ctx.ModuleForTests("myapex", "android_common_myapex_image")
|
|
|
|
apexRule = module.Rule("apexRule")
|
|
|
|
actual = apexRule.Args["file_contexts"]
|
|
|
|
expected = "product_specific_file_contexts"
|
|
|
|
if actual != expected {
|
|
|
|
t.Errorf("wrong file_contexts. expected %q. actual %q", expected, actual)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-03-20 17:11:21 +01:00
|
|
|
func TestApexKeyFromOtherModule(t *testing.T) {
|
2019-07-17 03:25:41 +02:00
|
|
|
ctx, _ := testApex(t, `
|
2019-03-20 17:11:21 +01:00
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: ":my.avbpubkey",
|
|
|
|
private_key: ":my.pem",
|
|
|
|
product_specific: true,
|
|
|
|
}
|
|
|
|
|
|
|
|
filegroup {
|
|
|
|
name: "my.avbpubkey",
|
|
|
|
srcs: ["testkey2.avbpubkey"],
|
|
|
|
}
|
|
|
|
|
|
|
|
filegroup {
|
|
|
|
name: "my.pem",
|
|
|
|
srcs: ["testkey2.pem"],
|
|
|
|
}
|
|
|
|
`)
|
|
|
|
|
|
|
|
apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
|
|
|
|
expected_pubkey := "testkey2.avbpubkey"
|
|
|
|
actual_pubkey := apex_key.public_key_file.String()
|
|
|
|
if actual_pubkey != expected_pubkey {
|
|
|
|
t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
|
|
|
|
}
|
|
|
|
expected_privkey := "testkey2.pem"
|
|
|
|
actual_privkey := apex_key.private_key_file.String()
|
|
|
|
if actual_privkey != expected_privkey {
|
|
|
|
t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
|
|
|
|
}
|
|
|
|
}
|
2019-03-26 23:07:36 +01:00
|
|
|
|
|
|
|
func TestPrebuilt(t *testing.T) {
|
2019-07-17 03:25:41 +02:00
|
|
|
ctx, _ := testApex(t, `
|
2019-03-26 23:07:36 +01:00
|
|
|
prebuilt_apex {
|
|
|
|
name: "myapex",
|
2019-03-29 06:23:10 +01:00
|
|
|
arch: {
|
|
|
|
arm64: {
|
|
|
|
src: "myapex-arm64.apex",
|
|
|
|
},
|
|
|
|
arm: {
|
|
|
|
src: "myapex-arm.apex",
|
|
|
|
},
|
|
|
|
},
|
2019-03-26 23:07:36 +01:00
|
|
|
}
|
|
|
|
`)
|
|
|
|
|
|
|
|
prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
|
|
|
|
|
2019-03-29 06:23:10 +01:00
|
|
|
expectedInput := "myapex-arm64.apex"
|
|
|
|
if prebuilt.inputApex.String() != expectedInput {
|
|
|
|
t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
|
|
|
|
}
|
2019-03-26 23:07:36 +01:00
|
|
|
}
|
2019-04-04 19:09:48 +02:00
|
|
|
|
|
|
|
func TestPrebuiltFilenameOverride(t *testing.T) {
|
2019-07-17 03:25:41 +02:00
|
|
|
ctx, _ := testApex(t, `
|
2019-04-04 19:09:48 +02:00
|
|
|
prebuilt_apex {
|
|
|
|
name: "myapex",
|
|
|
|
src: "myapex-arm.apex",
|
|
|
|
filename: "notmyapex.apex",
|
|
|
|
}
|
|
|
|
`)
|
|
|
|
|
|
|
|
p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
|
|
|
|
|
|
|
|
expected := "notmyapex.apex"
|
|
|
|
if p.installFilename != expected {
|
|
|
|
t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
|
|
|
|
}
|
|
|
|
}
|
2019-06-25 20:20:53 +02:00
|
|
|
|
2019-07-17 03:25:41 +02:00
|
|
|
func TestPrebuiltOverrides(t *testing.T) {
|
|
|
|
ctx, config := testApex(t, `
|
|
|
|
prebuilt_apex {
|
|
|
|
name: "myapex.prebuilt",
|
|
|
|
src: "myapex-arm.apex",
|
|
|
|
overrides: [
|
|
|
|
"myapex",
|
|
|
|
],
|
|
|
|
}
|
|
|
|
`)
|
|
|
|
|
|
|
|
p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
|
|
|
|
|
|
|
|
expected := []string{"myapex"}
|
2019-12-03 05:24:29 +01:00
|
|
|
actual := android.AndroidMkEntriesForTest(t, config, "", p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
|
2019-07-17 03:25:41 +02:00
|
|
|
if !reflect.DeepEqual(actual, expected) {
|
2019-11-14 09:17:03 +01:00
|
|
|
t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
|
2019-07-17 03:25:41 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-06-26 13:48:34 +02:00
|
|
|
func TestApexWithTests(t *testing.T) {
|
2019-07-29 17:22:59 +02:00
|
|
|
ctx, config := testApex(t, `
|
2019-06-26 13:48:34 +02:00
|
|
|
apex_test {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
tests: [
|
|
|
|
"mytest",
|
2019-06-28 16:41:19 +02:00
|
|
|
"mytests",
|
2019-06-26 13:48:34 +02:00
|
|
|
],
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_test {
|
|
|
|
name: "mytest",
|
|
|
|
gtest: false,
|
|
|
|
srcs: ["mytest.cpp"],
|
|
|
|
relative_install_path: "test",
|
|
|
|
system_shared_libs: [],
|
|
|
|
static_executable: true,
|
|
|
|
stl: "none",
|
|
|
|
}
|
2019-06-28 16:41:19 +02:00
|
|
|
|
|
|
|
cc_test {
|
|
|
|
name: "mytests",
|
|
|
|
gtest: false,
|
|
|
|
srcs: [
|
|
|
|
"mytest1.cpp",
|
|
|
|
"mytest2.cpp",
|
|
|
|
"mytest3.cpp",
|
|
|
|
],
|
|
|
|
test_per_src: true,
|
|
|
|
relative_install_path: "test",
|
|
|
|
system_shared_libs: [],
|
|
|
|
static_executable: true,
|
|
|
|
stl: "none",
|
|
|
|
}
|
2019-06-26 13:48:34 +02:00
|
|
|
`)
|
|
|
|
|
2019-10-22 06:58:29 +02:00
|
|
|
apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
|
2019-06-26 13:48:34 +02:00
|
|
|
copyCmds := apexRule.Args["copy_commands"]
|
|
|
|
|
|
|
|
// Ensure that test dep is copied into apex.
|
|
|
|
ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
|
2019-06-28 16:41:19 +02:00
|
|
|
|
|
|
|
// Ensure that test deps built with `test_per_src` are copied into apex.
|
|
|
|
ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
|
|
|
|
ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
|
|
|
|
ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
|
2019-07-29 17:22:59 +02:00
|
|
|
|
|
|
|
// Ensure the module is correctly translated.
|
2019-10-22 06:58:29 +02:00
|
|
|
apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
|
2019-07-29 17:22:59 +02:00
|
|
|
data := android.AndroidMkDataForTest(t, config, "", apexBundle)
|
|
|
|
name := apexBundle.BaseModuleName()
|
|
|
|
prefix := "TARGET_"
|
|
|
|
var builder strings.Builder
|
|
|
|
data.Custom(&builder, name, prefix, "", data)
|
|
|
|
androidMk := builder.String()
|
2019-10-18 09:26:59 +02:00
|
|
|
ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
|
|
|
|
ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
|
|
|
|
ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
|
|
|
|
ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
|
2019-11-12 05:03:50 +01:00
|
|
|
ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
|
2019-10-18 09:26:59 +02:00
|
|
|
ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
|
2019-07-29 17:22:59 +02:00
|
|
|
ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
|
2019-06-26 13:48:34 +02:00
|
|
|
}
|
|
|
|
|
2019-12-05 08:27:44 +01:00
|
|
|
func TestInstallExtraFlattenedApexes(t *testing.T) {
|
|
|
|
ctx, config := testApex(t, `
|
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
}
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
`, func(fs map[string][]byte, config android.Config) {
|
|
|
|
config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
|
|
|
|
})
|
|
|
|
ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
|
|
|
|
ensureListContains(t, ab.externalDeps, "myapex.flattened")
|
|
|
|
mk := android.AndroidMkDataForTest(t, config, "", ab)
|
|
|
|
var builder strings.Builder
|
|
|
|
mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
|
|
|
|
androidMk := builder.String()
|
|
|
|
ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
|
|
|
|
}
|
|
|
|
|
2019-06-27 04:30:33 +02:00
|
|
|
func TestApexUsesOtherApex(t *testing.T) {
|
2019-07-17 03:25:41 +02:00
|
|
|
ctx, _ := testApex(t, `
|
2019-06-27 04:30:33 +02:00
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
native_shared_libs: ["mylib"],
|
|
|
|
uses: ["commonapex"],
|
|
|
|
}
|
|
|
|
|
|
|
|
apex {
|
|
|
|
name: "commonapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
native_shared_libs: ["libcommon"],
|
|
|
|
provide_cpp_shared_libs: true,
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "mylib",
|
|
|
|
srcs: ["mylib.cpp"],
|
|
|
|
shared_libs: ["libcommon"],
|
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "libcommon",
|
|
|
|
srcs: ["mylib_common.cpp"],
|
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
|
|
|
}
|
|
|
|
`)
|
|
|
|
|
2019-10-22 06:58:29 +02:00
|
|
|
module1 := ctx.ModuleForTests("myapex", "android_common_myapex_image")
|
2019-06-27 04:30:33 +02:00
|
|
|
apexRule1 := module1.Rule("apexRule")
|
|
|
|
copyCmds1 := apexRule1.Args["copy_commands"]
|
|
|
|
|
2019-10-22 06:58:29 +02:00
|
|
|
module2 := ctx.ModuleForTests("commonapex", "android_common_commonapex_image")
|
2019-06-27 04:30:33 +02:00
|
|
|
apexRule2 := module2.Rule("apexRule")
|
|
|
|
copyCmds2 := apexRule2.Args["copy_commands"]
|
|
|
|
|
2019-11-21 01:39:12 +01:00
|
|
|
ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_myapex")
|
|
|
|
ensureListContains(t, ctx.ModuleVariantsForTests("libcommon"), "android_arm64_armv8-a_shared_commonapex")
|
2019-06-27 04:30:33 +02:00
|
|
|
ensureContains(t, copyCmds1, "image.apex/lib64/mylib.so")
|
|
|
|
ensureContains(t, copyCmds2, "image.apex/lib64/libcommon.so")
|
|
|
|
ensureNotContains(t, copyCmds1, "image.apex/lib64/libcommon.so")
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestApexUsesFailsIfNotProvided(t *testing.T) {
|
|
|
|
testApexError(t, `uses: "commonapex" does not provide native_shared_libs`, `
|
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
uses: ["commonapex"],
|
|
|
|
}
|
|
|
|
|
|
|
|
apex {
|
|
|
|
name: "commonapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
`)
|
|
|
|
testApexError(t, `uses: "commonapex" is not a provider`, `
|
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
uses: ["commonapex"],
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "commonapex",
|
|
|
|
system_shared_libs: [],
|
|
|
|
stl: "none",
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
`)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestApexUsesFailsIfUseVenderMismatch(t *testing.T) {
|
|
|
|
testApexError(t, `use_vendor: "commonapex" has different value of use_vendor`, `
|
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
use_vendor: true,
|
|
|
|
uses: ["commonapex"],
|
|
|
|
}
|
|
|
|
|
|
|
|
apex {
|
|
|
|
name: "commonapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
provide_cpp_shared_libs: true,
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
2019-10-31 19:14:38 +01:00
|
|
|
`, func(fs map[string][]byte, config android.Config) {
|
|
|
|
setUseVendorWhitelistForTest(config, []string{"myapex"})
|
|
|
|
})
|
2019-06-27 04:30:33 +02:00
|
|
|
}
|
|
|
|
|
2019-08-23 04:18:57 +02:00
|
|
|
func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
|
|
|
|
testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
|
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
native_shared_libs: ["libfoo"],
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "libfoo",
|
|
|
|
stl: "none",
|
|
|
|
system_shared_libs: [],
|
|
|
|
enabled: false,
|
|
|
|
}
|
|
|
|
`)
|
|
|
|
testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
|
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
java_libs: ["myjar"],
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
|
|
|
|
java_library {
|
|
|
|
name: "myjar",
|
|
|
|
srcs: ["foo/bar/MyClass.java"],
|
|
|
|
sdk_version: "none",
|
|
|
|
system_modules: "none",
|
|
|
|
compile_dex: true,
|
|
|
|
enabled: false,
|
|
|
|
}
|
|
|
|
`)
|
|
|
|
}
|
|
|
|
|
2019-08-27 06:55:42 +02:00
|
|
|
func TestApexWithApps(t *testing.T) {
|
|
|
|
ctx, _ := testApex(t, `
|
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
apps: [
|
|
|
|
"AppFoo",
|
2019-10-17 05:54:30 +02:00
|
|
|
"AppFooPriv",
|
2019-08-27 06:55:42 +02:00
|
|
|
],
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
|
|
|
|
android_app {
|
|
|
|
name: "AppFoo",
|
|
|
|
srcs: ["foo/bar/MyClass.java"],
|
|
|
|
sdk_version: "none",
|
|
|
|
system_modules: "none",
|
2019-11-08 07:53:48 +01:00
|
|
|
jni_libs: ["libjni"],
|
2019-08-27 06:55:42 +02:00
|
|
|
}
|
2019-10-17 05:54:30 +02:00
|
|
|
|
|
|
|
android_app {
|
|
|
|
name: "AppFooPriv",
|
|
|
|
srcs: ["foo/bar/MyClass.java"],
|
|
|
|
sdk_version: "none",
|
|
|
|
system_modules: "none",
|
|
|
|
privileged: true,
|
|
|
|
}
|
2019-11-08 07:53:48 +01:00
|
|
|
|
|
|
|
cc_library_shared {
|
|
|
|
name: "libjni",
|
|
|
|
srcs: ["mylib.cpp"],
|
|
|
|
stl: "none",
|
|
|
|
system_shared_libs: [],
|
|
|
|
}
|
2019-08-27 06:55:42 +02:00
|
|
|
`)
|
|
|
|
|
2019-10-22 06:58:29 +02:00
|
|
|
module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
|
2019-08-27 06:55:42 +02:00
|
|
|
apexRule := module.Rule("apexRule")
|
|
|
|
copyCmds := apexRule.Args["copy_commands"]
|
|
|
|
|
|
|
|
ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
|
2019-10-17 05:54:30 +02:00
|
|
|
ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
|
2019-11-11 02:14:32 +01:00
|
|
|
|
|
|
|
// JNI libraries are embedded inside APK
|
|
|
|
appZipRule := ctx.ModuleForTests("AppFoo", "android_common_myapex").Rule("zip")
|
2019-11-21 01:39:12 +01:00
|
|
|
libjniOutput := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_shared_myapex").Module().(*cc.Module).OutputFile()
|
2019-11-11 02:14:32 +01:00
|
|
|
ensureListContains(t, appZipRule.Implicits.Strings(), libjniOutput.String())
|
|
|
|
// ... uncompressed
|
|
|
|
if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
|
|
|
|
t.Errorf("jni lib is not uncompressed for AppFoo")
|
|
|
|
}
|
|
|
|
// ... and not directly inside the APEX
|
|
|
|
ensureNotContains(t, copyCmds, "image.apex/lib64/libjni.so")
|
2019-10-27 01:29:22 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestApexWithAppImports(t *testing.T) {
|
|
|
|
ctx, _ := testApex(t, `
|
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
apps: [
|
|
|
|
"AppFooPrebuilt",
|
|
|
|
"AppFooPrivPrebuilt",
|
|
|
|
],
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
|
|
|
|
android_app_import {
|
|
|
|
name: "AppFooPrebuilt",
|
|
|
|
apk: "PrebuiltAppFoo.apk",
|
|
|
|
presigned: true,
|
|
|
|
dex_preopt: {
|
|
|
|
enabled: false,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
android_app_import {
|
|
|
|
name: "AppFooPrivPrebuilt",
|
|
|
|
apk: "PrebuiltAppFooPriv.apk",
|
|
|
|
privileged: true,
|
|
|
|
presigned: true,
|
|
|
|
dex_preopt: {
|
|
|
|
enabled: false,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
`)
|
|
|
|
|
2019-10-22 06:58:29 +02:00
|
|
|
module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
|
2019-10-27 01:29:22 +02:00
|
|
|
apexRule := module.Rule("apexRule")
|
|
|
|
copyCmds := apexRule.Args["copy_commands"]
|
2019-08-27 06:55:42 +02:00
|
|
|
|
2019-10-27 01:29:22 +02:00
|
|
|
ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
|
|
|
|
ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AppFooPrivPrebuilt.apk")
|
2019-08-27 06:55:42 +02:00
|
|
|
}
|
|
|
|
|
2019-11-13 02:50:48 +01:00
|
|
|
func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
|
|
|
|
// libfoo's apex_available comes from cc_defaults
|
|
|
|
testApexError(t, `"myapex" .*: requires "libfoo" that is not available for the APEX`, `
|
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
native_shared_libs: ["libfoo"],
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
|
|
|
|
apex {
|
|
|
|
name: "otherapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
native_shared_libs: ["libfoo"],
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_defaults {
|
|
|
|
name: "libfoo-defaults",
|
|
|
|
apex_available: ["otherapex"],
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "libfoo",
|
|
|
|
defaults: ["libfoo-defaults"],
|
|
|
|
stl: "none",
|
|
|
|
system_shared_libs: [],
|
|
|
|
}`)
|
|
|
|
}
|
|
|
|
|
Add apex_available to control the availablity of a module to APEXes
apex_available property controls the availability of a module to APEXes.
For example, `apex_available: ["myapex", "otherapex"]` makes the module
available only to the two APEXes: myapex and otherapex, and nothing
else, even to the platform.
If the module is intended to be available to any APEX, then a pseudo
name "//apex_available:anyapex" can be used.
If the module is intended to be available to the platform, then another
pseudo name "//apex_available:platform" is used.
For now, if unspecified, this property defaults to ["//apex_available:platform",
"//apex_available:anyapex"], which means the module is available to everybody.
This will be reduced to ["//apex_available:platform"], when marking for
apex_available for existing modules are finished.
Bug: 139870423
Bug: 128708192
Test: m
Change-Id: Id4b233c3056c7858f984cbf9427cfac4118b2682
2019-09-30 09:04:35 +02:00
|
|
|
func TestApexAvailable(t *testing.T) {
|
|
|
|
// libfoo is not available to myapex, but only to otherapex
|
|
|
|
testApexError(t, "requires \"libfoo\" that is not available for the APEX", `
|
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
native_shared_libs: ["libfoo"],
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
|
|
|
|
apex {
|
|
|
|
name: "otherapex",
|
|
|
|
key: "otherapex.key",
|
|
|
|
native_shared_libs: ["libfoo"],
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "otherapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "libfoo",
|
|
|
|
stl: "none",
|
|
|
|
system_shared_libs: [],
|
|
|
|
apex_available: ["otherapex"],
|
|
|
|
}`)
|
|
|
|
|
|
|
|
// libbar is an indirect dep
|
|
|
|
testApexError(t, "requires \"libbar\" that is not available for the APEX", `
|
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
native_shared_libs: ["libfoo"],
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
|
|
|
|
apex {
|
|
|
|
name: "otherapex",
|
|
|
|
key: "otherapex.key",
|
|
|
|
native_shared_libs: ["libfoo"],
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "otherapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "libfoo",
|
|
|
|
stl: "none",
|
|
|
|
shared_libs: ["libbar"],
|
|
|
|
system_shared_libs: [],
|
|
|
|
apex_available: ["myapex", "otherapex"],
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "libbar",
|
|
|
|
stl: "none",
|
|
|
|
system_shared_libs: [],
|
|
|
|
apex_available: ["otherapex"],
|
|
|
|
}`)
|
|
|
|
|
|
|
|
testApexError(t, "\"otherapex\" is not a valid module name", `
|
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
native_shared_libs: ["libfoo"],
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "libfoo",
|
|
|
|
stl: "none",
|
|
|
|
system_shared_libs: [],
|
|
|
|
apex_available: ["otherapex"],
|
|
|
|
}`)
|
|
|
|
|
|
|
|
ctx, _ := testApex(t, `
|
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
native_shared_libs: ["libfoo", "libbar"],
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "libfoo",
|
|
|
|
stl: "none",
|
|
|
|
system_shared_libs: [],
|
|
|
|
apex_available: ["myapex"],
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "libbar",
|
|
|
|
stl: "none",
|
|
|
|
system_shared_libs: [],
|
|
|
|
apex_available: ["//apex_available:anyapex"],
|
|
|
|
}`)
|
|
|
|
|
|
|
|
// check that libfoo and libbar are created only for myapex, but not for the platform
|
2019-11-21 01:39:12 +01:00
|
|
|
ensureListContains(t, ctx.ModuleVariantsForTests("libfoo"), "android_arm64_armv8-a_shared_myapex")
|
|
|
|
ensureListNotContains(t, ctx.ModuleVariantsForTests("libfoo"), "android_arm64_armv8-a_shared")
|
|
|
|
ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_myapex")
|
|
|
|
ensureListNotContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared")
|
Add apex_available to control the availablity of a module to APEXes
apex_available property controls the availability of a module to APEXes.
For example, `apex_available: ["myapex", "otherapex"]` makes the module
available only to the two APEXes: myapex and otherapex, and nothing
else, even to the platform.
If the module is intended to be available to any APEX, then a pseudo
name "//apex_available:anyapex" can be used.
If the module is intended to be available to the platform, then another
pseudo name "//apex_available:platform" is used.
For now, if unspecified, this property defaults to ["//apex_available:platform",
"//apex_available:anyapex"], which means the module is available to everybody.
This will be reduced to ["//apex_available:platform"], when marking for
apex_available for existing modules are finished.
Bug: 139870423
Bug: 128708192
Test: m
Change-Id: Id4b233c3056c7858f984cbf9427cfac4118b2682
2019-09-30 09:04:35 +02:00
|
|
|
|
|
|
|
ctx, _ = testApex(t, `
|
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "libfoo",
|
|
|
|
stl: "none",
|
|
|
|
system_shared_libs: [],
|
|
|
|
apex_available: ["//apex_available:platform"],
|
|
|
|
}`)
|
|
|
|
|
|
|
|
// check that libfoo is created only for the platform
|
2019-11-21 01:39:12 +01:00
|
|
|
ensureListNotContains(t, ctx.ModuleVariantsForTests("libfoo"), "android_arm64_armv8-a_shared_myapex")
|
|
|
|
ensureListContains(t, ctx.ModuleVariantsForTests("libfoo"), "android_arm64_armv8-a_shared")
|
2019-10-07 08:47:24 +02:00
|
|
|
|
|
|
|
ctx, _ = testApex(t, `
|
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
native_shared_libs: ["libfoo"],
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
|
|
|
|
cc_library {
|
|
|
|
name: "libfoo",
|
|
|
|
stl: "none",
|
|
|
|
system_shared_libs: [],
|
|
|
|
apex_available: ["myapex"],
|
|
|
|
static: {
|
|
|
|
apex_available: ["//apex_available:platform"],
|
|
|
|
},
|
|
|
|
}`)
|
|
|
|
|
|
|
|
// shared variant of libfoo is only available to myapex
|
2019-11-21 01:39:12 +01:00
|
|
|
ensureListContains(t, ctx.ModuleVariantsForTests("libfoo"), "android_arm64_armv8-a_shared_myapex")
|
|
|
|
ensureListNotContains(t, ctx.ModuleVariantsForTests("libfoo"), "android_arm64_armv8-a_shared")
|
2019-10-07 08:47:24 +02:00
|
|
|
// but the static variant is available to both myapex and the platform
|
2019-11-21 01:39:12 +01:00
|
|
|
ensureListContains(t, ctx.ModuleVariantsForTests("libfoo"), "android_arm64_armv8-a_static_myapex")
|
|
|
|
ensureListContains(t, ctx.ModuleVariantsForTests("libfoo"), "android_arm64_armv8-a_static")
|
Add apex_available to control the availablity of a module to APEXes
apex_available property controls the availability of a module to APEXes.
For example, `apex_available: ["myapex", "otherapex"]` makes the module
available only to the two APEXes: myapex and otherapex, and nothing
else, even to the platform.
If the module is intended to be available to any APEX, then a pseudo
name "//apex_available:anyapex" can be used.
If the module is intended to be available to the platform, then another
pseudo name "//apex_available:platform" is used.
For now, if unspecified, this property defaults to ["//apex_available:platform",
"//apex_available:anyapex"], which means the module is available to everybody.
This will be reduced to ["//apex_available:platform"], when marking for
apex_available for existing modules are finished.
Bug: 139870423
Bug: 128708192
Test: m
Change-Id: Id4b233c3056c7858f984cbf9427cfac4118b2682
2019-09-30 09:04:35 +02:00
|
|
|
}
|
|
|
|
|
2019-11-15 10:40:32 +01:00
|
|
|
func TestOverrideApex(t *testing.T) {
|
2019-11-22 23:50:42 +01:00
|
|
|
ctx, config := testApex(t, `
|
2019-11-15 10:40:32 +01:00
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
apps: ["app"],
|
|
|
|
}
|
|
|
|
|
|
|
|
override_apex {
|
|
|
|
name: "override_myapex",
|
|
|
|
base: "myapex",
|
|
|
|
apps: ["override_app"],
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
|
|
|
|
android_app {
|
|
|
|
name: "app",
|
|
|
|
srcs: ["foo/bar/MyClass.java"],
|
|
|
|
package_name: "foo",
|
|
|
|
sdk_version: "none",
|
|
|
|
system_modules: "none",
|
|
|
|
}
|
|
|
|
|
|
|
|
override_android_app {
|
|
|
|
name: "override_app",
|
|
|
|
base: "app",
|
|
|
|
package_name: "bar",
|
|
|
|
}
|
|
|
|
`)
|
|
|
|
|
2019-12-05 05:20:58 +01:00
|
|
|
originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
|
|
|
|
overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
|
|
|
|
if originalVariant.GetOverriddenBy() != "" {
|
|
|
|
t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
|
|
|
|
}
|
|
|
|
if overriddenVariant.GetOverriddenBy() != "override_myapex" {
|
|
|
|
t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
|
|
|
|
}
|
|
|
|
|
2019-11-15 10:40:32 +01:00
|
|
|
module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
|
|
|
|
apexRule := module.Rule("apexRule")
|
|
|
|
copyCmds := apexRule.Args["copy_commands"]
|
|
|
|
|
|
|
|
ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
|
|
|
|
ensureContains(t, copyCmds, "image.apex/app/app/override_app.apk")
|
2019-11-22 23:50:42 +01:00
|
|
|
|
|
|
|
apexBundle := module.Module().(*apexBundle)
|
|
|
|
name := apexBundle.Name()
|
|
|
|
if name != "override_myapex" {
|
|
|
|
t.Errorf("name should be \"override_myapex\", but was %q", name)
|
|
|
|
}
|
|
|
|
|
|
|
|
data := android.AndroidMkDataForTest(t, config, "", apexBundle)
|
|
|
|
var builder strings.Builder
|
|
|
|
data.Custom(&builder, name, "TARGET_", "", data)
|
|
|
|
androidMk := builder.String()
|
2019-11-18 07:39:01 +01:00
|
|
|
ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
|
2019-11-22 23:50:42 +01:00
|
|
|
ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
|
|
|
|
ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
|
|
|
|
ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
|
2019-11-18 07:39:01 +01:00
|
|
|
ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
|
2019-11-22 23:50:42 +01:00
|
|
|
ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
|
|
|
|
ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
|
2019-11-15 10:40:32 +01:00
|
|
|
}
|
|
|
|
|
2019-11-12 05:03:50 +01:00
|
|
|
func TestLegacyAndroid10Support(t *testing.T) {
|
|
|
|
ctx, _ := testApex(t, `
|
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
legacy_android10_support: true,
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
`)
|
|
|
|
|
|
|
|
module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
|
|
|
|
args := module.Rule("apexRule").Args
|
|
|
|
ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
|
|
|
|
}
|
|
|
|
|
2019-12-16 03:47:12 +01:00
|
|
|
func TestRejectNonInstallableJavaLibrary(t *testing.T) {
|
|
|
|
testApexError(t, `"myjar" is not configured to be compiled into dex`, `
|
|
|
|
apex {
|
|
|
|
name: "myapex",
|
|
|
|
key: "myapex.key",
|
|
|
|
java_libs: ["myjar"],
|
|
|
|
}
|
|
|
|
|
|
|
|
apex_key {
|
|
|
|
name: "myapex.key",
|
|
|
|
public_key: "testkey.avbpubkey",
|
|
|
|
private_key: "testkey.pem",
|
|
|
|
}
|
|
|
|
|
|
|
|
java_library {
|
|
|
|
name: "myjar",
|
|
|
|
srcs: ["foo/bar/MyClass.java"],
|
|
|
|
sdk_version: "none",
|
|
|
|
system_modules: "none",
|
|
|
|
}
|
|
|
|
`)
|
|
|
|
}
|
|
|
|
|
2019-06-25 20:20:53 +02:00
|
|
|
func TestMain(m *testing.M) {
|
|
|
|
run := func() int {
|
|
|
|
setUp()
|
|
|
|
defer tearDown()
|
|
|
|
|
|
|
|
return m.Run()
|
|
|
|
}
|
|
|
|
|
|
|
|
os.Exit(run())
|
|
|
|
}
|