diff options
Diffstat (limited to 'apex/apex.go')
-rw-r--r-- | apex/apex.go | 81 |
1 files changed, 63 insertions, 18 deletions
diff --git a/apex/apex.go b/apex/apex.go index 442769ad9..7ffa6cc81 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -170,9 +170,9 @@ type apexBundleProperties struct { // Default is false. Ignore_system_library_special_case *bool - // Whenever apex_payload.img of the APEX should include dm-verity hashtree. Should be only - // used in tests. - Test_only_no_hashtree *bool + // Whenever apex_payload.img of the APEX should include dm-verity hashtree. + // Default value is true. + Generate_hashtree *bool // Whenever apex_payload.img of the APEX should not be dm-verity signed. Should be only // used in tests. @@ -1059,8 +1059,9 @@ func apexMutator(mctx android.BottomUpMutatorContext) { // apexBundle itself is mutated so that it and its dependencies have the same apex variant. // TODO(jiyong): document the reason why the VNDK APEX is an exception here. - if a, ok := mctx.Module().(*apexBundle); ok && !a.vndkApex { - apexBundleName := mctx.ModuleName() + unprefixedModuleName := android.RemoveOptionalPrebuiltPrefix(mctx.ModuleName()) + if apexModuleTypeRequiresVariant(mctx.Module()) { + apexBundleName := unprefixedModuleName mctx.CreateVariations(apexBundleName) if strings.HasPrefix(apexBundleName, "com.android.art") { // Create an alias from the platform variant. This is done to make @@ -1078,6 +1079,12 @@ func apexMutator(mctx android.BottomUpMutatorContext) { mctx.ModuleErrorf("base property is not set") return } + // Workaround the issue reported in b/191269918 by using the unprefixed module name of this + // module as the default variation to use if dependencies of this module do not have the correct + // apex variant name. This name matches the name used to create the variations of modules for + // which apexModuleTypeRequiresVariant return true. + // TODO(b/191269918): Remove this workaround. + mctx.SetDefaultDependencyVariation(&unprefixedModuleName) mctx.CreateVariations(apexBundleName) if strings.HasPrefix(apexBundleName, "com.android.art") { // TODO(b/183882457): See note for CreateAliasVariation above. @@ -1086,6 +1093,22 @@ func apexMutator(mctx android.BottomUpMutatorContext) { } } +// apexModuleTypeRequiresVariant determines whether the module supplied requires an apex specific +// variant. +func apexModuleTypeRequiresVariant(module android.Module) bool { + if a, ok := module.(*apexBundle); ok { + return !a.vndkApex + } + + // Match apex_set and prebuilt_apex. Would also match apexBundle but that is handled specially + // above. + if _, ok := module.(ApexInfoMutator); ok { + return true + } + + return false +} + // See android.UpdateDirectlyInAnyApex // TODO(jiyong): move this to android/apex.go? func apexDirectlyInAnyMutator(mctx android.BottomUpMutatorContext) { @@ -1320,9 +1343,9 @@ func (a *apexBundle) installable() bool { return !a.properties.PreventInstall && (a.properties.Installable == nil || proptools.Bool(a.properties.Installable)) } -// See the test_only_no_hashtree property -func (a *apexBundle) testOnlyShouldSkipHashtreeGeneration() bool { - return proptools.Bool(a.properties.Test_only_no_hashtree) +// See the generate_hashtree property +func (a *apexBundle) shouldGenerateHashtree() bool { + return proptools.BoolDefault(a.properties.Generate_hashtree, true) } // See the test_only_unsigned_payload property @@ -1738,7 +1761,9 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) { ctx.PropertyErrorf("systemserverclasspath_fragments", "%q is not a systemserverclasspath_fragment module", depName) return false } - filesInfo = append(filesInfo, apexClasspathFragmentProtoFile(ctx, child)) + if af := apexClasspathFragmentProtoFile(ctx, child); af != nil { + filesInfo = append(filesInfo, *af) + } return true } case javaLibTag: @@ -2141,17 +2166,23 @@ func apexBootclasspathFragmentFiles(ctx android.ModuleContext, module blueprint. } // Add classpaths.proto config. - filesToAdd = append(filesToAdd, apexClasspathFragmentProtoFile(ctx, module)) + if af := apexClasspathFragmentProtoFile(ctx, module); af != nil { + filesToAdd = append(filesToAdd, *af) + } return filesToAdd } -// apexClasspathFragmentProtoFile returns apexFile structure defining the classpath.proto config that -// the module contributes to the apex. -func apexClasspathFragmentProtoFile(ctx android.ModuleContext, module blueprint.Module) apexFile { - fragmentInfo := ctx.OtherModuleProvider(module, java.ClasspathFragmentProtoContentInfoProvider).(java.ClasspathFragmentProtoContentInfo) - classpathProtoOutput := fragmentInfo.ClasspathFragmentProtoOutput - return newApexFile(ctx, classpathProtoOutput, classpathProtoOutput.Base(), fragmentInfo.ClasspathFragmentProtoInstallDir.Rel(), etc, nil) +// apexClasspathFragmentProtoFile returns *apexFile structure defining the classpath.proto config that +// the module contributes to the apex; or nil if the proto config was not generated. +func apexClasspathFragmentProtoFile(ctx android.ModuleContext, module blueprint.Module) *apexFile { + info := ctx.OtherModuleProvider(module, java.ClasspathFragmentProtoContentInfoProvider).(java.ClasspathFragmentProtoContentInfo) + if !info.ClasspathFragmentProtoGenerated { + return nil + } + classpathProtoOutput := info.ClasspathFragmentProtoOutput + af := newApexFile(ctx, classpathProtoOutput, classpathProtoOutput.Base(), info.ClasspathFragmentProtoInstallDir.Rel(), etc, nil) + return &af } // apexFileForBootclasspathFragmentContentModule creates an apexFile for a bootclasspath_fragment @@ -2337,16 +2368,30 @@ func (a *apexBundle) checkStaticLinkingToStubLibraries(ctx android.ModuleContext }) } -// Enforce that Java deps of the apex are using stable SDKs to compile +// checkUpdatable enforces APEX and its transitive dep properties to have desired values for updatable APEXes. func (a *apexBundle) checkUpdatable(ctx android.ModuleContext) { if a.Updatable() { if String(a.properties.Min_sdk_version) == "" { ctx.PropertyErrorf("updatable", "updatable APEXes should set min_sdk_version as well") } a.checkJavaStableSdkVersion(ctx) + a.checkClasspathFragments(ctx) } } +// checkClasspathFragments enforces that all classpath fragments in deps generate classpaths.proto config. +func (a *apexBundle) checkClasspathFragments(ctx android.ModuleContext) { + ctx.VisitDirectDeps(func(module android.Module) { + if tag := ctx.OtherModuleDependencyTag(module); tag == bcpfTag || tag == sscpfTag { + info := ctx.OtherModuleProvider(module, java.ClasspathFragmentProtoContentInfoProvider).(java.ClasspathFragmentProtoContentInfo) + if !info.ClasspathFragmentProtoGenerated { + ctx.OtherModuleErrorf(module, "is included in updatable apex %v, it must not set generate_classpaths_proto to false", ctx.ModuleName()) + } + } + }) +} + +// checkJavaStableSdkVersion enforces that all Java deps are using stable SDKs to compile. func (a *apexBundle) checkJavaStableSdkVersion(ctx android.ModuleContext) { // Visit direct deps only. As long as we guarantee top-level deps are using stable SDKs, // java's checkLinkType guarantees correct usage for transitive deps @@ -2365,7 +2410,7 @@ func (a *apexBundle) checkJavaStableSdkVersion(ctx android.ModuleContext) { }) } -// Ensures that the all the dependencies are marked as available for this APEX +// checkApexAvailability ensures that the all the dependencies are marked as available for this APEX. func (a *apexBundle) checkApexAvailability(ctx android.ModuleContext) { // Let's be practical. Availability for test, host, and the VNDK apex isn't important if ctx.Host() || a.testApex || a.vndkApex { |