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

Commit 29ff8874 authored by Colin Cross's avatar Colin Cross
Browse files

Dexpreopt soong modules inside soong

Port the dexpreopt logic from Make to the dexpreopt package in Soong,
and use it to dexpreopt Soong modules.  The same package is also
compiled into the dexpreopt_gen binary to generate dexpreopt scripts
for Make modules.

Bug: 119412419
Bug: 120273280
Test: no differences to dexpreopt outputs on aosp_sailfish system/,
      only expected changes to dexpreopt outputs on system_other
      (.vdex files for privileged Soong modules no longer incorrectly
      contain .dex contents).
Change-Id: Ib67e2febf9ed921f06e8a86b9ec945c80dff35eb
parent 9d824cc8
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -224,6 +224,7 @@ bootstrap_go_package {
        "soong",
        "soong",
        "soong-android",
        "soong-android",
        "soong-cc",
        "soong-cc",
        "soong-dexpreopt",
        "soong-genrule",
        "soong-genrule",
        "soong-java-config",
        "soong-java-config",
        "soong-tradefed",
        "soong-tradefed",
@@ -238,6 +239,7 @@ bootstrap_go_package {
        "java/app.go",
        "java/app.go",
        "java/builder.go",
        "java/builder.go",
        "java/dex.go",
        "java/dex.go",
        "java/dexpreopt.go",
        "java/droiddoc.go",
        "java/droiddoc.go",
        "java/gen.go",
        "java/gen.go",
        "java/genrule.go",
        "java/genrule.go",
+20 −4
Original line number Original line Diff line number Diff line
@@ -732,14 +732,18 @@ func (c *config) ModulesLoadedByPrivilegedModules() []string {
	return c.productVariables.ModulesLoadedByPrivilegedModules
	return c.productVariables.ModulesLoadedByPrivilegedModules
}
}


func (c *config) DefaultStripDex() bool {
	return Bool(c.productVariables.DefaultStripDex)
}

func (c *config) DisableDexPreopt(name string) bool {
func (c *config) DisableDexPreopt(name string) bool {
	return Bool(c.productVariables.DisableDexPreopt) || InList(name, c.productVariables.DisableDexPreoptModules)
	return Bool(c.productVariables.DisableDexPreopt) || InList(name, c.productVariables.DisableDexPreoptModules)
}
}


func (c *config) DexpreoptGlobalConfig() string {
	return String(c.productVariables.DexpreoptGlobalConfig)
}

func (c *config) DexPreoptProfileDir() string {
	return String(c.productVariables.DexPreoptProfileDir)
}

func (c *deviceConfig) Arches() []Arch {
func (c *deviceConfig) Arches() []Arch {
	var arches []Arch
	var arches []Arch
	for _, target := range c.config.Targets[Android] {
	for _, target := range c.config.Targets[Android] {
@@ -854,6 +858,18 @@ func (c *deviceConfig) PlatPrivateSepolicyDirs() []string {
	return c.config.productVariables.BoardPlatPrivateSepolicyDirs
	return c.config.productVariables.BoardPlatPrivateSepolicyDirs
}
}


func (c *config) SecondArchIsTranslated() bool {
	deviceTargets := c.Targets[Android]
	if len(deviceTargets) < 2 {
		return false
	}

	arch := deviceTargets[0].Arch

	return (arch.ArchType == X86 || arch.ArchType == X86_64) &&
		(hasArmAbi(arch) || hasArmAndroidArch(deviceTargets))
}

func (c *config) IntegerOverflowDisabledForPath(path string) bool {
func (c *config) IntegerOverflowDisabledForPath(path string) bool {
	if c.productVariables.IntegerOverflowExcludePaths == nil {
	if c.productVariables.IntegerOverflowExcludePaths == nil {
		return false
		return false
+57 −33
Original line number Original line Diff line number Diff line
@@ -659,11 +659,7 @@ func (p SourcePath) OverlayPath(ctx ModuleContext, path Path) OptionalPath {
	if len(paths) == 0 {
	if len(paths) == 0 {
		return OptionalPath{}
		return OptionalPath{}
	}
	}
	relPath, err := filepath.Rel(p.config.srcDir, paths[0])
	relPath := Rel(ctx, p.config.srcDir, paths[0])
	if err != nil {
		reportPathError(ctx, err)
		return OptionalPath{}
	}
	return OptionalPathForPath(PathForSource(ctx, relPath))
	return OptionalPathForPath(PathForSource(ctx, relPath))
}
}


@@ -788,13 +784,7 @@ func (p ModuleSrcPath) resPathWithName(ctx ModuleContext, name string) ModuleRes


func (p ModuleSrcPath) WithSubDir(ctx ModuleContext, subdir string) ModuleSrcPath {
func (p ModuleSrcPath) WithSubDir(ctx ModuleContext, subdir string) ModuleSrcPath {
	subdir = PathForModuleSrc(ctx, subdir).String()
	subdir = PathForModuleSrc(ctx, subdir).String()
	var err error
	p.rel = Rel(ctx, subdir, p.path)
	rel, err := filepath.Rel(subdir, p.path)
	if err != nil {
		ctx.ModuleErrorf("source file %q is not under path %q", p.path, subdir)
		return p
	}
	p.rel = rel
	return p
	return p
}
}


@@ -932,6 +922,33 @@ func PathForModuleRes(ctx ModuleContext, pathComponents ...string) ModuleResPath
func PathForModuleInstall(ctx ModuleInstallPathContext, pathComponents ...string) OutputPath {
func PathForModuleInstall(ctx ModuleInstallPathContext, pathComponents ...string) OutputPath {
	var outPaths []string
	var outPaths []string
	if ctx.Device() {
	if ctx.Device() {
		partition := modulePartition(ctx)
		outPaths = []string{"target", "product", ctx.Config().DeviceName(), partition}
	} else {
		switch ctx.Os() {
		case Linux:
			outPaths = []string{"host", "linux-x86"}
		case LinuxBionic:
			// TODO: should this be a separate top level, or shared with linux-x86?
			outPaths = []string{"host", "linux_bionic-x86"}
		default:
			outPaths = []string{"host", ctx.Os().String() + "-x86"}
		}
	}
	if ctx.Debug() {
		outPaths = append([]string{"debug"}, outPaths...)
	}
	outPaths = append(outPaths, pathComponents...)
	return PathForOutput(ctx, outPaths...)
}

func InstallPathToOnDevicePath(ctx PathContext, path OutputPath) string {
	rel := Rel(ctx, PathForOutput(ctx, "target", "product", ctx.Config().DeviceName()).String(), path.String())

	return "/" + rel
}

func modulePartition(ctx ModuleInstallPathContext) string {
	var partition string
	var partition string
	if ctx.InstallInData() {
	if ctx.InstallInData() {
		partition = "data"
		partition = "data"
@@ -949,27 +966,10 @@ func PathForModuleInstall(ctx ModuleInstallPathContext, pathComponents ...string
	} else {
	} else {
		partition = "system"
		partition = "system"
	}
	}

	if ctx.InstallInSanitizerDir() {
	if ctx.InstallInSanitizerDir() {
		partition = "data/asan/" + partition
		partition = "data/asan/" + partition
	}
	}
		outPaths = []string{"target", "product", ctx.Config().DeviceName(), partition}
	return partition
	} else {
		switch ctx.Os() {
		case Linux:
			outPaths = []string{"host", "linux-x86"}
		case LinuxBionic:
			// TODO: should this be a separate top level, or shared with linux-x86?
			outPaths = []string{"host", "linux_bionic-x86"}
		default:
			outPaths = []string{"host", ctx.Os().String() + "-x86"}
		}
	}
	if ctx.Debug() {
		outPaths = append([]string{"debug"}, outPaths...)
	}
	outPaths = append(outPaths, pathComponents...)
	return PathForOutput(ctx, outPaths...)
}
}


// validateSafePath validates a path that we trust (may contain ninja variables).
// validateSafePath validates a path that we trust (may contain ninja variables).
@@ -1039,3 +1039,27 @@ func PathsForTesting(strs []string) Paths {


	return p
	return p
}
}

// Rel performs the same function as filepath.Rel, but reports errors to a PathContext, and reports an error if
// targetPath is not inside basePath.
func Rel(ctx PathContext, basePath string, targetPath string) string {
	rel, isRel := MaybeRel(ctx, basePath, targetPath)
	if !isRel {
		reportPathErrorf(ctx, "path %q is not under path %q", targetPath, basePath)
		return ""
	}
	return rel
}

// MaybeRel performs the same function as filepath.Rel, but reports errors to a PathContext, and returns false if
// targetPath is not inside basePath.
func MaybeRel(ctx PathContext, basePath string, targetPath string) (string, bool) {
	rel, err := filepath.Rel(basePath, targetPath)
	if err != nil {
		reportPathError(ctx, err)
		return "", false
	} else if rel == ".." || strings.HasPrefix(rel, "../") || strings.HasPrefix(rel, "/") {
		return "", false
	}
	return rel, true
}
+6 −3
Original line number Original line Diff line number Diff line
@@ -196,9 +196,10 @@ type productVariables struct {


	UncompressPrivAppDex             *bool    `json:",omitempty"`
	UncompressPrivAppDex             *bool    `json:",omitempty"`
	ModulesLoadedByPrivilegedModules []string `json:",omitempty"`
	ModulesLoadedByPrivilegedModules []string `json:",omitempty"`
	DefaultStripDex                  *bool    `json:",omitempty"`

	DisableDexPreopt        *bool    `json:",omitempty"`
	DisableDexPreopt        *bool    `json:",omitempty"`
	DisableDexPreoptModules []string `json:",omitempty"`
	DisableDexPreoptModules []string `json:",omitempty"`
	DexPreoptProfileDir     *string  `json:",omitempty"`


	IntegerOverflowExcludePaths *[]string `json:",omitempty"`
	IntegerOverflowExcludePaths *[]string `json:",omitempty"`


@@ -257,6 +258,8 @@ type productVariables struct {
	Exclude_draft_ndk_apis *bool `json:",omitempty"`
	Exclude_draft_ndk_apis *bool `json:",omitempty"`


	FlattenApex *bool `json:",omitempty"`
	FlattenApex *bool `json:",omitempty"`

	DexpreoptGlobalConfig *string `json:",omitempty"`
}
}


func boolPtr(v bool) *bool {
func boolPtr(v bool) *bool {

dexpreopt/Android.bp

0 → 100644
+15 −0
Original line number Original line Diff line number Diff line
bootstrap_go_package {
    name: "soong-dexpreopt",
    pkgPath: "android/soong/dexpreopt",
    srcs: [
        "config.go",
        "dexpreopt.go",
        "script.go",
    ],
    testSrcs: [
        "dexpreopt_test.go",
    ],
    deps: [
        "blueprint-pathtools",
    ],
}
 No newline at end of file
Loading