xref: /aosp_15_r20/build/soong/java/dex.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2017 Google Inc. All rights reserved.
2*333d2b36SAndroid Build Coastguard Worker//
3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*333d2b36SAndroid Build Coastguard Worker//
7*333d2b36SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*333d2b36SAndroid Build Coastguard Worker//
9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*333d2b36SAndroid Build Coastguard Worker// limitations under the License.
14*333d2b36SAndroid Build Coastguard Worker
15*333d2b36SAndroid Build Coastguard Workerpackage java
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"strconv"
19*333d2b36SAndroid Build Coastguard Worker	"strings"
20*333d2b36SAndroid Build Coastguard Worker
21*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint"
22*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint/proptools"
23*333d2b36SAndroid Build Coastguard Worker
24*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
25*333d2b36SAndroid Build Coastguard Worker	"android/soong/remoteexec"
26*333d2b36SAndroid Build Coastguard Worker)
27*333d2b36SAndroid Build Coastguard Worker
28*333d2b36SAndroid Build Coastguard Workertype DexProperties struct {
29*333d2b36SAndroid Build Coastguard Worker	// If set to true, compile dex regardless of installable.  Defaults to false.
30*333d2b36SAndroid Build Coastguard Worker	Compile_dex *bool
31*333d2b36SAndroid Build Coastguard Worker
32*333d2b36SAndroid Build Coastguard Worker	// list of module-specific flags that will be used for dex compiles
33*333d2b36SAndroid Build Coastguard Worker	Dxflags []string `android:"arch_variant"`
34*333d2b36SAndroid Build Coastguard Worker
35*333d2b36SAndroid Build Coastguard Worker	// A list of files containing rules that specify the classes to keep in the main dex file.
36*333d2b36SAndroid Build Coastguard Worker	Main_dex_rules []string `android:"path"`
37*333d2b36SAndroid Build Coastguard Worker
38*333d2b36SAndroid Build Coastguard Worker	Optimize struct {
39*333d2b36SAndroid Build Coastguard Worker		// If false, disable all optimization.  Defaults to true for android_app and
40*333d2b36SAndroid Build Coastguard Worker		// android_test_helper_app modules, false for android_test, java_library, and java_test modules.
41*333d2b36SAndroid Build Coastguard Worker		Enabled *bool
42*333d2b36SAndroid Build Coastguard Worker		// True if the module containing this has it set by default.
43*333d2b36SAndroid Build Coastguard Worker		EnabledByDefault bool `blueprint:"mutated"`
44*333d2b36SAndroid Build Coastguard Worker
45*333d2b36SAndroid Build Coastguard Worker		// Whether to continue building even if warnings are emitted.  Defaults to true.
46*333d2b36SAndroid Build Coastguard Worker		Ignore_warnings *bool
47*333d2b36SAndroid Build Coastguard Worker
48*333d2b36SAndroid Build Coastguard Worker		// If true, runs R8 in Proguard compatibility mode, otherwise runs R8 in full mode.
49*333d2b36SAndroid Build Coastguard Worker		// Defaults to false for apps, true for libraries and tests.
50*333d2b36SAndroid Build Coastguard Worker		Proguard_compatibility *bool
51*333d2b36SAndroid Build Coastguard Worker
52*333d2b36SAndroid Build Coastguard Worker		// If true, optimize for size by removing unused code.  Defaults to true for apps,
53*333d2b36SAndroid Build Coastguard Worker		// false for libraries and tests.
54*333d2b36SAndroid Build Coastguard Worker		Shrink *bool
55*333d2b36SAndroid Build Coastguard Worker
56*333d2b36SAndroid Build Coastguard Worker		// If true, optimize bytecode.  Defaults to false.
57*333d2b36SAndroid Build Coastguard Worker		Optimize *bool
58*333d2b36SAndroid Build Coastguard Worker
59*333d2b36SAndroid Build Coastguard Worker		// If true, obfuscate bytecode.  Defaults to false.
60*333d2b36SAndroid Build Coastguard Worker		Obfuscate *bool
61*333d2b36SAndroid Build Coastguard Worker
62*333d2b36SAndroid Build Coastguard Worker		// If true, do not use the flag files generated by aapt that automatically keep
63*333d2b36SAndroid Build Coastguard Worker		// classes referenced by the app manifest.  Defaults to false.
64*333d2b36SAndroid Build Coastguard Worker		No_aapt_flags *bool
65*333d2b36SAndroid Build Coastguard Worker
66*333d2b36SAndroid Build Coastguard Worker		// If true, optimize for size by removing unused resources. Defaults to false.
67*333d2b36SAndroid Build Coastguard Worker		Shrink_resources *bool
68*333d2b36SAndroid Build Coastguard Worker
69*333d2b36SAndroid Build Coastguard Worker		// If true, use optimized resource shrinking in R8, overriding the
70*333d2b36SAndroid Build Coastguard Worker		// Shrink_resources setting. Defaults to false.
71*333d2b36SAndroid Build Coastguard Worker		// Optimized shrinking means that R8 will trace and treeshake resources together with code
72*333d2b36SAndroid Build Coastguard Worker		// and apply additional optimizations. This implies non final fields in the R classes.
73*333d2b36SAndroid Build Coastguard Worker		Optimized_shrink_resources *bool
74*333d2b36SAndroid Build Coastguard Worker
75*333d2b36SAndroid Build Coastguard Worker		// Flags to pass to proguard.
76*333d2b36SAndroid Build Coastguard Worker		Proguard_flags []string
77*333d2b36SAndroid Build Coastguard Worker
78*333d2b36SAndroid Build Coastguard Worker		// Specifies the locations of files containing proguard flags.
79*333d2b36SAndroid Build Coastguard Worker		Proguard_flags_files []string `android:"path"`
80*333d2b36SAndroid Build Coastguard Worker
81*333d2b36SAndroid Build Coastguard Worker		// If true, transitive reverse dependencies of this module will have this
82*333d2b36SAndroid Build Coastguard Worker		// module's proguard spec appended to their optimization action
83*333d2b36SAndroid Build Coastguard Worker		Export_proguard_flags_files *bool
84*333d2b36SAndroid Build Coastguard Worker	}
85*333d2b36SAndroid Build Coastguard Worker
86*333d2b36SAndroid Build Coastguard Worker	// Keep the data uncompressed. We always need uncompressed dex for execution,
87*333d2b36SAndroid Build Coastguard Worker	// so this might actually save space by avoiding storing the same data twice.
88*333d2b36SAndroid Build Coastguard Worker	// This defaults to reasonable value based on module and should not be set.
89*333d2b36SAndroid Build Coastguard Worker	// It exists only to support ART tests.
90*333d2b36SAndroid Build Coastguard Worker	Uncompress_dex *bool
91*333d2b36SAndroid Build Coastguard Worker
92*333d2b36SAndroid Build Coastguard Worker	// Exclude kotlinc generate files: *.kotlin_module, *.kotlin_builtins. Defaults to false.
93*333d2b36SAndroid Build Coastguard Worker	Exclude_kotlinc_generated_files *bool
94*333d2b36SAndroid Build Coastguard Worker
95*333d2b36SAndroid Build Coastguard Worker	// Disable dex container (also known as "multi-dex").
96*333d2b36SAndroid Build Coastguard Worker	// This may be necessary as a temporary workaround to mask toolchain bugs (see b/341652226).
97*333d2b36SAndroid Build Coastguard Worker	No_dex_container *bool
98*333d2b36SAndroid Build Coastguard Worker}
99*333d2b36SAndroid Build Coastguard Worker
100*333d2b36SAndroid Build Coastguard Workertype dexer struct {
101*333d2b36SAndroid Build Coastguard Worker	dexProperties DexProperties
102*333d2b36SAndroid Build Coastguard Worker
103*333d2b36SAndroid Build Coastguard Worker	// list of extra proguard flag files
104*333d2b36SAndroid Build Coastguard Worker	extraProguardFlagsFiles android.Paths
105*333d2b36SAndroid Build Coastguard Worker	proguardDictionary      android.OptionalPath
106*333d2b36SAndroid Build Coastguard Worker	proguardConfiguration   android.OptionalPath
107*333d2b36SAndroid Build Coastguard Worker	proguardUsageZip        android.OptionalPath
108*333d2b36SAndroid Build Coastguard Worker	resourcesInput          android.OptionalPath
109*333d2b36SAndroid Build Coastguard Worker	resourcesOutput         android.OptionalPath
110*333d2b36SAndroid Build Coastguard Worker
111*333d2b36SAndroid Build Coastguard Worker	providesTransitiveHeaderJarsForR8
112*333d2b36SAndroid Build Coastguard Worker}
113*333d2b36SAndroid Build Coastguard Worker
114*333d2b36SAndroid Build Coastguard Workerfunc (d *dexer) effectiveOptimizeEnabled() bool {
115*333d2b36SAndroid Build Coastguard Worker	return BoolDefault(d.dexProperties.Optimize.Enabled, d.dexProperties.Optimize.EnabledByDefault)
116*333d2b36SAndroid Build Coastguard Worker}
117*333d2b36SAndroid Build Coastguard Worker
118*333d2b36SAndroid Build Coastguard Workerfunc (d *DexProperties) resourceShrinkingEnabled(ctx android.ModuleContext) bool {
119*333d2b36SAndroid Build Coastguard Worker	return !ctx.Config().Eng() && BoolDefault(d.Optimize.Optimized_shrink_resources, Bool(d.Optimize.Shrink_resources))
120*333d2b36SAndroid Build Coastguard Worker}
121*333d2b36SAndroid Build Coastguard Worker
122*333d2b36SAndroid Build Coastguard Workerfunc (d *DexProperties) optimizedResourceShrinkingEnabled(ctx android.ModuleContext) bool {
123*333d2b36SAndroid Build Coastguard Worker	return d.resourceShrinkingEnabled(ctx) && BoolDefault(d.Optimize.Optimized_shrink_resources, ctx.Config().UseOptimizedResourceShrinkingByDefault())
124*333d2b36SAndroid Build Coastguard Worker}
125*333d2b36SAndroid Build Coastguard Worker
126*333d2b36SAndroid Build Coastguard Workerfunc (d *dexer) optimizeOrObfuscateEnabled() bool {
127*333d2b36SAndroid Build Coastguard Worker	return d.effectiveOptimizeEnabled() && (proptools.Bool(d.dexProperties.Optimize.Optimize) || proptools.Bool(d.dexProperties.Optimize.Obfuscate))
128*333d2b36SAndroid Build Coastguard Worker}
129*333d2b36SAndroid Build Coastguard Worker
130*333d2b36SAndroid Build Coastguard Workervar d8, d8RE = pctx.MultiCommandRemoteStaticRules("d8",
131*333d2b36SAndroid Build Coastguard Worker	blueprint.RuleParams{
132*333d2b36SAndroid Build Coastguard Worker		Command: `rm -rf "$outDir" && mkdir -p "$outDir" && ` +
133*333d2b36SAndroid Build Coastguard Worker			`$d8Template${config.D8Cmd} ${config.D8Flags} $d8Flags --output $outDir --no-dex-input-jar $in && ` +
134*333d2b36SAndroid Build Coastguard Worker			`$zipTemplate${config.SoongZipCmd} $zipFlags -o $outDir/classes.dex.jar -C $outDir -f "$outDir/classes*.dex" && ` +
135*333d2b36SAndroid Build Coastguard Worker			`${config.MergeZipsCmd} -D -stripFile "**/*.class" $mergeZipsFlags $out $outDir/classes.dex.jar $in && ` +
136*333d2b36SAndroid Build Coastguard Worker			`rm -f "$outDir"/classes*.dex "$outDir/classes.dex.jar"`,
137*333d2b36SAndroid Build Coastguard Worker		CommandDeps: []string{
138*333d2b36SAndroid Build Coastguard Worker			"${config.D8Cmd}",
139*333d2b36SAndroid Build Coastguard Worker			"${config.SoongZipCmd}",
140*333d2b36SAndroid Build Coastguard Worker			"${config.MergeZipsCmd}",
141*333d2b36SAndroid Build Coastguard Worker		},
142*333d2b36SAndroid Build Coastguard Worker	}, map[string]*remoteexec.REParams{
143*333d2b36SAndroid Build Coastguard Worker		"$d8Template": &remoteexec.REParams{
144*333d2b36SAndroid Build Coastguard Worker			Labels:          map[string]string{"type": "compile", "compiler": "d8"},
145*333d2b36SAndroid Build Coastguard Worker			Inputs:          []string{"${config.D8Jar}"},
146*333d2b36SAndroid Build Coastguard Worker			ExecStrategy:    "${config.RED8ExecStrategy}",
147*333d2b36SAndroid Build Coastguard Worker			ToolchainInputs: []string{"${config.JavaCmd}"},
148*333d2b36SAndroid Build Coastguard Worker			Platform:        map[string]string{remoteexec.PoolKey: "${config.REJavaPool}"},
149*333d2b36SAndroid Build Coastguard Worker		},
150*333d2b36SAndroid Build Coastguard Worker		"$zipTemplate": &remoteexec.REParams{
151*333d2b36SAndroid Build Coastguard Worker			Labels:       map[string]string{"type": "tool", "name": "soong_zip"},
152*333d2b36SAndroid Build Coastguard Worker			Inputs:       []string{"${config.SoongZipCmd}", "$outDir"},
153*333d2b36SAndroid Build Coastguard Worker			OutputFiles:  []string{"$outDir/classes.dex.jar"},
154*333d2b36SAndroid Build Coastguard Worker			ExecStrategy: "${config.RED8ExecStrategy}",
155*333d2b36SAndroid Build Coastguard Worker			Platform:     map[string]string{remoteexec.PoolKey: "${config.REJavaPool}"},
156*333d2b36SAndroid Build Coastguard Worker		},
157*333d2b36SAndroid Build Coastguard Worker	}, []string{"outDir", "d8Flags", "zipFlags", "mergeZipsFlags"}, nil)
158*333d2b36SAndroid Build Coastguard Worker
159*333d2b36SAndroid Build Coastguard Workervar r8, r8RE = pctx.MultiCommandRemoteStaticRules("r8",
160*333d2b36SAndroid Build Coastguard Worker	blueprint.RuleParams{
161*333d2b36SAndroid Build Coastguard Worker		Command: `rm -rf "$outDir" && mkdir -p "$outDir" && ` +
162*333d2b36SAndroid Build Coastguard Worker			`rm -f "$outDict" && rm -f "$outConfig" && rm -rf "${outUsageDir}" && ` +
163*333d2b36SAndroid Build Coastguard Worker			`mkdir -p $$(dirname ${outUsage}) && ` +
164*333d2b36SAndroid Build Coastguard Worker			`$r8Template${config.R8Cmd} ${config.R8Flags} $r8Flags -injars $in --output $outDir ` +
165*333d2b36SAndroid Build Coastguard Worker			`--no-data-resources ` +
166*333d2b36SAndroid Build Coastguard Worker			`-printmapping ${outDict} ` +
167*333d2b36SAndroid Build Coastguard Worker			`-printconfiguration ${outConfig} ` +
168*333d2b36SAndroid Build Coastguard Worker			`-printusage ${outUsage} ` +
169*333d2b36SAndroid Build Coastguard Worker			`--deps-file ${out}.d && ` +
170*333d2b36SAndroid Build Coastguard Worker			`touch "${outDict}" "${outConfig}" "${outUsage}" && ` +
171*333d2b36SAndroid Build Coastguard Worker			`${config.SoongZipCmd} -o ${outUsageZip} -C ${outUsageDir} -f ${outUsage} && ` +
172*333d2b36SAndroid Build Coastguard Worker			`rm -rf ${outUsageDir} && ` +
173*333d2b36SAndroid Build Coastguard Worker			`$zipTemplate${config.SoongZipCmd} $zipFlags -o $outDir/classes.dex.jar -C $outDir -f "$outDir/classes*.dex" && ` +
174*333d2b36SAndroid Build Coastguard Worker			`${config.MergeZipsCmd} -D -stripFile "**/*.class" $mergeZipsFlags $out $outDir/classes.dex.jar $in && ` +
175*333d2b36SAndroid Build Coastguard Worker			`rm -f "$outDir"/classes*.dex "$outDir/classes.dex.jar"`,
176*333d2b36SAndroid Build Coastguard Worker		Depfile: "${out}.d",
177*333d2b36SAndroid Build Coastguard Worker		Deps:    blueprint.DepsGCC,
178*333d2b36SAndroid Build Coastguard Worker		CommandDeps: []string{
179*333d2b36SAndroid Build Coastguard Worker			"${config.R8Cmd}",
180*333d2b36SAndroid Build Coastguard Worker			"${config.SoongZipCmd}",
181*333d2b36SAndroid Build Coastguard Worker			"${config.MergeZipsCmd}",
182*333d2b36SAndroid Build Coastguard Worker		},
183*333d2b36SAndroid Build Coastguard Worker	}, map[string]*remoteexec.REParams{
184*333d2b36SAndroid Build Coastguard Worker		"$r8Template": &remoteexec.REParams{
185*333d2b36SAndroid Build Coastguard Worker			Labels:          map[string]string{"type": "compile", "compiler": "r8"},
186*333d2b36SAndroid Build Coastguard Worker			Inputs:          []string{"$implicits", "${config.R8Jar}"},
187*333d2b36SAndroid Build Coastguard Worker			OutputFiles:     []string{"${outUsage}", "${outConfig}", "${outDict}", "${resourcesOutput}", "${outR8ArtProfile}"},
188*333d2b36SAndroid Build Coastguard Worker			ExecStrategy:    "${config.RER8ExecStrategy}",
189*333d2b36SAndroid Build Coastguard Worker			ToolchainInputs: []string{"${config.JavaCmd}"},
190*333d2b36SAndroid Build Coastguard Worker			Platform:        map[string]string{remoteexec.PoolKey: "${config.REJavaPool}"},
191*333d2b36SAndroid Build Coastguard Worker		},
192*333d2b36SAndroid Build Coastguard Worker		"$zipTemplate": &remoteexec.REParams{
193*333d2b36SAndroid Build Coastguard Worker			Labels:       map[string]string{"type": "tool", "name": "soong_zip"},
194*333d2b36SAndroid Build Coastguard Worker			Inputs:       []string{"${config.SoongZipCmd}", "$outDir"},
195*333d2b36SAndroid Build Coastguard Worker			OutputFiles:  []string{"$outDir/classes.dex.jar"},
196*333d2b36SAndroid Build Coastguard Worker			ExecStrategy: "${config.RER8ExecStrategy}",
197*333d2b36SAndroid Build Coastguard Worker			Platform:     map[string]string{remoteexec.PoolKey: "${config.REJavaPool}"},
198*333d2b36SAndroid Build Coastguard Worker		},
199*333d2b36SAndroid Build Coastguard Worker		"$zipUsageTemplate": &remoteexec.REParams{
200*333d2b36SAndroid Build Coastguard Worker			Labels:       map[string]string{"type": "tool", "name": "soong_zip"},
201*333d2b36SAndroid Build Coastguard Worker			Inputs:       []string{"${config.SoongZipCmd}", "${outUsage}"},
202*333d2b36SAndroid Build Coastguard Worker			OutputFiles:  []string{"${outUsageZip}"},
203*333d2b36SAndroid Build Coastguard Worker			ExecStrategy: "${config.RER8ExecStrategy}",
204*333d2b36SAndroid Build Coastguard Worker			Platform:     map[string]string{remoteexec.PoolKey: "${config.REJavaPool}"},
205*333d2b36SAndroid Build Coastguard Worker		},
206*333d2b36SAndroid Build Coastguard Worker	}, []string{"outDir", "outDict", "outConfig", "outUsage", "outUsageZip", "outUsageDir",
207*333d2b36SAndroid Build Coastguard Worker		"r8Flags", "zipFlags", "mergeZipsFlags", "resourcesOutput", "outR8ArtProfile"}, []string{"implicits"})
208*333d2b36SAndroid Build Coastguard Worker
209*333d2b36SAndroid Build Coastguard Workerfunc (d *dexer) dexCommonFlags(ctx android.ModuleContext,
210*333d2b36SAndroid Build Coastguard Worker	dexParams *compileDexParams) (flags []string, deps android.Paths) {
211*333d2b36SAndroid Build Coastguard Worker
212*333d2b36SAndroid Build Coastguard Worker	flags = d.dexProperties.Dxflags
213*333d2b36SAndroid Build Coastguard Worker	// Translate all the DX flags to D8 ones until all the build files have been migrated
214*333d2b36SAndroid Build Coastguard Worker	// to D8 flags. See: b/69377755
215*333d2b36SAndroid Build Coastguard Worker	flags = android.RemoveListFromList(flags,
216*333d2b36SAndroid Build Coastguard Worker		[]string{"--core-library", "--dex", "--multi-dex"})
217*333d2b36SAndroid Build Coastguard Worker
218*333d2b36SAndroid Build Coastguard Worker	for _, f := range android.PathsForModuleSrc(ctx, d.dexProperties.Main_dex_rules) {
219*333d2b36SAndroid Build Coastguard Worker		flags = append(flags, "--main-dex-rules", f.String())
220*333d2b36SAndroid Build Coastguard Worker		deps = append(deps, f)
221*333d2b36SAndroid Build Coastguard Worker	}
222*333d2b36SAndroid Build Coastguard Worker
223*333d2b36SAndroid Build Coastguard Worker	var requestReleaseMode bool
224*333d2b36SAndroid Build Coastguard Worker	requestReleaseMode, flags = android.RemoveFromList("--release", flags)
225*333d2b36SAndroid Build Coastguard Worker
226*333d2b36SAndroid Build Coastguard Worker	if ctx.Config().Getenv("NO_OPTIMIZE_DX") != "" || ctx.Config().Getenv("GENERATE_DEX_DEBUG") != "" {
227*333d2b36SAndroid Build Coastguard Worker		flags = append(flags, "--debug")
228*333d2b36SAndroid Build Coastguard Worker		requestReleaseMode = false
229*333d2b36SAndroid Build Coastguard Worker	}
230*333d2b36SAndroid Build Coastguard Worker
231*333d2b36SAndroid Build Coastguard Worker	// Don't strip out debug information for eng builds, unless the target
232*333d2b36SAndroid Build Coastguard Worker	// explicitly provided the `--release` build flag. This allows certain
233*333d2b36SAndroid Build Coastguard Worker	// test targets to remain optimized as part of eng test_suites builds.
234*333d2b36SAndroid Build Coastguard Worker	if requestReleaseMode {
235*333d2b36SAndroid Build Coastguard Worker		flags = append(flags, "--release")
236*333d2b36SAndroid Build Coastguard Worker	} else if ctx.Config().Eng() {
237*333d2b36SAndroid Build Coastguard Worker		flags = append(flags, "--debug")
238*333d2b36SAndroid Build Coastguard Worker	}
239*333d2b36SAndroid Build Coastguard Worker
240*333d2b36SAndroid Build Coastguard Worker	// Supplying the platform build flag disables various features like API modeling and desugaring.
241*333d2b36SAndroid Build Coastguard Worker	// For targets with a stable min SDK version (i.e., when the min SDK is both explicitly specified
242*333d2b36SAndroid Build Coastguard Worker	// and managed+versioned), we suppress this flag to ensure portability.
243*333d2b36SAndroid Build Coastguard Worker	// Note: Targets with a min SDK kind of core_platform (e.g., framework.jar) or unspecified (e.g.,
244*333d2b36SAndroid Build Coastguard Worker	// services.jar), are not classified as stable, which is WAI.
245*333d2b36SAndroid Build Coastguard Worker	// TODO(b/232073181): Expand to additional min SDK cases after validation.
246*333d2b36SAndroid Build Coastguard Worker	var addAndroidPlatformBuildFlag = false
247*333d2b36SAndroid Build Coastguard Worker	if !dexParams.sdkVersion.Stable() {
248*333d2b36SAndroid Build Coastguard Worker		addAndroidPlatformBuildFlag = true
249*333d2b36SAndroid Build Coastguard Worker	}
250*333d2b36SAndroid Build Coastguard Worker
251*333d2b36SAndroid Build Coastguard Worker	effectiveVersion, err := dexParams.minSdkVersion.EffectiveVersion(ctx)
252*333d2b36SAndroid Build Coastguard Worker	if err != nil {
253*333d2b36SAndroid Build Coastguard Worker		ctx.PropertyErrorf("min_sdk_version", "%s", err)
254*333d2b36SAndroid Build Coastguard Worker	}
255*333d2b36SAndroid Build Coastguard Worker	if !Bool(d.dexProperties.No_dex_container) && effectiveVersion.FinalOrFutureInt() >= 36 && ctx.Config().UseDexV41() {
256*333d2b36SAndroid Build Coastguard Worker		// W is 36, but we have not bumped the SDK version yet, so check for both.
257*333d2b36SAndroid Build Coastguard Worker		if ctx.Config().PlatformSdkVersion().FinalInt() >= 36 ||
258*333d2b36SAndroid Build Coastguard Worker			ctx.Config().PlatformSdkCodename() == "Baklava" {
259*333d2b36SAndroid Build Coastguard Worker			flags = append([]string{"-JDcom.android.tools.r8.dexContainerExperiment"}, flags...)
260*333d2b36SAndroid Build Coastguard Worker		}
261*333d2b36SAndroid Build Coastguard Worker	}
262*333d2b36SAndroid Build Coastguard Worker
263*333d2b36SAndroid Build Coastguard Worker	// If the specified SDK level is 10000, then configure the compiler to use the
264*333d2b36SAndroid Build Coastguard Worker	// current platform SDK level and to compile the build as a platform build.
265*333d2b36SAndroid Build Coastguard Worker	var minApiFlagValue = effectiveVersion.FinalOrFutureInt()
266*333d2b36SAndroid Build Coastguard Worker	if minApiFlagValue == 10000 {
267*333d2b36SAndroid Build Coastguard Worker		minApiFlagValue = ctx.Config().PlatformSdkVersion().FinalInt()
268*333d2b36SAndroid Build Coastguard Worker		addAndroidPlatformBuildFlag = true
269*333d2b36SAndroid Build Coastguard Worker	}
270*333d2b36SAndroid Build Coastguard Worker	flags = append(flags, "--min-api "+strconv.Itoa(minApiFlagValue))
271*333d2b36SAndroid Build Coastguard Worker
272*333d2b36SAndroid Build Coastguard Worker	if addAndroidPlatformBuildFlag {
273*333d2b36SAndroid Build Coastguard Worker		flags = append(flags, "--android-platform-build")
274*333d2b36SAndroid Build Coastguard Worker	}
275*333d2b36SAndroid Build Coastguard Worker	return flags, deps
276*333d2b36SAndroid Build Coastguard Worker}
277*333d2b36SAndroid Build Coastguard Worker
278*333d2b36SAndroid Build Coastguard Workerfunc (d *dexer) d8Flags(ctx android.ModuleContext, dexParams *compileDexParams) (d8Flags []string, d8Deps android.Paths, artProfileOutput *android.OutputPath) {
279*333d2b36SAndroid Build Coastguard Worker	flags := dexParams.flags
280*333d2b36SAndroid Build Coastguard Worker	d8Flags = append(d8Flags, flags.bootClasspath.FormRepeatedClassPath("--lib ")...)
281*333d2b36SAndroid Build Coastguard Worker	d8Flags = append(d8Flags, flags.dexClasspath.FormRepeatedClassPath("--lib ")...)
282*333d2b36SAndroid Build Coastguard Worker
283*333d2b36SAndroid Build Coastguard Worker	d8Deps = append(d8Deps, flags.bootClasspath...)
284*333d2b36SAndroid Build Coastguard Worker	d8Deps = append(d8Deps, flags.dexClasspath...)
285*333d2b36SAndroid Build Coastguard Worker
286*333d2b36SAndroid Build Coastguard Worker	if flags, deps, profileOutput := d.addArtProfile(ctx, dexParams); profileOutput != nil {
287*333d2b36SAndroid Build Coastguard Worker		d8Flags = append(d8Flags, flags...)
288*333d2b36SAndroid Build Coastguard Worker		d8Deps = append(d8Deps, deps...)
289*333d2b36SAndroid Build Coastguard Worker		artProfileOutput = profileOutput
290*333d2b36SAndroid Build Coastguard Worker	}
291*333d2b36SAndroid Build Coastguard Worker
292*333d2b36SAndroid Build Coastguard Worker	return d8Flags, d8Deps, artProfileOutput
293*333d2b36SAndroid Build Coastguard Worker}
294*333d2b36SAndroid Build Coastguard Worker
295*333d2b36SAndroid Build Coastguard Workerfunc (d *dexer) r8Flags(ctx android.ModuleContext, dexParams *compileDexParams, debugMode bool) (r8Flags []string, r8Deps android.Paths, artProfileOutput *android.OutputPath) {
296*333d2b36SAndroid Build Coastguard Worker	flags := dexParams.flags
297*333d2b36SAndroid Build Coastguard Worker	opt := d.dexProperties.Optimize
298*333d2b36SAndroid Build Coastguard Worker
299*333d2b36SAndroid Build Coastguard Worker	// When an app contains references to APIs that are not in the SDK specified by
300*333d2b36SAndroid Build Coastguard Worker	// its LOCAL_SDK_VERSION for example added by support library or by runtime
301*333d2b36SAndroid Build Coastguard Worker	// classes added by desugaring, we artifically raise the "SDK version" "linked" by
302*333d2b36SAndroid Build Coastguard Worker	// ProGuard, to
303*333d2b36SAndroid Build Coastguard Worker	// - suppress ProGuard warnings of referencing symbols unknown to the lower SDK version.
304*333d2b36SAndroid Build Coastguard Worker	// - prevent ProGuard stripping subclass in the support library that extends class added in the higher SDK version.
305*333d2b36SAndroid Build Coastguard Worker	// See b/20667396
306*333d2b36SAndroid Build Coastguard Worker	// TODO(b/360905238): Remove SdkSystemServer exception after resolving missing class references.
307*333d2b36SAndroid Build Coastguard Worker	if !dexParams.sdkVersion.Stable() || dexParams.sdkVersion.Kind == android.SdkSystemServer {
308*333d2b36SAndroid Build Coastguard Worker		var proguardRaiseDeps classpath
309*333d2b36SAndroid Build Coastguard Worker		ctx.VisitDirectDepsWithTag(proguardRaiseTag, func(m android.Module) {
310*333d2b36SAndroid Build Coastguard Worker			if dep, ok := android.OtherModuleProvider(ctx, m, JavaInfoProvider); ok {
311*333d2b36SAndroid Build Coastguard Worker				proguardRaiseDeps = append(proguardRaiseDeps, dep.RepackagedHeaderJars...)
312*333d2b36SAndroid Build Coastguard Worker			}
313*333d2b36SAndroid Build Coastguard Worker		})
314*333d2b36SAndroid Build Coastguard Worker		r8Flags = append(r8Flags, proguardRaiseDeps.FormJavaClassPath("-libraryjars"))
315*333d2b36SAndroid Build Coastguard Worker		r8Deps = append(r8Deps, proguardRaiseDeps...)
316*333d2b36SAndroid Build Coastguard Worker	}
317*333d2b36SAndroid Build Coastguard Worker
318*333d2b36SAndroid Build Coastguard Worker	r8Flags = append(r8Flags, flags.bootClasspath.FormJavaClassPath("-libraryjars"))
319*333d2b36SAndroid Build Coastguard Worker	r8Deps = append(r8Deps, flags.bootClasspath...)
320*333d2b36SAndroid Build Coastguard Worker	r8Flags = append(r8Flags, flags.dexClasspath.FormJavaClassPath("-libraryjars"))
321*333d2b36SAndroid Build Coastguard Worker	r8Deps = append(r8Deps, flags.dexClasspath...)
322*333d2b36SAndroid Build Coastguard Worker
323*333d2b36SAndroid Build Coastguard Worker	transitiveStaticLibsLookupMap := map[android.Path]bool{}
324*333d2b36SAndroid Build Coastguard Worker	for _, jar := range d.transitiveStaticLibsHeaderJarsForR8.ToList() {
325*333d2b36SAndroid Build Coastguard Worker		transitiveStaticLibsLookupMap[jar] = true
326*333d2b36SAndroid Build Coastguard Worker	}
327*333d2b36SAndroid Build Coastguard Worker	transitiveHeaderJars := android.Paths{}
328*333d2b36SAndroid Build Coastguard Worker	for _, jar := range d.transitiveLibsHeaderJarsForR8.ToList() {
329*333d2b36SAndroid Build Coastguard Worker		if _, ok := transitiveStaticLibsLookupMap[jar]; ok {
330*333d2b36SAndroid Build Coastguard Worker			// don't include a lib if it is already packaged in the current JAR as a static lib
331*333d2b36SAndroid Build Coastguard Worker			continue
332*333d2b36SAndroid Build Coastguard Worker		}
333*333d2b36SAndroid Build Coastguard Worker		transitiveHeaderJars = append(transitiveHeaderJars, jar)
334*333d2b36SAndroid Build Coastguard Worker	}
335*333d2b36SAndroid Build Coastguard Worker	transitiveClasspath := classpath(transitiveHeaderJars)
336*333d2b36SAndroid Build Coastguard Worker	r8Flags = append(r8Flags, transitiveClasspath.FormJavaClassPath("-libraryjars"))
337*333d2b36SAndroid Build Coastguard Worker	r8Deps = append(r8Deps, transitiveClasspath...)
338*333d2b36SAndroid Build Coastguard Worker
339*333d2b36SAndroid Build Coastguard Worker	flagFiles := android.Paths{
340*333d2b36SAndroid Build Coastguard Worker		android.PathForSource(ctx, "build/make/core/proguard.flags"),
341*333d2b36SAndroid Build Coastguard Worker	}
342*333d2b36SAndroid Build Coastguard Worker
343*333d2b36SAndroid Build Coastguard Worker	flagFiles = append(flagFiles, d.extraProguardFlagsFiles...)
344*333d2b36SAndroid Build Coastguard Worker	// TODO(ccross): static android library proguard files
345*333d2b36SAndroid Build Coastguard Worker
346*333d2b36SAndroid Build Coastguard Worker	flagFiles = append(flagFiles, android.PathsForModuleSrc(ctx, opt.Proguard_flags_files)...)
347*333d2b36SAndroid Build Coastguard Worker
348*333d2b36SAndroid Build Coastguard Worker	flagFiles = android.FirstUniquePaths(flagFiles)
349*333d2b36SAndroid Build Coastguard Worker
350*333d2b36SAndroid Build Coastguard Worker	r8Flags = append(r8Flags, android.JoinWithPrefix(flagFiles.Strings(), "-include "))
351*333d2b36SAndroid Build Coastguard Worker	r8Deps = append(r8Deps, flagFiles...)
352*333d2b36SAndroid Build Coastguard Worker
353*333d2b36SAndroid Build Coastguard Worker	// TODO(b/70942988): This is included from build/make/core/proguard.flags
354*333d2b36SAndroid Build Coastguard Worker	r8Deps = append(r8Deps, android.PathForSource(ctx,
355*333d2b36SAndroid Build Coastguard Worker		"build/make/core/proguard_basic_keeps.flags"))
356*333d2b36SAndroid Build Coastguard Worker
357*333d2b36SAndroid Build Coastguard Worker	r8Flags = append(r8Flags, opt.Proguard_flags...)
358*333d2b36SAndroid Build Coastguard Worker
359*333d2b36SAndroid Build Coastguard Worker	if BoolDefault(opt.Proguard_compatibility, true) {
360*333d2b36SAndroid Build Coastguard Worker		r8Flags = append(r8Flags, "--force-proguard-compatibility")
361*333d2b36SAndroid Build Coastguard Worker	}
362*333d2b36SAndroid Build Coastguard Worker
363*333d2b36SAndroid Build Coastguard Worker	// Avoid unnecessary stack frame noise by only injecting source map ids for non-debug
364*333d2b36SAndroid Build Coastguard Worker	// optimized or obfuscated targets.
365*333d2b36SAndroid Build Coastguard Worker	if (Bool(opt.Optimize) || Bool(opt.Obfuscate)) && !debugMode {
366*333d2b36SAndroid Build Coastguard Worker		// TODO(b/213833843): Allow configuration of the prefix via a build variable.
367*333d2b36SAndroid Build Coastguard Worker		var sourceFilePrefix = "go/retraceme "
368*333d2b36SAndroid Build Coastguard Worker		var sourceFileTemplate = "\"" + sourceFilePrefix + "%MAP_ID\""
369*333d2b36SAndroid Build Coastguard Worker		r8Flags = append(r8Flags, "--map-id-template", "%MAP_HASH")
370*333d2b36SAndroid Build Coastguard Worker		r8Flags = append(r8Flags, "--source-file-template", sourceFileTemplate)
371*333d2b36SAndroid Build Coastguard Worker	}
372*333d2b36SAndroid Build Coastguard Worker
373*333d2b36SAndroid Build Coastguard Worker	// TODO(ccross): Don't shrink app instrumentation tests by default.
374*333d2b36SAndroid Build Coastguard Worker	if !Bool(opt.Shrink) {
375*333d2b36SAndroid Build Coastguard Worker		r8Flags = append(r8Flags, "-dontshrink")
376*333d2b36SAndroid Build Coastguard Worker	}
377*333d2b36SAndroid Build Coastguard Worker
378*333d2b36SAndroid Build Coastguard Worker	if !Bool(opt.Optimize) {
379*333d2b36SAndroid Build Coastguard Worker		r8Flags = append(r8Flags, "-dontoptimize")
380*333d2b36SAndroid Build Coastguard Worker	}
381*333d2b36SAndroid Build Coastguard Worker
382*333d2b36SAndroid Build Coastguard Worker	// TODO(ccross): error if obufscation + app instrumentation test.
383*333d2b36SAndroid Build Coastguard Worker	if !Bool(opt.Obfuscate) {
384*333d2b36SAndroid Build Coastguard Worker		r8Flags = append(r8Flags, "-dontobfuscate")
385*333d2b36SAndroid Build Coastguard Worker	}
386*333d2b36SAndroid Build Coastguard Worker	// TODO(ccross): if this is an instrumentation test of an obfuscated app, use the
387*333d2b36SAndroid Build Coastguard Worker	// dictionary of the app and move the app from libraryjars to injars.
388*333d2b36SAndroid Build Coastguard Worker
389*333d2b36SAndroid Build Coastguard Worker	// TODO(b/180878971): missing classes should be added to the relevant builds.
390*333d2b36SAndroid Build Coastguard Worker	// TODO(b/229727645): do not use true as default for Android platform builds.
391*333d2b36SAndroid Build Coastguard Worker	if proptools.BoolDefault(opt.Ignore_warnings, true) {
392*333d2b36SAndroid Build Coastguard Worker		r8Flags = append(r8Flags, "-ignorewarnings")
393*333d2b36SAndroid Build Coastguard Worker	}
394*333d2b36SAndroid Build Coastguard Worker
395*333d2b36SAndroid Build Coastguard Worker	// resourcesInput is empty when we don't use resource shrinking, if on, pass these to R8
396*333d2b36SAndroid Build Coastguard Worker	if d.resourcesInput.Valid() {
397*333d2b36SAndroid Build Coastguard Worker		r8Flags = append(r8Flags, "--resource-input", d.resourcesInput.Path().String())
398*333d2b36SAndroid Build Coastguard Worker		r8Deps = append(r8Deps, d.resourcesInput.Path())
399*333d2b36SAndroid Build Coastguard Worker		r8Flags = append(r8Flags, "--resource-output", d.resourcesOutput.Path().String())
400*333d2b36SAndroid Build Coastguard Worker		if d.dexProperties.optimizedResourceShrinkingEnabled(ctx) {
401*333d2b36SAndroid Build Coastguard Worker			r8Flags = append(r8Flags, "--optimized-resource-shrinking")
402*333d2b36SAndroid Build Coastguard Worker			if Bool(d.dexProperties.Optimize.Optimized_shrink_resources) {
403*333d2b36SAndroid Build Coastguard Worker				// Explicitly opted into optimized shrinking, no need for keeping R$id entries
404*333d2b36SAndroid Build Coastguard Worker				r8Flags = append(r8Flags, "--force-optimized-resource-shrinking")
405*333d2b36SAndroid Build Coastguard Worker			}
406*333d2b36SAndroid Build Coastguard Worker		}
407*333d2b36SAndroid Build Coastguard Worker	}
408*333d2b36SAndroid Build Coastguard Worker
409*333d2b36SAndroid Build Coastguard Worker	if flags, deps, profileOutput := d.addArtProfile(ctx, dexParams); profileOutput != nil {
410*333d2b36SAndroid Build Coastguard Worker		r8Flags = append(r8Flags, flags...)
411*333d2b36SAndroid Build Coastguard Worker		r8Deps = append(r8Deps, deps...)
412*333d2b36SAndroid Build Coastguard Worker		artProfileOutput = profileOutput
413*333d2b36SAndroid Build Coastguard Worker	}
414*333d2b36SAndroid Build Coastguard Worker
415*333d2b36SAndroid Build Coastguard Worker	return r8Flags, r8Deps, artProfileOutput
416*333d2b36SAndroid Build Coastguard Worker}
417*333d2b36SAndroid Build Coastguard Worker
418*333d2b36SAndroid Build Coastguard Workertype compileDexParams struct {
419*333d2b36SAndroid Build Coastguard Worker	flags           javaBuilderFlags
420*333d2b36SAndroid Build Coastguard Worker	sdkVersion      android.SdkSpec
421*333d2b36SAndroid Build Coastguard Worker	minSdkVersion   android.ApiLevel
422*333d2b36SAndroid Build Coastguard Worker	classesJar      android.Path
423*333d2b36SAndroid Build Coastguard Worker	jarName         string
424*333d2b36SAndroid Build Coastguard Worker	artProfileInput *string
425*333d2b36SAndroid Build Coastguard Worker}
426*333d2b36SAndroid Build Coastguard Worker
427*333d2b36SAndroid Build Coastguard Worker// Adds --art-profile to r8/d8 command.
428*333d2b36SAndroid Build Coastguard Worker// r8/d8 will output a generated profile file to match the optimized dex code.
429*333d2b36SAndroid Build Coastguard Workerfunc (d *dexer) addArtProfile(ctx android.ModuleContext, dexParams *compileDexParams) (flags []string, deps android.Paths, artProfileOutputPath *android.OutputPath) {
430*333d2b36SAndroid Build Coastguard Worker	if dexParams.artProfileInput == nil {
431*333d2b36SAndroid Build Coastguard Worker		return nil, nil, nil
432*333d2b36SAndroid Build Coastguard Worker	}
433*333d2b36SAndroid Build Coastguard Worker	artProfileInputPath := android.PathForModuleSrc(ctx, *dexParams.artProfileInput)
434*333d2b36SAndroid Build Coastguard Worker	artProfileOutputPathValue := android.PathForModuleOut(ctx, "profile.prof.txt").OutputPath
435*333d2b36SAndroid Build Coastguard Worker	artProfileOutputPath = &artProfileOutputPathValue
436*333d2b36SAndroid Build Coastguard Worker	flags = []string{
437*333d2b36SAndroid Build Coastguard Worker		"--art-profile",
438*333d2b36SAndroid Build Coastguard Worker		artProfileInputPath.String(),
439*333d2b36SAndroid Build Coastguard Worker		artProfileOutputPath.String(),
440*333d2b36SAndroid Build Coastguard Worker	}
441*333d2b36SAndroid Build Coastguard Worker	deps = append(deps, artProfileInputPath)
442*333d2b36SAndroid Build Coastguard Worker	return flags, deps, artProfileOutputPath
443*333d2b36SAndroid Build Coastguard Worker
444*333d2b36SAndroid Build Coastguard Worker}
445*333d2b36SAndroid Build Coastguard Worker
446*333d2b36SAndroid Build Coastguard Worker// Return the compiled dex jar and (optional) profile _after_ r8 optimization
447*333d2b36SAndroid Build Coastguard Workerfunc (d *dexer) compileDex(ctx android.ModuleContext, dexParams *compileDexParams) (android.Path, android.Path) {
448*333d2b36SAndroid Build Coastguard Worker
449*333d2b36SAndroid Build Coastguard Worker	// Compile classes.jar into classes.dex and then javalib.jar
450*333d2b36SAndroid Build Coastguard Worker	javalibJar := android.PathForModuleOut(ctx, "dex", dexParams.jarName).OutputPath
451*333d2b36SAndroid Build Coastguard Worker	outDir := android.PathForModuleOut(ctx, "dex")
452*333d2b36SAndroid Build Coastguard Worker
453*333d2b36SAndroid Build Coastguard Worker	zipFlags := "--ignore_missing_files"
454*333d2b36SAndroid Build Coastguard Worker	if proptools.Bool(d.dexProperties.Uncompress_dex) {
455*333d2b36SAndroid Build Coastguard Worker		zipFlags += " -L 0"
456*333d2b36SAndroid Build Coastguard Worker	}
457*333d2b36SAndroid Build Coastguard Worker
458*333d2b36SAndroid Build Coastguard Worker	commonFlags, commonDeps := d.dexCommonFlags(ctx, dexParams)
459*333d2b36SAndroid Build Coastguard Worker
460*333d2b36SAndroid Build Coastguard Worker	// Exclude kotlinc generated files when "exclude_kotlinc_generated_files" is set to true.
461*333d2b36SAndroid Build Coastguard Worker	mergeZipsFlags := ""
462*333d2b36SAndroid Build Coastguard Worker	if proptools.BoolDefault(d.dexProperties.Exclude_kotlinc_generated_files, false) {
463*333d2b36SAndroid Build Coastguard Worker		mergeZipsFlags = "-stripFile META-INF/*.kotlin_module -stripFile **/*.kotlin_builtins"
464*333d2b36SAndroid Build Coastguard Worker	}
465*333d2b36SAndroid Build Coastguard Worker
466*333d2b36SAndroid Build Coastguard Worker	useR8 := d.effectiveOptimizeEnabled()
467*333d2b36SAndroid Build Coastguard Worker	var artProfileOutputPath *android.OutputPath
468*333d2b36SAndroid Build Coastguard Worker	if useR8 {
469*333d2b36SAndroid Build Coastguard Worker		proguardDictionary := android.PathForModuleOut(ctx, "proguard_dictionary")
470*333d2b36SAndroid Build Coastguard Worker		d.proguardDictionary = android.OptionalPathForPath(proguardDictionary)
471*333d2b36SAndroid Build Coastguard Worker		proguardConfiguration := android.PathForModuleOut(ctx, "proguard_configuration")
472*333d2b36SAndroid Build Coastguard Worker		d.proguardConfiguration = android.OptionalPathForPath(proguardConfiguration)
473*333d2b36SAndroid Build Coastguard Worker		proguardUsageDir := android.PathForModuleOut(ctx, "proguard_usage")
474*333d2b36SAndroid Build Coastguard Worker		proguardUsage := proguardUsageDir.Join(ctx, ctx.Namespace().Path,
475*333d2b36SAndroid Build Coastguard Worker			android.ModuleNameWithPossibleOverride(ctx), "unused.txt")
476*333d2b36SAndroid Build Coastguard Worker		proguardUsageZip := android.PathForModuleOut(ctx, "proguard_usage.zip")
477*333d2b36SAndroid Build Coastguard Worker		d.proguardUsageZip = android.OptionalPathForPath(proguardUsageZip)
478*333d2b36SAndroid Build Coastguard Worker		resourcesOutput := android.PathForModuleOut(ctx, "package-res-shrunken.apk")
479*333d2b36SAndroid Build Coastguard Worker		d.resourcesOutput = android.OptionalPathForPath(resourcesOutput)
480*333d2b36SAndroid Build Coastguard Worker		implicitOutputs := android.WritablePaths{
481*333d2b36SAndroid Build Coastguard Worker			proguardDictionary,
482*333d2b36SAndroid Build Coastguard Worker			proguardUsageZip,
483*333d2b36SAndroid Build Coastguard Worker			proguardConfiguration,
484*333d2b36SAndroid Build Coastguard Worker		}
485*333d2b36SAndroid Build Coastguard Worker		debugMode := android.InList("--debug", commonFlags)
486*333d2b36SAndroid Build Coastguard Worker		r8Flags, r8Deps, r8ArtProfileOutputPath := d.r8Flags(ctx, dexParams, debugMode)
487*333d2b36SAndroid Build Coastguard Worker		rule := r8
488*333d2b36SAndroid Build Coastguard Worker		args := map[string]string{
489*333d2b36SAndroid Build Coastguard Worker			"r8Flags":        strings.Join(append(commonFlags, r8Flags...), " "),
490*333d2b36SAndroid Build Coastguard Worker			"zipFlags":       zipFlags,
491*333d2b36SAndroid Build Coastguard Worker			"outDict":        proguardDictionary.String(),
492*333d2b36SAndroid Build Coastguard Worker			"outConfig":      proguardConfiguration.String(),
493*333d2b36SAndroid Build Coastguard Worker			"outUsageDir":    proguardUsageDir.String(),
494*333d2b36SAndroid Build Coastguard Worker			"outUsage":       proguardUsage.String(),
495*333d2b36SAndroid Build Coastguard Worker			"outUsageZip":    proguardUsageZip.String(),
496*333d2b36SAndroid Build Coastguard Worker			"outDir":         outDir.String(),
497*333d2b36SAndroid Build Coastguard Worker			"mergeZipsFlags": mergeZipsFlags,
498*333d2b36SAndroid Build Coastguard Worker		}
499*333d2b36SAndroid Build Coastguard Worker		if r8ArtProfileOutputPath != nil {
500*333d2b36SAndroid Build Coastguard Worker			artProfileOutputPath = r8ArtProfileOutputPath
501*333d2b36SAndroid Build Coastguard Worker			implicitOutputs = append(
502*333d2b36SAndroid Build Coastguard Worker				implicitOutputs,
503*333d2b36SAndroid Build Coastguard Worker				artProfileOutputPath,
504*333d2b36SAndroid Build Coastguard Worker			)
505*333d2b36SAndroid Build Coastguard Worker			// Add the implicit r8 Art profile output to args so that r8RE knows
506*333d2b36SAndroid Build Coastguard Worker			// about this implicit output
507*333d2b36SAndroid Build Coastguard Worker			args["outR8ArtProfile"] = artProfileOutputPath.String()
508*333d2b36SAndroid Build Coastguard Worker		}
509*333d2b36SAndroid Build Coastguard Worker
510*333d2b36SAndroid Build Coastguard Worker		if ctx.Config().UseRBE() && ctx.Config().IsEnvTrue("RBE_R8") {
511*333d2b36SAndroid Build Coastguard Worker			rule = r8RE
512*333d2b36SAndroid Build Coastguard Worker			args["implicits"] = strings.Join(r8Deps.Strings(), ",")
513*333d2b36SAndroid Build Coastguard Worker		}
514*333d2b36SAndroid Build Coastguard Worker		if d.resourcesInput.Valid() {
515*333d2b36SAndroid Build Coastguard Worker			implicitOutputs = append(implicitOutputs, resourcesOutput)
516*333d2b36SAndroid Build Coastguard Worker			args["resourcesOutput"] = resourcesOutput.String()
517*333d2b36SAndroid Build Coastguard Worker		}
518*333d2b36SAndroid Build Coastguard Worker		ctx.Build(pctx, android.BuildParams{
519*333d2b36SAndroid Build Coastguard Worker			Rule:            rule,
520*333d2b36SAndroid Build Coastguard Worker			Description:     "r8",
521*333d2b36SAndroid Build Coastguard Worker			Output:          javalibJar,
522*333d2b36SAndroid Build Coastguard Worker			ImplicitOutputs: implicitOutputs,
523*333d2b36SAndroid Build Coastguard Worker			Input:           dexParams.classesJar,
524*333d2b36SAndroid Build Coastguard Worker			Implicits:       r8Deps,
525*333d2b36SAndroid Build Coastguard Worker			Args:            args,
526*333d2b36SAndroid Build Coastguard Worker		})
527*333d2b36SAndroid Build Coastguard Worker	} else {
528*333d2b36SAndroid Build Coastguard Worker		implicitOutputs := android.WritablePaths{}
529*333d2b36SAndroid Build Coastguard Worker		d8Flags, d8Deps, d8ArtProfileOutputPath := d.d8Flags(ctx, dexParams)
530*333d2b36SAndroid Build Coastguard Worker		if d8ArtProfileOutputPath != nil {
531*333d2b36SAndroid Build Coastguard Worker			artProfileOutputPath = d8ArtProfileOutputPath
532*333d2b36SAndroid Build Coastguard Worker			implicitOutputs = append(
533*333d2b36SAndroid Build Coastguard Worker				implicitOutputs,
534*333d2b36SAndroid Build Coastguard Worker				artProfileOutputPath,
535*333d2b36SAndroid Build Coastguard Worker			)
536*333d2b36SAndroid Build Coastguard Worker		}
537*333d2b36SAndroid Build Coastguard Worker		d8Deps = append(d8Deps, commonDeps...)
538*333d2b36SAndroid Build Coastguard Worker		rule := d8
539*333d2b36SAndroid Build Coastguard Worker		if ctx.Config().UseRBE() && ctx.Config().IsEnvTrue("RBE_D8") {
540*333d2b36SAndroid Build Coastguard Worker			rule = d8RE
541*333d2b36SAndroid Build Coastguard Worker		}
542*333d2b36SAndroid Build Coastguard Worker		ctx.Build(pctx, android.BuildParams{
543*333d2b36SAndroid Build Coastguard Worker			Rule:            rule,
544*333d2b36SAndroid Build Coastguard Worker			Description:     "d8",
545*333d2b36SAndroid Build Coastguard Worker			Output:          javalibJar,
546*333d2b36SAndroid Build Coastguard Worker			Input:           dexParams.classesJar,
547*333d2b36SAndroid Build Coastguard Worker			ImplicitOutputs: implicitOutputs,
548*333d2b36SAndroid Build Coastguard Worker			Implicits:       d8Deps,
549*333d2b36SAndroid Build Coastguard Worker			Args: map[string]string{
550*333d2b36SAndroid Build Coastguard Worker				"d8Flags":        strings.Join(append(commonFlags, d8Flags...), " "),
551*333d2b36SAndroid Build Coastguard Worker				"zipFlags":       zipFlags,
552*333d2b36SAndroid Build Coastguard Worker				"outDir":         outDir.String(),
553*333d2b36SAndroid Build Coastguard Worker				"mergeZipsFlags": mergeZipsFlags,
554*333d2b36SAndroid Build Coastguard Worker			},
555*333d2b36SAndroid Build Coastguard Worker		})
556*333d2b36SAndroid Build Coastguard Worker	}
557*333d2b36SAndroid Build Coastguard Worker	if proptools.Bool(d.dexProperties.Uncompress_dex) {
558*333d2b36SAndroid Build Coastguard Worker		alignedJavalibJar := android.PathForModuleOut(ctx, "aligned", dexParams.jarName).OutputPath
559*333d2b36SAndroid Build Coastguard Worker		TransformZipAlign(ctx, alignedJavalibJar, javalibJar, nil)
560*333d2b36SAndroid Build Coastguard Worker		javalibJar = alignedJavalibJar
561*333d2b36SAndroid Build Coastguard Worker	}
562*333d2b36SAndroid Build Coastguard Worker
563*333d2b36SAndroid Build Coastguard Worker	return javalibJar, artProfileOutputPath
564*333d2b36SAndroid Build Coastguard Worker}
565