diff options
75 files changed, 940 insertions, 873 deletions
diff --git a/android/androidmk_test.go b/android/androidmk_test.go index a558f453f..10527b911 100644 --- a/android/androidmk_test.go +++ b/android/androidmk_test.go @@ -80,10 +80,10 @@ func TestAndroidMkSingleton_PassesUpdatedAndroidMkDataToCustomCallback(t *testin config := TestConfig(buildDir, nil, bp, nil) config.inMake = true // Enable androidmk Singleton - ctx := NewTestContext() + ctx := NewTestContext(config) ctx.RegisterSingletonType("androidmk", AndroidMkSingleton) ctx.RegisterModuleType("custom", customModuleFactory) - ctx.Register(config) + ctx.Register() _, errs := ctx.ParseFileList(".", []string{"Android.bp"}) FailIfErrored(t, errs) @@ -252,10 +252,10 @@ func TestGetDistForGoals(t *testing.T) { config := TestConfig(buildDir, nil, testCase.bp, nil) config.inMake = true // Enable androidmk Singleton - ctx := NewTestContext() + ctx := NewTestContext(config) ctx.RegisterSingletonType("androidmk", AndroidMkSingleton) ctx.RegisterModuleType("custom", customModuleFactory) - ctx.Register(config) + ctx.Register() _, errs := ctx.ParseFileList(".", []string{"Android.bp"}) FailIfErrored(t, errs) diff --git a/android/arch_test.go b/android/arch_test.go index 8525b0349..4cef4c8e6 100644 --- a/android/arch_test.go +++ b/android/arch_test.go @@ -353,9 +353,9 @@ func TestArchMutator(t *testing.T) { t.Run(tt.name, func(t *testing.T) { config := TestArchConfig(buildDir, nil, bp, nil) - ctx := NewTestArchContext() + ctx := NewTestArchContext(config) ctx.RegisterModuleType("module", archTestModuleFactory) - ctx.Register(config) + ctx.Register() if tt.config != nil { tt.config(config) } @@ -442,9 +442,9 @@ func TestArchMutatorNativeBridge(t *testing.T) { t.Run(tt.name, func(t *testing.T) { config := TestArchConfigNativeBridge(buildDir, nil, bp, nil) - ctx := NewTestArchContext() + ctx := NewTestArchContext(config) ctx.RegisterModuleType("module", archTestModuleFactory) - ctx.Register(config) + ctx.Register() if tt.config != nil { tt.config(config) } diff --git a/android/csuite_config_test.go b/android/csuite_config_test.go index bf1a19a46..9ac959e18 100644 --- a/android/csuite_config_test.go +++ b/android/csuite_config_test.go @@ -21,9 +21,9 @@ import ( func testCSuiteConfig(test *testing.T, bpFileContents string) *TestContext { config := TestArchConfig(buildDir, nil, bpFileContents, nil) - ctx := NewTestArchContext() + ctx := NewTestArchContext(config) ctx.RegisterModuleType("csuite_config", CSuiteConfigFactory) - ctx.Register(config) + ctx.Register() _, errs := ctx.ParseFileList(".", []string{"Android.bp"}) FailIfErrored(test, errs) _, errs = ctx.PrepareBuildActions(config) diff --git a/android/defaults_test.go b/android/defaults_test.go index d096b2f92..2689d864e 100644 --- a/android/defaults_test.go +++ b/android/defaults_test.go @@ -80,14 +80,14 @@ func TestDefaults(t *testing.T) { config := TestConfig(buildDir, nil, bp, nil) - ctx := NewTestContext() + ctx := NewTestContext(config) ctx.RegisterModuleType("test", defaultsTestModuleFactory) ctx.RegisterModuleType("defaults", defaultsTestDefaultsFactory) ctx.PreArchMutators(RegisterDefaultsPreArchMutators) - ctx.Register(config) + ctx.Register() _, errs := ctx.ParseFileList(".", []string{"Android.bp"}) FailIfErrored(t, errs) @@ -125,7 +125,7 @@ func TestDefaultsAllowMissingDependencies(t *testing.T) { config := TestConfig(buildDir, nil, bp, nil) config.TestProductVariables.Allow_missing_dependencies = proptools.BoolPtr(true) - ctx := NewTestContext() + ctx := NewTestContext(config) ctx.SetAllowMissingDependencies(true) ctx.RegisterModuleType("test", defaultsTestModuleFactory) @@ -133,7 +133,7 @@ func TestDefaultsAllowMissingDependencies(t *testing.T) { ctx.PreArchMutators(RegisterDefaultsPreArchMutators) - ctx.Register(config) + ctx.Register() _, errs := ctx.ParseFileList(".", []string{"Android.bp"}) FailIfErrored(t, errs) diff --git a/android/module_test.go b/android/module_test.go index 3a039e29a..6cc18132a 100644 --- a/android/module_test.go +++ b/android/module_test.go @@ -164,9 +164,6 @@ func depsModuleFactory() Module { } func TestErrorDependsOnDisabledModule(t *testing.T) { - ctx := NewTestContext() - ctx.RegisterModuleType("deps", depsModuleFactory) - bp := ` deps { name: "foo", @@ -180,7 +177,9 @@ func TestErrorDependsOnDisabledModule(t *testing.T) { config := TestConfig(buildDir, nil, bp, nil) - ctx.Register(config) + ctx := NewTestContext(config) + ctx.RegisterModuleType("deps", depsModuleFactory) + ctx.Register() _, errs := ctx.ParseFileList(".", []string{"Android.bp"}) FailIfErrored(t, errs) diff --git a/android/mutator_test.go b/android/mutator_test.go index 191b535a3..1c395c782 100644 --- a/android/mutator_test.go +++ b/android/mutator_test.go @@ -70,7 +70,7 @@ func TestMutatorAddMissingDependencies(t *testing.T) { config := TestConfig(buildDir, nil, bp, nil) config.TestProductVariables.Allow_missing_dependencies = proptools.BoolPtr(true) - ctx := NewTestContext() + ctx := NewTestContext(config) ctx.SetAllowMissingDependencies(true) ctx.RegisterModuleType("test", mutatorTestModuleFactory) @@ -78,7 +78,7 @@ func TestMutatorAddMissingDependencies(t *testing.T) { ctx.TopDown("add_missing_dependencies", addMissingDependenciesMutator) }) - ctx.Register(config) + ctx.Register() _, errs := ctx.ParseFileList(".", []string{"Android.bp"}) FailIfErrored(t, errs) _, errs = ctx.PrepareBuildActions(config) @@ -92,7 +92,15 @@ func TestMutatorAddMissingDependencies(t *testing.T) { } func TestModuleString(t *testing.T) { - ctx := NewTestContext() + bp := ` + test { + name: "foo", + } + ` + + config := TestConfig(buildDir, nil, bp, nil) + + ctx := NewTestContext(config) var moduleStrings []string @@ -130,15 +138,7 @@ func TestModuleString(t *testing.T) { ctx.RegisterModuleType("test", mutatorTestModuleFactory) - bp := ` - test { - name: "foo", - } - ` - - config := TestConfig(buildDir, nil, bp, nil) - - ctx.Register(config) + ctx.Register() _, errs := ctx.ParseFileList(".", []string{"Android.bp"}) FailIfErrored(t, errs) @@ -190,7 +190,21 @@ func TestModuleString(t *testing.T) { } func TestFinalDepsPhase(t *testing.T) { - ctx := NewTestContext() + bp := ` + test { + name: "common_dep_1", + } + test { + name: "common_dep_2", + } + test { + name: "foo", + } + ` + + config := TestConfig(buildDir, nil, bp, nil) + + ctx := NewTestContext(config) finalGot := map[string]int{} @@ -228,20 +242,7 @@ func TestFinalDepsPhase(t *testing.T) { ctx.RegisterModuleType("test", mutatorTestModuleFactory) - bp := ` - test { - name: "common_dep_1", - } - test { - name: "common_dep_2", - } - test { - name: "foo", - } - ` - - config := TestConfig(buildDir, nil, bp, nil) - ctx.Register(config) + ctx.Register() _, errs := ctx.ParseFileList(".", []string{"Android.bp"}) FailIfErrored(t, errs) @@ -267,7 +268,8 @@ func TestFinalDepsPhase(t *testing.T) { } func TestNoCreateVariationsInFinalDeps(t *testing.T) { - ctx := NewTestContext() + config := TestConfig(buildDir, nil, `test {name: "foo"}`, nil) + ctx := NewTestContext(config) checkErr := func() { if err := recover(); err == nil || !strings.Contains(fmt.Sprintf("%s", err), "not allowed in FinalDepsMutators") { @@ -287,8 +289,7 @@ func TestNoCreateVariationsInFinalDeps(t *testing.T) { }) ctx.RegisterModuleType("test", mutatorTestModuleFactory) - config := TestConfig(buildDir, nil, `test {name: "foo"}`, nil) - ctx.Register(config) + ctx.Register() _, errs := ctx.ParseFileList(".", []string{"Android.bp"}) FailIfErrored(t, errs) diff --git a/android/namespace_test.go b/android/namespace_test.go index 66c0d895a..45e2cdb7b 100644 --- a/android/namespace_test.go +++ b/android/namespace_test.go @@ -635,7 +635,7 @@ func mockFiles(bps map[string]string) (files map[string][]byte) { func setupTestFromFiles(bps map[string][]byte) (ctx *TestContext, errs []error) { config := TestConfig(buildDir, nil, "", bps) - ctx = NewTestContext() + ctx = NewTestContext(config) ctx.RegisterModuleType("test_module", newTestModule) ctx.RegisterModuleType("soong_namespace", NamespaceFactory) ctx.Context.RegisterModuleType("blueprint_test_module", newBlueprintTestModule) @@ -643,7 +643,7 @@ func setupTestFromFiles(bps map[string][]byte) (ctx *TestContext, errs []error) ctx.PreDepsMutators(func(ctx RegisterMutatorsContext) { ctx.BottomUp("rename", renameMutator) }) - ctx.Register(config) + ctx.Register() _, errs = ctx.ParseBlueprintsFiles("Android.bp") if len(errs) > 0 { diff --git a/android/neverallow_test.go b/android/neverallow_test.go index 56a07dc9d..1d454e52f 100644 --- a/android/neverallow_test.go +++ b/android/neverallow_test.go @@ -359,14 +359,14 @@ func TestNeverallow(t *testing.T) { } func testNeverallow(config Config) (*TestContext, []error) { - ctx := NewTestContext() + ctx := NewTestContext(config) ctx.RegisterModuleType("cc_library", newMockCcLibraryModule) ctx.RegisterModuleType("java_library", newMockJavaLibraryModule) ctx.RegisterModuleType("java_library_host", newMockJavaLibraryModule) ctx.RegisterModuleType("java_device_for_host", newMockJavaLibraryModule) ctx.RegisterModuleType("makefile_goal", newMockMakefileGoalModule) ctx.PostDepsMutators(RegisterNeverallowMutator) - ctx.Register(config) + ctx.Register() _, errs := ctx.ParseBlueprintsFiles("Android.bp") if len(errs) > 0 { diff --git a/android/package_test.go b/android/package_test.go index 04dfc08a9..ade95d42d 100644 --- a/android/package_test.go +++ b/android/package_test.go @@ -86,9 +86,9 @@ func testPackage(fs map[string][]byte) (*TestContext, []error) { // Create a new config per test as visibility information is stored in the config. config := TestArchConfig(buildDir, nil, "", fs) - ctx := NewTestArchContext() + ctx := NewTestArchContext(config) RegisterPackageBuildComponents(ctx) - ctx.Register(config) + ctx.Register() _, errs := ctx.ParseBlueprintsFiles(".") if len(errs) > 0 { diff --git a/android/path_properties_test.go b/android/path_properties_test.go index f367b82b8..f964d9f1e 100644 --- a/android/path_properties_test.go +++ b/android/path_properties_test.go @@ -116,12 +116,12 @@ func TestPathDepsMutator(t *testing.T) { ` config := TestArchConfig(buildDir, nil, bp, nil) - ctx := NewTestArchContext() + ctx := NewTestArchContext(config) ctx.RegisterModuleType("test", pathDepsMutatorTestModuleFactory) ctx.RegisterModuleType("filegroup", FileGroupFactory) - ctx.Register(config) + ctx.Register() _, errs := ctx.ParseFileList(".", []string{"Android.bp"}) FailIfErrored(t, errs) _, errs = ctx.PrepareBuildActions(config) diff --git a/android/paths_test.go b/android/paths_test.go index e7fd763e4..14a477353 100644 --- a/android/paths_test.go +++ b/android/paths_test.go @@ -980,12 +980,6 @@ type pathForModuleSrcTestCase struct { func testPathForModuleSrc(t *testing.T, buildDir string, tests []pathForModuleSrcTestCase) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { - ctx := NewTestContext() - - ctx.RegisterModuleType("test", pathForModuleSrcTestModuleFactory) - ctx.RegisterModuleType("output_file_provider", pathForModuleSrcOutputFileProviderModuleFactory) - ctx.RegisterModuleType("filegroup", FileGroupFactory) - fgBp := ` filegroup { name: "a", @@ -1015,7 +1009,13 @@ func testPathForModuleSrc(t *testing.T, buildDir string, tests []pathForModuleSr config := TestConfig(buildDir, nil, "", mockFS) - ctx.Register(config) + ctx := NewTestContext(config) + + ctx.RegisterModuleType("test", pathForModuleSrcTestModuleFactory) + ctx.RegisterModuleType("output_file_provider", pathForModuleSrcOutputFileProviderModuleFactory) + ctx.RegisterModuleType("filegroup", FileGroupFactory) + + ctx.Register() _, errs := ctx.ParseFileList(".", []string{"fg/Android.bp", "foo/Android.bp", "ofp/Android.bp"}) FailIfErrored(t, errs) _, errs = ctx.PrepareBuildActions(config) @@ -1224,12 +1224,12 @@ func TestPathsForModuleSrc_AllowMissingDependencies(t *testing.T) { config := TestConfig(buildDir, nil, bp, nil) config.TestProductVariables.Allow_missing_dependencies = proptools.BoolPtr(true) - ctx := NewTestContext() + ctx := NewTestContext(config) ctx.SetAllowMissingDependencies(true) ctx.RegisterModuleType("test", pathForModuleSrcTestModuleFactory) - ctx.Register(config) + ctx.Register() _, errs := ctx.ParseFileList(".", []string{"Android.bp"}) FailIfErrored(t, errs) diff --git a/android/prebuilt_test.go b/android/prebuilt_test.go index 854395e64..9ac38750c 100644 --- a/android/prebuilt_test.go +++ b/android/prebuilt_test.go @@ -288,10 +288,10 @@ func TestPrebuilts(t *testing.T) { {Windows, Arch{ArchType: X86_64}, NativeBridgeDisabled, "", "", true}, } - ctx := NewTestArchContext() + ctx := NewTestArchContext(config) registerTestPrebuiltBuildComponents(ctx) ctx.RegisterModuleType("filegroup", FileGroupFactory) - ctx.Register(config) + ctx.Register() _, errs := ctx.ParseBlueprintsFiles("Android.bp") FailIfErrored(t, errs) diff --git a/android/queryview.go b/android/queryview.go index 7e615b121..970ae0116 100644 --- a/android/queryview.go +++ b/android/queryview.go @@ -57,7 +57,7 @@ func (c *bazelQueryViewSingleton) GenerateBuildActions(ctx SingletonContext) { ), CommandDeps: []string{primaryBuilder.String()}, Description: fmt.Sprintf( - "[EXPERIMENTAL] Creating the Bazel QueryView workspace with %s at $outDir", + "[EXPERIMENTAL, PRE-PRODUCTION] Creating the Bazel QueryView workspace with %s at $outDir", primaryBuilder.Base()), Deps: blueprint.DepsGCC, Depfile: "${outDir}/.queryview-depfile.d", diff --git a/android/register.go b/android/register.go index ad3df7ead..bd824c9c1 100644 --- a/android/register.go +++ b/android/register.go @@ -81,10 +81,11 @@ func RegisterPreSingletonType(name string, factory SingletonFactory) { type Context struct { *blueprint.Context + config Config } -func NewContext() *Context { - ctx := &Context{blueprint.NewContext()} +func NewContext(config Config) *Context { + ctx := &Context{blueprint.NewContext(), config} ctx.SetSrcDir(absSrcDir) return ctx } @@ -157,7 +158,7 @@ type RegistrationContext interface { // Extracting the actual registration into a separate RegisterBuildComponents(ctx) function // allows it to be used to initialize test context, e.g. // -// ctx := android.NewTestContext() +// ctx := android.NewTestContext(config) // RegisterBuildComponents(ctx) var InitRegistrationContext RegistrationContext = &initRegistrationContext{ moduleTypes: make(map[string]ModuleFactory), diff --git a/android/rule_builder_test.go b/android/rule_builder_test.go index 0d1070da2..ca6359d67 100644 --- a/android/rule_builder_test.go +++ b/android/rule_builder_test.go @@ -507,10 +507,10 @@ func TestRuleBuilder_Build(t *testing.T) { ` config := TestConfig(buildDir, nil, bp, fs) - ctx := NewTestContext() + ctx := NewTestContext(config) ctx.RegisterModuleType("rule_builder_test", testRuleBuilderFactory) ctx.RegisterSingletonType("rule_builder_test", testRuleBuilderSingletonFactory) - ctx.Register(config) + ctx.Register() _, errs := ctx.ParseFileList(".", []string{"Android.bp"}) FailIfErrored(t, errs) diff --git a/android/soong_config_modules_test.go b/android/soong_config_modules_test.go index 9677f34cf..b1810b305 100644 --- a/android/soong_config_modules_test.go +++ b/android/soong_config_modules_test.go @@ -175,7 +175,7 @@ func TestSoongConfigModule(t *testing.T) { }, } - ctx := NewTestContext() + ctx := NewTestContext(config) ctx.RegisterModuleType("soong_config_module_type_import", soongConfigModuleTypeImportFactory) ctx.RegisterModuleType("soong_config_module_type", soongConfigModuleTypeFactory) ctx.RegisterModuleType("soong_config_string_variable", soongConfigStringVariableDummyFactory) @@ -183,7 +183,7 @@ func TestSoongConfigModule(t *testing.T) { ctx.RegisterModuleType("test_defaults", soongConfigTestDefaultsModuleFactory) ctx.RegisterModuleType("test", soongConfigTestModuleFactory) ctx.PreArchMutators(RegisterDefaultsPreArchMutators) - ctx.Register(config) + ctx.Register() _, errs := ctx.ParseBlueprintsFiles("Android.bp") FailIfErrored(t, errs) diff --git a/android/testing.go b/android/testing.go index 8ea4168d1..d83cecc43 100644 --- a/android/testing.go +++ b/android/testing.go @@ -25,14 +25,14 @@ import ( "github.com/google/blueprint" ) -func NewTestContext() *TestContext { +func NewTestContext(config Config) *TestContext { namespaceExportFilter := func(namespace *Namespace) bool { return true } nameResolver := NewNameResolver(namespaceExportFilter) ctx := &TestContext{ - Context: &Context{blueprint.NewContext()}, + Context: &Context{blueprint.NewContext(), config}, NameResolver: nameResolver, } @@ -40,11 +40,16 @@ func NewTestContext() *TestContext { ctx.postDeps = append(ctx.postDeps, registerPathDepsMutator) + ctx.SetFs(ctx.config.fs) + if ctx.config.mockBpList != "" { + ctx.SetModuleListFile(ctx.config.mockBpList) + } + return ctx } -func NewTestArchContext() *TestContext { - ctx := NewTestContext() +func NewTestArchContext(config Config) *TestContext { + ctx := NewTestContext(config) ctx.preDeps = append(ctx.preDeps, registerArchMutator) return ctx } @@ -53,7 +58,6 @@ type TestContext struct { *Context preArch, preDeps, postDeps, finalDeps []RegisterMutatorFunc NameResolver *NameResolver - config Config } func (ctx *TestContext) PreArchMutators(f RegisterMutatorFunc) { @@ -77,16 +81,10 @@ func (ctx *TestContext) FinalDepsMutators(f RegisterMutatorFunc) { ctx.finalDeps = append(ctx.finalDeps, f) } -func (ctx *TestContext) Register(config Config) { - ctx.SetFs(config.fs) - if config.mockBpList != "" { - ctx.SetModuleListFile(config.mockBpList) - } +func (ctx *TestContext) Register() { registerMutators(ctx.Context.Context, ctx.preArch, ctx.preDeps, ctx.postDeps, ctx.finalDeps) ctx.RegisterSingletonType("env", EnvSingleton) - - ctx.config = config } func (ctx *TestContext) ParseFileList(rootDir string, filePaths []string) (deps []string, errs []error) { diff --git a/android/variable_test.go b/android/variable_test.go index 9cafedd50..393fe0172 100644 --- a/android/variable_test.go +++ b/android/variable_test.go @@ -157,23 +157,6 @@ func testProductVariableModuleFactoryFactory(props interface{}) func() Module { } func TestProductVariables(t *testing.T) { - ctx := NewTestContext() - // A module type that has a srcs property but not a cflags property. - ctx.RegisterModuleType("module1", testProductVariableModuleFactoryFactory(&struct { - Srcs []string - }{})) - // A module type that has a cflags property but not a srcs property. - ctx.RegisterModuleType("module2", testProductVariableModuleFactoryFactory(&struct { - Cflags []string - }{})) - // A module type that does not have any properties that match product_variables. - ctx.RegisterModuleType("module3", testProductVariableModuleFactoryFactory(&struct { - Foo []string - }{})) - ctx.PreDepsMutators(func(ctx RegisterMutatorsContext) { - ctx.BottomUp("variable", VariableMutator).Parallel() - }) - // Test that a module can use one product variable even if it doesn't have all the properties // supported by that product variable. bp := ` @@ -201,7 +184,24 @@ func TestProductVariables(t *testing.T) { config := TestConfig(buildDir, nil, bp, nil) config.TestProductVariables.Eng = proptools.BoolPtr(true) - ctx.Register(config) + ctx := NewTestContext(config) + // A module type that has a srcs property but not a cflags property. + ctx.RegisterModuleType("module1", testProductVariableModuleFactoryFactory(&struct { + Srcs []string + }{})) + // A module type that has a cflags property but not a srcs property. + ctx.RegisterModuleType("module2", testProductVariableModuleFactoryFactory(&struct { + Cflags []string + }{})) + // A module type that does not have any properties that match product_variables. + ctx.RegisterModuleType("module3", testProductVariableModuleFactoryFactory(&struct { + Foo []string + }{})) + ctx.PreDepsMutators(func(ctx RegisterMutatorsContext) { + ctx.BottomUp("variable", VariableMutator).Parallel() + }) + + ctx.Register() _, errs := ctx.ParseFileList(".", []string{"Android.bp"}) FailIfErrored(t, errs) @@ -293,7 +293,7 @@ func TestProductVariablesDefaults(t *testing.T) { config := TestConfig(buildDir, nil, bp, nil) config.TestProductVariables.Eng = boolPtr(true) - ctx := NewTestContext() + ctx := NewTestContext(config) ctx.RegisterModuleType("test", productVariablesDefaultsTestModuleFactory) ctx.RegisterModuleType("defaults", productVariablesDefaultsTestDefaultsFactory) @@ -303,7 +303,7 @@ func TestProductVariablesDefaults(t *testing.T) { ctx.BottomUp("variable", VariableMutator).Parallel() }) - ctx.Register(config) + ctx.Register() _, errs := ctx.ParseFileList(".", []string{"Android.bp"}) FailIfErrored(t, errs) diff --git a/android/visibility_test.go b/android/visibility_test.go index cb5ef35b3..87a295e23 100644 --- a/android/visibility_test.go +++ b/android/visibility_test.go @@ -1168,7 +1168,7 @@ func testVisibility(buildDir string, fs map[string][]byte) (*TestContext, []erro // Create a new config per test as visibility information is stored in the config. config := TestArchConfig(buildDir, nil, "", fs) - ctx := NewTestArchContext() + ctx := NewTestArchContext(config) ctx.RegisterModuleType("mock_library", newMockLibraryModule) ctx.RegisterModuleType("mock_parent", newMockParentFactory) ctx.RegisterModuleType("mock_defaults", defaultsFactory) @@ -1180,7 +1180,7 @@ func testVisibility(buildDir string, fs map[string][]byte) (*TestContext, []erro ctx.PreArchMutators(RegisterDefaultsPreArchMutators) ctx.PreArchMutators(RegisterVisibilityRuleGatherer) ctx.PostDepsMutators(RegisterVisibilityRuleEnforcer) - ctx.Register(config) + ctx.Register() _, errs := ctx.ParseBlueprintsFiles(".") if len(errs) > 0 { diff --git a/apex/androidmk.go b/apex/androidmk.go index ee8b2b321..993260c7e 100644 --- a/apex/androidmk.go +++ b/apex/androidmk.go @@ -307,6 +307,7 @@ func (a *apexBundle) writeRequiredModules(w io.Writer) { func (a *apexBundle) androidMkForType() android.AndroidMkData { return android.AndroidMkData{ + DistFiles: a.distFiles, Custom: func(w io.Writer, name, prefix, moduleDir string, data android.AndroidMkData) { moduleNames := []string{} apexType := a.properties.ApexType @@ -391,6 +392,9 @@ func (a *apexBundle) androidMkForType() android.AndroidMkData { fmt.Fprintf(w, "$(call dist-for-goals,%s,%s:%s)\n", goal, a.installedFilesFile.String(), distFile) } + for _, dist := range data.Entries.GetDistForGoals(a) { + fmt.Fprintf(w, dist) + } } }} } diff --git a/apex/apex.go b/apex/apex.go index fdc105e37..91770f464 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -63,7 +63,6 @@ var ( testTag = dependencyTag{name: "test", payload: true} keyTag = dependencyTag{name: "key"} certificateTag = dependencyTag{name: "certificate"} - usesTag = dependencyTag{name: "uses"} androidAppTag = dependencyTag{name: "androidApp", payload: true} rroTag = dependencyTag{name: "rro", payload: true} bpfTag = dependencyTag{name: "bpf", payload: true} @@ -764,7 +763,6 @@ func RegisterPostDepsMutators(ctx android.RegisterMutatorsContext) { ctx.BottomUp("apex", apexMutator).Parallel() ctx.BottomUp("apex_directly_in_any", apexDirectlyInAnyMutator).Parallel() ctx.BottomUp("apex_flattened", apexFlattenedMutator).Parallel() - ctx.BottomUp("apex_uses", apexUsesMutator).Parallel() ctx.BottomUp("mark_platform_availability", markPlatformAvailability).Parallel() } @@ -1007,12 +1005,6 @@ func apexFlattenedMutator(mctx android.BottomUpMutatorContext) { } } -func apexUsesMutator(mctx android.BottomUpMutatorContext) { - if ab, ok := mctx.Module().(*apexBundle); ok { - mctx.AddFarVariationDependencies(nil, usesTag, ab.properties.Uses...) - } -} - var ( useVendorAllowListKey = android.NewOnceKey("useVendorAllowList") ) @@ -1132,12 +1124,6 @@ type apexBundleProperties struct { HideFromMake bool `blueprint:"mutated"` - // Indicates this APEX provides C++ shared libaries to other APEXes. Default: false. - Provide_cpp_shared_libs *bool - - // List of providing APEXes' names so that this APEX can depend on provided shared libraries. - Uses []string - // package format of this apex variant; could be non-flattened, flattened, or zip. // imageApex, zipApex or flattened ApexType apexPackaging `blueprint:"mutated"` @@ -1477,6 +1463,8 @@ type apexBundle struct { lintReports android.Paths payloadFsType fsType + + distFiles android.TaggedDistFiles } func addDependenciesForNativeModules(ctx android.BottomUpMutatorContext, @@ -2179,30 +2167,6 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) { var provideNativeLibs []string var requireNativeLibs []string - // Check if "uses" requirements are met with dependent apexBundles - var providedNativeSharedLibs []string - useVendor := proptools.Bool(a.properties.Use_vendor) - ctx.VisitDirectDepsBlueprint(func(m blueprint.Module) { - if ctx.OtherModuleDependencyTag(m) != usesTag { - return - } - otherName := ctx.OtherModuleName(m) - other, ok := m.(*apexBundle) - if !ok { - ctx.PropertyErrorf("uses", "%q is not a provider", otherName) - return - } - if proptools.Bool(other.properties.Use_vendor) != useVendor { - ctx.PropertyErrorf("use_vendor", "%q has different value of use_vendor", otherName) - return - } - if !proptools.Bool(other.properties.Provide_cpp_shared_libs) { - ctx.PropertyErrorf("uses", "%q does not provide native_shared_libs", otherName) - return - } - providedNativeSharedLibs = append(providedNativeSharedLibs, other.properties.Native_shared_libs...) - }) - var filesInfo []apexFile // TODO(jiyong) do this using WalkPayloadDeps ctx.WalkDepsBlueprint(func(child, parent blueprint.Module) bool { @@ -2350,11 +2314,6 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) { // tags used below are private (e.g. `cc.sharedDepTag`). if cc.IsSharedDepTag(depTag) || cc.IsRuntimeDepTag(depTag) { if cc, ok := child.(*cc.Module); ok { - if android.InList(cc.Name(), providedNativeSharedLibs) { - // If we're using a shared library which is provided from other APEX, - // don't include it in this APEX - return false - } if cc.UseVndk() && proptools.Bool(a.properties.Use_vndk_as_stable) && cc.IsVndk() { requireNativeLibs = append(requireNativeLibs, ":vndk") return false @@ -2522,6 +2481,8 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) { a.buildApexDependencyInfo(ctx) a.buildLintReports(ctx) + + a.distFiles = a.GenerateTaggedDistFiles(ctx) } // Enforce that Java deps of the apex are using stable SDKs to compile diff --git a/apex/apex_test.go b/apex/apex_test.go index 09d9c44c4..524549a2d 100644 --- a/apex/apex_test.go +++ b/apex/apex_test.go @@ -149,10 +149,8 @@ func testApexContext(_ *testing.T, bp string, handlers ...testCustomizer) (*andr "system/sepolicy/apex/myapex.updatable-file_contexts": nil, "system/sepolicy/apex/myapex2-file_contexts": nil, "system/sepolicy/apex/otherapex-file_contexts": nil, - "system/sepolicy/apex/commonapex-file_contexts": nil, "system/sepolicy/apex/com.android.vndk-file_contexts": nil, "mylib.cpp": nil, - "mylib_common.cpp": nil, "mytest.cpp": nil, "mytest1.cpp": nil, "mytest2.cpp": nil, @@ -216,7 +214,7 @@ func testApexContext(_ *testing.T, bp string, handlers ...testCustomizer) (*andr handler(tempFS, config) } - ctx := android.NewTestArchContext() + ctx := android.NewTestArchContext(config) // from android package android.RegisterPackageBuildComponents(ctx) @@ -261,7 +259,7 @@ func testApexContext(_ *testing.T, bp string, handlers ...testCustomizer) (*andr ctx.PreDepsMutators(RegisterPreDepsMutators) ctx.PostDepsMutators(RegisterPostDepsMutators) - ctx.Register(config) + ctx.Register() return ctx, config } @@ -4202,131 +4200,6 @@ func TestInstallExtraFlattenedApexes(t *testing.T) { ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened") } -func TestApexUsesOtherApex(t *testing.T) { - ctx, _ := testApex(t, ` - apex { - name: "myapex", - key: "myapex.key", - native_shared_libs: ["mylib"], - uses: ["commonapex"], - } - - apex { - name: "commonapex", - key: "myapex.key", - native_shared_libs: ["libcommon"], - provide_cpp_shared_libs: true, - } - - apex_key { - name: "myapex.key", - public_key: "testkey.avbpubkey", - private_key: "testkey.pem", - } - - cc_library { - name: "mylib", - srcs: ["mylib.cpp"], - shared_libs: ["libcommon"], - system_shared_libs: [], - stl: "none", - apex_available: [ "myapex" ], - } - - cc_library { - name: "libcommon", - srcs: ["mylib_common.cpp"], - system_shared_libs: [], - stl: "none", - // TODO: remove //apex_available:platform - apex_available: [ - "//apex_available:platform", - "commonapex", - "myapex", - ], - } - `) - - module1 := ctx.ModuleForTests("myapex", "android_common_myapex_image") - apexRule1 := module1.Rule("apexRule") - copyCmds1 := apexRule1.Args["copy_commands"] - - module2 := ctx.ModuleForTests("commonapex", "android_common_commonapex_image") - apexRule2 := module2.Rule("apexRule") - copyCmds2 := apexRule2.Args["copy_commands"] - - ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000") - ensureListContains(t, ctx.ModuleVariantsForTests("libcommon"), "android_arm64_armv8-a_shared_apex10000") - ensureContains(t, copyCmds1, "image.apex/lib64/mylib.so") - ensureContains(t, copyCmds2, "image.apex/lib64/libcommon.so") - ensureNotContains(t, copyCmds1, "image.apex/lib64/libcommon.so") -} - -func TestApexUsesFailsIfNotProvided(t *testing.T) { - testApexError(t, `uses: "commonapex" does not provide native_shared_libs`, ` - apex { - name: "myapex", - key: "myapex.key", - uses: ["commonapex"], - } - - apex { - name: "commonapex", - key: "myapex.key", - } - - apex_key { - name: "myapex.key", - public_key: "testkey.avbpubkey", - private_key: "testkey.pem", - } - `) - testApexError(t, `uses: "commonapex" is not a provider`, ` - apex { - name: "myapex", - key: "myapex.key", - uses: ["commonapex"], - } - - cc_library { - name: "commonapex", - system_shared_libs: [], - stl: "none", - } - - apex_key { - name: "myapex.key", - public_key: "testkey.avbpubkey", - private_key: "testkey.pem", - } - `) -} - -func TestApexUsesFailsIfUseVenderMismatch(t *testing.T) { - testApexError(t, `use_vendor: "commonapex" has different value of use_vendor`, ` - apex { - name: "myapex", - key: "myapex.key", - use_vendor: true, - uses: ["commonapex"], - } - - apex { - name: "commonapex", - key: "myapex.key", - provide_cpp_shared_libs: true, - } - - apex_key { - name: "myapex.key", - public_key: "testkey.avbpubkey", - private_key: "testkey.pem", - } - `, func(fs map[string][]byte, config android.Config) { - setUseVendorAllowListForTest(config, []string{"myapex"}) - }) -} - func TestErrorsIfDepsAreNotEnabled(t *testing.T) { testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, ` apex { @@ -5746,7 +5619,9 @@ func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpre } cc.GatherRequiredFilesForTest(fs) - ctx := android.NewTestArchContext() + config := android.TestArchConfig(buildDir, nil, bp, fs) + + ctx := android.NewTestArchContext(config) ctx.RegisterModuleType("apex", BundleFactory) ctx.RegisterModuleType("apex_key", ApexKeyFactory) ctx.RegisterModuleType("filegroup", android.FileGroupFactory) @@ -5761,8 +5636,7 @@ func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpre ctx.PreDepsMutators(RegisterPreDepsMutators) ctx.PostDepsMutators(RegisterPostDepsMutators) - config := android.TestArchConfig(buildDir, nil, bp, fs) - ctx.Register(config) + ctx.Register() _ = dexpreopt.GlobalSoongConfigForTests(config) dexpreopt.RegisterToolModulesForTest(ctx) @@ -5897,7 +5771,15 @@ func testApexPermittedPackagesRules(t *testing.T, errmsg, bp string, apexBootJar "system/sepolicy/apex/myapex-file_contexts": nil, } - ctx := android.NewTestArchContext() + config := android.TestArchConfig(buildDir, nil, bp, fs) + android.SetTestNeverallowRules(config, rules) + updatableBootJars := make([]string, 0, len(apexBootJars)) + for _, apexBootJar := range apexBootJars { + updatableBootJars = append(updatableBootJars, "myapex:"+apexBootJar) + } + config.TestProductVariables.UpdatableBootJars = android.CreateTestConfiguredJarList(updatableBootJars) + + ctx := android.NewTestArchContext(config) ctx.RegisterModuleType("apex", BundleFactory) ctx.RegisterModuleType("apex_key", ApexKeyFactory) ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators) @@ -5910,15 +5792,7 @@ func testApexPermittedPackagesRules(t *testing.T, errmsg, bp string, apexBootJar ctx.PostDepsMutators(RegisterPostDepsMutators) ctx.PostDepsMutators(android.RegisterNeverallowMutator) - config := android.TestArchConfig(buildDir, nil, bp, fs) - android.SetTestNeverallowRules(config, rules) - updatableBootJars := make([]string, 0, len(apexBootJars)) - for _, apexBootJar := range apexBootJars { - updatableBootJars = append(updatableBootJars, "myapex:"+apexBootJar) - } - config.TestProductVariables.UpdatableBootJars = android.CreateTestConfiguredJarList(updatableBootJars) - - ctx.Register(config) + ctx.Register() _, errs := ctx.ParseBlueprintsFiles("Android.bp") android.FailIfErrored(t, errs) diff --git a/bpf/bpf_test.go b/bpf/bpf_test.go index d06d7d1a5..be9e36ea5 100644 --- a/bpf/bpf_test.go +++ b/bpf/bpf_test.go @@ -58,9 +58,9 @@ func testConfig(buildDir string, env map[string]string, bp string) android.Confi } func testContext(config android.Config) *android.TestContext { - ctx := cc.CreateTestContext() + ctx := cc.CreateTestContext(config) ctx.RegisterModuleType("bpf", BpfFactory) - ctx.Register(config) + ctx.Register() return ctx } diff --git a/build_test.bash b/build_test.bash index a53a58598..accca0f81 100755 --- a/build_test.bash +++ b/build_test.bash @@ -43,14 +43,9 @@ case $(uname) in ;; esac -function bazel_cleanup { - "${TOP}/tools/bazel" shutdown -} -trap bazel_cleanup EXIT - echo echo "Running Bazel smoke test..." -"${TOP}/tools/bazel" info +"${TOP}/tools/bazel" --batch --max_idle_secs=1 info echo echo "Running Soong test..." @@ -592,6 +592,11 @@ func IsStaticDepTag(depTag blueprint.DependencyTag) bool { return ok && ccLibDepTag.static() } +func IsHeaderDepTag(depTag blueprint.DependencyTag) bool { + ccLibDepTag, ok := depTag.(libraryDependencyTag) + return ok && ccLibDepTag.header() +} + func IsRuntimeDepTag(depTag blueprint.DependencyTag) bool { ccDepTag, ok := depTag.(dependencyTag) return ok && ccDepTag == runtimeDepTag diff --git a/cc/cc_test.go b/cc/cc_test.go index b3bb282a6..b803cbaa0 100644 --- a/cc/cc_test.go +++ b/cc/cc_test.go @@ -53,8 +53,8 @@ func TestMain(m *testing.M) { func testCcWithConfig(t *testing.T, config android.Config) *android.TestContext { t.Helper() - ctx := CreateTestContext() - ctx.Register(config) + ctx := CreateTestContext(config) + ctx.Register() _, errs := ctx.ParseFileList(".", []string{"Android.bp"}) android.FailIfErrored(t, errs) @@ -84,8 +84,8 @@ func testCcNoVndk(t *testing.T, bp string) *android.TestContext { func testCcErrorWithConfig(t *testing.T, pattern string, config android.Config) { t.Helper() - ctx := CreateTestContext() - ctx.Register(config) + ctx := CreateTestContext(config) + ctx.Register() _, errs := ctx.ParseFileList(".", []string{"Android.bp"}) if len(errs) > 0 { @@ -1293,8 +1293,8 @@ func TestVendorSnapshotUse(t *testing.T) { config := TestConfig(buildDir, android.Android, nil, "", mockFS) config.TestProductVariables.DeviceVndkVersion = StringPtr("BOARD") config.TestProductVariables.Platform_vndk_version = StringPtr("VER") - ctx := CreateTestContext() - ctx.Register(config) + ctx := CreateTestContext(config) + ctx.Register() _, errs := ctx.ParseFileList(".", []string{"deps/Android.bp", "framework/Android.bp", "vendor/Android.bp", "vndk/Android.bp"}) android.FailIfErrored(t, errs) @@ -1451,8 +1451,8 @@ func TestVendorSnapshotExclude(t *testing.T) { config := TestConfig(buildDir, android.Android, nil, "", mockFS) config.TestProductVariables.DeviceVndkVersion = StringPtr("current") config.TestProductVariables.Platform_vndk_version = StringPtr("VER") - ctx := CreateTestContext() - ctx.Register(config) + ctx := CreateTestContext(config) + ctx.Register() _, errs := ctx.ParseFileList(".", []string{"deps/Android.bp", "framework/Android.bp", "device/Android.bp"}) android.FailIfErrored(t, errs) @@ -1541,8 +1541,8 @@ func TestVendorSnapshotExcludeInVendorProprietaryPathErrors(t *testing.T) { config := TestConfig(buildDir, android.Android, nil, "", mockFS) config.TestProductVariables.DeviceVndkVersion = StringPtr("current") config.TestProductVariables.Platform_vndk_version = StringPtr("VER") - ctx := CreateTestContext() - ctx.Register(config) + ctx := CreateTestContext(config) + ctx.Register() _, errs := ctx.ParseFileList(".", []string{"deps/Android.bp", "device/Android.bp"}) android.FailIfErrored(t, errs) @@ -1582,8 +1582,8 @@ func TestVendorSnapshotExcludeWithVendorAvailable(t *testing.T) { config := TestConfig(buildDir, android.Android, nil, "", mockFS) config.TestProductVariables.DeviceVndkVersion = StringPtr("current") config.TestProductVariables.Platform_vndk_version = StringPtr("VER") - ctx := CreateTestContext() - ctx.Register(config) + ctx := CreateTestContext(config) + ctx.Register() _, errs := ctx.ParseFileList(".", []string{"deps/Android.bp", "framework/Android.bp"}) android.FailIfErrored(t, errs) @@ -3882,11 +3882,11 @@ func TestProductVariableDefaults(t *testing.T) { config := TestConfig(buildDir, android.Android, nil, bp, nil) config.TestProductVariables.Debuggable = BoolPtr(true) - ctx := CreateTestContext() + ctx := CreateTestContext(config) ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) { ctx.BottomUp("variable", android.VariableMutator).Parallel() }) - ctx.Register(config) + ctx.Register() _, errs := ctx.ParseFileList(".", []string{"Android.bp"}) android.FailIfErrored(t, errs) @@ -3917,9 +3917,9 @@ func TestEmptyWholeStaticLibsAllowMissingDependencies(t *testing.T) { config := TestConfig(buildDir, android.Android, nil, bp, nil) config.TestProductVariables.Allow_missing_dependencies = BoolPtr(true) - ctx := CreateTestContext() + ctx := CreateTestContext(config) ctx.SetAllowMissingDependencies(true) - ctx.Register(config) + ctx.Register() _, errs := ctx.ParseFileList(".", []string{"Android.bp"}) android.FailIfErrored(t, errs) diff --git a/cc/genrule_test.go b/cc/genrule_test.go index a366f765c..0c7952b70 100644 --- a/cc/genrule_test.go +++ b/cc/genrule_test.go @@ -22,9 +22,9 @@ import ( ) func testGenruleContext(config android.Config) *android.TestContext { - ctx := android.NewTestArchContext() + ctx := android.NewTestArchContext(config) ctx.RegisterModuleType("cc_genrule", genRuleFactory) - ctx.Register(config) + ctx.Register() return ctx } diff --git a/cc/linkable.go b/cc/linkable.go index 60ab6dff4..0609b288d 100644 --- a/cc/linkable.go +++ b/cc/linkable.go @@ -64,6 +64,10 @@ func StaticDepTag() blueprint.DependencyTag { return libraryDependencyTag{Kind: staticLibraryDependency} } +func HeaderDepTag() blueprint.DependencyTag { + return libraryDependencyTag{Kind: headerLibraryDependency} +} + type SharedLibraryInfo struct { SharedLibrary android.Path UnstrippedSharedLibrary android.Path diff --git a/cc/prebuilt_test.go b/cc/prebuilt_test.go index 1f070a508..5bf334e3e 100644 --- a/cc/prebuilt_test.go +++ b/cc/prebuilt_test.go @@ -25,7 +25,7 @@ import ( func testPrebuilt(t *testing.T, bp string, fs map[string][]byte, handlers ...configCustomizer) *android.TestContext { config := TestConfig(buildDir, android.Android, nil, bp, fs) - ctx := CreateTestContext() + ctx := CreateTestContext(config) // Enable androidmk support. // * Register the singleton @@ -38,7 +38,7 @@ func testPrebuilt(t *testing.T, bp string, fs map[string][]byte, handlers ...con handler(config) } - ctx.Register(config) + ctx.Register() _, errs := ctx.ParseFileList(".", []string{"Android.bp"}) android.FailIfErrored(t, errs) _, errs = ctx.PrepareBuildActions(config) diff --git a/cc/test_data_test.go b/cc/test_data_test.go index ae59e2f0f..426dfc57c 100644 --- a/cc/test_data_test.go +++ b/cc/test_data_test.go @@ -122,10 +122,10 @@ func TestDataTests(t *testing.T) { "dir/baz": nil, "dir/bar/baz": nil, }) - ctx := android.NewTestContext() + ctx := android.NewTestContext(config) ctx.RegisterModuleType("filegroup", android.FileGroupFactory) ctx.RegisterModuleType("test", newTest) - ctx.Register(config) + ctx.Register() _, errs := ctx.ParseBlueprintsFiles("Blueprints") android.FailIfErrored(t, errs) diff --git a/cc/testing.go b/cc/testing.go index 388a9ce54..5a311f4b9 100644 --- a/cc/testing.go +++ b/cc/testing.go @@ -545,8 +545,8 @@ func TestConfig(buildDir string, os android.OsType, env map[string]string, return config } -func CreateTestContext() *android.TestContext { - ctx := android.NewTestArchContext() +func CreateTestContext(config android.Config) *android.TestContext { + ctx := android.NewTestArchContext(config) ctx.RegisterModuleType("cc_fuzz", FuzzFactory) ctx.RegisterModuleType("cc_test", TestFactory) ctx.RegisterModuleType("cc_test_library", TestLibraryFactory) diff --git a/cmd/soong_build/main.go b/cmd/soong_build/main.go index 9d7dddd84..b88803a72 100644 --- a/cmd/soong_build/main.go +++ b/cmd/soong_build/main.go @@ -52,7 +52,7 @@ func newNameResolver(config android.Config) *android.NameResolver { } func newContext(srcDir string, configuration android.Config) *android.Context { - ctx := android.NewContext() + ctx := android.NewContext(configuration) ctx.Register() if !shouldPrepareBuildActions() { configuration.SetStopBefore(bootstrap.StopBeforePrepareBuildActions) @@ -95,6 +95,7 @@ func main() { // TODO(cparsons): Don't output any ninja file, as the second pass will overwrite // the incorrect results from the first pass, and file I/O is expensive. firstCtx := newContext(srcDir, configuration) + configuration.SetStopBefore(bootstrap.StopBeforeWriteNinja) bootstrap.Main(firstCtx.Context, configuration, extraNinjaDeps...) // Invoke bazel commands and save results for second pass. if err := configuration.BazelContext.InvokeBazel(); err != nil { diff --git a/cmd/soong_build/queryview_test.go b/cmd/soong_build/queryview_test.go index 675b53280..525802a79 100644 --- a/cmd/soong_build/queryview_test.go +++ b/cmd/soong_build/queryview_test.go @@ -234,9 +234,9 @@ func TestGenerateBazelQueryViewFromBlueprint(t *testing.T) { for _, testCase := range testCases { config := android.TestConfig(buildDir, nil, testCase.bp, nil) - ctx := android.NewTestContext() + ctx := android.NewTestContext(config) ctx.RegisterModuleType("custom", customModuleFactory) - ctx.Register(config) + ctx.Register() _, errs := ctx.ParseFileList(".", []string{"Android.bp"}) android.FailIfErrored(t, errs) diff --git a/cmd/soong_ui/main.go b/cmd/soong_ui/main.go index e778bd638..aee8e5a49 100644 --- a/cmd/soong_ui/main.go +++ b/cmd/soong_ui/main.go @@ -471,11 +471,9 @@ func make(ctx build.Context, config build.Config, _ []string, logsDir string) { ctx.Fatal("done") } - var toBuild int - if _, ok := config.Environment().Get("USE_BAZEL"); ok { + toBuild := build.BuildAll + if config.UseBazel() { toBuild = build.BuildAllWithBazel - } else { - toBuild = build.BuildAll } if config.Checkbuild() { diff --git a/dexpreopt/class_loader_context.go b/dexpreopt/class_loader_context.go index 6d778123f..77d6ee9e3 100644 --- a/dexpreopt/class_loader_context.go +++ b/dexpreopt/class_loader_context.go @@ -16,7 +16,7 @@ package dexpreopt import ( "fmt" - "path/filepath" + "strconv" "strings" "android/soong/android" @@ -49,39 +49,39 @@ var CompatUsesLibs = android.CopyOf(CompatUsesLibs29) const UnknownInstallLibraryPath = "error" -const AnySdkVersion int = 9999 // should go last in class loader context +// AnySdkVersion means that the class loader context is needed regardless of the targetSdkVersion +// of the app. The numeric value affects the key order in the map and, as a result, the order of +// arguments passed to construct_context.py (high value means that the unconditional context goes +// last). We use the converntional "current" SDK level (10000), but any big number would do as well. +const AnySdkVersion int = android.FutureApiLevelInt -// LibraryPath contains paths to the library DEX jar on host and on device. -type LibraryPath struct { - Host android.Path - Device string -} - -// LibraryPaths is a map from library name to on-host and on-device paths to its DEX jar. -type LibraryPaths map[string]*LibraryPath +// ClassLoaderContext is a tree of libraries used by the dexpreopted module with their dependencies. +// The context is used by dex2oat to compile the module and recorded in the AOT-compiled files, so +// that it can be checked agains the run-time class loader context on device. If there is a mismatch +// at runtime, AOT-compiled code is rejected. +type ClassLoaderContext struct { + // The name of the library (same as the name of the module that contains it). + Name string -type classLoaderContext struct { - // Library names - Names []string + // On-host build path to the library dex file (used in dex2oat argument --class-loader-context). + Host android.Path - // The class loader context using paths in the build. - Host android.Paths + // On-device install path (used in dex2oat argument --stored-class-loader-context). + Device string - // The class loader context using paths as they will be on the device. - Target []string + // Nested class loader subcontexts for dependencies. + Subcontexts []*ClassLoaderContext } -// A map of class loader contexts for each SDK version. -// A map entry for "any" version contains libraries that are unconditionally added to class loader -// context. Map entries for existing versions contains libraries that were in the default classpath -// until that API version, and should be added to class loader context if and only if the -// targetSdkVersion in the manifest or APK is less than that API version. -type classLoaderContextMap map[int]*classLoaderContext +// ClassLoaderContextMap is a map from SDK version to a class loader context. +// There is a special entry with key AnySdkVersion that stores unconditional class loader context. +// Other entries store conditional contexts that should be added for some apps that have +// targetSdkVersion in the manifest lower than the key SDK version. +type ClassLoaderContextMap map[int][]*ClassLoaderContext -// Add a new library path to the map, unless a path for this library already exists. -// If necessary, check that the build and install paths exist. -func (libPaths LibraryPaths) addLibraryPath(ctx android.ModuleInstallPathContext, lib string, - hostPath, installPath android.Path, strict bool) error { +// Add class loader context for the given library to the map entry for the given SDK version. +func (clcMap ClassLoaderContextMap) addContext(ctx android.ModuleInstallPathContext, sdkVer int, lib string, + hostPath, installPath android.Path, strict bool, nestedClcMap ClassLoaderContextMap) error { // If missing dependencies are allowed, the build shouldn't fail when a <uses-library> is // not found. However, this is likely to result is disabling dexpreopt, as it won't be @@ -89,263 +89,277 @@ func (libPaths LibraryPaths) addLibraryPath(ctx android.ModuleInstallPathContext strict = strict && !ctx.Config().AllowMissingDependencies() if hostPath == nil && strict { - return fmt.Errorf("unknown build path to <uses-library> '%s'", lib) + return fmt.Errorf("unknown build path to <uses-library> \"%s\"", lib) } + devicePath := UnknownInstallLibraryPath if installPath == nil { if android.InList(lib, CompatUsesLibs) || android.InList(lib, OptionalCompatUsesLibs) { // Assume that compatibility libraries are installed in /system/framework. installPath = android.PathForModuleInstall(ctx, "framework", lib+".jar") } else if strict { - return fmt.Errorf("unknown install path to <uses-library> '%s'", lib) - } - } - - // Add a library only if the build and install path to it is known. - if _, present := libPaths[lib]; !present { - var devicePath string - if installPath != nil { - devicePath = android.InstallPathToOnDevicePath(ctx, installPath.(android.InstallPath)) + return fmt.Errorf("unknown install path to <uses-library> \"%s\"", lib) } else { // For some stub libraries the only known thing is the name of their implementation // library, but the library itself is unavailable (missing or part of a prebuilt). In // such cases we still need to add the library to <uses-library> tags in the manifest, - // but we cannot use if for dexpreopt. - devicePath = UnknownInstallLibraryPath + // but we cannot use it for dexpreopt. + } + } + if installPath != nil { + devicePath = android.InstallPathToOnDevicePath(ctx, installPath.(android.InstallPath)) + } + + // Nested class loader context shouldn't have conditional part (it is allowed only at the top level). + for ver, _ := range nestedClcMap { + if ver != AnySdkVersion { + clcStr, _ := ComputeClassLoaderContext(nestedClcMap) + return fmt.Errorf("nested class loader context shouldn't have conditional part: %s", clcStr) } - libPaths[lib] = &LibraryPath{hostPath, devicePath} } + subcontexts := nestedClcMap[AnySdkVersion] + + // If the library with this name is already present as one of the unconditional top-level + // components, do not re-add it. + for _, clc := range clcMap[sdkVer] { + if clc.Name == lib { + return nil + } + } + + clcMap[sdkVer] = append(clcMap[sdkVer], &ClassLoaderContext{ + Name: lib, + Host: hostPath, + Device: devicePath, + Subcontexts: subcontexts, + }) return nil } -// Wrapper around addLibraryPath that does error reporting. -func (libPaths LibraryPaths) addLibraryPathOrReportError(ctx android.ModuleInstallPathContext, lib string, - hostPath, installPath android.Path, strict bool) { +// Wrapper around addContext that reports errors. +func (clcMap ClassLoaderContextMap) addContextOrReportError(ctx android.ModuleInstallPathContext, sdkVer int, lib string, + hostPath, installPath android.Path, strict bool, nestedClcMap ClassLoaderContextMap) { - err := libPaths.addLibraryPath(ctx, lib, hostPath, installPath, strict) + err := clcMap.addContext(ctx, sdkVer, lib, hostPath, installPath, strict, nestedClcMap) if err != nil { + ctx.ModuleErrorf(err.Error()) android.ReportPathErrorf(ctx, err.Error()) } } -// Add a new library path to the map. Enforce checks that the library paths exist. -func (libPaths LibraryPaths) AddLibraryPath(ctx android.ModuleInstallPathContext, lib string, hostPath, installPath android.Path) { - libPaths.addLibraryPathOrReportError(ctx, lib, hostPath, installPath, true) +// Add class loader context. Fail on unknown build/install paths. +func (clcMap ClassLoaderContextMap) AddContext(ctx android.ModuleInstallPathContext, lib string, + hostPath, installPath android.Path) { + + clcMap.addContextOrReportError(ctx, AnySdkVersion, lib, hostPath, installPath, true, nil) } -// Add a new library path to the map, if the library exists (name is not nil). -// Don't enforce checks that the library paths exist. Some libraries may be missing from the build, -// but their names still need to be added to <uses-library> tags in the manifest. -func (libPaths LibraryPaths) MaybeAddLibraryPath(ctx android.ModuleInstallPathContext, lib *string, hostPath, installPath android.Path) { +// Add class loader context if the library exists. Don't fail on unknown build/install paths. +func (clcMap ClassLoaderContextMap) MaybeAddContext(ctx android.ModuleInstallPathContext, lib *string, + hostPath, installPath android.Path) { + if lib != nil { - libPaths.addLibraryPathOrReportError(ctx, *lib, hostPath, installPath, false) + clcMap.addContextOrReportError(ctx, AnySdkVersion, *lib, hostPath, installPath, false, nil) } } -// Add library paths from the second map to the first map (do not override existing entries). -func (libPaths LibraryPaths) AddLibraryPaths(otherPaths LibraryPaths) { - for lib, path := range otherPaths { - if _, present := libPaths[lib]; !present { - libPaths[lib] = path - } - } -} +// Add class loader context for the given SDK version. Fail on unknown build/install paths. +func (clcMap ClassLoaderContextMap) AddContextForSdk(ctx android.ModuleInstallPathContext, sdkVer int, + lib string, hostPath, installPath android.Path, nestedClcMap ClassLoaderContextMap) { -func (m classLoaderContextMap) getValue(sdkVer int) *classLoaderContext { - if _, ok := m[sdkVer]; !ok { - m[sdkVer] = &classLoaderContext{} - } - return m[sdkVer] + clcMap.addContextOrReportError(ctx, sdkVer, lib, hostPath, installPath, true, nestedClcMap) } -func (clc *classLoaderContext) addLib(lib string, hostPath android.Path, targetPath string) { - clc.Names = append(clc.Names, lib) - clc.Host = append(clc.Host, hostPath) - clc.Target = append(clc.Target, targetPath) -} +// Merge the other class loader context map into this one, do not override existing entries. +// The implicitRootLib parameter is the name of the library for which the other class loader +// context map was constructed. If the implicitRootLib is itself a <uses-library>, it should be +// already present in the class loader context (with the other context as its subcontext) -- in +// that case do not re-add the other context. Otherwise add the other context at the top-level. +func (clcMap ClassLoaderContextMap) AddContextMap(otherClcMap ClassLoaderContextMap, implicitRootLib string) { + if otherClcMap == nil { + return + } -func (m classLoaderContextMap) addLibs(ctx android.PathContext, sdkVer int, module *ModuleConfig, - libs ...string) (bool, error) { + // If the implicit root of the merged map is already present as one of top-level subtrees, do + // not merge it second time. + for _, clc := range clcMap[AnySdkVersion] { + if clc.Name == implicitRootLib { + return + } + } - clc := m.getValue(sdkVer) - for _, lib := range libs { - if p, ok := module.LibraryPaths[lib]; ok && p.Host != nil && p.Device != UnknownInstallLibraryPath { - clc.addLib(lib, p.Host, p.Device) - } else { - if sdkVer == AnySdkVersion { - // Fail the build if dexpreopt doesn't know paths to one of the <uses-library> - // dependencies. In the future we may need to relax this and just disable dexpreopt. - return false, fmt.Errorf("dexpreopt cannot find path for <uses-library> '%s'", lib) - } else { - // No error for compatibility libraries, as Soong doesn't know if they are needed - // (this depends on the targetSdkVersion in the manifest). - return false, nil + for sdkVer, otherClcs := range otherClcMap { + for _, otherClc := range otherClcs { + alreadyHave := false + for _, clc := range clcMap[sdkVer] { + if clc.Name == otherClc.Name { + alreadyHave = true + break + } + } + if !alreadyHave { + clcMap[sdkVer] = append(clcMap[sdkVer], otherClc) } } } - return true, nil } -func (m classLoaderContextMap) addSystemServerLibs(sdkVer int, ctx android.PathContext, module *ModuleConfig, libs ...string) { - clc := m.getValue(sdkVer) - for _, lib := range libs { - clc.addLib(lib, SystemServerDexJarHostPath(ctx, lib), filepath.Join("/system/framework", lib+".jar")) +// List of libraries in the unconditional class loader context, excluding dependencies of shared libraries. +func (clcMap ClassLoaderContextMap) UsesLibs() (ulibs []string) { + if clcMap != nil { + // compatibility libraries (those in conditional context) are not added to <uses-library> tags + ulibs = usesLibsRec(clcMap[AnySdkVersion]) + ulibs = android.FirstUniqueStrings(ulibs) } + return ulibs } -func (m classLoaderContextMap) usesLibs() []string { - if clc, ok := m[AnySdkVersion]; ok { - return clc.Names +func usesLibsRec(clcs []*ClassLoaderContext) (ulibs []string) { + for _, clc := range clcs { + ulibs = append(ulibs, clc.Name) + ulibs = append(ulibs, usesLibsRec(clc.Subcontexts)...) } - return nil -} - -// genClassLoaderContext generates host and target class loader context to be passed to the dex2oat -// command for the dexpreopted module. There are three possible cases: -// -// 1. System server jars. They have a special class loader context that includes other system -// server jars. -// -// 2. Library jars or APKs which have precise list of their <uses-library> libs. Their class loader -// context includes build and on-device paths to these libs. In some cases it may happen that -// the path to a <uses-library> is unknown (e.g. the dexpreopted module may depend on stubs -// library, whose implementation library is missing from the build altogether). In such case -// dexpreopting with the <uses-library> is impossible, and dexpreopting without it is pointless, -// as the runtime classpath won't match and the dexpreopted code will be discarded. Therefore in -// such cases the function returns nil, which disables dexpreopt. -// -// 3. All other library jars or APKs for which the exact <uses-library> list is unknown. They use -// the unsafe &-classpath workaround that means empty class loader context and absence of runtime -// check that the class loader context provided by the PackageManager agrees with the stored -// class loader context recorded in the .odex file. -// -func genClassLoaderContext(ctx android.PathContext, global *GlobalConfig, module *ModuleConfig) (*classLoaderContextMap, error) { - classLoaderContexts := make(classLoaderContextMap) - systemServerJars := NonUpdatableSystemServerJars(ctx, global) - - if jarIndex := android.IndexList(module.Name, systemServerJars); jarIndex >= 0 { - // System server jars should be dexpreopted together: class loader context of each jar - // should include all preceding jars on the system server classpath. - classLoaderContexts.addSystemServerLibs(AnySdkVersion, ctx, module, systemServerJars[:jarIndex]...) - - } else if module.EnforceUsesLibraries { - // Unconditional class loader context. - usesLibs := append(copyOf(module.UsesLibraries), module.OptionalUsesLibraries...) - if ok, err := classLoaderContexts.addLibs(ctx, AnySdkVersion, module, usesLibs...); !ok { - return nil, err - } - - // Conditional class loader context for API version < 28. - const httpLegacy = "org.apache.http.legacy" - if ok, err := classLoaderContexts.addLibs(ctx, 28, module, httpLegacy); !ok { - return nil, err - } - - // Conditional class loader context for API version < 29. - usesLibs29 := []string{ - "android.hidl.base-V1.0-java", - "android.hidl.manager-V1.0-java", - } - if ok, err := classLoaderContexts.addLibs(ctx, 29, module, usesLibs29...); !ok { - return nil, err - } - - // Conditional class loader context for API version < 30. - if ok, err := classLoaderContexts.addLibs(ctx, 30, module, OptionalCompatUsesLibs30...); !ok { - return nil, err - } - - } else { - // Pass special class loader context to skip the classpath and collision check. - // This will get removed once LOCAL_USES_LIBRARIES is enforced. - // Right now LOCAL_USES_LIBRARIES is opt in, for the case where it's not specified we still default - // to the &. - } - - fixConditionalClassLoaderContext(classLoaderContexts) - - return &classLoaderContexts, nil + return ulibs } // Now that the full unconditional context is known, reconstruct conditional context. // Apply filters for individual libraries, mirroring what the PackageManager does when it // constructs class loader context on device. // -// TODO(b/132357300): -// - remove android.hidl.manager and android.hidl.base unless the app is a system app. +// TODO(b/132357300): remove "android.hidl.manager" and "android.hidl.base" for non-system apps. // -func fixConditionalClassLoaderContext(clcMap classLoaderContextMap) { - usesLibs := clcMap.usesLibs() +func fixClassLoaderContext(clcMap ClassLoaderContextMap) { + usesLibs := clcMap.UsesLibs() - for sdkVer, clc := range clcMap { + for sdkVer, clcs := range clcMap { if sdkVer == AnySdkVersion { continue } - clcMap[sdkVer] = &classLoaderContext{} - for i, lib := range clc.Names { - if android.InList(lib, usesLibs) { + fixedClcs := []*ClassLoaderContext{} + for _, clc := range clcs { + if android.InList(clc.Name, usesLibs) { // skip compatibility libraries that are already included in unconditional context - } else if lib == AndroidTestMock && !android.InList("android.test.runner", usesLibs) { + } else if clc.Name == AndroidTestMock && !android.InList("android.test.runner", usesLibs) { // android.test.mock is only needed as a compatibility library (in conditional class // loader context) if android.test.runner is used, otherwise skip it } else { - clcMap[sdkVer].addLib(lib, clc.Host[i], clc.Target[i]) + fixedClcs = append(fixedClcs, clc) } + clcMap[sdkVer] = fixedClcs } } } -// Return the class loader context as a string and a slice of build paths for all dependencies. -func computeClassLoaderContext(ctx android.PathContext, clcMap classLoaderContextMap) (clcStr string, paths android.Paths) { - for _, ver := range android.SortedIntKeys(clcMap) { - clc := clcMap.getValue(ver) +// Return true if all build/install library paths are valid (including recursive subcontexts), +// otherwise return false. A build path is valid if it's not nil. An install path is valid if it's +// not equal to a special "error" value. +func validateClassLoaderContext(clcMap ClassLoaderContextMap) (bool, error) { + for sdkVer, clcs := range clcMap { + if valid, err := validateClassLoaderContextRec(sdkVer, clcs); !valid || err != nil { + return valid, err + } + } + return true, nil +} - clcLen := len(clc.Names) - if clcLen != len(clc.Host) || clcLen != len(clc.Target) { - android.ReportPathErrorf(ctx, "ill-formed class loader context") +func validateClassLoaderContextRec(sdkVer int, clcs []*ClassLoaderContext) (bool, error) { + for _, clc := range clcs { + if clc.Host == nil || clc.Device == UnknownInstallLibraryPath { + if sdkVer == AnySdkVersion { + // Return error if dexpreopt doesn't know paths to one of the <uses-library> + // dependencies. In the future we may need to relax this and just disable dexpreopt. + return false, fmt.Errorf("invalid path for <uses-library> \"%s\"", clc.Name) + } else { + // No error for compatibility libraries, as Soong doesn't know if they are needed + // (this depends on the targetSdkVersion in the manifest), but the CLC is invalid. + return false, nil + } + } + if valid, err := validateClassLoaderContextRec(sdkVer, clc.Subcontexts); !valid || err != nil { + return valid, err } + } + return true, nil +} - var hostClc, targetClc []string - var hostPaths android.Paths +// Return the class loader context as a string, and a slice of build paths for all dependencies. +// Perform a depth-first preorder traversal of the class loader context tree for each SDK version. +// Return the resulting string and a slice of on-host build paths to all library dependencies. +func ComputeClassLoaderContext(clcMap ClassLoaderContextMap) (clcStr string, paths android.Paths) { + for _, sdkVer := range android.SortedIntKeys(clcMap) { // determinisitc traversal order + sdkVerStr := fmt.Sprintf("%d", sdkVer) + if sdkVer == AnySdkVersion { + sdkVerStr = "any" // a special keyword that means any SDK version + } + hostClc, targetClc, hostPaths := computeClassLoaderContextRec(clcMap[sdkVer]) + if hostPaths != nil { + clcStr += fmt.Sprintf(" --host-context-for-sdk %s %s", sdkVerStr, hostClc) + clcStr += fmt.Sprintf(" --target-context-for-sdk %s %s", sdkVerStr, targetClc) + } + paths = append(paths, hostPaths...) + } + return clcStr, android.FirstUniquePaths(paths) +} - for i := 0; i < clcLen; i++ { - hostStr := "PCL[" + clc.Host[i].String() + "]" - targetStr := "PCL[" + clc.Target[i] + "]" +func computeClassLoaderContextRec(clcs []*ClassLoaderContext) (string, string, android.Paths) { + var paths android.Paths + var clcsHost, clcsTarget []string - hostClc = append(hostClc, hostStr) - targetClc = append(targetClc, targetStr) - hostPaths = append(hostPaths, clc.Host[i]) + for _, clc := range clcs { + subClcHost, subClcTarget, subPaths := computeClassLoaderContextRec(clc.Subcontexts) + if subPaths != nil { + subClcHost = "{" + subClcHost + "}" + subClcTarget = "{" + subClcTarget + "}" } - if hostPaths != nil { - sdkVerStr := fmt.Sprintf("%d", ver) - if ver == AnySdkVersion { - sdkVerStr = "any" // a special keyword that means any SDK version - } - clcStr += fmt.Sprintf(" --host-context-for-sdk %s %s", sdkVerStr, strings.Join(hostClc, "#")) - clcStr += fmt.Sprintf(" --target-context-for-sdk %s %s", sdkVerStr, strings.Join(targetClc, "#")) - paths = append(paths, hostPaths...) - } + clcsHost = append(clcsHost, "PCL["+clc.Host.String()+"]"+subClcHost) + clcsTarget = append(clcsTarget, "PCL["+clc.Device+"]"+subClcTarget) + + paths = append(paths, clc.Host) + paths = append(paths, subPaths...) } - return clcStr, paths + clcHost := strings.Join(clcsHost, "#") + clcTarget := strings.Join(clcsTarget, "#") + + return clcHost, clcTarget, paths } +// Paths to a <uses-library> on host and on device. type jsonLibraryPath struct { Host string Device string } -type jsonLibraryPaths map[string]jsonLibraryPath - -// convert JSON map of library paths to LibraryPaths -func constructLibraryPaths(ctx android.PathContext, paths jsonLibraryPaths) LibraryPaths { - m := LibraryPaths{} - for lib, path := range paths { - m[lib] = &LibraryPath{ - constructPath(ctx, path.Host), - path.Device, +// Class loader contexts that come from Make (via JSON dexpreopt.config) files have simpler +// structure than Soong class loader contexts: they are flat maps from a <uses-library> name to its +// on-host and on-device paths. There are no nested subcontexts. It is a limitation of the current +// Make implementation. +type jsonClassLoaderContext map[string]jsonLibraryPath + +// A map from SDK version (represented with a JSON string) to JSON class loader context. +type jsonClassLoaderContextMap map[string]jsonClassLoaderContext + +// Convert JSON class loader context map to ClassLoaderContextMap. +func fromJsonClassLoaderContext(ctx android.PathContext, jClcMap jsonClassLoaderContextMap) ClassLoaderContextMap { + clcMap := make(ClassLoaderContextMap) + for sdkVerStr, clc := range jClcMap { + sdkVer, ok := strconv.Atoi(sdkVerStr) + if ok != nil { + if sdkVerStr == "any" { + sdkVer = AnySdkVersion + } else { + android.ReportPathErrorf(ctx, "failed to parse SDK version in dexpreopt.config: '%s'", sdkVerStr) + } + } + for lib, path := range clc { + clcMap[sdkVer] = append(clcMap[sdkVer], &ClassLoaderContext{ + Name: lib, + Host: constructPath(ctx, path.Host), + Device: path.Device, + Subcontexts: nil, + }) } } - return m + return clcMap } diff --git a/dexpreopt/class_loader_context_test.go b/dexpreopt/class_loader_context_test.go index 51c1a0a1f..e0a75bfea 100644 --- a/dexpreopt/class_loader_context_test.go +++ b/dexpreopt/class_loader_context_test.go @@ -37,91 +37,79 @@ func TestCLC(t *testing.T) { // ├── b // ├── c // ├── d - // ├── a2 - // ├── b2 - // ├── c2 - // ├── a1 - // ├── b1 + // │  ├── a2 + // │  ├── b2 + // │  └── c2 + // │  ├── a1 + // │  └── b1 // ├── f // ├── a3 // └── b3 // ctx := testContext() - lp := make(LibraryPaths) + m := make(ClassLoaderContextMap) - lp.AddLibraryPath(ctx, "a", buildPath(ctx, "a"), installPath(ctx, "a")) - lp.AddLibraryPath(ctx, "b", buildPath(ctx, "b"), installPath(ctx, "b")) + m.AddContext(ctx, "a", buildPath(ctx, "a"), installPath(ctx, "a")) + m.AddContext(ctx, "b", buildPath(ctx, "b"), installPath(ctx, "b")) // "Maybe" variant in the good case: add as usual. c := "c" - lp.MaybeAddLibraryPath(ctx, &c, buildPath(ctx, "c"), installPath(ctx, "c")) + m.MaybeAddContext(ctx, &c, buildPath(ctx, "c"), installPath(ctx, "c")) // "Maybe" variant in the bad case: don't add library with unknown name, keep going. - lp.MaybeAddLibraryPath(ctx, nil, nil, nil) + m.MaybeAddContext(ctx, nil, nil, nil) // Add some libraries with nested subcontexts. - lp1 := make(LibraryPaths) - lp1.AddLibraryPath(ctx, "a1", buildPath(ctx, "a1"), installPath(ctx, "a1")) - lp1.AddLibraryPath(ctx, "b1", buildPath(ctx, "b1"), installPath(ctx, "b1")) + m1 := make(ClassLoaderContextMap) + m1.AddContext(ctx, "a1", buildPath(ctx, "a1"), installPath(ctx, "a1")) + m1.AddContext(ctx, "b1", buildPath(ctx, "b1"), installPath(ctx, "b1")) - lp2 := make(LibraryPaths) - lp2.AddLibraryPath(ctx, "a2", buildPath(ctx, "a2"), installPath(ctx, "a2")) - lp2.AddLibraryPath(ctx, "b2", buildPath(ctx, "b2"), installPath(ctx, "b2")) - lp2.AddLibraryPath(ctx, "c2", buildPath(ctx, "c2"), installPath(ctx, "c2")) - lp2.AddLibraryPaths(lp1) + m2 := make(ClassLoaderContextMap) + m2.AddContext(ctx, "a2", buildPath(ctx, "a2"), installPath(ctx, "a2")) + m2.AddContext(ctx, "b2", buildPath(ctx, "b2"), installPath(ctx, "b2")) + m2.AddContextForSdk(ctx, AnySdkVersion, "c2", buildPath(ctx, "c2"), installPath(ctx, "c2"), m1) - lp.AddLibraryPath(ctx, "d", buildPath(ctx, "d"), installPath(ctx, "d")) - lp.AddLibraryPaths(lp2) + m3 := make(ClassLoaderContextMap) + m3.AddContext(ctx, "a3", buildPath(ctx, "a3"), installPath(ctx, "a3")) + m3.AddContext(ctx, "b3", buildPath(ctx, "b3"), installPath(ctx, "b3")) - lp3 := make(LibraryPaths) - lp3.AddLibraryPath(ctx, "f", buildPath(ctx, "f"), installPath(ctx, "f")) - lp3.AddLibraryPath(ctx, "a3", buildPath(ctx, "a3"), installPath(ctx, "a3")) - lp3.AddLibraryPath(ctx, "b3", buildPath(ctx, "b3"), installPath(ctx, "b3")) - lp.AddLibraryPaths(lp3) - - // Compatibility libraries with unknown install paths get default paths. - lp.AddLibraryPath(ctx, AndroidHidlBase, buildPath(ctx, AndroidHidlBase), nil) - lp.AddLibraryPath(ctx, AndroidHidlManager, buildPath(ctx, AndroidHidlManager), nil) - lp.AddLibraryPath(ctx, AndroidTestMock, buildPath(ctx, AndroidTestMock), nil) - - module := testSystemModuleConfig(ctx, "test") - module.LibraryPaths = lp - - m := make(classLoaderContextMap) - valid := true + m.AddContextForSdk(ctx, AnySdkVersion, "d", buildPath(ctx, "d"), installPath(ctx, "d"), m2) + // When the same library is both in conditional and unconditional context, it should be removed + // from conditional context. + m.AddContextForSdk(ctx, 42, "f", buildPath(ctx, "f"), installPath(ctx, "f"), nil) + m.AddContextForSdk(ctx, AnySdkVersion, "f", buildPath(ctx, "f"), installPath(ctx, "f"), nil) - ok, err := m.addLibs(ctx, AnySdkVersion, module, "a", "b", "c", "d", "a2", "b2", "c2", "a1", "b1", "f", "a3", "b3") - valid = valid && ok && err == nil + // Merge map with implicit root library that is among toplevel contexts => does nothing. + m.AddContextMap(m1, "c") + // Merge map with implicit root library that is not among toplevel contexts => all subcontexts + // of the other map are added as toplevel contexts. + m.AddContextMap(m3, "m_g") - // Add compatibility libraries to conditional CLC for SDK level 29. - ok, err = m.addLibs(ctx, 29, module, AndroidHidlManager, AndroidHidlBase) - valid = valid && ok && err == nil + // Compatibility libraries with unknown install paths get default paths. + m.AddContextForSdk(ctx, 29, AndroidHidlManager, buildPath(ctx, AndroidHidlManager), nil, nil) + m.AddContextForSdk(ctx, 29, AndroidHidlBase, buildPath(ctx, AndroidHidlBase), nil, nil) // Add "android.test.mock" to conditional CLC, observe that is gets removed because it is only // needed as a compatibility library if "android.test.runner" is in CLC as well. - ok, err = m.addLibs(ctx, 30, module, AndroidTestMock) - valid = valid && ok && err == nil + m.AddContextForSdk(ctx, 30, AndroidTestMock, buildPath(ctx, AndroidTestMock), nil, nil) - // When the same library is both in conditional and unconditional context, it should be removed - // from conditional context. - ok, err = m.addLibs(ctx, 42, module, "f") - valid = valid && ok && err == nil + valid, validationError := validateClassLoaderContext(m) - fixConditionalClassLoaderContext(m) + fixClassLoaderContext(m) var haveStr string var havePaths android.Paths var haveUsesLibs []string - if valid { - haveStr, havePaths = computeClassLoaderContext(ctx, m) - haveUsesLibs = m.usesLibs() + if valid && validationError == nil { + haveStr, havePaths = ComputeClassLoaderContext(m) + haveUsesLibs = m.UsesLibs() } // Test that validation is successful (all paths are known). t.Run("validate", func(t *testing.T) { - if !valid { + if !(valid && validationError == nil) { t.Errorf("invalid class loader context") } }) @@ -135,14 +123,14 @@ func TestCLC(t *testing.T) { "PCL[/system/framework/" + AndroidHidlManager + ".jar]#" + "PCL[/system/framework/" + AndroidHidlBase + ".jar]" + " --host-context-for-sdk any " + - "PCL[out/a.jar]#PCL[out/b.jar]#PCL[out/c.jar]#PCL[out/d.jar]#" + - "PCL[out/a2.jar]#PCL[out/b2.jar]#PCL[out/c2.jar]#" + - "PCL[out/a1.jar]#PCL[out/b1.jar]#" + + "PCL[out/a.jar]#PCL[out/b.jar]#PCL[out/c.jar]#PCL[out/d.jar]" + + "{PCL[out/a2.jar]#PCL[out/b2.jar]#PCL[out/c2.jar]" + + "{PCL[out/a1.jar]#PCL[out/b1.jar]}}#" + "PCL[out/f.jar]#PCL[out/a3.jar]#PCL[out/b3.jar]" + " --target-context-for-sdk any " + - "PCL[/system/a.jar]#PCL[/system/b.jar]#PCL[/system/c.jar]#PCL[/system/d.jar]#" + - "PCL[/system/a2.jar]#PCL[/system/b2.jar]#PCL[/system/c2.jar]#" + - "PCL[/system/a1.jar]#PCL[/system/b1.jar]#" + + "PCL[/system/a.jar]#PCL[/system/b.jar]#PCL[/system/c.jar]#PCL[/system/d.jar]" + + "{PCL[/system/a2.jar]#PCL[/system/b2.jar]#PCL[/system/c2.jar]" + + "{PCL[/system/a1.jar]#PCL[/system/b1.jar]}}#" + "PCL[/system/f.jar]#PCL[/system/a3.jar]#PCL[/system/b3.jar]" if wantStr != haveStr { t.Errorf("\nwant class loader context: %s\nhave class loader context: %s", wantStr, haveStr) @@ -175,32 +163,50 @@ func TestCLC(t *testing.T) { // Test that an unexpected unknown build path causes immediate error. func TestCLCUnknownBuildPath(t *testing.T) { ctx := testContext() - lp := make(LibraryPaths) - err := lp.addLibraryPath(ctx, "a", nil, nil, true) - checkError(t, err, "unknown build path to <uses-library> 'a'") + m := make(ClassLoaderContextMap) + err := m.addContext(ctx, AnySdkVersion, "a", nil, nil, true, nil) + checkError(t, err, "unknown build path to <uses-library> \"a\"") } // Test that an unexpected unknown install path causes immediate error. func TestCLCUnknownInstallPath(t *testing.T) { ctx := testContext() - lp := make(LibraryPaths) - err := lp.addLibraryPath(ctx, "a", buildPath(ctx, "a"), nil, true) - checkError(t, err, "unknown install path to <uses-library> 'a'") + m := make(ClassLoaderContextMap) + err := m.addContext(ctx, AnySdkVersion, "a", buildPath(ctx, "a"), nil, true, nil) + checkError(t, err, "unknown install path to <uses-library> \"a\"") } func TestCLCMaybeAdd(t *testing.T) { ctx := testContext() - lp := make(LibraryPaths) + m := make(ClassLoaderContextMap) a := "a" - lp.MaybeAddLibraryPath(ctx, &a, nil, nil) + m.MaybeAddContext(ctx, &a, nil, nil) - module := testSystemModuleConfig(ctx, "test") - module.LibraryPaths = lp + // The library should be added to <uses-library> tags by the manifest_fixer. + t.Run("maybe add", func(t *testing.T) { + haveUsesLibs := m.UsesLibs() + wantUsesLibs := []string{"a"} + if !reflect.DeepEqual(wantUsesLibs, haveUsesLibs) { + t.Errorf("\nwant uses libs: %s\nhave uses libs: %s", wantUsesLibs, haveUsesLibs) + } + }) - m := make(classLoaderContextMap) - _, err := m.addLibs(ctx, AnySdkVersion, module, "a") - checkError(t, err, "dexpreopt cannot find path for <uses-library> 'a'") + // But class loader context in such cases should raise an error on validation. + t.Run("validate", func(t *testing.T) { + _, err := validateClassLoaderContext(m) + checkError(t, err, "invalid path for <uses-library> \"a\"") + }) +} + +// An attempt to add conditional nested subcontext should fail. +func TestCLCNestedConditional(t *testing.T) { + ctx := testContext() + m1 := make(ClassLoaderContextMap) + m1.AddContextForSdk(ctx, 42, "a", buildPath(ctx, "a"), installPath(ctx, "a"), nil) + m := make(ClassLoaderContextMap) + err := m.addContext(ctx, AnySdkVersion, "b", buildPath(ctx, "b"), installPath(ctx, "b"), true, m1) + checkError(t, err, "nested class loader context shouldn't have conditional part") } func checkError(t *testing.T, have error, want string) { diff --git a/dexpreopt/config.go b/dexpreopt/config.go index 03accc8e1..cfa4c5590 100644 --- a/dexpreopt/config.go +++ b/dexpreopt/config.go @@ -114,10 +114,8 @@ type ModuleConfig struct { ProfileIsTextListing bool ProfileBootListing android.OptionalPath - EnforceUsesLibraries bool - OptionalUsesLibraries []string - UsesLibraries []string - LibraryPaths LibraryPaths + EnforceUsesLibraries bool + ClassLoaderContexts ClassLoaderContextMap Archs []android.ArchType DexPreoptImages []android.Path @@ -265,7 +263,7 @@ func ParseModuleConfig(ctx android.PathContext, data []byte) (*ModuleConfig, err DexPath string ManifestPath string ProfileClassListing string - LibraryPaths jsonLibraryPaths + ClassLoaderContexts jsonClassLoaderContextMap DexPreoptImages []string DexPreoptImageLocations []string PreoptBootClassPathDexFiles []string @@ -283,7 +281,7 @@ func ParseModuleConfig(ctx android.PathContext, data []byte) (*ModuleConfig, err config.ModuleConfig.DexPath = constructPath(ctx, config.DexPath) config.ModuleConfig.ManifestPath = constructPath(ctx, config.ManifestPath) config.ModuleConfig.ProfileClassListing = android.OptionalPathForPath(constructPath(ctx, config.ProfileClassListing)) - config.ModuleConfig.LibraryPaths = constructLibraryPaths(ctx, config.LibraryPaths) + config.ModuleConfig.ClassLoaderContexts = fromJsonClassLoaderContext(ctx, config.ClassLoaderContexts) config.ModuleConfig.DexPreoptImages = constructPaths(ctx, config.DexPreoptImages) config.ModuleConfig.DexPreoptImageLocations = config.DexPreoptImageLocations config.ModuleConfig.PreoptBootClassPathDexFiles = constructPaths(ctx, config.PreoptBootClassPathDexFiles) diff --git a/dexpreopt/dexpreopt.go b/dexpreopt/dexpreopt.go index a07f1fa2b..65380feae 100644 --- a/dexpreopt/dexpreopt.go +++ b/dexpreopt/dexpreopt.go @@ -81,16 +81,18 @@ func GenerateDexpreoptRule(ctx android.PathContext, globalSoong *GlobalSoongConf } if !dexpreoptDisabled(ctx, global, module) { - if clc, err := genClassLoaderContext(ctx, global, module); err != nil { + if valid, err := validateClassLoaderContext(module.ClassLoaderContexts); err != nil { android.ReportPathErrorf(ctx, err.Error()) - } else if clc != nil { + } else if valid { + fixClassLoaderContext(module.ClassLoaderContexts) + appImage := (generateProfile || module.ForceCreateAppImage || global.DefaultAppImages) && !module.NoCreateAppImage generateDM := shouldGenerateDM(module, global) for archIdx, _ := range module.Archs { - dexpreoptCommand(ctx, globalSoong, global, module, rule, archIdx, *clc, profile, appImage, generateDM) + dexpreoptCommand(ctx, globalSoong, global, module, rule, archIdx, profile, appImage, generateDM) } } } @@ -197,8 +199,8 @@ func bootProfileCommand(ctx android.PathContext, globalSoong *GlobalSoongConfig, } func dexpreoptCommand(ctx android.PathContext, globalSoong *GlobalSoongConfig, global *GlobalConfig, - module *ModuleConfig, rule *android.RuleBuilder, archIdx int, classLoaderContexts classLoaderContextMap, - profile android.WritablePath, appImage bool, generateDM bool) { + module *ModuleConfig, rule *android.RuleBuilder, archIdx int, profile android.WritablePath, + appImage bool, generateDM bool) { arch := module.Archs[archIdx] @@ -235,6 +237,16 @@ func dexpreoptCommand(ctx android.PathContext, globalSoong *GlobalSoongConfig, g rule.Command().FlagWithOutput("rm -f ", odexPath) if jarIndex := android.IndexList(module.Name, systemServerJars); jarIndex >= 0 { + // System server jars should be dexpreopted together: class loader context of each jar + // should include all preceding jars on the system server classpath. + + var clcHost android.Paths + var clcTarget []string + for _, lib := range systemServerJars[:jarIndex] { + clcHost = append(clcHost, SystemServerDexJarHostPath(ctx, lib)) + clcTarget = append(clcTarget, filepath.Join("/system/framework", lib+".jar")) + } + // Copy the system server jar to a predefined location where dex2oat will find it. dexPathHost := SystemServerDexJarHostPath(ctx, module.Name) rule.Command().Text("mkdir -p").Flag(filepath.Dir(dexPathHost.String())) @@ -242,11 +254,11 @@ func dexpreoptCommand(ctx android.PathContext, globalSoong *GlobalSoongConfig, g checkSystemServerOrder(ctx, jarIndex) - clc := classLoaderContexts[AnySdkVersion] rule.Command(). - Text("class_loader_context_arg=--class-loader-context=PCL[" + strings.Join(clc.Host.Strings(), ":") + "]"). - Implicits(clc.Host). - Text("stored_class_loader_context_arg=--stored-class-loader-context=PCL[" + strings.Join(clc.Target, ":") + "]") + Text("class_loader_context_arg=--class-loader-context=PCL[" + strings.Join(clcHost.Strings(), ":") + "]"). + Implicits(clcHost). + Text("stored_class_loader_context_arg=--stored-class-loader-context=PCL[" + strings.Join(clcTarget, ":") + "]") + } else if module.EnforceUsesLibraries { // Generate command that saves target SDK version in a shell variable. if module.ManifestPath != nil { @@ -266,13 +278,15 @@ func dexpreoptCommand(ctx android.PathContext, globalSoong *GlobalSoongConfig, g } // Generate command that saves host and target class loader context in shell variables. - clc, paths := computeClassLoaderContext(ctx, classLoaderContexts) + clc, paths := ComputeClassLoaderContext(module.ClassLoaderContexts) cmd := rule.Command(). Text(`eval "$(`).Tool(globalSoong.ConstructContext). Text(` --target-sdk-version ${target_sdk_version}`). Text(clc).Implicits(paths) cmd.Text(`)"`) + } else { + // Other libraries or APKs for which the exact <uses-library> list is unknown. // Pass special class loader context to skip the classpath and collision check. // This will get removed once LOCAL_USES_LIBRARIES is enforced. // Right now LOCAL_USES_LIBRARIES is opt in, for the case where it's not specified we still default diff --git a/dexpreopt/dexpreopt_test.go b/dexpreopt/dexpreopt_test.go index ec3154903..feabd7004 100644 --- a/dexpreopt/dexpreopt_test.go +++ b/dexpreopt/dexpreopt_test.go @@ -44,9 +44,7 @@ func testModuleConfig(ctx android.PathContext, name, partition string) *ModuleCo ProfileClassListing: android.OptionalPath{}, ProfileIsTextListing: false, EnforceUsesLibraries: false, - OptionalUsesLibraries: nil, - UsesLibraries: nil, - LibraryPaths: nil, + ClassLoaderContexts: nil, Archs: []android.ArchType{android.Arm}, DexPreoptImages: android.Paths{android.PathForTesting("system/framework/arm/boot.art")}, DexPreoptImagesDeps: []android.OutputPaths{android.OutputPaths{}}, diff --git a/etc/prebuilt_etc_test.go b/etc/prebuilt_etc_test.go index 8fc36c274..6c4c0b63d 100644 --- a/etc/prebuilt_etc_test.go +++ b/etc/prebuilt_etc_test.go @@ -58,7 +58,7 @@ func testPrebuiltEtcContext(t *testing.T, bp string) (*android.TestContext, andr config := android.TestArchConfig(buildDir, nil, bp, fs) - ctx := android.NewTestArchContext() + ctx := android.NewTestArchContext(config) ctx.RegisterModuleType("prebuilt_etc", PrebuiltEtcFactory) ctx.RegisterModuleType("prebuilt_etc_host", PrebuiltEtcHostFactory) ctx.RegisterModuleType("prebuilt_usr_share", PrebuiltUserShareFactory) @@ -66,7 +66,7 @@ func testPrebuiltEtcContext(t *testing.T, bp string) (*android.TestContext, andr ctx.RegisterModuleType("prebuilt_font", PrebuiltFontFactory) ctx.RegisterModuleType("prebuilt_firmware", PrebuiltFirmwareFactory) ctx.RegisterModuleType("prebuilt_dsp", PrebuiltDSPFactory) - ctx.Register(config) + ctx.Register() return ctx, config } diff --git a/genrule/genrule_test.go b/genrule/genrule_test.go index fdbb9d962..c19078f0d 100644 --- a/genrule/genrule_test.go +++ b/genrule/genrule_test.go @@ -53,14 +53,14 @@ func TestMain(m *testing.M) { func testContext(config android.Config) *android.TestContext { - ctx := android.NewTestArchContext() + ctx := android.NewTestArchContext(config) ctx.RegisterModuleType("filegroup", android.FileGroupFactory) ctx.RegisterModuleType("tool", toolFactory) registerGenruleBuildComponents(ctx) ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators) - ctx.Register(config) + ctx.Register() return ctx } diff --git a/java/aar.go b/java/aar.go index 157d677d3..7c3840bb1 100644 --- a/java/aar.go +++ b/java/aar.go @@ -109,7 +109,6 @@ type aapt struct { useEmbeddedNativeLibs bool useEmbeddedDex bool usesNonSdkApis bool - sdkLibraries dexpreopt.LibraryPaths hasNoCode bool LoggingParent string resourceFiles android.Paths @@ -259,12 +258,11 @@ var extractAssetsRule = pctx.AndroidStaticRule("extractAssets", CommandDeps: []string{"${config.Zip2ZipCmd}"}, }) -func (a *aapt) buildActions(ctx android.ModuleContext, sdkContext sdkContext, extraLinkFlags ...string) { +func (a *aapt) buildActions(ctx android.ModuleContext, sdkContext sdkContext, + sdkLibraries dexpreopt.ClassLoaderContextMap, extraLinkFlags ...string) { - transitiveStaticLibs, transitiveStaticLibManifests, staticRRODirs, assetPackages, libDeps, libFlags, sdkLibraries := - aaptLibs(ctx, sdkContext) - - a.sdkLibraries = sdkLibraries + transitiveStaticLibs, transitiveStaticLibManifests, staticRRODirs, assetPackages, libDeps, libFlags := + aaptLibs(ctx, sdkContext, sdkLibraries) // App manifest file manifestFile := proptools.StringDefault(a.aaptProperties.Manifest, "AndroidManifest.xml") @@ -391,29 +389,31 @@ func (a *aapt) buildActions(ctx android.ModuleContext, sdkContext sdkContext, ex } // aaptLibs collects libraries from dependencies and sdk_version and converts them into paths -func aaptLibs(ctx android.ModuleContext, sdkContext sdkContext) (transitiveStaticLibs, transitiveStaticLibManifests android.Paths, - staticRRODirs []rroDir, assets, deps android.Paths, flags []string, sdkLibraries dexpreopt.LibraryPaths) { +func aaptLibs(ctx android.ModuleContext, sdkContext sdkContext, sdkLibraries dexpreopt.ClassLoaderContextMap) ( + transitiveStaticLibs, transitiveStaticLibManifests android.Paths, staticRRODirs []rroDir, assets, deps android.Paths, flags []string) { var sharedLibs android.Paths + if sdkLibraries == nil { + // Not all callers need to compute class loader context, those who don't just pass nil. + // Create a temporary class loader context here (it will be computed, but not used). + sdkLibraries = make(dexpreopt.ClassLoaderContextMap) + } + sdkDep := decodeSdkDep(ctx, sdkContext) if sdkDep.useFiles { sharedLibs = append(sharedLibs, sdkDep.jars...) } - sdkLibraries = make(dexpreopt.LibraryPaths) - ctx.VisitDirectDeps(func(module android.Module) { + depName := ctx.OtherModuleName(module) + var exportPackage android.Path aarDep, _ := module.(AndroidLibraryDependency) if aarDep != nil { exportPackage = aarDep.ExportPackage() } - if dep, ok := module.(Dependency); ok { - sdkLibraries.AddLibraryPaths(dep.ExportedSdkLibs()) - } - switch ctx.OtherModuleDependencyTag(module) { case instrumentationForTag: // Nothing, instrumentationForTag is treated as libTag for javac but not for aapt2. @@ -426,7 +426,7 @@ func aaptLibs(ctx android.ModuleContext, sdkContext sdkContext) (transitiveStati // (including the java_sdk_library) itself then append any implicit sdk library // names to the list of sdk libraries to be added to the manifest. if component, ok := module.(SdkLibraryComponentDependency); ok { - sdkLibraries.MaybeAddLibraryPath(ctx, component.OptionalImplicitSdkLibrary(), + sdkLibraries.MaybeAddContext(ctx, component.OptionalImplicitSdkLibrary(), component.DexJarBuildPath(), component.DexJarInstallPath()) } @@ -439,7 +439,7 @@ func aaptLibs(ctx android.ModuleContext, sdkContext sdkContext) (transitiveStati transitiveStaticLibs = append(transitiveStaticLibs, aarDep.ExportedStaticPackages()...) transitiveStaticLibs = append(transitiveStaticLibs, exportPackage) transitiveStaticLibManifests = append(transitiveStaticLibManifests, aarDep.ExportedManifests()...) - sdkLibraries.AddLibraryPaths(aarDep.ExportedSdkLibs()) + sdkLibraries.AddContextMap(aarDep.ExportedSdkLibs(), depName) if aarDep.ExportedAssets().Valid() { assets = append(assets, aarDep.ExportedAssets().Path()) } @@ -457,6 +457,12 @@ func aaptLibs(ctx android.ModuleContext, sdkContext sdkContext) (transitiveStati } } } + + // Add nested dependencies after processing the direct dependency: if it is a <uses-library>, + // nested context is added as its subcontext, and should not be re-added at the top-level. + if dep, ok := module.(Dependency); ok { + sdkLibraries.AddContextMap(dep.ExportedSdkLibs(), depName) + } }) deps = append(deps, sharedLibs...) @@ -473,7 +479,7 @@ func aaptLibs(ctx android.ModuleContext, sdkContext sdkContext) (transitiveStati transitiveStaticLibs = android.FirstUniquePaths(transitiveStaticLibs) transitiveStaticLibManifests = android.FirstUniquePaths(transitiveStaticLibManifests) - return transitiveStaticLibs, transitiveStaticLibManifests, staticRRODirs, assets, deps, flags, sdkLibraries + return transitiveStaticLibs, transitiveStaticLibManifests, staticRRODirs, assets, deps, flags } type AndroidLibrary struct { @@ -508,8 +514,8 @@ func (a *AndroidLibrary) DepsMutator(ctx android.BottomUpMutatorContext) { func (a *AndroidLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) { a.aapt.isLibrary = true - a.aapt.buildActions(ctx, sdkContext(a)) - a.exportedSdkLibs = a.aapt.sdkLibraries + a.exportedSdkLibs = make(dexpreopt.ClassLoaderContextMap) + a.aapt.buildActions(ctx, sdkContext(a), a.exportedSdkLibs) a.hideApexVariantFromMake = !ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).IsForPlatform() @@ -781,12 +787,11 @@ func (a *AARImport) GenerateAndroidBuildActions(ctx android.ModuleContext) { linkFlags = append(linkFlags, "--manifest "+a.manifest.String()) linkDeps = append(linkDeps, a.manifest) - transitiveStaticLibs, staticLibManifests, staticRRODirs, transitiveAssets, libDeps, libFlags, sdkLibraries := - aaptLibs(ctx, sdkContext(a)) + transitiveStaticLibs, staticLibManifests, staticRRODirs, transitiveAssets, libDeps, libFlags := + aaptLibs(ctx, sdkContext(a), nil) _ = staticLibManifests _ = staticRRODirs - _ = sdkLibraries linkDeps = append(linkDeps, libDeps...) linkFlags = append(linkFlags, libFlags...) @@ -827,7 +832,7 @@ func (a *AARImport) AidlIncludeDirs() android.Paths { return nil } -func (a *AARImport) ExportedSdkLibs() dexpreopt.LibraryPaths { +func (a *AARImport) ExportedSdkLibs() dexpreopt.ClassLoaderContextMap { return nil } diff --git a/java/android_manifest.go b/java/android_manifest.go index 62cd11203..6b39c3584 100644 --- a/java/android_manifest.go +++ b/java/android_manifest.go @@ -43,8 +43,9 @@ var manifestMergerRule = pctx.AndroidStaticRule("manifestMerger", "args", "libs") // Uses manifest_fixer.py to inject minSdkVersion, etc. into an AndroidManifest.xml -func manifestFixer(ctx android.ModuleContext, manifest android.Path, sdkContext sdkContext, sdkLibraries dexpreopt.LibraryPaths, - isLibrary, useEmbeddedNativeLibs, usesNonSdkApis, useEmbeddedDex, hasNoCode bool, loggingParent string) android.Path { +func manifestFixer(ctx android.ModuleContext, manifest android.Path, sdkContext sdkContext, + sdkLibraries dexpreopt.ClassLoaderContextMap, isLibrary, useEmbeddedNativeLibs, usesNonSdkApis, + useEmbeddedDex, hasNoCode bool, loggingParent string) android.Path { var args []string if isLibrary { @@ -70,7 +71,7 @@ func manifestFixer(ctx android.ModuleContext, manifest android.Path, sdkContext args = append(args, "--use-embedded-dex") } - for _, usesLib := range android.SortedStringKeys(sdkLibraries) { + for _, usesLib := range sdkLibraries.UsesLibs() { if inList(usesLib, dexpreopt.OptionalCompatUsesLibs) { args = append(args, "--optional-uses-library", usesLib) } else { diff --git a/java/android_resources.go b/java/android_resources.go index 97f76793c..720d3a5ae 100644 --- a/java/android_resources.go +++ b/java/android_resources.go @@ -23,6 +23,7 @@ import ( func init() { android.RegisterPreSingletonType("overlay", OverlaySingletonFactory) + } var androidResourceIgnoreFilenames = []string{ diff --git a/java/androidmk.go b/java/androidmk.go index e1a661fc1..c6062457f 100644 --- a/java/androidmk.go +++ b/java/androidmk.go @@ -115,7 +115,7 @@ func (library *Library) AndroidMkEntries() []android.AndroidMkEntries { entries.SetPath("LOCAL_SOONG_JACOCO_REPORT_CLASSES_JAR", library.jacocoReportClassesFile) } - entries.AddStrings("LOCAL_EXPORT_SDK_LIBRARIES", android.SortedStringKeys(library.exportedSdkLibs)...) + entries.AddStrings("LOCAL_EXPORT_SDK_LIBRARIES", library.exportedSdkLibs.UsesLibs()...) if len(library.additionalCheckedModules) != 0 { entries.AddStrings("LOCAL_ADDITIONAL_CHECKED_MODULE", library.additionalCheckedModules.Strings()...) diff --git a/java/app.go b/java/app.go index c24e0c56b..9ff413cc1 100755 --- a/java/app.go +++ b/java/app.go @@ -565,9 +565,8 @@ func (a *AndroidApp) aaptBuildActions(ctx android.ModuleContext) { aaptLinkFlags = append(aaptLinkFlags, a.additionalAaptFlags...) a.aapt.splitNames = a.appProperties.Package_splits - a.aapt.sdkLibraries = a.exportedSdkLibs a.aapt.LoggingParent = String(a.overridableAppProperties.Logging_parent) - a.aapt.buildActions(ctx, sdkContext(a), aaptLinkFlags...) + a.aapt.buildActions(ctx, sdkContext(a), a.exportedSdkLibs, aaptLinkFlags...) // apps manifests are handled by aapt, don't let Module see them a.properties.Manifest = nil @@ -601,7 +600,7 @@ func (a *AndroidApp) installPath(ctx android.ModuleContext) android.InstallPath return android.PathForModuleInstall(ctx, installDir, a.installApkName+".apk") } -func (a *AndroidApp) dexBuildActions(ctx android.ModuleContext, sdkLibs dexpreopt.LibraryPaths) android.Path { +func (a *AndroidApp) dexBuildActions(ctx android.ModuleContext) android.Path { a.dexpreopter.installPath = a.installPath(ctx) if a.dexProperties.Uncompress_dex == nil { // If the value was not force-set by the user, use reasonable default based on the module. @@ -609,12 +608,8 @@ func (a *AndroidApp) dexBuildActions(ctx android.ModuleContext, sdkLibs dexpreop } a.dexpreopter.uncompressedDex = *a.dexProperties.Uncompress_dex a.dexpreopter.enforceUsesLibs = a.usesLibrary.enforceUsesLibraries() - a.dexpreopter.usesLibs = a.usesLibrary.usesLibraryProperties.Uses_libs - a.dexpreopter.optionalUsesLibs = a.usesLibrary.presentOptionalUsesLibs(ctx) - a.dexpreopter.libraryPaths = a.usesLibrary.usesLibraryPaths(ctx) - a.dexpreopter.libraryPaths.AddLibraryPaths(sdkLibs) + a.dexpreopter.classLoaderContexts = a.exportedSdkLibs a.dexpreopter.manifestFile = a.mergedManifestFile - a.exportedSdkLibs = make(dexpreopt.LibraryPaths) if ctx.ModuleName() != "framework-res" { a.Module.compile(ctx, a.aaptSrcJar) @@ -784,6 +779,8 @@ func (a *AndroidApp) generateAndroidBuildActions(ctx android.ModuleContext) { a.aapt.noticeFile = a.noticeOutputs.HtmlGzOutput } + a.exportedSdkLibs = a.usesLibrary.classLoaderContextForUsesLibDeps(ctx) + // Process all building blocks, from AAPT to certificates. a.aaptBuildActions(ctx) @@ -791,7 +788,7 @@ func (a *AndroidApp) generateAndroidBuildActions(ctx android.ModuleContext) { a.usesLibrary.freezeEnforceUsesLibraries() // Add implicit SDK libraries to <uses-library> list. - for _, usesLib := range android.SortedStringKeys(a.aapt.sdkLibraries) { + for _, usesLib := range a.exportedSdkLibs.UsesLibs() { a.usesLibrary.addLib(usesLib, inList(usesLib, dexpreopt.OptionalCompatUsesLibs)) } @@ -808,7 +805,7 @@ func (a *AndroidApp) generateAndroidBuildActions(ctx android.ModuleContext) { a.linter.resources = a.aapt.resourceFiles a.linter.buildModuleReportZip = ctx.Config().UnbundledBuildApps() - dexJarFile := a.dexBuildActions(ctx, a.aapt.sdkLibraries) + dexJarFile := a.dexBuildActions(ctx) jniLibs, certificateDeps := collectAppDeps(ctx, a, a.shouldEmbedJnis(ctx), !Bool(a.appProperties.Jni_uses_platform_apis)) jniJarFile := a.jniBuildActions(jniLibs, ctx) @@ -1540,9 +1537,7 @@ func (a *AndroidAppImport) generateAndroidBuildActions(ctx android.ModuleContext a.dexpreopter.uncompressedDex = a.shouldUncompressDex(ctx) a.dexpreopter.enforceUsesLibs = a.usesLibrary.enforceUsesLibraries() - a.dexpreopter.usesLibs = a.usesLibrary.usesLibraryProperties.Uses_libs - a.dexpreopter.optionalUsesLibs = a.usesLibrary.presentOptionalUsesLibs(ctx) - a.dexpreopter.libraryPaths = a.usesLibrary.usesLibraryPaths(ctx) + a.dexpreopter.classLoaderContexts = a.usesLibrary.classLoaderContextForUsesLibDeps(ctx) dexOutput := a.dexpreopter.dexpreopt(ctx, jnisUncompressed) if a.dexpreopter.uncompressedDex { @@ -1852,7 +1847,7 @@ func (r *RuntimeResourceOverlay) GenerateAndroidBuildActions(ctx android.ModuleC aaptLinkFlags = append(aaptLinkFlags, "--rename-overlay-target-package "+*r.overridableProperties.Target_package_name) } - r.aapt.buildActions(ctx, r, aaptLinkFlags...) + r.aapt.buildActions(ctx, r, nil, aaptLinkFlags...) // Sign the built package _, certificates := collectAppDeps(ctx, r, false, false) @@ -1976,17 +1971,18 @@ func (u *usesLibrary) presentOptionalUsesLibs(ctx android.BaseModuleContext) []s return optionalUsesLibs } -// usesLibraryPaths returns a map of module names of shared library dependencies to the paths +// Returns a map of module names of shared library dependencies to the paths // to their dex jars on host and on device. -func (u *usesLibrary) usesLibraryPaths(ctx android.ModuleContext) dexpreopt.LibraryPaths { - usesLibPaths := make(dexpreopt.LibraryPaths) +func (u *usesLibrary) classLoaderContextForUsesLibDeps(ctx android.ModuleContext) dexpreopt.ClassLoaderContextMap { + clcMap := make(dexpreopt.ClassLoaderContextMap) if !ctx.Config().UnbundledBuild() { ctx.VisitDirectDeps(func(m android.Module) { - if _, ok := ctx.OtherModuleDependencyTag(m).(usesLibraryDependencyTag); ok { + if tag, ok := ctx.OtherModuleDependencyTag(m).(usesLibraryDependencyTag); ok { dep := ctx.OtherModuleName(m) if lib, ok := m.(Dependency); ok { - usesLibPaths.AddLibraryPath(ctx, dep, lib.DexJarBuildPath(), lib.DexJarInstallPath()) + clcMap.AddContextForSdk(ctx, tag.sdkVersion, dep, + lib.DexJarBuildPath(), lib.DexJarInstallPath(), lib.ExportedSdkLibs()) } else if ctx.Config().AllowMissingDependencies() { ctx.AddMissingDependencies([]string{dep}) } else { @@ -1996,7 +1992,7 @@ func (u *usesLibrary) usesLibraryPaths(ctx android.ModuleContext) dexpreopt.Libr }) } - return usesLibPaths + return clcMap } // enforceUsesLibraries returns true of <uses-library> tags should be checked against uses_libs and optional_uses_libs diff --git a/java/app_test.go b/java/app_test.go index 82577e32e..6429ab836 100644 --- a/java/app_test.go +++ b/java/app_test.go @@ -59,7 +59,7 @@ func testAppConfig(env map[string]string, bp string, fs map[string][]byte) andro func testApp(t *testing.T, bp string) *android.TestContext { config := testAppConfig(nil, bp, nil) - ctx := testContext() + ctx := testContext(config) run(t, ctx, config) @@ -220,7 +220,7 @@ func TestAndroidAppSet_Variants(t *testing.T) { config.TestProductVariables.AAPTPrebuiltDPI = test.aaptPrebuiltDPI config.TestProductVariables.Platform_sdk_version = &test.sdkVersion config.Targets[android.Android] = test.targets - ctx := testContext() + ctx := testContext(config) run(t, ctx, config) module := ctx.ModuleForTests("foo", "android_common") const packedSplitApks = "foo.zip" @@ -657,7 +657,7 @@ func TestResourceDirs(t *testing.T) { for _, testCase := range testCases { t.Run(testCase.name, func(t *testing.T) { config := testConfig(nil, fmt.Sprintf(bp, testCase.prop), fs) - ctx := testContext() + ctx := testContext(config) run(t, ctx, config) module := ctx.ModuleForTests("foo", "android_common") @@ -973,7 +973,7 @@ func TestAndroidResources(t *testing.T) { config.TestProductVariables.EnforceRROExcludedOverlays = testCase.enforceRROExcludedOverlays } - ctx := testContext() + ctx := testContext(config) run(t, ctx, config) resourceListToFiles := func(module android.TestingModule, list []string) (files []string) { @@ -1039,7 +1039,7 @@ func TestAndroidResources(t *testing.T) { } func checkSdkVersion(t *testing.T, config android.Config, expectedSdkVersion string) { - ctx := testContext() + ctx := testContext(config) run(t, ctx, config) @@ -1633,7 +1633,7 @@ func TestCertificates(t *testing.T) { if test.certificateOverride != "" { config.TestProductVariables.CertificateOverrides = []string{test.certificateOverride} } - ctx := testContext() + ctx := testContext(config) run(t, ctx, config) foo := ctx.ModuleForTests("foo", "android_common") @@ -1698,7 +1698,7 @@ func TestRequestV4SigningFlag(t *testing.T) { for _, test := range testCases { t.Run(test.name, func(t *testing.T) { config := testAppConfig(nil, test.bp, nil) - ctx := testContext() + ctx := testContext(config) run(t, ctx, config) foo := ctx.ModuleForTests("foo", "android_common") @@ -1758,7 +1758,7 @@ func TestPackageNameOverride(t *testing.T) { if test.packageNameOverride != "" { config.TestProductVariables.PackageNameOverrides = []string{test.packageNameOverride} } - ctx := testContext() + ctx := testContext(config) run(t, ctx, config) foo := ctx.ModuleForTests("foo", "android_common") @@ -1793,7 +1793,7 @@ func TestInstrumentationTargetOverridden(t *testing.T) { ` config := testAppConfig(nil, bp, nil) config.TestProductVariables.ManifestPackageNameOverrides = []string{"foo:org.dandroid.bp"} - ctx := testContext() + ctx := testContext(config) run(t, ctx, config) @@ -2416,7 +2416,7 @@ func TestAndroidAppImport_DpiVariants(t *testing.T) { config := testAppConfig(nil, bp, nil) config.TestProductVariables.AAPTPreferredConfig = test.aaptPreferredConfig config.TestProductVariables.AAPTPrebuiltDPI = test.aaptPrebuiltDPI - ctx := testContext() + ctx := testContext(config) run(t, ctx, config) @@ -2777,7 +2777,7 @@ func TestUsesLibraries(t *testing.T) { config := testAppConfig(nil, bp, nil) config.TestProductVariables.MissingUsesLibraries = []string{"baz"} - ctx := testContext() + ctx := testContext(config) run(t, ctx, config) @@ -2815,11 +2815,11 @@ func TestUsesLibraries(t *testing.T) { // Test that all present libraries are preopted, including implicit SDK dependencies, possibly stubs cmd = app.Rule("dexpreopt").RuleParams.Command w := `--target-context-for-sdk any ` + - `PCL[/system/framework/foo.jar]#` + - `PCL[/system/framework/quuz.jar]#` + `PCL[/system/framework/qux.jar]#` + - `PCL[/system/framework/runtime-library.jar]#` + - `PCL[/system/framework/bar.jar]` + `PCL[/system/framework/quuz.jar]#` + + `PCL[/system/framework/foo.jar]#` + + `PCL[/system/framework/bar.jar]#` + + `PCL[/system/framework/runtime-library.jar]` if !strings.Contains(cmd, w) { t.Errorf("wanted %q in %q", w, cmd) } @@ -3129,7 +3129,7 @@ func TestUncompressDex(t *testing.T) { config.TestProductVariables.Always_use_prebuilt_sdks = proptools.BoolPtr(true) } - ctx := testContext() + ctx := testContext(config) run(t, ctx, config) @@ -3209,7 +3209,7 @@ func TestRuntimeResourceOverlay(t *testing.T) { } ` config := testAppConfig(nil, bp, fs) - ctx := testContext() + ctx := testContext(config) run(t, ctx, config) m := ctx.ModuleForTests("foo", "android_common") @@ -3506,7 +3506,7 @@ func TestEnforceRRO_propagatesToDependencies(t *testing.T) { config.TestProductVariables.EnforceRROExemptedTargets = testCase.enforceRROExemptTargets } - ctx := testContext() + ctx := testContext(config) run(t, ctx, config) modules := []string{"foo", "bar"} diff --git a/java/device_host_converter.go b/java/device_host_converter.go index 40a2280d9..d8b617e7d 100644 --- a/java/device_host_converter.go +++ b/java/device_host_converter.go @@ -163,7 +163,7 @@ func (d *DeviceHostConverter) AidlIncludeDirs() android.Paths { return nil } -func (d *DeviceHostConverter) ExportedSdkLibs() dexpreopt.LibraryPaths { +func (d *DeviceHostConverter) ExportedSdkLibs() dexpreopt.ClassLoaderContextMap { return nil } diff --git a/java/dexpreopt.go b/java/dexpreopt.go index 20dbc666b..a21fb7640 100644 --- a/java/dexpreopt.go +++ b/java/dexpreopt.go @@ -33,11 +33,9 @@ type dexpreopter struct { isTest bool isPresignedPrebuilt bool - manifestFile android.Path - usesLibs []string - optionalUsesLibs []string - enforceUsesLibs bool - libraryPaths dexpreopt.LibraryPaths + manifestFile android.Path + enforceUsesLibs bool + classLoaderContexts dexpreopt.ClassLoaderContextMap builtInstalled string } @@ -193,10 +191,8 @@ func (d *dexpreopter) dexpreopt(ctx android.ModuleContext, dexJarFile android.Mo ProfileIsTextListing: profileIsTextListing, ProfileBootListing: profileBootListing, - EnforceUsesLibraries: d.enforceUsesLibs, - OptionalUsesLibraries: d.optionalUsesLibs, - UsesLibraries: d.usesLibs, - LibraryPaths: d.libraryPaths, + EnforceUsesLibraries: d.enforceUsesLibs, + ClassLoaderContexts: d.classLoaderContexts, Archs: archs, DexPreoptImages: images, diff --git a/java/dexpreopt_bootjars_test.go b/java/dexpreopt_bootjars_test.go index ab31958cf..95fe5e10e 100644 --- a/java/dexpreopt_bootjars_test.go +++ b/java/dexpreopt_bootjars_test.go @@ -51,7 +51,7 @@ func testDexpreoptBoot(t *testing.T, ruleFile string, expectedInputs, expectedOu dexpreoptConfig.BootJars = android.CreateTestConfiguredJarList([]string{"platform:foo", "platform:bar", "platform:baz"}) dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig) - ctx := testContext() + ctx := testContext(config) RegisterDexpreoptBootJarsComponents(ctx) run(t, ctx, config) diff --git a/java/hiddenapi_singleton_test.go b/java/hiddenapi_singleton_test.go index 7acaae750..34a485618 100644 --- a/java/hiddenapi_singleton_test.go +++ b/java/hiddenapi_singleton_test.go @@ -29,8 +29,8 @@ func testConfigWithBootJars(bp string, bootJars []string) android.Config { return config } -func testContextWithHiddenAPI() *android.TestContext { - ctx := testContext() +func testContextWithHiddenAPI(config android.Config) *android.TestContext { + ctx := testContext(config) ctx.RegisterSingletonType("hiddenapi", hiddenAPISingletonFactory) return ctx } @@ -38,7 +38,7 @@ func testContextWithHiddenAPI() *android.TestContext { func testHiddenAPIWithConfig(t *testing.T, config android.Config) *android.TestContext { t.Helper() - ctx := testContextWithHiddenAPI() + ctx := testContextWithHiddenAPI(config) run(t, ctx, config) return ctx diff --git a/java/java.go b/java/java.go index 9f0905126..d6dc148a6 100644 --- a/java/java.go +++ b/java/java.go @@ -416,8 +416,8 @@ type Module struct { // manifest file to use instead of properties.Manifest overrideManifest android.OptionalPath - // map of SDK libs exported by this java module to their build and install paths - exportedSdkLibs dexpreopt.LibraryPaths + // map of SDK version to class loader context + exportedSdkLibs dexpreopt.ClassLoaderContextMap // list of plugins that this java module is exporting exportedPluginJars android.Paths @@ -509,7 +509,7 @@ type Dependency interface { ImplementationJars() android.Paths ResourceJars() android.Paths AidlIncludeDirs() android.Paths - ExportedSdkLibs() dexpreopt.LibraryPaths + ExportedSdkLibs() dexpreopt.ClassLoaderContextMap ExportedPlugins() (android.Paths, []string) SrcJarArgs() ([]string, android.Paths) BaseModuleName() string @@ -1027,7 +1027,8 @@ func (j *Module) collectDeps(ctx android.ModuleContext) deps { case libTag: deps.classpath = append(deps.classpath, dep.SdkHeaderJars(ctx, j.sdkVersion())...) // names of sdk libs that are directly depended are exported - j.exportedSdkLibs.MaybeAddLibraryPath(ctx, dep.OptionalImplicitSdkLibrary(), dep.DexJarBuildPath(), dep.DexJarInstallPath()) + j.exportedSdkLibs.MaybeAddContext(ctx, dep.OptionalImplicitSdkLibrary(), + dep.DexJarBuildPath(), dep.DexJarInstallPath()) case staticLibTag: ctx.ModuleErrorf("dependency on java_sdk_library %q can only be in libs", otherName) } @@ -1038,7 +1039,7 @@ func (j *Module) collectDeps(ctx android.ModuleContext) deps { case libTag, instrumentationForTag: deps.classpath = append(deps.classpath, dep.HeaderJars()...) // sdk lib names from dependencies are re-exported - j.exportedSdkLibs.AddLibraryPaths(dep.ExportedSdkLibs()) + j.exportedSdkLibs.AddContextMap(dep.ExportedSdkLibs(), otherName) deps.aidlIncludeDirs = append(deps.aidlIncludeDirs, dep.AidlIncludeDirs()...) pluginJars, pluginClasses := dep.ExportedPlugins() addPlugins(&deps, pluginJars, pluginClasses...) @@ -1050,7 +1051,7 @@ func (j *Module) collectDeps(ctx android.ModuleContext) deps { deps.staticHeaderJars = append(deps.staticHeaderJars, dep.HeaderJars()...) deps.staticResourceJars = append(deps.staticResourceJars, dep.ResourceJars()...) // sdk lib names from dependencies are re-exported - j.exportedSdkLibs.AddLibraryPaths(dep.ExportedSdkLibs()) + j.exportedSdkLibs.AddContextMap(dep.ExportedSdkLibs(), otherName) deps.aidlIncludeDirs = append(deps.aidlIncludeDirs, dep.AidlIncludeDirs()...) pluginJars, pluginClasses := dep.ExportedPlugins() addPlugins(&deps, pluginJars, pluginClasses...) @@ -1902,7 +1903,7 @@ func (j *Module) AidlIncludeDirs() android.Paths { return j.exportAidlIncludeDirs } -func (j *Module) ExportedSdkLibs() dexpreopt.LibraryPaths { +func (j *Module) ExportedSdkLibs() dexpreopt.ClassLoaderContextMap { return j.exportedSdkLibs } @@ -2041,7 +2042,7 @@ func (j *Library) GenerateAndroidBuildActions(ctx android.ModuleContext) { j.dexProperties.Uncompress_dex = proptools.BoolPtr(shouldUncompressDex(ctx, &j.dexpreopter)) } j.dexpreopter.uncompressedDex = *j.dexProperties.Uncompress_dex - j.exportedSdkLibs = make(dexpreopt.LibraryPaths) + j.exportedSdkLibs = make(dexpreopt.ClassLoaderContextMap) j.compile(ctx, nil) // Collect the module directory for IDE info in java/jdeps.go. @@ -2061,11 +2062,12 @@ func (j *Library) GenerateAndroidBuildActions(ctx android.ModuleContext) { // add the name of that java_sdk_library to the exported sdk libs to make sure // that, if necessary, a <uses-library> element for that java_sdk_library is // added to the Android manifest. - j.exportedSdkLibs.MaybeAddLibraryPath(ctx, j.OptionalImplicitSdkLibrary(), j.DexJarBuildPath(), j.DexJarInstallPath()) + j.exportedSdkLibs.MaybeAddContext(ctx, j.OptionalImplicitSdkLibrary(), + j.DexJarBuildPath(), j.DexJarInstallPath()) // A non-SDK library may provide a <uses-library> (the name may be different from the module name). if lib := proptools.String(j.usesLibraryProperties.Provides_uses_lib); lib != "" { - j.exportedSdkLibs.AddLibraryPath(ctx, lib, j.DexJarBuildPath(), j.DexJarInstallPath()) + j.exportedSdkLibs.AddContext(ctx, lib, j.DexJarBuildPath(), j.DexJarInstallPath()) } j.distFiles = j.GenerateTaggedDistFiles(ctx) @@ -2644,7 +2646,7 @@ type Import struct { dexJarFile android.Path combinedClasspathFile android.Path - exportedSdkLibs dexpreopt.LibraryPaths + exportedSdkLibs dexpreopt.ClassLoaderContextMap exportAidlIncludeDirs android.Paths hideApexVariantFromMake bool @@ -2719,7 +2721,7 @@ func (j *Import) GenerateAndroidBuildActions(ctx android.ModuleContext) { TransformJetifier(ctx, outputFile, inputFile) } j.combinedClasspathFile = outputFile - j.exportedSdkLibs = make(dexpreopt.LibraryPaths) + j.exportedSdkLibs = make(dexpreopt.ClassLoaderContextMap) var flags javaBuilderFlags @@ -2733,7 +2735,7 @@ func (j *Import) GenerateAndroidBuildActions(ctx android.ModuleContext) { case libTag, staticLibTag: flags.classpath = append(flags.classpath, dep.HeaderJars()...) // sdk lib names from dependencies are re-exported - j.exportedSdkLibs.AddLibraryPaths(dep.ExportedSdkLibs()) + j.exportedSdkLibs.AddContextMap(dep.ExportedSdkLibs(), otherName) case bootClasspathTag: flags.bootClasspath = append(flags.bootClasspath, dep.HeaderJars()...) } @@ -2742,7 +2744,8 @@ func (j *Import) GenerateAndroidBuildActions(ctx android.ModuleContext) { case libTag: flags.classpath = append(flags.classpath, dep.SdkHeaderJars(ctx, j.sdkVersion())...) // names of sdk libs that are directly depended are exported - j.exportedSdkLibs.AddLibraryPath(ctx, otherName, dep.DexJarBuildPath(), dep.DexJarInstallPath()) + j.exportedSdkLibs.AddContext(ctx, otherName, + dep.DexJarBuildPath(), dep.DexJarInstallPath()) } } }) @@ -2757,7 +2760,8 @@ func (j *Import) GenerateAndroidBuildActions(ctx android.ModuleContext) { // add the name of that java_sdk_library to the exported sdk libs to make sure // that, if necessary, a <uses-library> element for that java_sdk_library is // added to the Android manifest. - j.exportedSdkLibs.MaybeAddLibraryPath(ctx, j.OptionalImplicitSdkLibrary(), outputFile, installFile) + j.exportedSdkLibs.MaybeAddContext(ctx, j.OptionalImplicitSdkLibrary(), + outputFile, installFile) j.exportAidlIncludeDirs = android.PathsForModuleSrc(ctx, j.properties.Aidl.Export_include_dirs) @@ -2839,7 +2843,7 @@ func (j *Import) AidlIncludeDirs() android.Paths { return j.exportAidlIncludeDirs } -func (j *Import) ExportedSdkLibs() dexpreopt.LibraryPaths { +func (j *Import) ExportedSdkLibs() dexpreopt.ClassLoaderContextMap { return j.exportedSdkLibs } diff --git a/java/java_test.go b/java/java_test.go index 6c0a90856..4594b8111 100644 --- a/java/java_test.go +++ b/java/java_test.go @@ -70,9 +70,9 @@ func testConfig(env map[string]string, bp string, fs map[string][]byte) android. return config } -func testContext() *android.TestContext { +func testContext(config android.Config) *android.TestContext { - ctx := android.NewTestArchContext() + ctx := android.NewTestArchContext(config) RegisterJavaBuildComponents(ctx) RegisterAppBuildComponents(ctx) RegisterAARBuildComponents(ctx) @@ -115,7 +115,7 @@ func run(t *testing.T, ctx *android.TestContext, config android.Config) { pathCtx := android.PathContextForTesting(config) dexpreopt.SetTestGlobalConfig(config, dexpreopt.GlobalConfigForTests(pathCtx)) - ctx.Register(config) + ctx.Register() _, errs := ctx.ParseBlueprintsFiles("Android.bp") android.FailIfErrored(t, errs) _, errs = ctx.PrepareBuildActions(config) @@ -129,12 +129,12 @@ func testJavaError(t *testing.T, pattern string, bp string) (*android.TestContex func testJavaErrorWithConfig(t *testing.T, pattern string, config android.Config) (*android.TestContext, android.Config) { t.Helper() - ctx := testContext() + ctx := testContext(config) pathCtx := android.PathContextForTesting(config) dexpreopt.SetTestGlobalConfig(config, dexpreopt.GlobalConfigForTests(pathCtx)) - ctx.Register(config) + ctx.Register() _, errs := ctx.ParseBlueprintsFiles("Android.bp") if len(errs) > 0 { android.FailIfNoMatchingErrors(t, pattern, errs) @@ -163,7 +163,7 @@ func testJava(t *testing.T, bp string) (*android.TestContext, android.Config) { func testJavaWithConfig(t *testing.T, config android.Config) (*android.TestContext, android.Config) { t.Helper() - ctx := testContext() + ctx := testContext(config) run(t, ctx, config) return ctx, config @@ -1440,7 +1440,7 @@ func TestJavaLibrary(t *testing.T) { } `), }) - ctx := testContext() + ctx := testContext(config) run(t, ctx, config) } @@ -1458,7 +1458,7 @@ func TestJavaImport(t *testing.T) { } `), }) - ctx := testContext() + ctx := testContext(config) run(t, ctx, config) } @@ -1593,8 +1593,8 @@ func TestJavaSdkLibrary(t *testing.T) { // test if baz has exported SDK lib names foo and bar to qux qux := ctx.ModuleForTests("qux", "android_common") if quxLib, ok := qux.Module().(*Library); ok { - sdkLibs := android.SortedStringKeys(quxLib.ExportedSdkLibs()) - if w := []string{"bar", "foo", "fred", "quuz"}; !reflect.DeepEqual(w, sdkLibs) { + sdkLibs := quxLib.ExportedSdkLibs().UsesLibs() + if w := []string{"foo", "bar", "fred", "quuz"}; !reflect.DeepEqual(w, sdkLibs) { t.Errorf("qux should export %q but exports %q", w, sdkLibs) } } diff --git a/java/sdk_test.go b/java/sdk_test.go index 776069dc9..dc90ea304 100644 --- a/java/sdk_test.go +++ b/java/sdk_test.go @@ -356,7 +356,7 @@ func TestClasspath(t *testing.T) { config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true) config.TestProductVariables.Always_use_prebuilt_sdks = proptools.BoolPtr(true) } - ctx := testContext() + ctx := testContext(config) run(t, ctx, config) checkClasspath(t, ctx, true /* isJava8 */) @@ -377,7 +377,7 @@ func TestClasspath(t *testing.T) { config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true) config.TestProductVariables.Always_use_prebuilt_sdks = proptools.BoolPtr(true) } - ctx := testContext() + ctx := testContext(config) run(t, ctx, config) checkClasspath(t, ctx, false /* isJava8 */) @@ -401,7 +401,7 @@ func TestClasspath(t *testing.T) { config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true) config.TestProductVariables.Always_use_prebuilt_sdks = proptools.BoolPtr(true) } - ctx := testContext() + ctx := testContext(config) run(t, ctx, config) checkClasspath(t, ctx, true /* isJava8 */) @@ -417,7 +417,7 @@ func TestClasspath(t *testing.T) { config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true) config.TestProductVariables.Always_use_prebuilt_sdks = proptools.BoolPtr(true) } - ctx := testContext() + ctx := testContext(config) run(t, ctx, config) checkClasspath(t, ctx, false /* isJava8 */) diff --git a/linkerconfig/linkerconfig_test.go b/linkerconfig/linkerconfig_test.go index 13c276abf..01f465785 100644 --- a/linkerconfig/linkerconfig_test.go +++ b/linkerconfig/linkerconfig_test.go @@ -56,9 +56,9 @@ func testContext(t *testing.T, bp string) (*android.TestContext, android.Config) config := android.TestArchConfig(buildDir, nil, bp, fs) - ctx := android.NewTestArchContext() + ctx := android.NewTestArchContext(config) ctx.RegisterModuleType("linker_config", linkerConfigFactory) - ctx.Register(config) + ctx.Register() _, errs := ctx.ParseFileList(".", []string{"Android.bp"}) android.FailIfErrored(t, errs) diff --git a/python/python_test.go b/python/python_test.go index 10b565ae8..64bc4f6b8 100644 --- a/python/python_test.go +++ b/python/python_test.go @@ -329,13 +329,13 @@ func TestPythonModule(t *testing.T) { for _, d := range data { t.Run(d.desc, func(t *testing.T) { config := android.TestConfig(buildDir, nil, "", d.mockFiles) - ctx := android.NewTestContext() + ctx := android.NewTestContext(config) ctx.PreDepsMutators(RegisterPythonPreDepsMutators) ctx.RegisterModuleType("python_library_host", PythonLibraryHostFactory) ctx.RegisterModuleType("python_binary_host", PythonBinaryHostFactory) ctx.RegisterModuleType("python_defaults", defaultsFactory) ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators) - ctx.Register(config) + ctx.Register() _, testErrs := ctx.ParseBlueprintsFiles(bpFile) android.FailIfErrored(t, testErrs) _, actErrs := ctx.PrepareBuildActions(config) diff --git a/rust/builder.go b/rust/builder.go index 3e082dc2f..a09b1d1ec 100644 --- a/rust/builder.go +++ b/rust/builder.go @@ -15,6 +15,7 @@ package rust import ( + "path/filepath" "strings" "github.com/google/blueprint" @@ -235,7 +236,18 @@ func transformSrctoCrate(ctx ModuleContext, main android.Path, deps PathDeps, fl }, }) implicits = append(implicits, outputs.Paths()...) - envVars = append(envVars, "OUT_DIR=$$PWD/"+moduleGenDir.String()) + + // We must calculate an absolute path for OUT_DIR since Rust's include! macro (which normally consumes this) + // assumes that paths are relative to the source file. + var outDirPrefix string + if !filepath.IsAbs(moduleGenDir.String()) { + // If OUT_DIR is not absolute, we use $$PWD to generate an absolute path (os.Getwd() returns '/') + outDirPrefix = "$$PWD/" + } else { + // If OUT_DIR is absolute, then moduleGenDir will be an absolute path, so we don't need to set this to anything. + outDirPrefix = "" + } + envVars = append(envVars, "OUT_DIR="+filepath.Join(outDirPrefix, moduleGenDir.String())) } if flags.Clippy { diff --git a/rust/clippy_test.go b/rust/clippy_test.go index 7815aab9d..132b7b8fa 100644 --- a/rust/clippy_test.go +++ b/rust/clippy_test.go @@ -65,8 +65,8 @@ func TestClippy(t *testing.T) { t.Run("path="+tc.modulePath, func(t *testing.T) { config := android.TestArchConfig(buildDir, nil, bp, fs) - ctx := CreateTestContext() - ctx.Register(config) + ctx := CreateTestContext(config) + ctx.Register() _, errs := ctx.ParseFileList(".", []string{tc.modulePath + "Android.bp"}) android.FailIfErrored(t, errs) _, errs = ctx.PrepareBuildActions(config) diff --git a/rust/compiler_test.go b/rust/compiler_test.go index a25523c05..a6dba9eec 100644 --- a/rust/compiler_test.go +++ b/rust/compiler_test.go @@ -152,8 +152,8 @@ func TestLints(t *testing.T) { t.Run("path="+tc.modulePath, func(t *testing.T) { config := android.TestArchConfig(buildDir, nil, bp, fs) - ctx := CreateTestContext() - ctx.Register(config) + ctx := CreateTestContext(config) + ctx.Register() _, errs := ctx.ParseFileList(".", []string{tc.modulePath + "Android.bp"}) android.FailIfErrored(t, errs) _, errs = ctx.PrepareBuildActions(config) diff --git a/rust/protobuf.go b/rust/protobuf.go index ca4015402..76fed30fb 100644 --- a/rust/protobuf.go +++ b/rust/protobuf.go @@ -15,6 +15,9 @@ package rust import ( + "fmt" + "strings" + "android/soong/android" ) @@ -22,6 +25,10 @@ var ( defaultProtobufFlags = []string{""} ) +const ( + grpcSuffix = "_grpc" +) + type PluginType int const ( @@ -44,6 +51,9 @@ type ProtobufProperties struct { // List of additional flags to pass to aprotoc Proto_flags []string `android:"arch_variant"` + + // List of libraries which export include paths required for this module + Header_libs []string `android:"arch_variant"` } type protobufDecorator struct { @@ -72,6 +82,11 @@ func (proto *protobufDecorator) GenerateSource(ctx ModuleContext, deps PathDeps) ctx.PropertyErrorf("proto", "invalid path to proto file") } + // Add exported dependency include paths + for _, include := range deps.depIncludePaths { + protoFlags.Flags = append(protoFlags.Flags, "-I"+include.String()) + } + stem := proto.BaseSourceProvider.getStem(ctx) // rust protobuf-codegen output <stem>.rs stemFile := android.PathForModuleOut(ctx, stem+".rs") @@ -79,17 +94,39 @@ func (proto *protobufDecorator) GenerateSource(ctx ModuleContext, deps PathDeps) modFile := android.PathForModuleOut(ctx, "mod_"+stem+".rs") // mod_<stem>.rs is the main/first output file to be included/compiled outputs := android.WritablePaths{modFile, stemFile} + if proto.plugin == Grpc { + outputs = append(outputs, android.PathForModuleOut(ctx, stem+grpcSuffix+".rs")) + } depFile := android.PathForModuleOut(ctx, "mod_"+stem+".d") rule := android.NewRuleBuilder() android.ProtoRule(ctx, rule, protoFile.Path(), protoFlags, protoFlags.Deps, outDir, depFile, outputs) - rule.Command().Text("printf '// @generated\\npub mod %s;\\n' '" + stem + "' >").Output(modFile) + rule.Command().Text("printf '" + proto.getModFileContents(ctx) + "' >").Output(modFile) rule.Build(pctx, ctx, "protoc_"+protoFile.Path().Rel(), "protoc "+protoFile.Path().Rel()) proto.BaseSourceProvider.OutputFiles = android.Paths{modFile, stemFile} return modFile } +func (proto *protobufDecorator) getModFileContents(ctx ModuleContext) string { + stem := proto.BaseSourceProvider.getStem(ctx) + lines := []string{ + "// @generated", + fmt.Sprintf("pub mod %s;", stem), + } + + if proto.plugin == Grpc { + lines = append(lines, fmt.Sprintf("pub mod %s%s;", stem, grpcSuffix)) + lines = append( + lines, + "pub mod empty {", + " pub use protobuf::well_known_types::Empty;", + "}") + } + + return strings.Join(lines, "\\n") +} + func (proto *protobufDecorator) setupPlugin(ctx ModuleContext, protoFlags android.ProtoFlags, outDir android.ModuleOutPath) (android.Paths, android.ProtoFlags) { pluginPaths := []android.Path{} @@ -118,6 +155,13 @@ func (proto *protobufDecorator) SourceProviderProps() []interface{} { func (proto *protobufDecorator) SourceProviderDeps(ctx DepsContext, deps Deps) Deps { deps = proto.BaseSourceProvider.SourceProviderDeps(ctx, deps) deps.Rustlibs = append(deps.Rustlibs, "libprotobuf") + deps.HeaderLibs = append(deps.SharedLibs, proto.Properties.Header_libs...) + + if proto.plugin == Grpc { + deps.Rustlibs = append(deps.Rustlibs, "libgrpcio", "libfutures") + deps.HeaderLibs = append(deps.HeaderLibs, "libprotobuf-cpp-full") + } + return deps } diff --git a/rust/protobuf_test.go b/rust/protobuf_test.go index 7c3907100..845911f75 100644 --- a/rust/protobuf_test.go +++ b/rust/protobuf_test.go @@ -28,6 +28,16 @@ func TestRustProtobuf(t *testing.T) { proto: "buf.proto", crate_name: "rust_proto", source_stem: "buf", + shared_libs: ["libfoo_shared"], + static_libs: ["libfoo_static"], + } + cc_library_shared { + name: "libfoo_shared", + export_include_dirs: ["shared_include"], + } + cc_library_static { + name: "libfoo_static", + export_include_dirs: ["static_include"], } `) // Check that libprotobuf is added as a dependency. @@ -43,6 +53,13 @@ func TestRustProtobuf(t *testing.T) { t.Errorf("expected %q in %q", w, cmd) } + // Check exported include directories + if w := "-Ishared_include"; !strings.Contains(cmd, w) { + t.Errorf("expected %q in %q", w, cmd) + } + if w := "-Istatic_include"; !strings.Contains(cmd, w) { + t.Errorf("expected %q in %q", w, cmd) + } } func TestRustGrpcio(t *testing.T) { @@ -52,6 +69,16 @@ func TestRustGrpcio(t *testing.T) { proto: "buf.proto", crate_name: "rust_grpcio", source_stem: "buf", + shared_libs: ["libfoo_shared"], + static_libs: ["libfoo_static"], + } + cc_library_shared { + name: "libfoo_shared", + export_include_dirs: ["shared_include"], + } + cc_library_static { + name: "libfoo_static", + export_include_dirs: ["static_include"], } `) @@ -61,10 +88,33 @@ func TestRustGrpcio(t *testing.T) { t.Errorf("libprotobuf dependency missing for rust_grpcio (dependency missing from AndroidMkDylibs)") } + // Check that libgrpcio is added as a dependency. + if !android.InList("libgrpcio", librust_grpcio_module.Properties.AndroidMkDylibs) { + t.Errorf("libgrpcio dependency missing for rust_grpcio (dependency missing from AndroidMkDylibs)") + } + + // Check that libfutures is added as a dependency. + if !android.InList("libfutures", librust_grpcio_module.Properties.AndroidMkDylibs) { + t.Errorf("libfutures dependency missing for rust_grpcio (dependency missing from AndroidMkDylibs)") + } + // Make sure the correct plugin is being used. - librust_grpcio_out := ctx.ModuleForTests("librust_grpcio", "android_arm64_armv8-a_source").Output("buf.rs") + librust_grpcio_out := ctx.ModuleForTests("librust_grpcio", "android_arm64_armv8-a_source").Output("buf_grpc.rs") cmd := librust_grpcio_out.RuleParams.Command if w := "protoc-gen-grpc"; !strings.Contains(cmd, w) { t.Errorf("expected %q in %q", w, cmd) } + + // Check exported include directories + if w := "-Ishared_include"; !strings.Contains(cmd, w) { + t.Errorf("expected %q in %q", w, cmd) + } + if w := "-Istatic_include"; !strings.Contains(cmd, w) { + t.Errorf("expected %q in %q", w, cmd) + } + + // Check that we're including the exported directory from libprotobuf-cpp-full + if w := "-Ilibprotobuf-cpp-full-includes"; !strings.Contains(cmd, w) { + t.Errorf("expected %q in %q", w, cmd) + } } diff --git a/rust/rust.go b/rust/rust.go index e65b90e8a..5b9404504 100644 --- a/rust/rust.go +++ b/rust/rust.go @@ -229,6 +229,7 @@ type Deps struct { ProcMacros []string SharedLibs []string StaticLibs []string + HeaderLibs []string CrtBegin, CrtEnd string } @@ -838,6 +839,11 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps { directSharedLibDeps = append(directSharedLibDeps, ccDep) mod.Properties.AndroidMkSharedLibs = append(mod.Properties.AndroidMkSharedLibs, depName) exportDep = true + case cc.IsHeaderDepTag(depTag): + exportedInfo := ctx.OtherModuleProvider(dep, cc.FlagExporterInfoProvider).(cc.FlagExporterInfo) + depPaths.depIncludePaths = append(depPaths.depIncludePaths, exportedInfo.IncludeDirs...) + depPaths.depSystemIncludePaths = append(depPaths.depSystemIncludePaths, exportedInfo.SystemIncludeDirs...) + depPaths.depGeneratedHeaders = append(depPaths.depGeneratedHeaders, exportedInfo.GeneratedHeaders...) case depTag == cc.CrtBeginDepTag: depPaths.CrtBegin = linkObject case depTag == cc.CrtEndDepTag: @@ -983,6 +989,8 @@ func (mod *Module) DepsMutator(actx android.BottomUpMutatorContext) { blueprint.Variation{Mutator: "link", Variation: "static"}), cc.StaticDepTag(), deps.StaticLibs...) + actx.AddVariationDependencies(nil, cc.HeaderDepTag(), deps.HeaderLibs...) + crtVariations := cc.GetCrtVariations(ctx, mod) if deps.CrtBegin != "" { actx.AddVariationDependencies(crtVariations, cc.CrtBeginDepTag, deps.CrtBegin) diff --git a/rust/rust_test.go b/rust/rust_test.go index 9b2f023b7..14bbd0b9a 100644 --- a/rust/rust_test.go +++ b/rust/rust_test.go @@ -142,8 +142,8 @@ func (tctx testRustCtx) parse(t *testing.T) *android.TestContext { if tctx.config == nil { t.Fatalf("tctx.config not been generated yet. Please call generateConfig first.") } - ctx := CreateTestContext() - ctx.Register(*tctx.config) + ctx := CreateTestContext(*tctx.config) + ctx.Register() _, errs := ctx.ParseFileList(".", []string{"Android.bp"}) android.FailIfErrored(t, errs) _, errs = ctx.PrepareBuildActions(*tctx.config) @@ -157,8 +157,8 @@ func (tctx testRustCtx) parseError(t *testing.T, pattern string) { if tctx.config == nil { t.Fatalf("tctx.config not been generated yet. Please call generateConfig first.") } - ctx := CreateTestContext() - ctx.Register(*tctx.config) + ctx := CreateTestContext(*tctx.config) + ctx.Register() _, errs := ctx.ParseFileList(".", []string{"Android.bp"}) if len(errs) > 0 { diff --git a/rust/testing.go b/rust/testing.go index 4a1894c05..66877a907 100644 --- a/rust/testing.go +++ b/rust/testing.go @@ -79,6 +79,13 @@ func GatherRequiredDepsForTest() string { nocrt: true, system_shared_libs: [], } + cc_library { + name: "libprotobuf-cpp-full", + no_libcrt: true, + nocrt: true, + system_shared_libs: [], + export_include_dirs: ["libprotobuf-cpp-full-includes"], + } rust_library { name: "libstd", crate_name: "std", @@ -103,13 +110,25 @@ func GatherRequiredDepsForTest() string { srcs: ["foo.rs"], host_supported: true, } + rust_library { + name: "libgrpcio", + crate_name: "grpcio", + srcs: ["foo.rs"], + host_supported: true, + } + rust_library { + name: "libfutures", + crate_name: "futures", + srcs: ["foo.rs"], + host_supported: true, + } ` + cc.GatherRequiredDepsForTest(android.NoOsType) return bp } -func CreateTestContext() *android.TestContext { - ctx := android.NewTestArchContext() +func CreateTestContext(config android.Config) *android.TestContext { + ctx := android.NewTestArchContext(config) android.RegisterPrebuiltMutators(ctx) ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators) cc.RegisterRequiredBuildComponentsForTest(ctx) diff --git a/scripts/build-aml-prebuilts.sh b/scripts/build-aml-prebuilts.sh index ef5565de3..89fb1a569 100755 --- a/scripts/build-aml-prebuilts.sh +++ b/scripts/build-aml-prebuilts.sh @@ -37,6 +37,14 @@ my_get_build_var() { OUT_DIR=${OUT_DIR}/get_build_var get_build_var "$@" } +readonly SOONG_OUT=${OUT_DIR}/soong +mkdir -p ${SOONG_OUT} + +# Some Soong build rules may require this, and the failure mode if it's missing +# is confusing (b/172548608). +readonly BUILD_NUMBER="$(my_get_build_var BUILD_NUMBER)" +echo -n ${BUILD_NUMBER} > ${SOONG_OUT}/build_number.txt + readonly PLATFORM_SDK_VERSION="$(my_get_build_var PLATFORM_SDK_VERSION)" readonly PLATFORM_VERSION="$(my_get_build_var PLATFORM_VERSION)" PLATFORM_VERSION_ALL_CODENAMES="$(my_get_build_var PLATFORM_VERSION_ALL_CODENAMES)" @@ -61,8 +69,6 @@ else USE_GOMA=false fi -readonly SOONG_OUT=${OUT_DIR}/soong -mkdir -p ${SOONG_OUT} readonly SOONG_VARS=${SOONG_OUT}/soong.variables # Aml_abis: true @@ -73,6 +79,8 @@ readonly SOONG_VARS=${SOONG_OUT}/soong.variables # - Enable Bionic on host as ART needs prebuilts for it. cat > ${SOONG_VARS}.new << EOF { + "BuildNumberFile": "build_number.txt", + "Platform_sdk_version": ${PLATFORM_SDK_VERSION}, "Platform_sdk_codename": "${PLATFORM_VERSION}", "Platform_version_active_codenames": ${PLATFORM_VERSION_ALL_CODENAMES}, diff --git a/sdk/testing.go b/sdk/testing.go index 0b280efa3..5f520e5b0 100644 --- a/sdk/testing.go +++ b/sdk/testing.go @@ -80,7 +80,7 @@ func testSdkContext(bp string, fs map[string][]byte, extraOsTypes []android.OsTy } } - ctx := android.NewTestArchContext() + ctx := android.NewTestArchContext(config) // Enable androidmk support. // * Register the singleton @@ -129,7 +129,7 @@ func testSdkContext(bp string, fs map[string][]byte, extraOsTypes []android.OsTy ctx.PreDepsMutators(RegisterPreDepsMutators) ctx.PostDepsMutators(RegisterPostDepsMutators) - ctx.Register(config) + ctx.Register() return ctx, config } diff --git a/sh/sh_binary_test.go b/sh/sh_binary_test.go index 0aa607b6f..c664461a9 100644 --- a/sh/sh_binary_test.go +++ b/sh/sh_binary_test.go @@ -45,13 +45,13 @@ func testShBinary(t *testing.T, bp string) (*android.TestContext, android.Config config := android.TestArchConfig(buildDir, nil, bp, fs) - ctx := android.NewTestArchContext() + ctx := android.NewTestArchContext(config) ctx.RegisterModuleType("sh_test", ShTestFactory) ctx.RegisterModuleType("sh_test_host", ShTestHostFactory) cc.RegisterRequiredBuildComponentsForTest(ctx) - ctx.Register(config) + ctx.Register() _, errs := ctx.ParseFileList(".", []string{"Android.bp"}) android.FailIfErrored(t, errs) _, errs = ctx.PrepareBuildActions(config) diff --git a/shared/paths.go b/shared/paths.go index f5dc5ac44..24ba057aa 100644 --- a/shared/paths.go +++ b/shared/paths.go @@ -24,3 +24,17 @@ import ( func TempDirForOutDir(outDir string) (tempPath string) { return filepath.Join(outDir, ".temp") } + +// BazelMetricsDir returns the path where a set of bazel profile +// files are stored for later processed by the metrics pipeline. +func BazelMetricsDir(outDir string) string { + return filepath.Join(outDir, "bazel_metrics") +} + +// BazelMetricsFilename returns the bazel profile filename based +// on the action name. This is to help to store a set of bazel +// profiles since bazel may execute multiple times during a single +// build. +func BazelMetricsFilename(outDir, actionName string) string { + return filepath.Join(BazelMetricsDir(outDir), actionName+"_bazel_profile.gz") +} diff --git a/sysprop/sysprop_test.go b/sysprop/sysprop_test.go index 7a79a1b66..b8b93f631 100644 --- a/sysprop/sysprop_test.go +++ b/sysprop/sysprop_test.go @@ -57,7 +57,7 @@ func TestMain(m *testing.M) { func testContext(config android.Config) *android.TestContext { - ctx := android.NewTestArchContext() + ctx := android.NewTestArchContext(config) java.RegisterJavaBuildComponents(ctx) java.RegisterAppBuildComponents(ctx) java.RegisterSystemModulesBuildComponents(ctx) @@ -76,7 +76,7 @@ func testContext(config android.Config) *android.TestContext { ctx.RegisterModuleType("sysprop_library", syspropLibraryFactory) - ctx.Register(config) + ctx.Register() return ctx } diff --git a/ui/build/bazel.go b/ui/build/bazel.go index ca9ad4352..4b03bc16f 100644 --- a/ui/build/bazel.go +++ b/ui/build/bazel.go @@ -19,9 +19,15 @@ import ( "os" "path/filepath" "strings" + + "android/soong/shared" + "android/soong/ui/metrics" ) func runBazel(ctx Context, config Config) { + ctx.BeginTrace(metrics.RunBazel, "bazel") + defer ctx.EndTrace() + // "droid" is the default ninja target. // TODO(b/160568333): stop hardcoding 'droid' to support building any // Ninja target. @@ -33,6 +39,11 @@ func runBazel(ctx Context, config Config) { outputGroups = strings.Join(config.ninjaArgs, ",") } + config.environ.Set("COMBINED_NINJA", config.CombinedNinjaFile()) + config.environ.Set("KATI_NINJA", config.KatiBuildNinjaFile()) + config.environ.Set("PACKAGE_NINJA", config.KatiPackageNinjaFile()) + config.environ.Set("SOONG_NINJA", config.SoongNinjaFile()) + bazelExecutable := filepath.Join("tools", "bazel") cmd := Command(ctx, config, "bazel", bazelExecutable) @@ -40,9 +51,12 @@ func runBazel(ctx Context, config Config) { cmd.Args = append(cmd.Args, strings.Fields(extra_startup_args)...) } + actionName := "build" cmd.Args = append(cmd.Args, - "build", + actionName, "--output_groups="+outputGroups, + "--profile="+filepath.Join(shared.BazelMetricsFilename(config.OutDir(), actionName)), + "--slim_profile=true", ) if extra_build_args, ok := cmd.Environment.Get("BAZEL_BUILD_ARGS"); ok { diff --git a/ui/build/config.go b/ui/build/config.go index e57c7303c..641aae660 100644 --- a/ui/build/config.go +++ b/ui/build/config.go @@ -274,6 +274,16 @@ func NewConfig(ctx Context, args ...string) Config { } } + bpd := shared.BazelMetricsDir(ret.OutDir()) + if err := os.RemoveAll(bpd); err != nil { + ctx.Fatalf("Unable to remove bazel profile directory %q: %v", bpd, err) + } + if ret.UseBazel() { + if err := os.MkdirAll(bpd, 0777); err != nil { + ctx.Fatalf("Failed to create bazel profile directory %q: %v", bpd, err) + } + } + c := Config{ret} storeConfigMetrics(ctx, c) return c @@ -840,6 +850,16 @@ func (c *configImpl) UseRBE() bool { return false } +func (c *configImpl) UseBazel() bool { + if v, ok := c.environ.Get("USE_BAZEL"); ok { + v = strings.TrimSpace(v) + if v != "" && v != "false" { + return true + } + } + return false +} + func (c *configImpl) StartRBE() bool { if !c.UseRBE() { return false diff --git a/ui/metrics/metrics.go b/ui/metrics/metrics.go index 9434924e2..703104236 100644 --- a/ui/metrics/metrics.go +++ b/ui/metrics/metrics.go @@ -32,6 +32,7 @@ const ( RunSetupTool = "setup" RunShutdownTool = "shutdown" RunSoong = "soong" + RunBazel = "bazel" TestRun = "test" Total = "total" ) @@ -53,17 +54,14 @@ func (m *Metrics) SetTimeMetrics(perf soong_metrics_proto.PerfInfo) { switch perf.GetName() { case RunKati: m.metrics.KatiRuns = append(m.metrics.KatiRuns, &perf) - break case RunSoong: m.metrics.SoongRuns = append(m.metrics.SoongRuns, &perf) - break + case RunBazel: + m.metrics.BazelRuns = append(m.metrics.BazelRuns, &perf) case PrimaryNinja: m.metrics.NinjaRuns = append(m.metrics.NinjaRuns, &perf) - break case Total: m.metrics.Total = &perf - default: - // ignored } } @@ -80,13 +78,10 @@ func (m *Metrics) SetMetadataMetrics(metadata map[string]string) { switch k { case "BUILD_ID": m.metrics.BuildId = proto.String(v) - break case "PLATFORM_VERSION_CODENAME": m.metrics.PlatformVersionCodename = proto.String(v) - break case "TARGET_PRODUCT": m.metrics.TargetProduct = proto.String(v) - break case "TARGET_BUILD_VARIANT": switch v { case "user": @@ -95,8 +90,6 @@ func (m *Metrics) SetMetadataMetrics(metadata map[string]string) { m.metrics.TargetBuildVariant = soong_metrics_proto.MetricsBase_USERDEBUG.Enum() case "eng": m.metrics.TargetBuildVariant = soong_metrics_proto.MetricsBase_ENG.Enum() - default: - // ignored } case "TARGET_ARCH": m.metrics.TargetArch = m.getArch(v) @@ -118,8 +111,6 @@ func (m *Metrics) SetMetadataMetrics(metadata map[string]string) { m.metrics.HostCross_2NdArch = proto.String(v) case "OUT_DIR": m.metrics.OutDir = proto.String(v) - default: - // ignored } } } diff --git a/ui/metrics/metrics_proto/metrics.pb.go b/ui/metrics/metrics_proto/metrics.pb.go index 5db5ae5cd..fc2cfa492 100644 --- a/ui/metrics/metrics_proto/metrics.pb.go +++ b/ui/metrics/metrics_proto/metrics.pb.go @@ -205,10 +205,12 @@ type MetricsBase struct { // The system resource information such as total physical memory. SystemResourceInfo *SystemResourceInfo `protobuf:"bytes,25,opt,name=system_resource_info,json=systemResourceInfo" json:"system_resource_info,omitempty"` // The build command that the user entered to the build system. - BuildCommand *string `protobuf:"bytes,26,opt,name=build_command,json=buildCommand" json:"build_command,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + BuildCommand *string `protobuf:"bytes,26,opt,name=build_command,json=buildCommand" json:"build_command,omitempty"` + // The metrics for calling Bazel. + BazelRuns []*PerfInfo `protobuf:"bytes,27,rep,name=bazel_runs,json=bazelRuns" json:"bazel_runs,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *MetricsBase) Reset() { *m = MetricsBase{} } @@ -423,6 +425,13 @@ func (m *MetricsBase) GetBuildCommand() string { return "" } +func (m *MetricsBase) GetBazelRuns() []*PerfInfo { + if m != nil { + return m.BazelRuns + } + return nil +} + type BuildConfig struct { UseGoma *bool `protobuf:"varint,1,opt,name=use_goma,json=useGoma" json:"use_goma,omitempty"` UseRbe *bool `protobuf:"varint,2,opt,name=use_rbe,json=useRbe" json:"use_rbe,omitempty"` @@ -981,91 +990,92 @@ func init() { } var fileDescriptor_6039342a2ba47b72 = []byte{ - // 1366 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x57, 0xdd, 0x52, 0x1b, 0xc7, - 0x12, 0xb6, 0x40, 0x20, 0xa9, 0xf5, 0x83, 0x18, 0xe0, 0xb0, 0xc6, 0xf6, 0x39, 0x1c, 0x25, 0x76, - 0xa8, 0x54, 0x8c, 0x5d, 0xc4, 0x45, 0xb9, 0x28, 0x57, 0x2a, 0x20, 0x13, 0xc7, 0xa1, 0x40, 0xd4, - 0x60, 0x1c, 0x27, 0xb9, 0x98, 0x8c, 0x56, 0x23, 0x58, 0x7b, 0x77, 0x67, 0x6b, 0x66, 0x96, 0x80, - 0x1f, 0x25, 0x6f, 0x92, 0xeb, 0x3c, 0x4b, 0x9e, 0x20, 0x2f, 0x90, 0x9a, 0x9e, 0xdd, 0x65, 0xc1, - 0x8a, 0xed, 0xf2, 0xdd, 0xee, 0xd7, 0xdf, 0xd7, 0xd3, 0xdd, 0x3b, 0xdd, 0x2d, 0x41, 0x3b, 0x12, - 0x46, 0x05, 0xbe, 0x5e, 0x4f, 0x94, 0x34, 0x92, 0x2c, 0x68, 0x29, 0xe3, 0x13, 0x36, 0x4c, 0x83, - 0x70, 0xc4, 0x32, 0x53, 0xef, 0xf7, 0x16, 0x34, 0xf7, 0xdd, 0xf3, 0x0e, 0xd7, 0x82, 0x3c, 0x84, - 0x45, 0x47, 0x18, 0x71, 0x23, 0x98, 0x09, 0x22, 0xa1, 0x0d, 0x8f, 0x12, 0xaf, 0xb2, 0x5a, 0x59, - 0x9b, 0xa6, 0x04, 0x6d, 0x4f, 0xb9, 0x11, 0x2f, 0x72, 0x0b, 0xb9, 0x09, 0x75, 0xa7, 0x08, 0x46, - 0xde, 0xd4, 0x6a, 0x65, 0xad, 0x41, 0x6b, 0xf8, 0xfe, 0x7c, 0x44, 0xb6, 0xe0, 0x66, 0x12, 0x72, - 0x33, 0x96, 0x2a, 0x62, 0x67, 0x42, 0xe9, 0x40, 0xc6, 0xcc, 0x97, 0x23, 0x11, 0xf3, 0x48, 0x78, - 0xd3, 0xc8, 0x5d, 0xce, 0x09, 0x2f, 0x9d, 0xbd, 0x9f, 0x99, 0xc9, 0x5d, 0xe8, 0x18, 0xae, 0x4e, - 0x84, 0x61, 0x89, 0x92, 0xa3, 0xd4, 0x37, 0x5e, 0x15, 0x05, 0x6d, 0x87, 0x1e, 0x3a, 0x90, 0x8c, - 0x60, 0x31, 0xa3, 0xb9, 0x20, 0xce, 0xb8, 0x0a, 0x78, 0x6c, 0xbc, 0x99, 0xd5, 0xca, 0x5a, 0x67, - 0xe3, 0xfe, 0xfa, 0x84, 0x9c, 0xd7, 0x4b, 0xf9, 0xae, 0xef, 0x58, 0xcb, 0x4b, 0x27, 0xda, 0x9a, - 0xde, 0x3d, 0x78, 0x46, 0x89, 0xf3, 0x57, 0x36, 0x90, 0x01, 0x34, 0xb3, 0x53, 0xb8, 0xf2, 0x4f, - 0xbd, 0x59, 0x74, 0x7e, 0xf7, 0x83, 0xce, 0xb7, 0x95, 0x7f, 0xba, 0x55, 0x3b, 0x3e, 0xd8, 0x3b, - 0x18, 0xfc, 0x78, 0x40, 0xc1, 0xb9, 0xb0, 0x20, 0x59, 0x87, 0x85, 0x92, 0xc3, 0x22, 0xea, 0x1a, - 0xa6, 0x38, 0x7f, 0x49, 0xcc, 0x03, 0xf8, 0x0a, 0xb2, 0xb0, 0x98, 0x9f, 0xa4, 0x05, 0xbd, 0x8e, - 0xf4, 0xae, 0xb3, 0xf4, 0x93, 0x34, 0x67, 0xef, 0x41, 0xe3, 0x54, 0xea, 0x2c, 0xd8, 0xc6, 0x27, - 0x05, 0x5b, 0xb7, 0x0e, 0x30, 0x54, 0x0a, 0x6d, 0x74, 0xb6, 0x11, 0x8f, 0x9c, 0x43, 0xf8, 0x24, - 0x87, 0x4d, 0xeb, 0x64, 0x23, 0x1e, 0xa1, 0xcf, 0x65, 0xa8, 0xa1, 0x4f, 0xa9, 0xbd, 0x26, 0xe6, - 0x30, 0x6b, 0x5f, 0x07, 0x9a, 0xf4, 0xb2, 0xc3, 0xa4, 0x66, 0xe2, 0xdc, 0x28, 0xee, 0xb5, 0xd0, - 0xdc, 0x74, 0xe6, 0x5d, 0x0b, 0x15, 0x1c, 0x5f, 0x49, 0xad, 0xad, 0x8b, 0xf6, 0x25, 0xa7, 0x6f, - 0xb1, 0x81, 0x26, 0xf7, 0x60, 0xae, 0xc4, 0xc1, 0xb0, 0x3b, 0xee, 0xfa, 0x14, 0x2c, 0x0c, 0xe4, - 0x3e, 0x2c, 0x94, 0x78, 0x45, 0x8a, 0x73, 0xae, 0xb0, 0x05, 0xb7, 0x14, 0xb7, 0x4c, 0x0d, 0x1b, - 0x05, 0xca, 0xeb, 0xba, 0xb8, 0x65, 0x6a, 0x9e, 0x06, 0x8a, 0x7c, 0x03, 0x4d, 0x2d, 0x4c, 0x9a, - 0x30, 0x23, 0x65, 0xa8, 0xbd, 0xf9, 0xd5, 0xe9, 0xb5, 0xe6, 0xc6, 0x9d, 0x89, 0x25, 0x3a, 0x14, - 0x6a, 0xfc, 0x3c, 0x1e, 0x4b, 0x0a, 0xa8, 0x78, 0x61, 0x05, 0x64, 0x0b, 0x1a, 0x6f, 0xb8, 0x09, - 0x98, 0x4a, 0x63, 0xed, 0x91, 0x8f, 0x51, 0xd7, 0x2d, 0x9f, 0xa6, 0xb1, 0x26, 0x4f, 0x00, 0x1c, - 0x13, 0xc5, 0x0b, 0x1f, 0x23, 0x6e, 0xa0, 0x35, 0x57, 0xc7, 0x41, 0xfc, 0x9a, 0x3b, 0xf5, 0xe2, - 0x47, 0xa9, 0x51, 0x80, 0xea, 0xaf, 0x61, 0xc6, 0x48, 0xc3, 0x43, 0x6f, 0x69, 0xb5, 0xf2, 0x61, - 0xa1, 0xe3, 0x92, 0x97, 0x30, 0x69, 0x14, 0x79, 0xff, 0x41, 0x17, 0xf7, 0x26, 0xba, 0x38, 0xb2, - 0x18, 0xb6, 0x64, 0x76, 0xc3, 0xe8, 0xbc, 0xbe, 0x0e, 0x91, 0x3e, 0xb4, 0x9c, 0xca, 0x97, 0xf1, - 0x38, 0x38, 0xf1, 0x96, 0xd1, 0xe1, 0xea, 0x44, 0x87, 0x28, 0xec, 0x23, 0x8f, 0x36, 0x87, 0x97, - 0x2f, 0x64, 0x05, 0xf0, 0xea, 0xe3, 0x88, 0xf2, 0xf0, 0x1b, 0x17, 0xef, 0xe4, 0x27, 0x58, 0xd4, - 0x17, 0xda, 0x88, 0x88, 0x29, 0xa1, 0x65, 0xaa, 0x7c, 0xc1, 0x82, 0x78, 0x2c, 0xbd, 0x9b, 0x78, - 0xd0, 0x17, 0x93, 0x23, 0x47, 0x01, 0xcd, 0xf8, 0x58, 0x06, 0xa2, 0xdf, 0xc1, 0xc8, 0x67, 0xd0, - 0xce, 0x63, 0x8f, 0x22, 0x1e, 0x8f, 0xbc, 0x15, 0x3c, 0xbb, 0x95, 0x85, 0x86, 0x58, 0xef, 0x21, - 0xb4, 0xae, 0x8c, 0xa5, 0x3a, 0x54, 0x8f, 0x8f, 0x76, 0x69, 0xf7, 0x06, 0x69, 0x43, 0xc3, 0x3e, - 0x3d, 0xdd, 0xdd, 0x39, 0x7e, 0xd6, 0xad, 0x90, 0x1a, 0xd8, 0x51, 0xd6, 0x9d, 0xea, 0x3d, 0x81, - 0x2a, 0x5e, 0xdc, 0x26, 0xe4, 0x8d, 0xd8, 0xbd, 0x61, 0xad, 0xdb, 0x74, 0xbf, 0x5b, 0x21, 0x0d, - 0x98, 0xd9, 0xa6, 0xfb, 0x9b, 0x8f, 0xba, 0x53, 0x16, 0x7b, 0xf5, 0x78, 0xb3, 0x3b, 0x4d, 0x00, - 0x66, 0x5f, 0x3d, 0xde, 0x64, 0x9b, 0x8f, 0xba, 0xd5, 0xde, 0x09, 0x34, 0x4b, 0x75, 0xb2, 0x93, - 0x3e, 0xd5, 0x82, 0x9d, 0xc8, 0x88, 0xe3, 0x3e, 0xa8, 0xd3, 0x5a, 0xaa, 0xc5, 0x33, 0x19, 0x71, - 0xdb, 0x18, 0xd6, 0xa4, 0x86, 0x02, 0x77, 0x40, 0x9d, 0xce, 0xa6, 0x5a, 0xd0, 0xa1, 0x20, 0x9f, - 0x43, 0x67, 0x2c, 0x6d, 0xa1, 0x0a, 0xe5, 0x34, 0xda, 0x5b, 0x88, 0x1e, 0x3b, 0x79, 0x4f, 0x02, - 0x79, 0xb7, 0x4e, 0x64, 0x03, 0x96, 0xf0, 0xc2, 0xb0, 0xe4, 0xf4, 0x42, 0x07, 0x3e, 0x0f, 0x59, - 0x24, 0x22, 0xa9, 0x2e, 0xf0, 0xf0, 0x2a, 0x5d, 0x40, 0xe3, 0x61, 0x66, 0xdb, 0x47, 0x93, 0x5d, - 0x1b, 0xfc, 0x8c, 0x07, 0x21, 0x1f, 0x86, 0xc2, 0xce, 0x4a, 0x8d, 0xf1, 0xcc, 0xd0, 0x76, 0x81, - 0xf6, 0x93, 0x54, 0xf7, 0xfe, 0xae, 0x40, 0x3d, 0xbf, 0x96, 0x84, 0x40, 0x75, 0x24, 0xb4, 0x8f, - 0x6e, 0x1b, 0x14, 0x9f, 0x2d, 0x86, 0x57, 0xc0, 0x6d, 0x34, 0x7c, 0x26, 0x77, 0x00, 0xb4, 0xe1, - 0xca, 0xe0, 0x5a, 0xc4, 0x3c, 0xaa, 0xb4, 0x81, 0x88, 0xdd, 0x86, 0xe4, 0x16, 0x34, 0x94, 0xe0, - 0xa1, 0xb3, 0x56, 0xd1, 0x5a, 0xb7, 0x00, 0x1a, 0xff, 0x0f, 0xe0, 0x82, 0xb7, 0x85, 0xc0, 0xed, - 0x54, 0xdd, 0x99, 0xf2, 0x2a, 0xb4, 0xe1, 0xd0, 0x63, 0x2d, 0xc8, 0xaf, 0xb0, 0x9c, 0x28, 0xe9, - 0x0b, 0xad, 0x85, 0xbe, 0x76, 0xc1, 0x66, 0xb1, 0x2d, 0xd7, 0x26, 0x77, 0x97, 0xd3, 0x5c, 0xb9, - 0x61, 0x4b, 0x85, 0xa3, 0x32, 0xdc, 0xfb, 0x63, 0x1a, 0x16, 0x26, 0xd0, 0x8b, 0x64, 0x2b, 0xa5, - 0x64, 0xd7, 0xa0, 0x9b, 0x6a, 0xa1, 0x30, 0x1b, 0x16, 0x05, 0x76, 0x40, 0x62, 0x31, 0xaa, 0xb4, - 0x63, 0x71, 0x9b, 0xd4, 0x3e, 0xa2, 0x76, 0x37, 0x65, 0x5d, 0x51, 0xe6, 0xba, 0xf2, 0x74, 0x9d, - 0xa5, 0xc4, 0xbe, 0x0d, 0x10, 0xf1, 0x73, 0xa6, 0xb4, 0x66, 0x6f, 0x86, 0x79, 0x99, 0x22, 0x7e, - 0x4e, 0xb5, 0xde, 0x1b, 0x92, 0x2f, 0x61, 0x3e, 0x0a, 0x62, 0xa9, 0x58, 0xc2, 0x4f, 0x04, 0x1b, - 0xf3, 0x34, 0x34, 0xda, 0x55, 0x8b, 0xce, 0xa1, 0xe1, 0x90, 0x9f, 0x88, 0xef, 0x10, 0x46, 0x2e, - 0x7f, 0x7d, 0x8d, 0x3b, 0x9b, 0x71, 0xad, 0xa1, 0xc4, 0xfd, 0x2f, 0x34, 0x03, 0xc9, 0x82, 0x38, - 0x49, 0x8d, 0x3d, 0xb6, 0xe6, 0xbe, 0x5d, 0x20, 0x9f, 0x5b, 0x64, 0x6f, 0x48, 0x56, 0xa1, 0x15, - 0x48, 0x26, 0x53, 0x93, 0x11, 0xea, 0x48, 0x80, 0x40, 0x0e, 0x10, 0xda, 0x1b, 0x92, 0x27, 0xb0, - 0x72, 0x26, 0xc3, 0x34, 0x36, 0x5c, 0x5d, 0xd8, 0x01, 0x63, 0xc4, 0xb9, 0x61, 0xfa, 0xb7, 0xc0, - 0xf8, 0xa7, 0x42, 0xe3, 0x92, 0xad, 0x52, 0xaf, 0x60, 0xf4, 0x1d, 0xe1, 0x28, 0xb3, 0x93, 0x6f, - 0xe1, 0x76, 0x10, 0xbf, 0x47, 0x0f, 0xa8, 0x5f, 0x29, 0x71, 0xae, 0x79, 0xe8, 0xfd, 0x55, 0x81, - 0xce, 0xbe, 0x1c, 0xa5, 0xa1, 0x78, 0x71, 0x91, 0xb8, 0xcf, 0xf6, 0x4b, 0x3e, 0xef, 0x5c, 0x91, - 0xf1, 0xf3, 0x75, 0x36, 0x1e, 0x4c, 0x5e, 0xcc, 0x57, 0xa4, 0x6e, 0xfc, 0xb9, 0x96, 0x2b, 0xad, - 0xe8, 0xe1, 0x25, 0x4a, 0xfe, 0x07, 0xcd, 0x08, 0x35, 0xcc, 0x5c, 0x24, 0x79, 0x1f, 0x40, 0x54, - 0xb8, 0xb1, 0x9d, 0x1d, 0xa7, 0x11, 0x93, 0x63, 0xe6, 0x40, 0xf7, 0xc9, 0xdb, 0xb4, 0x15, 0xa7, - 0xd1, 0x60, 0xec, 0xce, 0xd3, 0xbd, 0x07, 0xd9, 0x08, 0xc9, 0xbc, 0x5e, 0x99, 0x43, 0x0d, 0x98, - 0x39, 0x1a, 0x0c, 0x0e, 0xec, 0xc0, 0xaa, 0x43, 0x75, 0x7f, 0x7b, 0x6f, 0xb7, 0x3b, 0xd5, 0x0b, - 0x61, 0xa5, 0xaf, 0x02, 0x63, 0x5b, 0xfa, 0x58, 0x0b, 0xf5, 0x83, 0x4c, 0x55, 0x2c, 0x2e, 0xf2, - 0x11, 0x3f, 0xe9, 0xa6, 0x6e, 0x41, 0x2d, 0x5f, 0x21, 0x53, 0xef, 0x99, 0xf8, 0xa5, 0x9f, 0x26, - 0x34, 0x17, 0xf4, 0x86, 0x70, 0x6b, 0xc2, 0x69, 0xfa, 0x72, 0xa3, 0x54, 0xfd, 0xf4, 0xb5, 0xf6, - 0x2a, 0xd8, 0x7f, 0x93, 0x2b, 0xfb, 0xef, 0xd1, 0x52, 0x14, 0xf7, 0xfe, 0xac, 0xc0, 0xfc, 0x3b, - 0xfb, 0x8b, 0x78, 0x50, 0xcb, 0xeb, 0x56, 0xc1, 0xba, 0xe5, 0xaf, 0x76, 0x03, 0x65, 0x3f, 0xf0, - 0x5c, 0x42, 0x6d, 0x5a, 0xbc, 0xdb, 0x3b, 0xef, 0x46, 0x22, 0x0f, 0x43, 0xe9, 0x33, 0x5f, 0xa6, - 0xb1, 0xc9, 0x5a, 0x6d, 0x0e, 0x0d, 0xdb, 0x16, 0xef, 0x5b, 0xd8, 0x76, 0x70, 0x99, 0xab, 0x83, - 0xb7, 0xf9, 0x58, 0xea, 0x5c, 0x52, 0x8f, 0x82, 0xb7, 0xc2, 0xfe, 0xa2, 0xb2, 0x3d, 0x79, 0x2a, - 0x78, 0xe2, 0x68, 0xae, 0xe3, 0x9a, 0x11, 0x3f, 0xff, 0x5e, 0xf0, 0xc4, 0x72, 0x76, 0x96, 0x7e, - 0xce, 0x96, 0x76, 0x96, 0x37, 0xc3, 0x3f, 0x15, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0xb9, 0x86, - 0x34, 0xa9, 0x64, 0x0c, 0x00, 0x00, + // 1380 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x57, 0xef, 0x52, 0x1b, 0x37, + 0x10, 0x8f, 0xc1, 0x60, 0x7b, 0xfd, 0x07, 0x23, 0xa0, 0x5c, 0x48, 0xd2, 0x52, 0xb7, 0x49, 0x99, + 0x4e, 0x43, 0x32, 0x34, 0xc3, 0x64, 0x98, 0x4c, 0xa7, 0xe0, 0xd0, 0x34, 0x65, 0xc0, 0x8c, 0x08, + 0x69, 0xda, 0x7e, 0x50, 0xe5, 0xb3, 0x0c, 0x97, 0xdc, 0x9d, 0x6e, 0x24, 0x1d, 0xc5, 0x79, 0xb3, + 0x7e, 0xee, 0x4b, 0xf4, 0x05, 0xfa, 0x04, 0x7d, 0x81, 0x8e, 0x56, 0x77, 0xe6, 0x20, 0x6e, 0xc2, + 0xe4, 0xdb, 0xe9, 0xb7, 0xbf, 0xdf, 0x6a, 0xb5, 0xd2, 0xee, 0xda, 0xd0, 0x8c, 0x84, 0x51, 0x81, + 0xaf, 0xd7, 0x13, 0x25, 0x8d, 0x24, 0x0b, 0x5a, 0xca, 0xf8, 0x84, 0xf5, 0xd3, 0x20, 0x1c, 0xb0, + 0xcc, 0xd4, 0xf9, 0xbb, 0x01, 0xf5, 0x7d, 0xf7, 0xbd, 0xc3, 0xb5, 0x20, 0x0f, 0x61, 0xd1, 0x11, + 0x06, 0xdc, 0x08, 0x66, 0x82, 0x48, 0x68, 0xc3, 0xa3, 0xc4, 0x2b, 0xad, 0x96, 0xd6, 0xa6, 0x29, + 0x41, 0xdb, 0x53, 0x6e, 0xc4, 0x8b, 0xdc, 0x42, 0x6e, 0x42, 0xd5, 0x29, 0x82, 0x81, 0x37, 0xb5, + 0x5a, 0x5a, 0xab, 0xd1, 0x0a, 0xae, 0x9f, 0x0f, 0xc8, 0x16, 0xdc, 0x4c, 0x42, 0x6e, 0x86, 0x52, + 0x45, 0xec, 0x4c, 0x28, 0x1d, 0xc8, 0x98, 0xf9, 0x72, 0x20, 0x62, 0x1e, 0x09, 0x6f, 0x1a, 0xb9, + 0xcb, 0x39, 0xe1, 0xa5, 0xb3, 0x77, 0x33, 0x33, 0xb9, 0x0b, 0x2d, 0xc3, 0xd5, 0x89, 0x30, 0x2c, + 0x51, 0x72, 0x90, 0xfa, 0xc6, 0x2b, 0xa3, 0xa0, 0xe9, 0xd0, 0x43, 0x07, 0x92, 0x01, 0x2c, 0x66, + 0x34, 0x17, 0xc4, 0x19, 0x57, 0x01, 0x8f, 0x8d, 0x37, 0xb3, 0x5a, 0x5a, 0x6b, 0x6d, 0xdc, 0x5f, + 0x9f, 0x70, 0xe6, 0xf5, 0xc2, 0x79, 0xd7, 0x77, 0xac, 0xe5, 0xa5, 0x13, 0x6d, 0x4d, 0xef, 0x1e, + 0x3c, 0xa3, 0xc4, 0xf9, 0x2b, 0x1a, 0x48, 0x0f, 0xea, 0xd9, 0x2e, 0x5c, 0xf9, 0xa7, 0xde, 0x2c, + 0x3a, 0xbf, 0xfb, 0x41, 0xe7, 0xdb, 0xca, 0x3f, 0xdd, 0xaa, 0x1c, 0x1f, 0xec, 0x1d, 0xf4, 0x7e, + 0x3e, 0xa0, 0xe0, 0x5c, 0x58, 0x90, 0xac, 0xc3, 0x42, 0xc1, 0xe1, 0x38, 0xea, 0x0a, 0x1e, 0x71, + 0xfe, 0x82, 0x98, 0x07, 0xf0, 0x0d, 0x64, 0x61, 0x31, 0x3f, 0x49, 0xc7, 0xf4, 0x2a, 0xd2, 0xdb, + 0xce, 0xd2, 0x4d, 0xd2, 0x9c, 0xbd, 0x07, 0xb5, 0x53, 0xa9, 0xb3, 0x60, 0x6b, 0x1f, 0x15, 0x6c, + 0xd5, 0x3a, 0xc0, 0x50, 0x29, 0x34, 0xd1, 0xd9, 0x46, 0x3c, 0x70, 0x0e, 0xe1, 0xa3, 0x1c, 0xd6, + 0xad, 0x93, 0x8d, 0x78, 0x80, 0x3e, 0x97, 0xa1, 0x82, 0x3e, 0xa5, 0xf6, 0xea, 0x78, 0x86, 0x59, + 0xbb, 0xec, 0x69, 0xd2, 0xc9, 0x36, 0x93, 0x9a, 0x89, 0x73, 0xa3, 0xb8, 0xd7, 0x40, 0x73, 0xdd, + 0x99, 0x77, 0x2d, 0x34, 0xe6, 0xf8, 0x4a, 0x6a, 0x6d, 0x5d, 0x34, 0x2f, 0x38, 0x5d, 0x8b, 0xf5, + 0x34, 0xb9, 0x07, 0x73, 0x05, 0x0e, 0x86, 0xdd, 0x72, 0xcf, 0x67, 0xcc, 0xc2, 0x40, 0xee, 0xc3, + 0x42, 0x81, 0x37, 0x3e, 0xe2, 0x9c, 0x4b, 0xec, 0x98, 0x5b, 0x88, 0x5b, 0xa6, 0x86, 0x0d, 0x02, + 0xe5, 0xb5, 0x5d, 0xdc, 0x32, 0x35, 0x4f, 0x03, 0x45, 0xbe, 0x83, 0xba, 0x16, 0x26, 0x4d, 0x98, + 0x91, 0x32, 0xd4, 0xde, 0xfc, 0xea, 0xf4, 0x5a, 0x7d, 0xe3, 0xce, 0xc4, 0x14, 0x1d, 0x0a, 0x35, + 0x7c, 0x1e, 0x0f, 0x25, 0x05, 0x54, 0xbc, 0xb0, 0x02, 0xb2, 0x05, 0xb5, 0x37, 0xdc, 0x04, 0x4c, + 0xa5, 0xb1, 0xf6, 0xc8, 0x75, 0xd4, 0x55, 0xcb, 0xa7, 0x69, 0xac, 0xc9, 0x13, 0x00, 0xc7, 0x44, + 0xf1, 0xc2, 0x75, 0xc4, 0x35, 0xb4, 0xe6, 0xea, 0x38, 0x88, 0x5f, 0x73, 0xa7, 0x5e, 0xbc, 0x96, + 0x1a, 0x05, 0xa8, 0xfe, 0x16, 0x66, 0x8c, 0x34, 0x3c, 0xf4, 0x96, 0x56, 0x4b, 0x1f, 0x16, 0x3a, + 0x2e, 0x79, 0x09, 0x93, 0x5a, 0x91, 0xf7, 0x09, 0xba, 0xb8, 0x37, 0xd1, 0xc5, 0x91, 0xc5, 0xb0, + 0x24, 0xb3, 0x17, 0x46, 0xe7, 0xf5, 0x55, 0x88, 0x74, 0xa1, 0xe1, 0x54, 0xbe, 0x8c, 0x87, 0xc1, + 0x89, 0xb7, 0x8c, 0x0e, 0x57, 0x27, 0x3a, 0x44, 0x61, 0x17, 0x79, 0xb4, 0xde, 0xbf, 0x58, 0x90, + 0x15, 0xc0, 0xa7, 0x8f, 0x2d, 0xca, 0xc3, 0x3b, 0x1e, 0xaf, 0xc9, 0x2f, 0xb0, 0xa8, 0x47, 0xda, + 0x88, 0x88, 0x29, 0xa1, 0x65, 0xaa, 0x7c, 0xc1, 0x82, 0x78, 0x28, 0xbd, 0x9b, 0xb8, 0xd1, 0x57, + 0x93, 0x23, 0x47, 0x01, 0xcd, 0xf8, 0x98, 0x06, 0xa2, 0xdf, 0xc1, 0xc8, 0x17, 0xd0, 0xcc, 0x63, + 0x8f, 0x22, 0x1e, 0x0f, 0xbc, 0x15, 0xdc, 0xbb, 0x91, 0x85, 0x86, 0x98, 0xbd, 0xab, 0x3e, 0x7f, + 0x2b, 0x42, 0x77, 0x57, 0xb7, 0xae, 0x75, 0x57, 0x28, 0xb0, 0x77, 0xd5, 0x79, 0x08, 0x8d, 0x4b, + 0x4d, 0xad, 0x0a, 0xe5, 0xe3, 0xa3, 0x5d, 0xda, 0xbe, 0x41, 0x9a, 0x50, 0xb3, 0x5f, 0x4f, 0x77, + 0x77, 0x8e, 0x9f, 0xb5, 0x4b, 0xa4, 0x02, 0xb6, 0x11, 0xb6, 0xa7, 0x3a, 0x4f, 0xa0, 0x8c, 0xcf, + 0xbe, 0x0e, 0x79, 0x19, 0xb7, 0x6f, 0x58, 0xeb, 0x36, 0xdd, 0x6f, 0x97, 0x48, 0x0d, 0x66, 0xb6, + 0xe9, 0xfe, 0xe6, 0xa3, 0xf6, 0x94, 0xc5, 0x5e, 0x3d, 0xde, 0x6c, 0x4f, 0x13, 0x80, 0xd9, 0x57, + 0x8f, 0x37, 0xd9, 0xe6, 0xa3, 0x76, 0xb9, 0x73, 0x02, 0xf5, 0x42, 0x96, 0xed, 0x9c, 0x48, 0xb5, + 0x60, 0x27, 0x32, 0xe2, 0x38, 0x4d, 0xaa, 0xb4, 0x92, 0x6a, 0xf1, 0x4c, 0x46, 0xdc, 0x96, 0x95, + 0x35, 0xa9, 0xbe, 0xc0, 0x09, 0x52, 0xa5, 0xb3, 0xa9, 0x16, 0xb4, 0x2f, 0xc8, 0x97, 0xd0, 0x1a, + 0x4a, 0x9b, 0xe6, 0xb1, 0x72, 0x1a, 0xed, 0x0d, 0x44, 0x8f, 0x9d, 0xbc, 0x23, 0x81, 0xbc, 0x9b, + 0x65, 0xb2, 0x01, 0x4b, 0xf8, 0xdc, 0x58, 0x72, 0x3a, 0xd2, 0x81, 0xcf, 0x43, 0x16, 0x89, 0x48, + 0xaa, 0x11, 0x6e, 0x5e, 0xa6, 0x0b, 0x68, 0x3c, 0xcc, 0x6c, 0xfb, 0x68, 0xb2, 0x43, 0x87, 0x9f, + 0xf1, 0x20, 0xe4, 0xfd, 0x50, 0xd8, 0x4e, 0xab, 0x31, 0x9e, 0x19, 0xda, 0x1c, 0xa3, 0xdd, 0x24, + 0xd5, 0x9d, 0x7f, 0x4b, 0x50, 0xcd, 0x33, 0x4c, 0x08, 0x94, 0x07, 0x42, 0xfb, 0xe8, 0xb6, 0x46, + 0xf1, 0xdb, 0x62, 0xf8, 0x80, 0xdc, 0x3c, 0xc4, 0x6f, 0x72, 0x07, 0x40, 0x1b, 0xae, 0x0c, 0x0e, + 0x55, 0x3c, 0x47, 0x99, 0xd6, 0x10, 0xb1, 0xb3, 0x94, 0xdc, 0x82, 0x9a, 0x12, 0x3c, 0x74, 0xd6, + 0x32, 0x5a, 0xab, 0x16, 0x40, 0xe3, 0xe7, 0x00, 0x2e, 0x78, 0x9b, 0x08, 0x9c, 0x6d, 0xe5, 0x9d, + 0x29, 0xaf, 0x44, 0x6b, 0x0e, 0x3d, 0xd6, 0x82, 0xfc, 0x0e, 0xcb, 0x89, 0x92, 0xbe, 0xd0, 0x5a, + 0xe8, 0x2b, 0xcf, 0x73, 0x16, 0x1f, 0xca, 0xda, 0xe4, 0x87, 0xe2, 0x34, 0x97, 0xde, 0xe7, 0xd2, + 0xd8, 0x51, 0x11, 0xee, 0xfc, 0x39, 0x0d, 0x0b, 0x13, 0xe8, 0xe3, 0xc3, 0x96, 0x0a, 0x87, 0x5d, + 0x83, 0x76, 0xaa, 0x85, 0xc2, 0xd3, 0xb0, 0x28, 0xb0, 0xed, 0x15, 0x93, 0x51, 0xa6, 0x2d, 0x8b, + 0xdb, 0x43, 0xed, 0x23, 0x6a, 0x27, 0x5b, 0x56, 0x53, 0x45, 0xae, 0x4b, 0x4f, 0xdb, 0x59, 0x0a, + 0xec, 0xdb, 0x00, 0x11, 0x3f, 0x67, 0x4a, 0x6b, 0xf6, 0xa6, 0x9f, 0xa7, 0x29, 0xe2, 0xe7, 0x54, + 0xeb, 0xbd, 0x3e, 0xf9, 0x1a, 0xe6, 0xa3, 0x20, 0x96, 0x8a, 0x25, 0xfc, 0x44, 0xb0, 0x21, 0x4f, + 0x43, 0xa3, 0x5d, 0xb6, 0xe8, 0x1c, 0x1a, 0x0e, 0xf9, 0x89, 0xf8, 0x01, 0x61, 0xe4, 0xf2, 0xd7, + 0x57, 0xb8, 0xb3, 0x19, 0xd7, 0x1a, 0x0a, 0xdc, 0x4f, 0xa1, 0x1e, 0x48, 0x16, 0xc4, 0x49, 0x6a, + 0xec, 0xb6, 0x15, 0x77, 0x77, 0x81, 0x7c, 0x6e, 0x91, 0xbd, 0x3e, 0x59, 0x85, 0x46, 0x20, 0x99, + 0x4c, 0x4d, 0x46, 0xa8, 0x22, 0x01, 0x02, 0xd9, 0x43, 0x68, 0xaf, 0x4f, 0x9e, 0xc0, 0xca, 0x99, + 0x0c, 0xd3, 0xd8, 0x70, 0x35, 0xb2, 0xed, 0xc9, 0x88, 0x73, 0xc3, 0xf4, 0x1f, 0x81, 0xf1, 0x4f, + 0x85, 0xc6, 0x11, 0x5d, 0xa6, 0xde, 0x98, 0xd1, 0x75, 0x84, 0xa3, 0xcc, 0x4e, 0xbe, 0x87, 0xdb, + 0x41, 0xfc, 0x1e, 0x3d, 0xa0, 0x7e, 0xa5, 0xc0, 0xb9, 0xe2, 0xa1, 0xf3, 0x4f, 0x09, 0x5a, 0xfb, + 0x72, 0x90, 0x86, 0xe2, 0xc5, 0x28, 0x71, 0xd7, 0xf6, 0x5b, 0xde, 0x2d, 0x5d, 0x92, 0xf1, 0xfa, + 0x5a, 0x1b, 0x0f, 0x26, 0x8f, 0xf5, 0x4b, 0x52, 0xd7, 0x3c, 0x5d, 0xc9, 0x15, 0x06, 0x7c, 0xff, + 0x02, 0x25, 0x9f, 0x41, 0x3d, 0x42, 0x0d, 0x33, 0xa3, 0x24, 0xaf, 0x03, 0x88, 0xc6, 0x6e, 0x6c, + 0x65, 0xc7, 0x69, 0xc4, 0xe4, 0x90, 0x39, 0xd0, 0x5d, 0x79, 0x93, 0x36, 0xe2, 0x34, 0xea, 0x0d, + 0xdd, 0x7e, 0xba, 0xf3, 0x20, 0x6b, 0x21, 0x99, 0xd7, 0x4b, 0x7d, 0xa8, 0x06, 0x33, 0x47, 0xbd, + 0xde, 0x81, 0x6d, 0x58, 0x55, 0x28, 0xef, 0x6f, 0xef, 0xed, 0xb6, 0xa7, 0x3a, 0x21, 0xac, 0x74, + 0x55, 0x60, 0x6c, 0x49, 0x1f, 0x6b, 0xa1, 0x7e, 0x92, 0xa9, 0x8a, 0xc5, 0x28, 0x1f, 0x10, 0x93, + 0x5e, 0xea, 0x16, 0x54, 0xf2, 0x01, 0x34, 0xf5, 0x9e, 0x79, 0x51, 0xf8, 0x61, 0x43, 0x73, 0x41, + 0xa7, 0x0f, 0xb7, 0x26, 0xec, 0xa6, 0x2f, 0xe6, 0x51, 0xd9, 0x4f, 0x5f, 0x6b, 0xaf, 0x84, 0xf5, + 0x37, 0x39, 0xb3, 0xff, 0x1f, 0x2d, 0x45, 0x71, 0xe7, 0xaf, 0x12, 0xcc, 0xbf, 0x33, 0xfd, 0x88, + 0x07, 0x95, 0x3c, 0x6f, 0x25, 0xcc, 0x5b, 0xbe, 0xb4, 0xf3, 0x2b, 0xfb, 0x79, 0xe8, 0x0e, 0xd4, + 0xa4, 0xe3, 0xb5, 0x7d, 0xf3, 0xae, 0x25, 0xf2, 0x30, 0x94, 0x3e, 0xf3, 0x65, 0x1a, 0x9b, 0xac, + 0xd4, 0xe6, 0xd0, 0xb0, 0x6d, 0xf1, 0xae, 0x85, 0x6d, 0x05, 0x17, 0xb9, 0x3a, 0x78, 0x9b, 0xb7, + 0xa5, 0xd6, 0x05, 0xf5, 0x28, 0x78, 0x2b, 0xec, 0xef, 0x31, 0x5b, 0x93, 0xa7, 0x82, 0x27, 0x8e, + 0xe6, 0x2a, 0xae, 0x1e, 0xf1, 0xf3, 0x1f, 0x05, 0x4f, 0x2c, 0x67, 0x67, 0xe9, 0xd7, 0x6c, 0xe4, + 0x67, 0xe7, 0x66, 0xf8, 0x97, 0xe4, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xcb, 0xfb, 0x8e, 0xf5, + 0xa2, 0x0c, 0x00, 0x00, } diff --git a/ui/metrics/metrics_proto/metrics.proto b/ui/metrics/metrics_proto/metrics.proto index 8d3933f4d..91d8dd9b7 100644 --- a/ui/metrics/metrics_proto/metrics.proto +++ b/ui/metrics/metrics_proto/metrics.proto @@ -105,6 +105,9 @@ message MetricsBase { // The build command that the user entered to the build system. optional string build_command = 26; + + // The metrics for calling Bazel. + repeated PerfInfo bazel_runs = 27; } message BuildConfig { diff --git a/xml/xml_test.go b/xml/xml_test.go index abcb1085f..138503c6d 100644 --- a/xml/xml_test.go +++ b/xml/xml_test.go @@ -57,10 +57,10 @@ func testXml(t *testing.T, bp string) *android.TestContext { "baz.xml": nil, } config := android.TestArchConfig(buildDir, nil, bp, fs) - ctx := android.NewTestArchContext() + ctx := android.NewTestArchContext(config) ctx.RegisterModuleType("prebuilt_etc", etc.PrebuiltEtcFactory) ctx.RegisterModuleType("prebuilt_etc_xml", PrebuiltEtcXmlFactory) - ctx.Register(config) + ctx.Register() _, errs := ctx.ParseFileList(".", []string{"Android.bp"}) android.FailIfErrored(t, errs) _, errs = ctx.PrepareBuildActions(config) |