diff options
Diffstat (limited to 'apex/apex.go')
| -rw-r--r-- | apex/apex.go | 179 |
1 files changed, 128 insertions, 51 deletions
diff --git a/apex/apex.go b/apex/apex.go index c1a4b40bb..b7faa5b98 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -54,8 +54,6 @@ func registerApexBuildComponents(ctx android.RegistrationContext) { ctx.PreArchMutators(registerPreArchMutators) ctx.PreDepsMutators(RegisterPreDepsMutators) ctx.PostDepsMutators(RegisterPostDepsMutators) - - android.RegisterBp2BuildMutator("apex", ApexBundleBp2Build) } func registerPreArchMutators(ctx android.RegisterMutatorsContext) { @@ -98,6 +96,14 @@ type apexBundleProperties struct { // /system/sepolicy/apex/<module_name>_file_contexts. File_contexts *string `android:"path"` + // Path to the canned fs config file for customizing file's uid/gid/mod/capabilities. The + // format is /<path_or_glob> <uid> <gid> <mode> [capabilities=0x<cap>], where path_or_glob is a + // path or glob pattern for a file or set of files, uid/gid are numerial values of user ID + // and group ID, mode is octal value for the file mode, and cap is hexadecimal value for the + // capability. If this property is not set, or a file is missing in the file, default config + // is used. + Canned_fs_config *string `android:"path"` + ApexNativeDependencies Multilib apexMultilibProperties @@ -111,6 +117,9 @@ type apexBundleProperties struct { // List of java libraries that are embedded inside this APEX bundle. Java_libs []string + // List of sh binaries that are embedded inside this APEX bundle. + Sh_binaries []string + // List of platform_compat_config files that are embedded inside this APEX bundle. Compat_configs []string @@ -127,6 +136,13 @@ type apexBundleProperties struct { // symlinking to the system libs. Default is true. Updatable *bool + // Marks that this APEX is designed to be updatable in the future, although it's not + // updatable yet. This is used to mimic some of the build behaviors that are applied only to + // updatable APEXes. Currently, this disables the size optimization, so that the size of + // APEX will not increase when the APEX is actually marked as truly updatable. Default is + // false. + Future_updatable *bool + // Whether this APEX can use platform APIs or not. Can be set to true only when `updatable: // false`. Default is false. Platform_apis *bool @@ -618,6 +634,7 @@ var ( sharedLibTag = dependencyTag{name: "sharedLib", payload: true} testForTag = dependencyTag{name: "test for"} testTag = dependencyTag{name: "test", payload: true} + shBinaryTag = dependencyTag{name: "shBinary", payload: true} ) // TODO(jiyong): shorten this function signature @@ -762,6 +779,10 @@ func (a *apexBundle) DepsMutator(ctx android.BottomUpMutatorContext) { for _, d := range depsList { addDependenciesForNativeModules(ctx, d, target, imageVariation) } + ctx.AddFarVariationDependencies([]blueprint.Variation{ + {Mutator: "os", Variation: target.OsVariation()}, + {Mutator: "arch", Variation: target.ArchVariation()}, + }, shBinaryTag, a.properties.Sh_binaries...) } // Common-arch dependencies come next @@ -1298,6 +1319,10 @@ func (a *apexBundle) Updatable() bool { return proptools.BoolDefault(a.properties.Updatable, true) } +func (a *apexBundle) FutureUpdatable() bool { + return proptools.BoolDefault(a.properties.Future_updatable, false) +} + func (a *apexBundle) UsePlatformApis() bool { return proptools.BoolDefault(a.properties.Platform_apis, false) } @@ -1482,6 +1507,9 @@ func apexFileForGoBinary(ctx android.BaseModuleContext, depName string, gb boots func apexFileForShBinary(ctx android.BaseModuleContext, sh *sh.ShBinary) apexFile { dirInApex := filepath.Join("bin", sh.SubDir()) + if sh.Target().NativeBridge == android.NativeBridgeEnabled { + dirInApex = filepath.Join(dirInApex, sh.Target().NativeBridgeRelativePath) + } fileToCopy := sh.OutputFile() af := newApexFile(ctx, fileToCopy, sh.BaseModuleName(), dirInApex, shBinary, sh) af.symlinks = sh.Symlinks() @@ -1659,7 +1687,7 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) { // 1) do some validity checks such as apex_available, min_sdk_version, etc. a.checkApexAvailability(ctx) a.checkUpdatable(ctx) - a.checkMinSdkVersion(ctx) + a.CheckMinSdkVersion(ctx) a.checkStaticLinkingToStubLibraries(ctx) a.checkStaticExecutables(ctx) if len(a.properties.Tests) > 0 && !a.testApex { @@ -1710,6 +1738,7 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) { return true // track transitive dependencies } else if r, ok := child.(*rust.Module); ok { fi := apexFileForRustLibrary(ctx, r) + fi.isJniLib = isJniLib filesInfo = append(filesInfo, fi) } else { propertyName := "native_shared_libs" @@ -1722,8 +1751,6 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) { if cc, ok := child.(*cc.Module); ok { filesInfo = append(filesInfo, apexFileForExecutable(ctx, cc)) return true // track transitive dependencies - } else if sh, ok := child.(*sh.ShBinary); ok { - filesInfo = append(filesInfo, apexFileForShBinary(ctx, sh)) } else if py, ok := child.(*python.Module); ok && py.HostToolPath().Valid() { filesInfo = append(filesInfo, apexFileForPyBinary(ctx, py)) } else if gb, ok := child.(bootstrap.GoBinaryTool); ok && a.Host() { @@ -1732,7 +1759,13 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) { filesInfo = append(filesInfo, apexFileForRustExecutable(ctx, rust)) return true // track transitive dependencies } else { - ctx.PropertyErrorf("binaries", "%q is neither cc_binary, rust_binary, (embedded) py_binary, (host) blueprint_go_binary, (host) bootstrap_go_binary, nor sh_binary", depName) + ctx.PropertyErrorf("binaries", "%q is neither cc_binary, rust_binary, (embedded) py_binary, (host) blueprint_go_binary, nor (host) bootstrap_go_binary", depName) + } + case shBinaryTag: + if sh, ok := child.(*sh.ShBinary); ok { + filesInfo = append(filesInfo, apexFileForShBinary(ctx, sh)) + } else { + ctx.PropertyErrorf("sh_binaries", "%q is not a sh_binary module", depName) } case bcpfTag: { @@ -1988,6 +2021,8 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) { } } else if _, ok := depTag.(android.CopyDirectlyInAnyApexTag); ok { // nothing + } else if depTag == android.DarwinUniversalVariantTag { + // nothing } else if am.CanHaveApexVariants() && am.IsInstallableToApex() { ctx.ModuleErrorf("unexpected tag %s for indirect dependency %q", android.PrettyPrintTag(depTag), depName) } @@ -2089,10 +2124,11 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) { } forced := ctx.Config().ForceApexSymlinkOptimization() + updatable := a.Updatable() || a.FutureUpdatable() // We don't need the optimization for updatable APEXes, as it might give false signal // to the system health when the APEXes are still bundled (b/149805758). - if !forced && a.Updatable() && a.properties.ApexType == imageApex { + if !forced && updatable && a.properties.ApexType == imageApex { a.linkToSystemLib = false } @@ -2158,6 +2194,40 @@ func apexBootclasspathFragmentFiles(ctx android.ModuleContext, module blueprint. filesToAdd = append(filesToAdd, *af) } + if pathInApex := bootclasspathFragmentInfo.ProfileInstallPathInApex(); pathInApex != "" { + pathOnHost := bootclasspathFragmentInfo.ProfilePathOnHost() + tempPath := android.PathForModuleOut(ctx, "boot_image_profile", pathInApex) + + if pathOnHost != nil { + // We need to copy the profile to a temporary path with the right filename because the apexer + // will take the filename as is. + ctx.Build(pctx, android.BuildParams{ + Rule: android.Cp, + Input: pathOnHost, + Output: tempPath, + }) + } else { + // At this point, the boot image profile cannot be generated. It is probably because the boot + // image profile source file does not exist on the branch, or it is not available for the + // current build target. + // However, we cannot enforce the boot image profile to be generated because some build + // targets (such as module SDK) do not need it. It is only needed when the APEX is being + // built. Therefore, we create an error rule so that an error will occur at the ninja phase + // only if the APEX is being built. + ctx.Build(pctx, android.BuildParams{ + Rule: android.ErrorRule, + Output: tempPath, + Args: map[string]string{ + "error": "Boot image profile cannot be generated", + }, + }) + } + + androidMkModuleName := filepath.Base(pathInApex) + af := newApexFile(ctx, tempPath, androidMkModuleName, filepath.Dir(pathInApex), etc, nil) + filesToAdd = append(filesToAdd, af) + } + return filesToAdd } @@ -2284,18 +2354,28 @@ func overrideApexFactory() android.Module { // // TODO(jiyong): move these checks to a separate go file. +var _ android.ModuleWithMinSdkVersionCheck = (*apexBundle)(nil) + // Entures that min_sdk_version of the included modules are equal or less than the min_sdk_version // of this apexBundle. -func (a *apexBundle) checkMinSdkVersion(ctx android.ModuleContext) { +func (a *apexBundle) CheckMinSdkVersion(ctx android.ModuleContext) { if a.testApex || a.vndkApex { return } // apexBundle::minSdkVersion reports its own errors. minSdkVersion := a.minSdkVersion(ctx) - android.CheckMinSdkVersion(a, ctx, minSdkVersion) + android.CheckMinSdkVersion(ctx, minSdkVersion, a.WalkPayloadDeps) } -func (a *apexBundle) minSdkVersion(ctx android.BaseModuleContext) android.ApiLevel { +func (a *apexBundle) MinSdkVersion(ctx android.EarlyModuleContext) android.SdkSpec { + return android.SdkSpec{ + Kind: android.SdkNone, + ApiLevel: a.minSdkVersion(ctx), + Raw: String(a.properties.Min_sdk_version), + } +} + +func (a *apexBundle) minSdkVersion(ctx android.EarlyModuleContext) android.ApiLevel { ver := proptools.String(a.properties.Min_sdk_version) if ver == "" { return android.NoneApiLevel @@ -2361,6 +2441,12 @@ func (a *apexBundle) checkUpdatable(ctx android.ModuleContext) { if a.UsePlatformApis() { ctx.PropertyErrorf("updatable", "updatable APEXes can't use platform APIs") } + if a.SocSpecific() || a.DeviceSpecific() { + ctx.PropertyErrorf("updatable", "vendor APEXes are not updatable") + } + if a.FutureUpdatable() { + ctx.PropertyErrorf("future_updatable", "Already updatable. Remove `future_updatable: true:`") + } a.checkJavaStableSdkVersion(ctx) a.checkClasspathFragments(ctx) } @@ -3120,15 +3206,16 @@ func createApexPermittedPackagesRules(modules_packages map[string][]string) []an BootclasspathJar(). With("apex_available", module_name). WithMatcher("permitted_packages", android.NotInList(module_packages)). + WithMatcher("min_sdk_version", android.LessThanSdkVersion("Tiramisu")). Because("jars that are part of the " + module_name + " module may only allow these packages: " + strings.Join(module_packages, ",") + - ". Please jarjar or move code around.") + " with min_sdk < T. Please jarjar or move code around.") rules = append(rules, permittedPackagesRule) } return rules } -// DO NOT EDIT! These are the package prefixes that are exempted from being AOT'ed by ART. +// DO NOT EDIT! These are the package prefixes that are exempted from being AOT'ed by ART on Q/R/S. // Adding code to the bootclasspath in new packages will cause issues on module update. func qModulesPackages() map[string][]string { return map[string][]string{ @@ -3142,7 +3229,7 @@ func qModulesPackages() map[string][]string { } } -// DO NOT EDIT! These are the package prefixes that are exempted from being AOT'ed by ART. +// DO NOT EDIT! These are the package prefixes that are exempted from being AOT'ed by ART on R/S. // Adding code to the bootclasspath in new packages will cause issues on module update. func rModulesPackages() map[string][]string { return map[string][]string{ @@ -3185,80 +3272,70 @@ type bazelApexBundleAttributes struct { File_contexts bazel.LabelAttribute Key bazel.LabelAttribute Certificate bazel.LabelAttribute - Min_sdk_version string + Min_sdk_version *string Updatable bazel.BoolAttribute Installable bazel.BoolAttribute Native_shared_libs bazel.LabelListAttribute - Binaries bazel.StringListAttribute + Binaries bazel.LabelListAttribute Prebuilts bazel.LabelListAttribute } -func ApexBundleBp2Build(ctx android.TopDownMutatorContext) { - module, ok := ctx.Module().(*apexBundle) - if !ok { - // Not an APEX bundle - return - } - if !module.ConvertWithBp2build(ctx) { - return - } +// ConvertWithBp2build performs bp2build conversion of an apex +func (a *apexBundle) ConvertWithBp2build(ctx android.TopDownMutatorContext) { + // We do not convert apex_test modules at this time if ctx.ModuleType() != "apex" { return } - apexBundleBp2BuildInternal(ctx, module) -} - -func apexBundleBp2BuildInternal(ctx android.TopDownMutatorContext, module *apexBundle) { var manifestLabelAttribute bazel.LabelAttribute - if module.properties.Manifest != nil { - manifestLabelAttribute.SetValue(android.BazelLabelForModuleSrcSingle(ctx, *module.properties.Manifest)) + if a.properties.Manifest != nil { + manifestLabelAttribute.SetValue(android.BazelLabelForModuleSrcSingle(ctx, *a.properties.Manifest)) } var androidManifestLabelAttribute bazel.LabelAttribute - if module.properties.AndroidManifest != nil { - androidManifestLabelAttribute.SetValue(android.BazelLabelForModuleSrcSingle(ctx, *module.properties.AndroidManifest)) + if a.properties.AndroidManifest != nil { + androidManifestLabelAttribute.SetValue(android.BazelLabelForModuleSrcSingle(ctx, *a.properties.AndroidManifest)) } var fileContextsLabelAttribute bazel.LabelAttribute - if module.properties.File_contexts != nil { - fileContextsLabelAttribute.SetValue(android.BazelLabelForModuleDepSingle(ctx, *module.properties.File_contexts)) + if a.properties.File_contexts != nil { + fileContextsLabelAttribute.SetValue(android.BazelLabelForModuleDepSingle(ctx, *a.properties.File_contexts)) } - var minSdkVersion string - if module.properties.Min_sdk_version != nil { - minSdkVersion = *module.properties.Min_sdk_version + var minSdkVersion *string + if a.properties.Min_sdk_version != nil { + minSdkVersion = a.properties.Min_sdk_version } var keyLabelAttribute bazel.LabelAttribute - if module.overridableProperties.Key != nil { - keyLabelAttribute.SetValue(android.BazelLabelForModuleDepSingle(ctx, *module.overridableProperties.Key)) + if a.overridableProperties.Key != nil { + keyLabelAttribute.SetValue(android.BazelLabelForModuleDepSingle(ctx, *a.overridableProperties.Key)) } var certificateLabelAttribute bazel.LabelAttribute - if module.overridableProperties.Certificate != nil { - certificateLabelAttribute.SetValue(android.BazelLabelForModuleDepSingle(ctx, *module.overridableProperties.Certificate)) + if a.overridableProperties.Certificate != nil { + certificateLabelAttribute.SetValue(android.BazelLabelForModuleDepSingle(ctx, *a.overridableProperties.Certificate)) } - nativeSharedLibs := module.properties.ApexNativeDependencies.Native_shared_libs + nativeSharedLibs := a.properties.ApexNativeDependencies.Native_shared_libs nativeSharedLibsLabelList := android.BazelLabelForModuleDeps(ctx, nativeSharedLibs) nativeSharedLibsLabelListAttribute := bazel.MakeLabelListAttribute(nativeSharedLibsLabelList) - prebuilts := module.overridableProperties.Prebuilts + prebuilts := a.overridableProperties.Prebuilts prebuiltsLabelList := android.BazelLabelForModuleDeps(ctx, prebuilts) prebuiltsLabelListAttribute := bazel.MakeLabelListAttribute(prebuiltsLabelList) - binaries := module.properties.ApexNativeDependencies.Binaries - binariesStringListAttribute := bazel.MakeStringListAttribute(binaries) + binaries := android.BazelLabelForModuleDeps(ctx, a.properties.ApexNativeDependencies.Binaries) + binariesLabelListAttribute := bazel.MakeLabelListAttribute(binaries) var updatableAttribute bazel.BoolAttribute - if module.properties.Updatable != nil { - updatableAttribute.Value = module.properties.Updatable + if a.properties.Updatable != nil { + updatableAttribute.Value = a.properties.Updatable } var installableAttribute bazel.BoolAttribute - if module.properties.Installable != nil { - installableAttribute.Value = module.properties.Installable + if a.properties.Installable != nil { + installableAttribute.Value = a.properties.Installable } attrs := &bazelApexBundleAttributes{ @@ -3271,7 +3348,7 @@ func apexBundleBp2BuildInternal(ctx android.TopDownMutatorContext, module *apexB Updatable: updatableAttribute, Installable: installableAttribute, Native_shared_libs: nativeSharedLibsLabelListAttribute, - Binaries: binariesStringListAttribute, + Binaries: binariesLabelListAttribute, Prebuilts: prebuiltsLabelListAttribute, } @@ -3280,5 +3357,5 @@ func apexBundleBp2BuildInternal(ctx android.TopDownMutatorContext, module *apexB Bzl_load_location: "//build/bazel/rules:apex.bzl", } - ctx.CreateBazelTargetModule(props, android.CommonAttributes{Name: module.Name()}, attrs) + ctx.CreateBazelTargetModule(props, android.CommonAttributes{Name: a.Name()}, attrs) } |