Add "updatable" property to ApexModule interface.
For a given variant of a module that implements ApexModule interface,
the "updatable" property tests if this variant comes from an updatable
apex. For platform variants it is always false.
Test: lunch aosp_walleye-userdebug && m nothing
Bug: 138994281
Merged-In: I2d4c54fb397e29dc9b3203be7fb17be4536529f7
Change-Id: I2d4c54fb397e29dc9b3203be7fb17be4536529f7
Exempt-From-Owner-Approval: cp from aosp
(cherry picked from commit 7c140d828a
)
This commit is contained in:
parent
b029f03191
commit
c0eb0b1ae5
|
@ -33,6 +33,7 @@ type ApexInfo struct {
|
||||||
ApexName string
|
ApexName string
|
||||||
|
|
||||||
MinSdkVersion int
|
MinSdkVersion int
|
||||||
|
Updatable bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// Extracted from ApexModule to make it easier to define custom subsets of the
|
// Extracted from ApexModule to make it easier to define custom subsets of the
|
||||||
|
@ -116,6 +117,9 @@ type ApexModule interface {
|
||||||
// it returns 9 as string
|
// it returns 9 as string
|
||||||
ChooseSdkVersion(versionList []string, maxSdkVersion int) (string, error)
|
ChooseSdkVersion(versionList []string, maxSdkVersion int) (string, error)
|
||||||
|
|
||||||
|
// Tests if the module comes from an updatable APEX.
|
||||||
|
Updatable() bool
|
||||||
|
|
||||||
// List of APEXes that this module tests. The module has access to
|
// List of APEXes that this module tests. The module has access to
|
||||||
// the private part of the listed APEXes even when it is not included in the
|
// the private part of the listed APEXes even when it is not included in the
|
||||||
// APEXes.
|
// APEXes.
|
||||||
|
@ -260,6 +264,10 @@ func (m *ApexModuleBase) checkApexAvailableProperty(mctx BaseModuleContext) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *ApexModuleBase) Updatable() bool {
|
||||||
|
return m.ApexProperties.Info.Updatable
|
||||||
|
}
|
||||||
|
|
||||||
type byApexName []ApexInfo
|
type byApexName []ApexInfo
|
||||||
|
|
||||||
func (a byApexName) Len() int { return len(a) }
|
func (a byApexName) Len() int { return len(a) }
|
||||||
|
|
|
@ -756,6 +756,7 @@ func apexDepsMutator(mctx android.TopDownMutatorContext) {
|
||||||
apexBundles = []android.ApexInfo{{
|
apexBundles = []android.ApexInfo{{
|
||||||
ApexName: mctx.ModuleName(),
|
ApexName: mctx.ModuleName(),
|
||||||
MinSdkVersion: a.minSdkVersion(mctx),
|
MinSdkVersion: a.minSdkVersion(mctx),
|
||||||
|
Updatable: proptools.Bool(a.properties.Updatable),
|
||||||
}}
|
}}
|
||||||
directDep = true
|
directDep = true
|
||||||
} else if am, ok := mctx.Module().(android.ApexModule); ok {
|
} else if am, ok := mctx.Module().(android.ApexModule); ok {
|
||||||
|
|
|
@ -4342,6 +4342,13 @@ func testNoUpdatableJarsInBootImage(t *testing.T, errmsg, bp string, transformDe
|
||||||
"system/sepolicy/apex/some-updatable-apex-file_contexts",
|
"system/sepolicy/apex/some-updatable-apex-file_contexts",
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
filegroup {
|
||||||
|
name: "some-non-updatable-apex-file_contexts",
|
||||||
|
srcs: [
|
||||||
|
"system/sepolicy/apex/some-non-updatable-apex-file_contexts",
|
||||||
|
],
|
||||||
|
}
|
||||||
`
|
`
|
||||||
bp += cc.GatherRequiredDepsForTest(android.Android)
|
bp += cc.GatherRequiredDepsForTest(android.Android)
|
||||||
bp += java.GatherRequiredDepsForTest()
|
bp += java.GatherRequiredDepsForTest()
|
||||||
|
@ -4354,6 +4361,7 @@ func testNoUpdatableJarsInBootImage(t *testing.T, errmsg, bp string, transformDe
|
||||||
"apex_manifest.json": nil,
|
"apex_manifest.json": nil,
|
||||||
"AndroidManifest.xml": nil,
|
"AndroidManifest.xml": nil,
|
||||||
"system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
|
"system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
|
||||||
|
"system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
|
||||||
"system/sepolicy/apex/com.android.art.something-file_contexts": nil,
|
"system/sepolicy/apex/com.android.art.something-file_contexts": nil,
|
||||||
"framework/aidl/a.aidl": nil,
|
"framework/aidl/a.aidl": nil,
|
||||||
}
|
}
|
||||||
|
@ -4424,6 +4432,14 @@ func TestNoUpdatableJarsInBootImage(t *testing.T) {
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
java_library {
|
||||||
|
name: "some-non-updatable-apex-lib",
|
||||||
|
srcs: ["a.java"],
|
||||||
|
apex_available: [
|
||||||
|
"some-non-updatable-apex",
|
||||||
|
],
|
||||||
|
}
|
||||||
|
|
||||||
java_library {
|
java_library {
|
||||||
name: "some-platform-lib",
|
name: "some-platform-lib",
|
||||||
srcs: ["a.java"],
|
srcs: ["a.java"],
|
||||||
|
@ -4445,16 +4461,30 @@ func TestNoUpdatableJarsInBootImage(t *testing.T) {
|
||||||
name: "some-updatable-apex",
|
name: "some-updatable-apex",
|
||||||
key: "some-updatable-apex.key",
|
key: "some-updatable-apex.key",
|
||||||
java_libs: ["some-updatable-apex-lib"],
|
java_libs: ["some-updatable-apex-lib"],
|
||||||
|
updatable: true,
|
||||||
|
min_sdk_version: "current",
|
||||||
|
}
|
||||||
|
|
||||||
|
apex {
|
||||||
|
name: "some-non-updatable-apex",
|
||||||
|
key: "some-non-updatable-apex.key",
|
||||||
|
java_libs: ["some-non-updatable-apex-lib"],
|
||||||
}
|
}
|
||||||
|
|
||||||
apex_key {
|
apex_key {
|
||||||
name: "some-updatable-apex.key",
|
name: "some-updatable-apex.key",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
apex_key {
|
||||||
|
name: "some-non-updatable-apex.key",
|
||||||
|
}
|
||||||
|
|
||||||
apex {
|
apex {
|
||||||
name: "com.android.art.something",
|
name: "com.android.art.something",
|
||||||
key: "com.android.art.something.key",
|
key: "com.android.art.something.key",
|
||||||
java_libs: ["some-art-lib"],
|
java_libs: ["some-art-lib"],
|
||||||
|
updatable: true,
|
||||||
|
min_sdk_version: "current",
|
||||||
}
|
}
|
||||||
|
|
||||||
apex_key {
|
apex_key {
|
||||||
|
@ -4485,6 +4515,13 @@ func TestNoUpdatableJarsInBootImage(t *testing.T) {
|
||||||
}
|
}
|
||||||
testNoUpdatableJarsInBootImage(t, error, bp, transform)
|
testNoUpdatableJarsInBootImage(t, error, bp, transform)
|
||||||
|
|
||||||
|
// non-updatable jar from some other apex in the ART boot image => error
|
||||||
|
error = "module 'some-non-updatable-apex-lib' is not allowed in the ART boot image"
|
||||||
|
transform = func(config *dexpreopt.GlobalConfig) {
|
||||||
|
config.ArtApexJars = []string{"some-non-updatable-apex-lib"}
|
||||||
|
}
|
||||||
|
testNoUpdatableJarsInBootImage(t, error, bp, transform)
|
||||||
|
|
||||||
// updatable jar from some other apex in the framework boot image => error
|
// updatable jar from some other apex in the framework boot image => error
|
||||||
error = "module 'some-updatable-apex-lib' from updatable apex 'some-updatable-apex' is not allowed in the framework boot image"
|
error = "module 'some-updatable-apex-lib' from updatable apex 'some-updatable-apex' is not allowed in the framework boot image"
|
||||||
transform = func(config *dexpreopt.GlobalConfig) {
|
transform = func(config *dexpreopt.GlobalConfig) {
|
||||||
|
@ -4492,6 +4529,12 @@ func TestNoUpdatableJarsInBootImage(t *testing.T) {
|
||||||
}
|
}
|
||||||
testNoUpdatableJarsInBootImage(t, error, bp, transform)
|
testNoUpdatableJarsInBootImage(t, error, bp, transform)
|
||||||
|
|
||||||
|
// non-updatable jar from some other apex in the framework boot image => ok
|
||||||
|
transform = func(config *dexpreopt.GlobalConfig) {
|
||||||
|
config.BootJars = []string{"some-non-updatable-apex-lib"}
|
||||||
|
}
|
||||||
|
testNoUpdatableJarsInBootImage(t, "", bp, transform)
|
||||||
|
|
||||||
// nonexistent jar in the ART boot image => error
|
// nonexistent jar in the ART boot image => error
|
||||||
error = "failed to find a dex jar path for module 'nonexistent'"
|
error = "failed to find a dex jar path for module 'nonexistent'"
|
||||||
transform = func(config *dexpreopt.GlobalConfig) {
|
transform = func(config *dexpreopt.GlobalConfig) {
|
||||||
|
@ -4507,7 +4550,7 @@ func TestNoUpdatableJarsInBootImage(t *testing.T) {
|
||||||
testNoUpdatableJarsInBootImage(t, error, bp, transform)
|
testNoUpdatableJarsInBootImage(t, error, bp, transform)
|
||||||
|
|
||||||
// platform jar in the ART boot image => error
|
// platform jar in the ART boot image => error
|
||||||
error = "module 'some-platform-lib' is part of the platform and not allowed in the ART boot image"
|
error = "module 'some-platform-lib' is not allowed in the ART boot image"
|
||||||
transform = func(config *dexpreopt.GlobalConfig) {
|
transform = func(config *dexpreopt.GlobalConfig) {
|
||||||
config.ArtApexJars = []string{"some-platform-lib"}
|
config.ArtApexJars = []string{"some-platform-lib"}
|
||||||
}
|
}
|
||||||
|
|
|
@ -264,27 +264,28 @@ func getBootImageJar(ctx android.SingletonContext, image *bootImageConfig, modul
|
||||||
|
|
||||||
// Check that this module satisfies constraints for a particular boot image.
|
// Check that this module satisfies constraints for a particular boot image.
|
||||||
apex, isApexModule := module.(android.ApexModule)
|
apex, isApexModule := module.(android.ApexModule)
|
||||||
|
fromUpdatableApex := isApexModule && apex.Updatable()
|
||||||
if image.name == artBootImageName {
|
if image.name == artBootImageName {
|
||||||
if isApexModule && strings.HasPrefix(apex.ApexName(), "com.android.art.") {
|
if isApexModule && strings.HasPrefix(apex.ApexName(), "com.android.art.") {
|
||||||
// ok, found the jar in the ART apex
|
// ok: found the jar in the ART apex
|
||||||
} else if isApexModule && !apex.IsForPlatform() {
|
|
||||||
// this jar is part of an updatable apex other than ART, fail immediately
|
|
||||||
ctx.Errorf("module '%s' from updatable apex '%s' is not allowed in the ART boot image", name, apex.ApexName())
|
|
||||||
} else if isApexModule && apex.IsForPlatform() && Bool(module.(*Library).deviceProperties.Hostdex) {
|
} else if isApexModule && apex.IsForPlatform() && Bool(module.(*Library).deviceProperties.Hostdex) {
|
||||||
// this is a special "hostdex" variant, skip it and resume search
|
// exception (skip and continue): special "hostdex" platform variant
|
||||||
return -1, nil
|
return -1, nil
|
||||||
} else if name == "jacocoagent" && ctx.Config().IsEnvTrue("EMMA_INSTRUMENT_FRAMEWORK") {
|
} else if name == "jacocoagent" && ctx.Config().IsEnvTrue("EMMA_INSTRUMENT_FRAMEWORK") {
|
||||||
// this is Jacoco platform variant for a coverage build, skip it and resume search
|
// exception (skip and continue): Jacoco platform variant for a coverage build
|
||||||
return -1, nil
|
return -1, nil
|
||||||
|
} else if fromUpdatableApex {
|
||||||
|
// error: this jar is part of an updatable apex other than ART
|
||||||
|
ctx.Errorf("module '%s' from updatable apex '%s' is not allowed in the ART boot image", name, apex.ApexName())
|
||||||
} else {
|
} else {
|
||||||
// this (installable) jar is part of the platform, fail immediately
|
// error: this jar is part of the platform or a non-updatable apex
|
||||||
ctx.Errorf("module '%s' is part of the platform and not allowed in the ART boot image", name)
|
ctx.Errorf("module '%s' is not allowed in the ART boot image", name)
|
||||||
}
|
}
|
||||||
} else if image.name == frameworkBootImageName {
|
} else if image.name == frameworkBootImageName {
|
||||||
if !isApexModule || apex.IsForPlatform() {
|
if !fromUpdatableApex {
|
||||||
// ok, this jar is part of the platform
|
// ok: this jar is part of the platform or a non-updatable apex
|
||||||
} else {
|
} else {
|
||||||
// this jar is part of an updatable apex, fail immediately
|
// error: this jar is part of an updatable apex
|
||||||
ctx.Errorf("module '%s' from updatable apex '%s' is not allowed in the framework boot image", name, apex.ApexName())
|
ctx.Errorf("module '%s' from updatable apex '%s' is not allowed in the framework boot image", name, apex.ApexName())
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in New Issue