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
Merged-In: I4ab7e1a3527fead97a81a5a2cb0e1e93a429117c
Exempt-From-Owner-Approval: cp from aosp
(cherry picked from commit 849f844252
)
This commit is contained in:
parent
93a06c10e9
commit
2b4b7bbe82
|
@ -489,6 +489,7 @@ bootstrap_go_package {
|
||||||
srcs: [
|
srcs: [
|
||||||
"apex/androidmk.go",
|
"apex/androidmk.go",
|
||||||
"apex/apex.go",
|
"apex/apex.go",
|
||||||
|
"apex/apex_singleton.go",
|
||||||
"apex/builder.go",
|
"apex/builder.go",
|
||||||
"apex/key.go",
|
"apex/key.go",
|
||||||
"apex/prebuilt.go",
|
"apex/prebuilt.go",
|
||||||
|
|
|
@ -425,7 +425,8 @@ type ApexBundleDepsInfo struct {
|
||||||
fullListPath OutputPath
|
fullListPath OutputPath
|
||||||
}
|
}
|
||||||
|
|
||||||
type ApexDepsInfoIntf interface {
|
type ApexBundleDepsInfoIntf interface {
|
||||||
|
Updatable() bool
|
||||||
FlatListPath() Path
|
FlatListPath() Path
|
||||||
FullListPath() Path
|
FullListPath() Path
|
||||||
}
|
}
|
||||||
|
@ -438,8 +439,6 @@ func (d *ApexBundleDepsInfo) FullListPath() Path {
|
||||||
return d.fullListPath
|
return d.fullListPath
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ ApexDepsInfoIntf = (*ApexBundleDepsInfo)(nil)
|
|
||||||
|
|
||||||
// Generate two module out files:
|
// Generate two module out files:
|
||||||
// 1. FullList with transitive deps and their parents in the dep graph
|
// 1. FullList with transitive deps and their parents in the dep graph
|
||||||
// 2. FlatList with a flat list of transitive deps
|
// 2. FlatList with a flat list of transitive deps
|
||||||
|
|
12
apex/apex.go
12
apex/apex.go
|
@ -756,7 +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),
|
Updatable: a.Updatable(),
|
||||||
}}
|
}}
|
||||||
directDep = true
|
directDep = true
|
||||||
} else if am, ok := mctx.Module().(android.ApexModule); ok {
|
} else if am, ok := mctx.Module().(android.ApexModule); ok {
|
||||||
|
@ -1800,6 +1800,12 @@ func PrettyPrintTag(tag blueprint.DependencyTag) string {
|
||||||
return tagString
|
return tagString
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
// Ensures that the dependencies are marked as available for this APEX
|
||||||
func (a *apexBundle) checkApexAvailability(ctx android.ModuleContext) {
|
func (a *apexBundle) checkApexAvailability(ctx android.ModuleContext) {
|
||||||
// Let's be practical. Availability for test, host, and the VNDK apex isn't important
|
// Let's be practical. Availability for test, host, and the VNDK apex isn't important
|
||||||
|
@ -1848,7 +1854,7 @@ func (a *apexBundle) checkApexAvailability(ctx android.ModuleContext) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *apexBundle) checkUpdatable(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) == "" {
|
if String(a.properties.Min_sdk_version) == "" {
|
||||||
ctx.PropertyErrorf("updatable", "updatable APEXes should set min_sdk_version as well")
|
ctx.PropertyErrorf("updatable", "updatable APEXes should set min_sdk_version as well")
|
||||||
}
|
}
|
||||||
|
@ -2175,7 +2181,7 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
||||||
|
|
||||||
// We don't need the optimization for updatable APEXes, as it might give false signal
|
// 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)
|
// 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
|
a.linkToSystemLib = false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
|
})
|
||||||
|
}
|
|
@ -414,7 +414,7 @@ func (a *AndroidApp) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *AndroidApp) checkAppSdkVersions(ctx android.ModuleContext) {
|
func (a *AndroidApp) checkAppSdkVersions(ctx android.ModuleContext) {
|
||||||
if Bool(a.appProperties.Updatable) {
|
if a.Updatable() {
|
||||||
if !a.sdkVersion().stable() {
|
if !a.sdkVersion().stable() {
|
||||||
ctx.PropertyErrorf("sdk_version", "Updatable apps must use stable SDKs, found %v", a.sdkVersion())
|
ctx.PropertyErrorf("sdk_version", "Updatable apps must use stable SDKs, found %v", a.sdkVersion())
|
||||||
}
|
}
|
||||||
|
@ -879,6 +879,10 @@ func (a *AndroidApp) buildAppDependencyInfo(ctx android.ModuleContext) {
|
||||||
a.ApexBundleDepsInfo.BuildDepsInfoLists(ctx, a.MinSdkVersion(), depsInfo)
|
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 {
|
func (a *AndroidApp) getCertString(ctx android.BaseModuleContext) string {
|
||||||
certificate, overridden := ctx.DeviceConfig().OverrideCertificateFor(ctx.ModuleName())
|
certificate, overridden := ctx.DeviceConfig().OverrideCertificateFor(ctx.ModuleName())
|
||||||
if overridden {
|
if overridden {
|
||||||
|
|
Loading…
Reference in New Issue