diff options
Diffstat (limited to 'api')
| -rw-r--r-- | api/Android.bp | 3 | ||||
| -rw-r--r-- | api/StubLibraries.bp | 364 | ||||
| -rw-r--r-- | api/api.go | 96 | ||||
| -rw-r--r-- | api/api_test.go | 12 | ||||
| -rwxr-xr-x | api/gen_combined_removed_dex.sh | 2 |
5 files changed, 436 insertions, 41 deletions
diff --git a/api/Android.bp b/api/Android.bp index c16bce5a1aea..6986ac09f89e 100644 --- a/api/Android.bp +++ b/api/Android.bp @@ -83,9 +83,11 @@ combined_apis { "framework-configinfrastructure", "framework-connectivity", "framework-connectivity-t", + "framework-crashrecovery", "framework-devicelock", "framework-graphics", "framework-healthfitness", + "framework-location", "framework-media", "framework-mediaprovider", "framework-ondevicepersonalization", @@ -104,6 +106,7 @@ combined_apis { system_server_classpath: [ "service-art", "service-configinfrastructure", + "service-crashrecovery", "service-healthfitness", "service-media-s", "service-permission", diff --git a/api/StubLibraries.bp b/api/StubLibraries.bp index f08745b5cd2c..2f84df70fc40 100644 --- a/api/StubLibraries.bp +++ b/api/StubLibraries.bp @@ -33,7 +33,7 @@ droidstubs { "android-non-updatable-stubs-defaults", "module-classpath-stubs-defaults", ], - args: metalava_framework_docs_args, + args: metalava_framework_docs_args + "--error UnflaggedApi ", check_api: { current: { api_file: ":non-updatable-current.txt", @@ -47,6 +47,7 @@ droidstubs { api_lint: { enabled: true, new_since: ":android.api.public.latest", + baseline_file: ":non-updatable-lint-baseline.txt", }, }, dists: [ @@ -73,7 +74,8 @@ priv_apps_in_stubs = " --show-for-stub-purposes-annotation android.annotation.Sy "client=android.annotation.SystemApi.Client.PRIVILEGED_APPS" + "\\)" -test = " --show-annotation android.annotation.TestApi" +test = " --show-annotation android.annotation.TestApi" + + " --hide UnflaggedApi" // TODO(b/297362755): TestApi lint doesn't ignore existing APIs. module_libs = " --show-annotation android.annotation.SystemApi\\(" + "client=android.annotation.SystemApi.Client.MODULE_LIBRARIES" + @@ -213,30 +215,106 @@ java_defaults { system_modules: "none", java_version: "1.8", compile_dex: true, - defaults_visibility: ["//visibility:private"], visibility: ["//visibility:public"], } java_defaults { - name: "android-non-updatable_defaults_stubs_current", - libs: ["stub-annotations"], - static_libs: ["framework-res-package-jar"], // Export package of framework-res + name: "android-non-updatable_defaults", sdk_version: "none", system_modules: "none", java_version: "1.8", compile_dex: true, +} + +java_defaults { + name: "android-non-updatable_from_source_defaults", + libs: ["stub-annotations"], + static_libs: ["framework-res-package-jar"], // Export package of framework-res dist: { targets: ["sdk"], tag: ".jar", dest: "android-non-updatable.jar", }, - defaults_visibility: ["//visibility:private"], - visibility: ["//visibility:private"], } java_library { name: "android-non-updatable.stubs", - defaults: ["android-non-updatable_defaults_stubs_current"], + defaults: ["android-non-updatable_defaults"], + static_libs: [ + "android-non-updatable.stubs.from-source", + ], + product_variables: { + build_from_text_stub: { + static_libs: [ + "android-non-updatable.stubs.from-text", + ], + exclude_static_libs: [ + "android-non-updatable.stubs.from-source", + ], + }, + }, +} + +java_library { + name: "android-non-updatable.stubs.system", + defaults: ["android-non-updatable_defaults"], + static_libs: [ + "android-non-updatable.stubs.system.from-source", + ], + product_variables: { + build_from_text_stub: { + static_libs: [ + "android-non-updatable.stubs.system.from-text", + ], + exclude_static_libs: [ + "android-non-updatable.stubs.system.from-source", + ], + }, + }, +} + +java_library { + name: "android-non-updatable.stubs.module_lib", + defaults: ["android-non-updatable_defaults"], + static_libs: [ + "android-non-updatable.stubs.module_lib.from-source", + ], + product_variables: { + build_from_text_stub: { + static_libs: [ + "android-non-updatable.stubs.module_lib.from-text", + ], + exclude_static_libs: [ + "android-non-updatable.stubs.module_lib.from-source", + ], + }, + }, +} + +java_library { + name: "android-non-updatable.stubs.test", + defaults: ["android-non-updatable_defaults"], + static_libs: [ + "android-non-updatable.stubs.test.from-source", + ], + product_variables: { + build_from_text_stub: { + static_libs: [ + "android-non-updatable.stubs.test.from-text", + ], + exclude_static_libs: [ + "android-non-updatable.stubs.test.from-source", + ], + }, + }, +} + +java_library { + name: "android-non-updatable.stubs.from-source", + defaults: [ + "android-non-updatable_defaults", + "android-non-updatable_from_source_defaults", + ], srcs: [":api-stubs-docs-non-updatable"], libs: ["all-modules-public-stubs"], dist: { @@ -245,8 +323,11 @@ java_library { } java_library { - name: "android-non-updatable.stubs.system", - defaults: ["android-non-updatable_defaults_stubs_current"], + name: "android-non-updatable.stubs.system.from-source", + defaults: [ + "android-non-updatable_defaults", + "android-non-updatable_from_source_defaults", + ], srcs: [":system-api-stubs-docs-non-updatable"], libs: ["all-modules-system-stubs"], dist: { @@ -255,8 +336,11 @@ java_library { } java_library { - name: "android-non-updatable.stubs.module_lib", - defaults: ["android-non-updatable_defaults_stubs_current"], + name: "android-non-updatable.stubs.module_lib.from-source", + defaults: [ + "android-non-updatable_defaults", + "android-non-updatable_from_source_defaults", + ], srcs: [":module-lib-api-stubs-docs-non-updatable"], libs: [ "sdk_module-lib_current_framework-tethering", @@ -273,8 +357,11 @@ java_library { } java_library { - name: "android-non-updatable.stubs.test", - defaults: ["android-non-updatable_defaults_stubs_current"], + name: "android-non-updatable.stubs.test.from-source", + defaults: [ + "android-non-updatable_defaults", + "android-non-updatable_from_source_defaults", + ], srcs: [":test-api-stubs-docs-non-updatable"], libs: ["all-modules-system-stubs"], dist: { @@ -283,6 +370,57 @@ java_library { } java_defaults { + name: "android-non-updatable_from_text_defaults", + static_libs: ["framework-res-package-jar"], + libs: ["stub-annotations"], +} + +java_api_library { + name: "android-non-updatable.stubs.from-text", + api_surface: "public", + api_files: [ + ":non-updatable-current.txt", + ], + defaults: ["android-non-updatable_from_text_defaults"], + full_api_surface_stub: "android_stubs_current.from-text", +} + +java_api_library { + name: "android-non-updatable.stubs.system.from-text", + api_surface: "system", + api_files: [ + ":non-updatable-current.txt", + ":non-updatable-system-current.txt", + ], + defaults: ["android-non-updatable_from_text_defaults"], + full_api_surface_stub: "android_system_stubs_current.from-text", +} + +java_api_library { + name: "android-non-updatable.stubs.test.from-text", + api_surface: "test", + api_files: [ + ":non-updatable-current.txt", + ":non-updatable-system-current.txt", + ":non-updatable-test-current.txt", + ], + defaults: ["android-non-updatable_from_text_defaults"], + full_api_surface_stub: "android_test_stubs_current.from-text", +} + +java_api_library { + name: "android-non-updatable.stubs.module_lib.from-text", + api_surface: "module_lib", + api_files: [ + ":non-updatable-current.txt", + ":non-updatable-system-current.txt", + ":non-updatable-module-lib-current.txt", + ], + defaults: ["android-non-updatable_from_text_defaults"], + full_api_surface_stub: "android_module_lib_stubs_current_full.from-text", +} + +java_defaults { name: "android_stubs_dists_default", dist: { targets: ["sdk"], @@ -293,7 +431,7 @@ java_defaults { } java_library { - name: "android_stubs_current", + name: "android_stubs_current.from-source", static_libs: [ "all-modules-public-stubs", "android-non-updatable.stubs", @@ -303,7 +441,7 @@ java_library { } java_library { - name: "android_system_stubs_current", + name: "android_system_stubs_current.from-source", static_libs: [ "all-modules-system-stubs", "android-non-updatable.stubs.system", @@ -327,7 +465,7 @@ java_library { } java_library { - name: "android_test_stubs_current", + name: "android_test_stubs_current.from-source", static_libs: [ // Updatable modules do not have test APIs, but we want to include their SystemApis, like we // include the SystemApi of framework-non-updatable-sources. @@ -347,7 +485,22 @@ java_library { } java_library { - name: "android_module_lib_stubs_current", + name: "android_test_frameworks_core_stubs_current.from-source", + static_libs: [ + "all-updatable-modules-system-stubs", + "android-non-updatable.stubs.test", + ], + defaults: [ + "android.jar_defaults", + "android_stubs_dists_default", + ], + dist: { + dir: "apistubs/android/test-core", + }, +} + +java_library { + name: "android_module_lib_stubs_current.from-source", defaults: [ "android.jar_defaults", "android_stubs_dists_default", @@ -363,7 +516,7 @@ java_library { } java_library { - name: "android_system_server_stubs_current", + name: "android_system_server_stubs_current.from-source", defaults: [ "android.jar_defaults", "android_stubs_dists_default", @@ -371,7 +524,7 @@ java_library { srcs: [":services-non-updatable-stubs"], installable: false, static_libs: [ - "android_module_lib_stubs_current", + "android_module_lib_stubs_current.from-source", ], dist: { dir: "apistubs/android/system-server", @@ -402,7 +555,6 @@ java_library { java_genrule { name: "android_stubs_private_hjar", - visibility: ["//visibility:private"], srcs: [":android_stubs_private_jar{.hjar}"], out: ["android_stubs_private.jar"], cmd: "cp $(in) $(out)", @@ -411,7 +563,6 @@ java_genrule { java_library { name: "android_stubs_private", defaults: ["android_stubs_dists_default"], - visibility: ["//visibility:private"], sdk_version: "none", system_modules: "none", static_libs: ["android_stubs_private_hjar"], @@ -422,7 +573,6 @@ java_library { java_genrule { name: "android_stubs_private_framework_aidl", - visibility: ["//visibility:private"], tools: ["sdkparcelables"], srcs: [":android_stubs_private"], out: ["framework.aidl"], @@ -439,6 +589,171 @@ java_genrule { }, } +// +// Java API defaults and libraries for single tree build +// + +java_defaults { + name: "stub-annotation-defaults", + libs: [ + "stub-annotations", + ], + static_libs: [ + // stub annotations do not contribute to the API surfaces but are statically + // linked in the stubs for API surfaces (see frameworks/base/StubLibraries.bp). + // This is because annotation processors insist on loading the classes for any + // annotations found, thus should exist inside android.jar. + "private-stub-annotations-jar", + ], +} + +// Listing of API domains contribution and dependencies per API surfaces +java_defaults { + name: "android_test_stubs_current_contributions", + api_surface: "test", + api_contributions: [ + "test-api-stubs-docs-non-updatable.api.contribution", + "framework-virtualization.stubs.source.test.api.contribution", + "framework-location.stubs.source.test.api.contribution", + ], +} + +java_defaults { + name: "android_test_frameworks_core_stubs_current_contributions", + api_surface: "test", + api_contributions: [ + "test-api-stubs-docs-non-updatable.api.contribution", + ], +} + +java_defaults { + name: "android_module_lib_stubs_current_contributions", + api_surface: "module-lib", + api_contributions: [ + "api-stubs-docs-non-updatable.api.contribution", + "system-api-stubs-docs-non-updatable.api.contribution", + "module-lib-api-stubs-docs-non-updatable.api.contribution", + "art.module.public.api.stubs.source.api.contribution", + "art.module.public.api.stubs.source.system.api.contribution", + "art.module.public.api.stubs.source.module_lib.api.contribution", + "i18n.module.public.api.stubs.source.api.contribution", + "i18n.module.public.api.stubs.source.system.api.contribution", + "i18n.module.public.api.stubs.source.module_lib.api.contribution", + ], +} + +// Java API library definitions per API surface +java_api_library { + name: "android_stubs_current.from-text", + api_surface: "public", + defaults: [ + // This module is dynamically created at frameworks/base/api/api.go + // instead of being written out, in order to minimize edits in the codebase + // when there is a change in the list of modules. + // that contributes to an api surface. + "android_stubs_current_contributions", + "stub-annotation-defaults", + ], + api_contributions: [ + "api-stubs-docs-non-updatable.api.contribution", + ], + visibility: ["//visibility:public"], +} + +java_api_library { + name: "android_system_stubs_current.from-text", + api_surface: "system", + defaults: [ + "android_stubs_current_contributions", + "android_system_stubs_current_contributions", + "stub-annotation-defaults", + ], + api_contributions: [ + "api-stubs-docs-non-updatable.api.contribution", + "system-api-stubs-docs-non-updatable.api.contribution", + ], + visibility: ["//visibility:public"], +} + +java_api_library { + name: "android_test_stubs_current.from-text", + api_surface: "test", + defaults: [ + "android_stubs_current_contributions", + "android_system_stubs_current_contributions", + "android_test_stubs_current_contributions", + "stub-annotation-defaults", + ], + api_contributions: [ + "api-stubs-docs-non-updatable.api.contribution", + "system-api-stubs-docs-non-updatable.api.contribution", + ], + visibility: ["//visibility:public"], +} + +java_api_library { + name: "android_test_frameworks_core_stubs_current.from-text", + api_surface: "test", + defaults: [ + "android_stubs_current_contributions", + "android_system_stubs_current_contributions", + "android_test_frameworks_core_stubs_current_contributions", + "stub-annotation-defaults", + ], + api_contributions: [ + "api-stubs-docs-non-updatable.api.contribution", + "system-api-stubs-docs-non-updatable.api.contribution", + ], +} + +java_api_library { + name: "android_module_lib_stubs_current_full.from-text", + api_surface: "module-lib", + defaults: [ + "android_stubs_current_contributions", + "android_system_stubs_current_contributions", + "android_module_lib_stubs_current_contributions_full", + ], + libs: [ + "stub-annotations", + ], + api_contributions: [ + "api-stubs-docs-non-updatable.api.contribution", + "system-api-stubs-docs-non-updatable.api.contribution", + "module-lib-api-stubs-docs-non-updatable.api.contribution", + ], + visibility: ["//visibility:public"], +} + +java_api_library { + name: "android_module_lib_stubs_current.from-text", + api_surface: "module-lib", + defaults: [ + "android_module_lib_stubs_current_contributions", + ], + libs: [ + "android_module_lib_stubs_current_full.from-text", + "stub-annotations", + ], + visibility: ["//visibility:public"], +} + +java_api_library { + name: "android_system_server_stubs_current.from-text", + api_surface: "system-server", + api_contributions: [ + "services-non-updatable-stubs.api.contribution", + ], + libs: [ + "android_module_lib_stubs_current.from-text", + "stub-annotations", + ], + static_libs: [ + "android_module_lib_stubs_current.from-text", + ], + visibility: ["//visibility:public"], +} + //////////////////////////////////////////////////////////////////////// // api-versions.xml generation, for public and system. This API database // also contains the android.test.* APIs. @@ -586,7 +901,6 @@ droidstubs { "metalava-manual", ], args: priv_apps, - visibility: ["//visibility:private"], } java_library { diff --git a/api/api.go b/api/api.go index 09c238336a39..6095a9a781d8 100644 --- a/api/api.go +++ b/api/api.go @@ -15,7 +15,9 @@ package api import ( + "fmt" "sort" + "strings" "github.com/google/blueprint/proptools" @@ -29,6 +31,7 @@ const art = "art.module.public.api" const conscrypt = "conscrypt.module.public.api" const i18n = "i18n.module.public.api" const virtualization = "framework-virtualization" +const location = "framework-location" var core_libraries_modules = []string{art, conscrypt, i18n} @@ -40,7 +43,7 @@ var core_libraries_modules = []string{art, conscrypt, i18n} // APIs. // In addition, the modules in this list are allowed to contribute to test APIs // stubs. -var non_updatable_modules = []string{virtualization} +var non_updatable_modules = []string{virtualization, location} // The intention behind this soong plugin is to generate a number of "merged" // API-related modules that would otherwise require a large amount of very @@ -94,6 +97,7 @@ type libraryProps struct { Sdk_version *string Static_libs []string Visibility []string + Defaults []string } type fgProps struct { @@ -102,6 +106,14 @@ type fgProps struct { Visibility []string } +type defaultsProps struct { + Name *string + Api_surface *string + Api_contributions []string + Defaults_visibility []string + Previous_api *string +} + type Bazel_module struct { Bp2build_available *bool } @@ -135,7 +147,7 @@ func createMergedTxt(ctx android.LoadHookContext, txt MergedTxtDefinition) { metalavaCmd := "$(location metalava)" // Silence reflection warnings. See b/168689341 metalavaCmd += " -J--add-opens=java.base/java.util=ALL-UNNAMED " - metalavaCmd += " --quiet --no-banner --format=v2 " + metalavaCmd += " --quiet merge-signatures --format=v2 " filename := txt.TxtFilename if txt.Scope != "public" { @@ -145,7 +157,7 @@ func createMergedTxt(ctx android.LoadHookContext, txt MergedTxtDefinition) { props.Name = proptools.StringPtr(ctx.ModuleName() + "-" + filename) props.Tools = []string{"metalava"} props.Out = []string{filename} - props.Cmd = proptools.StringPtr(metalavaCmd + "$(in) --api $(out)") + props.Cmd = proptools.StringPtr(metalavaCmd + "$(in) --out $(out)") props.Srcs = append([]string{txt.BaseTxt}, createSrcs(txt.Modules, txt.ModuleTag)...) props.Dists = []android.Dist{ { @@ -164,26 +176,26 @@ func createMergedTxt(ctx android.LoadHookContext, txt MergedTxtDefinition) { } func createMergedAnnotationsFilegroups(ctx android.LoadHookContext, modules, system_server_modules []string) { - for _, i := range []struct{ + for _, i := range []struct { name string tag string modules []string }{ { - name: "all-modules-public-annotations", - tag: "{.public.annotations.zip}", + name: "all-modules-public-annotations", + tag: "{.public.annotations.zip}", modules: modules, }, { - name: "all-modules-system-annotations", - tag: "{.system.annotations.zip}", + name: "all-modules-system-annotations", + tag: "{.system.annotations.zip}", modules: modules, }, { - name: "all-modules-module-lib-annotations", - tag: "{.module-lib.annotations.zip}", + name: "all-modules-module-lib-annotations", + tag: "{.module-lib.annotations.zip}", modules: modules, }, { - name: "all-modules-system-server-annotations", - tag: "{.system-server.annotations.zip}", + name: "all-modules-system-server-annotations", + tag: "{.system-server.annotations.zip}", modules: system_server_modules, }, } { @@ -267,8 +279,10 @@ func createMergedFrameworkImpl(ctx android.LoadHookContext, modules []string) { } func createMergedFrameworkModuleLibStubs(ctx android.LoadHookContext, modules []string) { - // The user of this module compiles against the "core" SDK, so remove core libraries to avoid dupes. + // The user of this module compiles against the "core" SDK and against non-updatable modules, + // so remove to avoid dupes. modules = removeAll(modules, core_libraries_modules) + modules = removeAll(modules, non_updatable_modules) props := libraryProps{} props.Name = proptools.StringPtr("framework-updatable-stubs-module_libs_api") props.Static_libs = transformArray(modules, "", ".stubs.module_lib") @@ -329,6 +343,56 @@ func createMergedTxts(ctx android.LoadHookContext, bootclasspath, system_server_ } } +func createApiContributionDefaults(ctx android.LoadHookContext, modules []string) { + defaultsSdkKinds := []android.SdkKind{ + android.SdkPublic, android.SdkSystem, android.SdkModule, + } + for _, sdkKind := range defaultsSdkKinds { + props := defaultsProps{} + props.Name = proptools.StringPtr( + sdkKind.DefaultJavaLibraryName() + "_contributions") + if sdkKind == android.SdkModule { + props.Name = proptools.StringPtr( + sdkKind.DefaultJavaLibraryName() + "_contributions_full") + } + props.Api_surface = proptools.StringPtr(sdkKind.String()) + apiSuffix := "" + if sdkKind != android.SdkPublic { + apiSuffix = "." + strings.ReplaceAll(sdkKind.String(), "-", "_") + } + props.Api_contributions = transformArray( + modules, "", fmt.Sprintf(".stubs.source%s.api.contribution", apiSuffix)) + props.Defaults_visibility = []string{"//visibility:public"} + props.Previous_api = proptools.StringPtr(":android.api.public.latest") + ctx.CreateModule(java.DefaultsFactory, &props) + } +} + +func createFullApiLibraries(ctx android.LoadHookContext) { + javaLibraryNames := []string{ + "android_stubs_current", + "android_system_stubs_current", + "android_test_stubs_current", + "android_test_frameworks_core_stubs_current", + "android_module_lib_stubs_current", + "android_system_server_stubs_current", + } + + for _, libraryName := range javaLibraryNames { + props := libraryProps{} + props.Name = proptools.StringPtr(libraryName) + staticLib := libraryName + ".from-source" + if ctx.Config().BuildFromTextStub() { + staticLib = libraryName + ".from-text" + } + props.Static_libs = []string{staticLib} + props.Defaults = []string{"android.jar_defaults"} + props.Visibility = []string{"//visibility:public"} + + ctx.CreateModule(java.LibraryFactory, &props) + } +} + func (a *CombinedApis) createInternalModules(ctx android.LoadHookContext) { bootclasspath := a.properties.Bootclasspath system_server_classpath := a.properties.System_server_classpath @@ -347,6 +411,10 @@ func (a *CombinedApis) createInternalModules(ctx android.LoadHookContext) { createMergedAnnotationsFilegroups(ctx, bootclasspath, system_server_classpath) createPublicStubsSourceFilegroup(ctx, bootclasspath) + + createApiContributionDefaults(ctx, bootclasspath) + + createFullApiLibraries(ctx) } func combinedApisModuleFactory() android.Module { @@ -374,7 +442,7 @@ func (a *CombinedApis) ConvertWithBp2build(ctx android.TopDownMutatorContext) { "system-server": "-system-server-current.txt", } - for scopeName, suffix := range scopeToSuffix{ + for scopeName, suffix := range scopeToSuffix { name := a.Name() + suffix var scope bazel.StringAttribute diff --git a/api/api_test.go b/api/api_test.go index 15b695ca0d36..1f4c2af32493 100644 --- a/api/api_test.go +++ b/api/api_test.go @@ -19,6 +19,7 @@ import ( "android/soong/android" "android/soong/bp2build" + "android/soong/java" ) func runCombinedApisTestCaseWithRegistrationCtxFunc(t *testing.T, tc bp2build.Bp2buildTestCase, registrationCtxFunc func(ctx android.RegistrationContext)) { @@ -30,7 +31,9 @@ func runCombinedApisTestCaseWithRegistrationCtxFunc(t *testing.T, tc bp2build.Bp func runCombinedApisTestCase(t *testing.T, tc bp2build.Bp2buildTestCase) { t.Helper() - runCombinedApisTestCaseWithRegistrationCtxFunc(t, tc, func(ctx android.RegistrationContext) {}) + runCombinedApisTestCaseWithRegistrationCtxFunc(t, tc, func(ctx android.RegistrationContext) { + ctx.RegisterModuleType("java_defaults", java.DefaultsFactory) + }) } func TestCombinedApisGeneral(t *testing.T) { @@ -42,6 +45,13 @@ func TestCombinedApisGeneral(t *testing.T) { system_server_classpath: ["ssc"], } `, + Filesystem: map[string]string{ + "a/Android.bp": ` + java_defaults { + name: "android.jar_defaults", + } + `, + }, ExpectedBazelTargets: []string{ bp2build.MakeBazelTargetNoRestrictions("merged_txts", "foo-current.txt", bp2build.AttrNameToString{ "scope": `"public"`, diff --git a/api/gen_combined_removed_dex.sh b/api/gen_combined_removed_dex.sh index 9225fe8dfe85..71f366a6aae2 100755 --- a/api/gen_combined_removed_dex.sh +++ b/api/gen_combined_removed_dex.sh @@ -6,6 +6,6 @@ shift 2 # Convert each removed.txt to the "dex format" equivalent, and print all output. for f in "$@"; do - "$metalava_path" --no-banner "$f" --dex-api "${tmp_dir}/tmp" + "$metalava_path" "$f" --dex-api "${tmp_dir}/tmp" cat "${tmp_dir}/tmp" done |