diff --git a/aconfig/Android.bp b/aconfig/Android.bp index fed419005..3c79f19c1 100644 --- a/aconfig/Android.bp +++ b/aconfig/Android.bp @@ -17,6 +17,7 @@ bootstrap_go_package { "aconfig_values.go", "aconfig_value_set.go", "all_aconfig_declarations.go", + "exported_java_aconfig_library.go", "init.go", "testing.go", ], diff --git a/aconfig/exported_java_aconfig_library.go b/aconfig/exported_java_aconfig_library.go new file mode 100644 index 000000000..45c5e3990 --- /dev/null +++ b/aconfig/exported_java_aconfig_library.go @@ -0,0 +1,56 @@ +// Copyright 2023 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package aconfig + +import ( + "android/soong/android" +) + +func ExportedJavaDeclarationsLibraryFactory() android.Singleton { + return &exportedJavaDeclarationsLibrarySingleton{} +} + +type exportedJavaDeclarationsLibrarySingleton struct { + intermediatePath android.OutputPath +} + +func (this *exportedJavaDeclarationsLibrarySingleton) GenerateBuildActions(ctx android.SingletonContext) { + // Find all of the aconfig_declarations modules + var cacheFiles android.Paths + ctx.VisitAllModules(func(module android.Module) { + if !ctx.ModuleHasProvider(module, DeclarationsProviderKey) { + return + } + decl := ctx.ModuleProvider(module, DeclarationsProviderKey).(DeclarationsProviderData) + cacheFiles = append(cacheFiles, decl.IntermediateCacheOutputPath) + }) + + // Generate build action for aconfig + this.intermediatePath = android.PathForIntermediates(ctx, "exported_java_aconfig_library.jar") + ctx.Build(pctx, android.BuildParams{ + Rule: exportedJavaRule, + Inputs: cacheFiles, + Output: this.intermediatePath, + Description: "exported_java_aconfig_library", + Args: map[string]string{ + "cache_files": android.JoinPathsWithPrefix(cacheFiles, " "), + }, + }) + ctx.Phony("exported_java_aconfig_library", this.intermediatePath) +} + +func (this *exportedJavaDeclarationsLibrarySingleton) MakeVars(ctx android.MakeVarsContext) { + ctx.DistForGoalWithFilename("sdk", this.intermediatePath, "android-flags.jar") +} diff --git a/aconfig/init.go b/aconfig/init.go index 72f6bb620..05fab4ce5 100644 --- a/aconfig/init.go +++ b/aconfig/init.go @@ -67,6 +67,20 @@ var ( Command: `${aconfig} dump --dedup --format protobuf --out $out $flags`, CommandDeps: []string{"${aconfig}"}, }, "flags") + // For exported_java_aconfig_library: Generate a JAR from all + // java_aconfig_libraries to be consumed by apps built outside the + // platform + exportedJavaRule = pctx.AndroidStaticRule("exported_java_aconfig_library", + blueprint.RuleParams{ + Command: `rm -rf ${out}.tmp` + + `&& for cache in ${cache_files}; do ${aconfig} create-java-lib --cache $$cache --out ${out}.tmp; done` + + `&& $soong_zip -write_if_changed -jar -o ${out} -C ${out}.tmp -D ${out}.tmp` + + `&& rm -rf ${out}.tmp`, + CommandDeps: []string{ + "$aconfig", + "$soong_zip", + }, + }, "cache_files") ) func init() { @@ -80,4 +94,5 @@ func RegisterBuildComponents(ctx android.RegistrationContext) { ctx.RegisterModuleType("aconfig_values", ValuesFactory) ctx.RegisterModuleType("aconfig_value_set", ValueSetFactory) ctx.RegisterParallelSingletonType("all_aconfig_declarations", AllAconfigDeclarationsFactory) + ctx.RegisterParallelSingletonType("exported_java_aconfig_library", ExportedJavaDeclarationsLibraryFactory) }