diff options
| author | 2023-06-09 14:26:18 +0000 | |
|---|---|---|
| committer | 2023-06-09 14:26:18 +0000 | |
| commit | 9ead6b6555896ba11f67bbb36f0c98869be99ac6 (patch) | |
| tree | 6aca2e0c01a3bf143dac43f1fe0bb6c99cdff035 | |
| parent | 4e066fbd428812e453fd281ebfea0b4186611c39 (diff) | |
| parent | aae62179cee6171b9aafa8580d957c23e05b6301 (diff) | |
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
| -rw-r--r-- | apex/apex.go | 14 | ||||
| -rw-r--r-- | apex/apex_test.go | 260 | ||||
| -rw-r--r-- | apex/builder.go | 16 |
3 files changed, 290 insertions, 0 deletions
diff --git a/apex/apex.go b/apex/apex.go index fa9233e79..f7c74440c 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -220,6 +220,13 @@ type apexBundleProperties struct { // imageApex or flattenedApex depending on Config.FlattenApex(). When payload_type is zip, // this becomes zipApex. 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 { @@ -3095,6 +3102,13 @@ func (a *apexBundle) checkApexAvailability(ctx android.ModuleContext) { } 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) toName := ctx.OtherModuleName(to) diff --git a/apex/apex_test.go b/apex/apex_test.go index 66ba0a8cf..d5493dd32 100644 --- a/apex/apex_test.go +++ b/apex/apex_test.go @@ -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) { ctx := testApex(t, ` apex { diff --git a/apex/builder.go b/apex/builder.go index 3c7671b00..f49bed93c 100644 --- a/apex/builder.go +++ b/apex/builder.go @@ -275,6 +275,22 @@ func (a *apexBundle) buildManifest(ctx android.ModuleContext, provideNativeLibs, manifestJsonFullOut := android.PathForModuleOut(ctx, "apex_manifest_full.json") 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 != "" { defaultVersion = override } |