Add "Optimize_for_size" build property

Projects with this property will be aggresively optimized for size. This
is useful for large binaries that are rarely executed and performance
insensitive (e.g. debugging tools, deprecated libraries).

This changeset reduces total system native binary size by 1.1%.

Test: presubmit
Bug: 342090838
Change-Id: I46a1db0c44e2e7d482b14eca1299f8ad48661d2d
This commit is contained in:
Yi Kong 2024-05-28 02:22:34 +09:00
parent 6c9fa02204
commit 5786f5cf1d
2 changed files with 19 additions and 0 deletions

View file

@ -286,6 +286,11 @@ type BaseProperties struct {
// Deprecated. true is the default, false is invalid. // Deprecated. true is the default, false is invalid.
Clang *bool `android:"arch_variant"` Clang *bool `android:"arch_variant"`
// Aggresively trade performance for smaller binary size.
// This should only be used for on-device binaries that are rarely executed and not
// performance critical.
Optimize_for_size *bool `android:"arch_variant"`
// The API level that this module is built against. The APIs of this API level will be // The API level that this module is built against. The APIs of this API level will be
// visible at build time, but use of any APIs newer than min_sdk_version will render the // visible at build time, but use of any APIs newer than min_sdk_version will render the
// module unloadable on older devices. In the future it will be possible to weakly-link new // module unloadable on older devices. In the future it will be possible to weakly-link new
@ -546,6 +551,7 @@ type ModuleContextIntf interface {
isCfiAssemblySupportEnabled() bool isCfiAssemblySupportEnabled() bool
getSharedFlags() *SharedFlags getSharedFlags() *SharedFlags
notInPlatform() bool notInPlatform() bool
optimizeForSize() bool
} }
type SharedFlags struct { type SharedFlags struct {
@ -985,6 +991,7 @@ func (c *Module) AddJSONData(d *map[string]interface{}) {
"WinMsgSrcs": hasWinMsg, "WinMsgSrcs": hasWinMsg,
"YaccSrsc": hasYacc, "YaccSrsc": hasYacc,
"OnlyCSrcs": !(hasAidl || hasLex || hasProto || hasRenderscript || hasSysprop || hasWinMsg || hasYacc), "OnlyCSrcs": !(hasAidl || hasLex || hasProto || hasRenderscript || hasSysprop || hasWinMsg || hasYacc),
"OptimizeForSize": c.OptimizeForSize(),
} }
} }
@ -1070,6 +1077,10 @@ func (c *Module) StubDecorator() bool {
return false return false
} }
func (c *Module) OptimizeForSize() bool {
return Bool(c.Properties.Optimize_for_size)
}
func (c *Module) SdkVersion() string { func (c *Module) SdkVersion() string {
return String(c.Properties.Sdk_version) return String(c.Properties.Sdk_version)
} }
@ -1613,6 +1624,10 @@ func (ctx *moduleContextImpl) object() bool {
return ctx.mod.Object() return ctx.mod.Object()
} }
func (ctx *moduleContextImpl) optimizeForSize() bool {
return ctx.mod.OptimizeForSize()
}
func (ctx *moduleContextImpl) canUseSdk() bool { func (ctx *moduleContextImpl) canUseSdk() bool {
return ctx.mod.canUseSdk() return ctx.mod.canUseSdk()
} }

View file

@ -693,6 +693,10 @@ func (compiler *baseCompiler) compilerFlags(ctx ModuleContext, flags Flags, deps
flags.Local.CFlags = append(flags.Local.CFlags, "-fopenmp") flags.Local.CFlags = append(flags.Local.CFlags, "-fopenmp")
} }
if ctx.optimizeForSize() {
flags.Local.CFlags = append(flags.Local.CFlags, "-Oz")
}
// Exclude directories from manual binder interface allowed list. // Exclude directories from manual binder interface allowed list.
//TODO(b/145621474): Move this check into IInterface.h when clang-tidy no longer uses absolute paths. //TODO(b/145621474): Move this check into IInterface.h when clang-tidy no longer uses absolute paths.
if android.HasAnyPrefix(ctx.ModuleDir(), allowedManualInterfacePaths) { if android.HasAnyPrefix(ctx.ModuleDir(), allowedManualInterfacePaths) {