Merge changes from topic "cherrypicker-L99000000961168479:N91800001376948752" into udc-mainline-prod
* changes: add variant_version property to apexBundle add apex_available_name property to apexBundle
This commit is contained in:
committed by
Android (Google) Code Review
commit
9ead6b6555
14
apex/apex.go
14
apex/apex.go
@@ -220,6 +220,13 @@ type apexBundleProperties struct {
|
|||||||
// imageApex or flattenedApex depending on Config.FlattenApex(). When payload_type is zip,
|
// imageApex or flattenedApex depending on Config.FlattenApex(). When payload_type is zip,
|
||||||
// this becomes zipApex.
|
// this becomes zipApex.
|
||||||
ApexType apexPackaging `blueprint:"mutated"`
|
ApexType apexPackaging `blueprint:"mutated"`
|
||||||
|
|
||||||
|
// Name that dependencies can specify in their apex_available properties to refer to this module.
|
||||||
|
// If not specified, this defaults to Soong module name.
|
||||||
|
Apex_available_name *string
|
||||||
|
|
||||||
|
// Variant version of the mainline module. Must be an integer between 0-9
|
||||||
|
Variant_version *string
|
||||||
}
|
}
|
||||||
|
|
||||||
type ApexNativeDependencies struct {
|
type ApexNativeDependencies struct {
|
||||||
@@ -3095,6 +3102,13 @@ func (a *apexBundle) checkApexAvailability(ctx android.ModuleContext) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
apexName := ctx.ModuleName()
|
apexName := ctx.ModuleName()
|
||||||
|
for _, props := range ctx.Module().GetProperties() {
|
||||||
|
if apexProps, ok := props.(*apexBundleProperties); ok {
|
||||||
|
if apexProps.Apex_available_name != nil {
|
||||||
|
apexName = *apexProps.Apex_available_name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
fromName := ctx.OtherModuleName(from)
|
fromName := ctx.OtherModuleName(from)
|
||||||
toName := ctx.OtherModuleName(to)
|
toName := ctx.OtherModuleName(to)
|
||||||
|
|
||||||
|
@@ -6556,6 +6556,266 @@ func TestApexAvailable_InvalidApexName(t *testing.T) {
|
|||||||
}`)
|
}`)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
|
||||||
|
t.Run("negative variant_version produces error", func(t *testing.T) {
|
||||||
|
testApexError(t, "expected an integer between 0-9; got -1", `
|
||||||
|
apex {
|
||||||
|
name: "myapex",
|
||||||
|
key: "myapex.key",
|
||||||
|
apex_available_name: "com.android.foo",
|
||||||
|
variant_version: "-1",
|
||||||
|
updatable: false,
|
||||||
|
}
|
||||||
|
apex_key {
|
||||||
|
name: "myapex.key",
|
||||||
|
public_key: "testkey.avbpubkey",
|
||||||
|
private_key: "testkey.pem",
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
|
||||||
|
testApexError(t, "expected an integer between 0-9; got 10", `
|
||||||
|
apex {
|
||||||
|
name: "myapex",
|
||||||
|
key: "myapex.key",
|
||||||
|
apex_available_name: "com.android.foo",
|
||||||
|
variant_version: "10",
|
||||||
|
updatable: false,
|
||||||
|
}
|
||||||
|
apex_key {
|
||||||
|
name: "myapex.key",
|
||||||
|
public_key: "testkey.avbpubkey",
|
||||||
|
private_key: "testkey.pem",
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
|
||||||
|
context := android.GroupFixturePreparers(
|
||||||
|
android.PrepareForIntegrationTestWithAndroid,
|
||||||
|
PrepareForTestWithApexBuildComponents,
|
||||||
|
android.FixtureMergeMockFs(android.MockFS{
|
||||||
|
"system/sepolicy/apex/foo-file_contexts": nil,
|
||||||
|
"system/sepolicy/apex/bar-file_contexts": nil,
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
result := context.RunTestWithBp(t, `
|
||||||
|
apex {
|
||||||
|
name: "foo",
|
||||||
|
key: "myapex.key",
|
||||||
|
apex_available_name: "com.android.foo",
|
||||||
|
variant_version: "0",
|
||||||
|
updatable: false,
|
||||||
|
}
|
||||||
|
apex {
|
||||||
|
name: "bar",
|
||||||
|
key: "myapex.key",
|
||||||
|
apex_available_name: "com.android.foo",
|
||||||
|
variant_version: "3",
|
||||||
|
updatable: false,
|
||||||
|
}
|
||||||
|
apex_key {
|
||||||
|
name: "myapex.key",
|
||||||
|
public_key: "testkey.avbpubkey",
|
||||||
|
private_key: "testkey.pem",
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
|
||||||
|
fooManifestRule := result.ModuleForTests("foo", "android_common_foo_image").Rule("apexManifestRule")
|
||||||
|
fooExpectedDefaultVersion := android.DefaultUpdatableModuleVersion
|
||||||
|
fooActualDefaultVersion := fooManifestRule.Args["default_version"]
|
||||||
|
if fooActualDefaultVersion != fooExpectedDefaultVersion {
|
||||||
|
t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
|
||||||
|
}
|
||||||
|
|
||||||
|
barManifestRule := result.ModuleForTests("bar", "android_common_bar_image").Rule("apexManifestRule")
|
||||||
|
defaultVersionInt, _ := strconv.Atoi(android.DefaultUpdatableModuleVersion)
|
||||||
|
barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
|
||||||
|
barActualDefaultVersion := barManifestRule.Args["default_version"]
|
||||||
|
if barActualDefaultVersion != barExpectedDefaultVersion {
|
||||||
|
t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestApexAvailable_ApexAvailableName(t *testing.T) {
|
||||||
|
t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) {
|
||||||
|
testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
|
||||||
|
apex {
|
||||||
|
name: "myapex_sminus",
|
||||||
|
key: "myapex.key",
|
||||||
|
apps: ["AppFoo"],
|
||||||
|
apex_available_name: "myapex",
|
||||||
|
updatable: false,
|
||||||
|
}
|
||||||
|
apex {
|
||||||
|
name: "myapex",
|
||||||
|
key: "myapex.key",
|
||||||
|
apps: ["AppFoo"],
|
||||||
|
updatable: false,
|
||||||
|
}
|
||||||
|
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",
|
||||||
|
apex_available: [ "myapex_sminus" ],
|
||||||
|
}`,
|
||||||
|
android.FixtureMergeMockFs(android.MockFS{
|
||||||
|
"system/sepolicy/apex/myapex_sminus-file_contexts": nil,
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) {
|
||||||
|
testApex(t, `
|
||||||
|
apex {
|
||||||
|
name: "myapex_sminus",
|
||||||
|
key: "myapex.key",
|
||||||
|
apps: ["AppFoo"],
|
||||||
|
apex_available_name: "myapex",
|
||||||
|
updatable: false,
|
||||||
|
}
|
||||||
|
apex {
|
||||||
|
name: "myapex",
|
||||||
|
key: "myapex.key",
|
||||||
|
apps: ["AppFoo"],
|
||||||
|
updatable: false,
|
||||||
|
}
|
||||||
|
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",
|
||||||
|
apex_available: [ "myapex" ],
|
||||||
|
}`,
|
||||||
|
android.FixtureMergeMockFs(android.MockFS{
|
||||||
|
"system/sepolicy/apex/myapex_sminus-file_contexts": nil,
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
|
||||||
|
testApex(t, `
|
||||||
|
override_apex {
|
||||||
|
name: "myoverrideapex_sminus",
|
||||||
|
base: "myapex_sminus",
|
||||||
|
key: "myapex.key",
|
||||||
|
apps: ["AppFooOverride"],
|
||||||
|
}
|
||||||
|
override_apex {
|
||||||
|
name: "myoverrideapex",
|
||||||
|
base: "myapex",
|
||||||
|
key: "myapex.key",
|
||||||
|
apps: ["AppFooOverride"],
|
||||||
|
}
|
||||||
|
apex {
|
||||||
|
name: "myapex_sminus",
|
||||||
|
key: "myapex.key",
|
||||||
|
apps: ["AppFoo"],
|
||||||
|
apex_available_name: "myapex",
|
||||||
|
updatable: false,
|
||||||
|
}
|
||||||
|
apex {
|
||||||
|
name: "myapex",
|
||||||
|
key: "myapex.key",
|
||||||
|
apps: ["AppFoo"],
|
||||||
|
updatable: false,
|
||||||
|
}
|
||||||
|
apex_key {
|
||||||
|
name: "myapex.key",
|
||||||
|
public_key: "testkey.avbpubkey",
|
||||||
|
private_key: "testkey.pem",
|
||||||
|
}
|
||||||
|
android_app {
|
||||||
|
name: "AppFooOverride",
|
||||||
|
srcs: ["foo/bar/MyClass.java"],
|
||||||
|
sdk_version: "none",
|
||||||
|
system_modules: "none",
|
||||||
|
apex_available: [ "myapex" ],
|
||||||
|
}
|
||||||
|
android_app {
|
||||||
|
name: "AppFoo",
|
||||||
|
srcs: ["foo/bar/MyClass.java"],
|
||||||
|
sdk_version: "none",
|
||||||
|
system_modules: "none",
|
||||||
|
apex_available: [ "myapex" ],
|
||||||
|
}`,
|
||||||
|
android.FixtureMergeMockFs(android.MockFS{
|
||||||
|
"system/sepolicy/apex/myapex_sminus-file_contexts": nil,
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
|
||||||
|
context := android.GroupFixturePreparers(
|
||||||
|
android.PrepareForIntegrationTestWithAndroid,
|
||||||
|
PrepareForTestWithApexBuildComponents,
|
||||||
|
java.PrepareForTestWithDexpreopt,
|
||||||
|
android.FixtureMergeMockFs(android.MockFS{
|
||||||
|
"system/sepolicy/apex/myapex-file_contexts": nil,
|
||||||
|
"system/sepolicy/apex/myapex_sminus-file_contexts": nil,
|
||||||
|
}),
|
||||||
|
android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
|
||||||
|
variables.BuildId = proptools.StringPtr("buildid")
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
context.RunTestWithBp(t, `
|
||||||
|
override_apex {
|
||||||
|
name: "myoverrideapex_sminus",
|
||||||
|
base: "myapex_sminus",
|
||||||
|
}
|
||||||
|
override_apex {
|
||||||
|
name: "myoverrideapex",
|
||||||
|
base: "myapex",
|
||||||
|
}
|
||||||
|
apex {
|
||||||
|
name: "myapex",
|
||||||
|
key: "myapex.key",
|
||||||
|
apps: ["AppFoo"],
|
||||||
|
updatable: false,
|
||||||
|
}
|
||||||
|
apex {
|
||||||
|
name: "myapex_sminus",
|
||||||
|
apex_available_name: "myapex",
|
||||||
|
key: "myapex.key",
|
||||||
|
apps: ["AppFoo_sminus"],
|
||||||
|
updatable: false,
|
||||||
|
}
|
||||||
|
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",
|
||||||
|
apex_available: [ "myapex" ],
|
||||||
|
}
|
||||||
|
android_app {
|
||||||
|
name: "AppFoo_sminus",
|
||||||
|
srcs: ["foo/bar/MyClass.java"],
|
||||||
|
sdk_version: "none",
|
||||||
|
min_sdk_version: "29",
|
||||||
|
system_modules: "none",
|
||||||
|
apex_available: [ "myapex" ],
|
||||||
|
}`)
|
||||||
|
}
|
||||||
|
|
||||||
func TestApexAvailable_CheckForPlatform(t *testing.T) {
|
func TestApexAvailable_CheckForPlatform(t *testing.T) {
|
||||||
ctx := testApex(t, `
|
ctx := testApex(t, `
|
||||||
apex {
|
apex {
|
||||||
|
@@ -275,6 +275,22 @@ func (a *apexBundle) buildManifest(ctx android.ModuleContext, provideNativeLibs,
|
|||||||
|
|
||||||
manifestJsonFullOut := android.PathForModuleOut(ctx, "apex_manifest_full.json")
|
manifestJsonFullOut := android.PathForModuleOut(ctx, "apex_manifest_full.json")
|
||||||
defaultVersion := android.DefaultUpdatableModuleVersion
|
defaultVersion := android.DefaultUpdatableModuleVersion
|
||||||
|
if a.properties.Variant_version != nil {
|
||||||
|
defaultVersionInt, err := strconv.Atoi(defaultVersion)
|
||||||
|
if err != nil {
|
||||||
|
ctx.ModuleErrorf("expected DefaultUpdatableModuleVersion to be an int, but got %s", defaultVersion)
|
||||||
|
}
|
||||||
|
if defaultVersionInt%10 != 0 {
|
||||||
|
ctx.ModuleErrorf("expected DefaultUpdatableModuleVersion to end in a zero, but got %s", defaultVersion)
|
||||||
|
}
|
||||||
|
variantVersion := []rune(*a.properties.Variant_version)
|
||||||
|
if len(variantVersion) != 1 || variantVersion[0] < '0' || variantVersion[0] > '9' {
|
||||||
|
ctx.PropertyErrorf("variant_version", "expected an integer between 0-9; got %s", *a.properties.Variant_version)
|
||||||
|
}
|
||||||
|
defaultVersionRunes := []rune(defaultVersion)
|
||||||
|
defaultVersionRunes[len(defaultVersion)-1] = []rune(variantVersion)[0]
|
||||||
|
defaultVersion = string(defaultVersionRunes)
|
||||||
|
}
|
||||||
if override := ctx.Config().Getenv("OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION"); override != "" {
|
if override := ctx.Config().Getenv("OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION"); override != "" {
|
||||||
defaultVersion = override
|
defaultVersion = override
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user