Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b56fe282 authored by Rico Wind's avatar Rico Wind
Browse files

Use R8 for resource shrinking

We are moving the resource shinking pipeline into r8 (gennerally, not just for platform)

This disables the usage of the resource shrinker cli from cmd-line tools

Bug: 308710394

Test: Existing, validated that resource table on SystemUI was byte<>byte equal.
Change-Id: Ia36b5e5970cbdcff519a5f05d672b44dc145ea32
parent 4efd3365
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -66,7 +66,6 @@ bootstrap_go_package {
        "plugin.go",
        "prebuilt_apis.go",
        "proto.go",
        "resourceshrinker.go",
        "robolectric.go",
        "rro.go",
        "sdk.go",
@@ -106,7 +105,6 @@ bootstrap_go_package {
        "plugin_test.go",
        "prebuilt_apis_test.go",
        "proto_test.go",
        "resourceshrinker_test.go",
        "rro_test.go",
        "sdk_test.go",
        "sdk_library_test.go",
+18 −6
Original line number Diff line number Diff line
@@ -525,7 +525,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) android.Path {
func (a *AndroidApp) dexBuildActions(ctx android.ModuleContext) (android.Path, android.Path) {
	a.dexpreopter.installPath = a.installPath(ctx)
	a.dexpreopter.isApp = true
	if a.dexProperties.Uncompress_dex == nil {
@@ -538,7 +538,15 @@ func (a *AndroidApp) dexBuildActions(ctx android.ModuleContext) android.Path {
	a.dexpreopter.manifestFile = a.mergedManifestFile
	a.dexpreopter.preventInstall = a.appProperties.PreventInstall

	var packageResources = a.exportPackage

	if ctx.ModuleName() != "framework-res" {
		if Bool(a.dexProperties.Optimize.Shrink_resources) {
			protoFile := android.PathForModuleOut(ctx, packageResources.Base()+".proto.apk")
			aapt2Convert(ctx, protoFile, packageResources, "proto")
			a.dexer.resourcesInput = android.OptionalPathForPath(protoFile)
		}

		var extraSrcJars android.Paths
		var extraClasspathJars android.Paths
		var extraCombinedJars android.Paths
@@ -556,9 +564,14 @@ func (a *AndroidApp) dexBuildActions(ctx android.ModuleContext) android.Path {
		}

		a.Module.compile(ctx, extraSrcJars, extraClasspathJars, extraCombinedJars)
		if Bool(a.dexProperties.Optimize.Shrink_resources) {
			binaryResources := android.PathForModuleOut(ctx, packageResources.Base()+".binary.out.apk")
			aapt2Convert(ctx, binaryResources, a.dexer.resourcesOutput.Path(), "binary")
			packageResources = binaryResources
		}
	}

	return a.dexJarFile.PathOrNil()
	return a.dexJarFile.PathOrNil(), packageResources
}

func (a *AndroidApp) jniBuildActions(jniLibs []jniLib, prebuiltJniPackages android.Paths, ctx android.ModuleContext) android.WritablePath {
@@ -743,7 +756,6 @@ func (a *AndroidApp) generateAndroidBuildActions(ctx android.ModuleContext) {

	// Process all building blocks, from AAPT to certificates.
	a.aaptBuildActions(ctx)

	// The decision to enforce <uses-library> checks is made before adding implicit SDK libraries.
	a.usesLibrary.freezeEnforceUsesLibraries()

@@ -769,7 +781,7 @@ func (a *AndroidApp) generateAndroidBuildActions(ctx android.ModuleContext) {
	a.linter.resources = a.aapt.resourceFiles
	a.linter.buildModuleReportZip = ctx.Config().UnbundledBuildApps()

	dexJarFile := a.dexBuildActions(ctx)
	dexJarFile, packageResources := a.dexBuildActions(ctx)

	jniLibs, prebuiltJniPackages, certificates := collectAppDeps(ctx, a, a.shouldEmbedJnis(ctx), !Bool(a.appProperties.Jni_uses_platform_apis))
	jniJarFile := a.jniBuildActions(jniLibs, prebuiltJniPackages, ctx)
@@ -793,7 +805,7 @@ func (a *AndroidApp) generateAndroidBuildActions(ctx android.ModuleContext) {
	}
	rotationMinSdkVersion := String(a.overridableAppProperties.RotationMinSdkVersion)

	CreateAndSignAppPackage(ctx, packageFile, a.exportPackage, jniJarFile, dexJarFile, certificates, apkDeps, v4SignatureFile, lineageFile, rotationMinSdkVersion, Bool(a.dexProperties.Optimize.Shrink_resources))
	CreateAndSignAppPackage(ctx, packageFile, packageResources, jniJarFile, dexJarFile, certificates, apkDeps, v4SignatureFile, lineageFile, rotationMinSdkVersion)
	a.outputFile = packageFile
	if v4SigningRequested {
		a.extraOutputFiles = append(a.extraOutputFiles, v4SignatureFile)
@@ -822,7 +834,7 @@ func (a *AndroidApp) generateAndroidBuildActions(ctx android.ModuleContext) {
		if v4SigningRequested {
			v4SignatureFile = android.PathForModuleOut(ctx, a.installApkName+"_"+split.suffix+".apk.idsig")
		}
		CreateAndSignAppPackage(ctx, packageFile, split.path, nil, nil, certificates, apkDeps, v4SignatureFile, lineageFile, rotationMinSdkVersion, false)
		CreateAndSignAppPackage(ctx, packageFile, split.path, nil, nil, certificates, apkDeps, v4SignatureFile, lineageFile, rotationMinSdkVersion)
		a.extraOutputFiles = append(a.extraOutputFiles, packageFile)
		if v4SigningRequested {
			a.extraOutputFiles = append(a.extraOutputFiles, v4SignatureFile)
+1 −7
Original line number Diff line number Diff line
@@ -52,7 +52,7 @@ var combineApk = pctx.AndroidStaticRule("combineApk",
	})

func CreateAndSignAppPackage(ctx android.ModuleContext, outputFile android.WritablePath,
	packageFile, jniJarFile, dexJarFile android.Path, certificates []Certificate, deps android.Paths, v4SignatureFile android.WritablePath, lineageFile android.Path, rotationMinSdkVersion string, shrinkResources bool) {
	packageFile, jniJarFile, dexJarFile android.Path, certificates []Certificate, deps android.Paths, v4SignatureFile android.WritablePath, lineageFile android.Path, rotationMinSdkVersion string) {

	unsignedApkName := strings.TrimSuffix(outputFile.Base(), ".apk") + "-unsigned.apk"
	unsignedApk := android.PathForModuleOut(ctx, unsignedApkName)
@@ -71,12 +71,6 @@ func CreateAndSignAppPackage(ctx android.ModuleContext, outputFile android.Writa
		Output:    unsignedApk,
		Implicits: deps,
	})

	if shrinkResources {
		shrunkenApk := android.PathForModuleOut(ctx, "resource-shrunken", unsignedApk.Base())
		ShrinkResources(ctx, unsignedApk, shrunkenApk)
		unsignedApk = shrunkenApk
	}
	SignAppPackage(ctx, outputFile, unsignedApk, certificates, v4SignatureFile, lineageFile, rotationMinSdkVersion)
}

+27 −12
Original line number Diff line number Diff line
@@ -95,6 +95,8 @@ type dexer struct {
	proguardDictionary     android.OptionalPath
	proguardConfiguration  android.OptionalPath
	proguardUsageZip       android.OptionalPath
	resourcesInput         android.OptionalPath
	resourcesOutput        android.OptionalPath

	providesTransitiveHeaderJars
}
@@ -161,7 +163,7 @@ var r8, r8RE = pctx.MultiCommandRemoteStaticRules("r8",
		"$r8Template": &remoteexec.REParams{
			Labels:          map[string]string{"type": "compile", "compiler": "r8"},
			Inputs:          []string{"$implicits", "${config.R8Jar}"},
			OutputFiles:     []string{"${outUsage}", "${outConfig}", "${outDict}"},
			OutputFiles:     []string{"${outUsage}", "${outConfig}", "${outDict}", "${resourcesOutput}"},
			ExecStrategy:    "${config.RER8ExecStrategy}",
			ToolchainInputs: []string{"${config.JavaCmd}"},
			Platform:        map[string]string{remoteexec.PoolKey: "${config.REJavaPool}"},
@@ -181,7 +183,7 @@ var r8, r8RE = pctx.MultiCommandRemoteStaticRules("r8",
			Platform:     map[string]string{remoteexec.PoolKey: "${config.REJavaPool}"},
		},
	}, []string{"outDir", "outDict", "outConfig", "outUsage", "outUsageZip", "outUsageDir",
		"r8Flags", "zipFlags", "mergeZipsFlags"}, []string{"implicits"})
		"r8Flags", "zipFlags", "mergeZipsFlags", "resourcesOutput"}, []string{"implicits"})

func (d *dexer) dexCommonFlags(ctx android.ModuleContext,
	dexParams *compileDexParams) (flags []string, deps android.Paths) {
@@ -348,6 +350,12 @@ func (d *dexer) r8Flags(ctx android.ModuleContext, flags javaBuilderFlags) (r8Fl
		r8Flags = append(r8Flags, "-ignorewarnings")
	}

	if d.resourcesInput.Valid() {
		r8Flags = append(r8Flags, "--resource-input", d.resourcesInput.Path().String())
		r8Deps = append(r8Deps, d.resourcesInput.Path())
		r8Flags = append(r8Flags, "--resource-output", d.resourcesOutput.Path().String())
	}

	return r8Flags, r8Deps
}

@@ -389,6 +397,8 @@ func (d *dexer) compileDex(ctx android.ModuleContext, dexParams *compileDexParam
			android.ModuleNameWithPossibleOverride(ctx), "unused.txt")
		proguardUsageZip := android.PathForModuleOut(ctx, "proguard_usage.zip")
		d.proguardUsageZip = android.OptionalPathForPath(proguardUsageZip)
		resourcesOutput := android.PathForModuleOut(ctx, "package-res-shrunken.apk")
		d.resourcesOutput = android.OptionalPathForPath(resourcesOutput)
		r8Flags, r8Deps := d.r8Flags(ctx, dexParams.flags)
		r8Deps = append(r8Deps, commonDeps...)
		rule := r8
@@ -407,14 +417,19 @@ func (d *dexer) compileDex(ctx android.ModuleContext, dexParams *compileDexParam
			rule = r8RE
			args["implicits"] = strings.Join(r8Deps.Strings(), ",")
		}
		implicitOutputs := android.WritablePaths{
			proguardDictionary,
			proguardUsageZip,
			proguardConfiguration}
		if d.resourcesInput.Valid() {
			implicitOutputs = append(implicitOutputs, resourcesOutput)
			args["resourcesOutput"] = resourcesOutput.String()
		}
		ctx.Build(pctx, android.BuildParams{
			Rule:            rule,
			Description:     "r8",
			Output:          javalibJar,
			ImplicitOutputs: android.WritablePaths{
				proguardDictionary,
				proguardUsageZip,
				proguardConfiguration},
			ImplicitOutputs: implicitOutputs,
			Input:           dexParams.classesJar,
			Implicits:       r8Deps,
			Args:            args,

java/resourceshrinker.go

deleted100644 → 0
+0 −44
Original line number Diff line number Diff line
// Copyright 2022 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 java

import (
	"android/soong/android"

	"github.com/google/blueprint"
)

var shrinkResources = pctx.AndroidStaticRule("shrinkResources",
	blueprint.RuleParams{
		// Note that we suppress stdout to avoid successful log confirmations.
		Command:     `${config.ResourceShrinkerCmd} --output $out --input $in --raw_resources $raw_resources >/dev/null`,
		CommandDeps: []string{"${config.ResourceShrinkerCmd}"},
	}, "raw_resources")

func ShrinkResources(ctx android.ModuleContext, apk android.Path, outputFile android.WritablePath) {
	protoFile := android.PathForModuleOut(ctx, apk.Base()+".proto.apk")
	aapt2Convert(ctx, protoFile, apk, "proto")
	strictModeFile := android.PathForSource(ctx, "prebuilts/cmdline-tools/shrinker.xml")
	protoOut := android.PathForModuleOut(ctx, apk.Base()+".proto.out.apk")
	ctx.Build(pctx, android.BuildParams{
		Rule:   shrinkResources,
		Input:  protoFile,
		Output: protoOut,
		Args: map[string]string{
			"raw_resources": strictModeFile.String(),
		},
	})
	aapt2Convert(ctx, outputFile, protoOut, "binary")
}
Loading