From 849f844252872e260a35cf958cb25ab4c5ea3e7f Mon Sep 17 00:00:00 2001 From: Artur Satayev Date: Tue, 28 Apr 2020 14:57:42 +0100 Subject: [PATCH] Generate combined deps-info for all updatable modules. Introduce a singleton apex rule to merge contents of individual deps-info results into a single output file. Bug: 149622332 Test: m Change-Id: I4ab7e1a3527fead97a81a5a2cb0e1e93a429117c --- Android.bp | 1 + android/apex.go | 5 ++-- apex/apex.go | 12 ++++++-- apex/apex_singleton.go | 65 ++++++++++++++++++++++++++++++++++++++++++ java/app.go | 6 +++- 5 files changed, 82 insertions(+), 7 deletions(-) create mode 100644 apex/apex_singleton.go diff --git a/Android.bp b/Android.bp index 342ca4ca9..ec7d13a48 100644 --- a/Android.bp +++ b/Android.bp @@ -492,6 +492,7 @@ bootstrap_go_package { srcs: [ "apex/androidmk.go", "apex/apex.go", + "apex/apex_singleton.go", "apex/builder.go", "apex/key.go", "apex/prebuilt.go", diff --git a/android/apex.go b/android/apex.go index 75be15026..30152db29 100644 --- a/android/apex.go +++ b/android/apex.go @@ -425,7 +425,8 @@ type ApexBundleDepsInfo struct { fullListPath OutputPath } -type ApexDepsInfoIntf interface { +type ApexBundleDepsInfoIntf interface { + Updatable() bool FlatListPath() Path FullListPath() Path } @@ -438,8 +439,6 @@ func (d *ApexBundleDepsInfo) FullListPath() Path { return d.fullListPath } -var _ ApexDepsInfoIntf = (*ApexBundleDepsInfo)(nil) - // Generate two module out files: // 1. FullList with transitive deps and their parents in the dep graph // 2. FlatList with a flat list of transitive deps diff --git a/apex/apex.go b/apex/apex.go index 322728d8d..fafa3f862 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -746,7 +746,7 @@ func apexDepsMutator(mctx android.TopDownMutatorContext) { apexBundles = []android.ApexInfo{{ ApexName: mctx.ModuleName(), MinSdkVersion: a.minSdkVersion(mctx), - Updatable: proptools.Bool(a.properties.Updatable), + Updatable: a.Updatable(), }} directDep = true } else if am, ok := mctx.Module().(android.ApexModule); ok { @@ -1797,6 +1797,12 @@ func (a *apexBundle) minSdkVersion(ctx android.BaseModuleContext) int { return intVer } +func (a *apexBundle) Updatable() bool { + return proptools.Bool(a.properties.Updatable) +} + +var _ android.ApexBundleDepsInfoIntf = (*apexBundle)(nil) + // Ensures that 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 @@ -1838,7 +1844,7 @@ func (a *apexBundle) checkApexAvailability(ctx android.ModuleContext) { } func (a *apexBundle) checkUpdatable(ctx android.ModuleContext) { - if proptools.Bool(a.properties.Updatable) { + if a.Updatable() { if String(a.properties.Min_sdk_version) == "" { ctx.PropertyErrorf("updatable", "updatable APEXes should set min_sdk_version as well") } @@ -2178,7 +2184,7 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) { // 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 proptools.Bool(a.properties.Updatable) && a.properties.ApexType == imageApex { + if a.Updatable() && a.properties.ApexType == imageApex { a.linkToSystemLib = false } diff --git a/apex/apex_singleton.go b/apex/apex_singleton.go new file mode 100644 index 000000000..83a56a2b5 --- /dev/null +++ b/apex/apex_singleton.go @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package apex + +import ( + "github.com/google/blueprint" + + "android/soong/android" +) + +func init() { + android.RegisterSingletonType("apex_depsinfo_singleton", apexDepsInfoSingletonFactory) +} + +type apexDepsInfoSingleton struct { + // Output file with all flatlists from updatable modules' deps-info combined + updatableFlatListsPath android.OutputPath +} + +func apexDepsInfoSingletonFactory() android.Singleton { + return &apexDepsInfoSingleton{} +} + +var combineFilesRule = pctx.AndroidStaticRule("combineFilesRule", + blueprint.RuleParams{ + Command: "cat $out.rsp | xargs cat > $out", + Rspfile: "$out.rsp", + RspfileContent: "$in", + }, +) + +func (s *apexDepsInfoSingleton) GenerateBuildActions(ctx android.SingletonContext) { + updatableFlatLists := android.Paths{} + ctx.VisitAllModules(func(module android.Module) { + if binaryInfo, ok := module.(android.ApexBundleDepsInfoIntf); ok { + if path := binaryInfo.FlatListPath(); path != nil { + if binaryInfo.Updatable() { + updatableFlatLists = append(updatableFlatLists, path) + } + } + } + }) + + s.updatableFlatListsPath = android.PathForOutput(ctx, "apex", "depsinfo", "updatable-flatlists.txt") + ctx.Build(pctx, android.BuildParams{ + Rule: combineFilesRule, + Description: "Generate " + s.updatableFlatListsPath.String(), + Inputs: updatableFlatLists, + Output: s.updatableFlatListsPath, + }) +} diff --git a/java/app.go b/java/app.go index f5f70d1a6..37d198ea7 100755 --- a/java/app.go +++ b/java/app.go @@ -414,7 +414,7 @@ func (a *AndroidApp) GenerateAndroidBuildActions(ctx android.ModuleContext) { } func (a *AndroidApp) checkAppSdkVersions(ctx android.ModuleContext) { - if Bool(a.appProperties.Updatable) || a.ApexModuleBase.Updatable() { + if a.Updatable() { if !a.sdkVersion().stable() { ctx.PropertyErrorf("sdk_version", "Updatable apps must use stable SDKs, found %v", a.sdkVersion()) } @@ -897,6 +897,10 @@ func (a *AndroidApp) buildAppDependencyInfo(ctx android.ModuleContext) { a.ApexBundleDepsInfo.BuildDepsInfoLists(ctx, a.MinSdkVersion(), depsInfo) } +func (a *AndroidApp) Updatable() bool { + return Bool(a.appProperties.Updatable) || a.ApexModuleBase.Updatable() +} + func (a *AndroidApp) getCertString(ctx android.BaseModuleContext) string { certificate, overridden := ctx.DeviceConfig().OverrideCertificateFor(ctx.ModuleName()) if overridden {