Use ArchType in dexpreopt config

Make ArchType implement the encoding.TextMarshaller and
encoding.TextUnmarshaller interfaces so that it can be used
as a value in the dexpreopt config structs that are passed
through JSON files.

Test: m checkbuild
Change-Id: Ie4c12443e7ee5fe43f42d5403bcde12d62f617e2
This commit is contained in:
Colin Cross
2019-02-11 15:11:14 -08:00
parent 1cd8a57510
commit 74ba962d29
5 changed files with 36 additions and 15 deletions

View File

@@ -15,9 +15,11 @@
package android package android
import ( import (
"encoding"
"fmt" "fmt"
"reflect" "reflect"
"runtime" "runtime"
"strconv"
"strings" "strings"
"github.com/google/blueprint/proptools" "github.com/google/blueprint/proptools"
@@ -369,6 +371,23 @@ func (a ArchType) String() string {
return a.Name return a.Name
} }
var _ encoding.TextMarshaler = ArchType{}
func (a ArchType) MarshalText() ([]byte, error) {
return []byte(strconv.Quote(a.String())), nil
}
var _ encoding.TextUnmarshaler = &ArchType{}
func (a *ArchType) UnmarshalText(text []byte) error {
if u, ok := archTypeMap[string(text)]; ok {
*a = u
return nil
}
return fmt.Errorf("unknown ArchType %q", text)
}
var BuildOs = func() OsType { var BuildOs = func() OsType {
switch runtime.GOOS { switch runtime.GOOS {
case "linux": case "linux":

View File

@@ -17,6 +17,8 @@ package dexpreopt
import ( import (
"encoding/json" "encoding/json"
"io/ioutil" "io/ioutil"
"android/soong/android"
) )
// GlobalConfig stores the configuration for dex preopting set by the product // GlobalConfig stores the configuration for dex preopting set by the product
@@ -66,9 +68,9 @@ type GlobalConfig struct {
EmptyDirectory string // path to an empty directory EmptyDirectory string // path to an empty directory
DefaultDexPreoptImage map[string]string // default boot image location for each architecture DefaultDexPreoptImage map[android.ArchType]string // default boot image location for each architecture
CpuVariant map[string]string // cpu variant for each architecture CpuVariant map[android.ArchType]string // cpu variant for each architecture
InstructionSetFeatures map[string]string // instruction set for each architecture InstructionSetFeatures map[android.ArchType]string // instruction set for each architecture
Tools Tools // paths to tools possibly used by the generated commands Tools Tools // paths to tools possibly used by the generated commands
} }
@@ -103,7 +105,7 @@ type ModuleConfig struct {
UsesLibraries []string UsesLibraries []string
LibraryPaths map[string]string LibraryPaths map[string]string
Archs []string Archs []android.ArchType
DexPreoptImages []string DexPreoptImages []string
PreoptExtractedApk bool // Overrides OnlyPreoptModules PreoptExtractedApk bool // Overrides OnlyPreoptModules

View File

@@ -115,7 +115,7 @@ func GenerateDexpreoptRule(global GlobalConfig, module ModuleConfig) (rule *andr
for i, arch := range module.Archs { for i, arch := range module.Archs {
image := module.DexPreoptImages[i] image := module.DexPreoptImages[i]
dexpreoptCommand(global, module, rule, profile, arch, image, appImage, generateDM) dexpreoptCommand(global, module, rule, arch, profile, image, appImage, generateDM)
} }
} }
} }
@@ -178,7 +178,7 @@ func profileCommand(global GlobalConfig, module ModuleConfig, rule *android.Rule
} }
func dexpreoptCommand(global GlobalConfig, module ModuleConfig, rule *android.RuleBuilder, func dexpreoptCommand(global GlobalConfig, module ModuleConfig, rule *android.RuleBuilder,
profile, arch, bootImage string, appImage, generateDM bool) { arch android.ArchType, profile, bootImage string, appImage, generateDM bool) {
// HACK: make soname in Soong-generated .odex files match Make. // HACK: make soname in Soong-generated .odex files match Make.
base := filepath.Base(module.DexLocation) base := filepath.Base(module.DexLocation)
@@ -192,7 +192,7 @@ func dexpreoptCommand(global GlobalConfig, module ModuleConfig, rule *android.Ru
return filepath.Join( return filepath.Join(
filepath.Dir(path), filepath.Dir(path),
"oat", "oat",
arch, arch.String(),
pathtools.ReplaceExtension(filepath.Base(path), "odex")) pathtools.ReplaceExtension(filepath.Base(path), "odex"))
} }
@@ -328,7 +328,7 @@ func dexpreoptCommand(global GlobalConfig, module ModuleConfig, rule *android.Ru
FlagWithOutput("--oat-file=", odexPath).ImplicitOutput(vdexPath). FlagWithOutput("--oat-file=", odexPath).ImplicitOutput(vdexPath).
// Pass an empty directory, dex2oat shouldn't be reading arbitrary files // Pass an empty directory, dex2oat shouldn't be reading arbitrary files
FlagWithArg("--android-root=", global.EmptyDirectory). FlagWithArg("--android-root=", global.EmptyDirectory).
FlagWithArg("--instruction-set=", arch). FlagWithArg("--instruction-set=", arch.String()).
FlagWithArg("--instruction-set-variant=", global.CpuVariant[arch]). FlagWithArg("--instruction-set-variant=", global.CpuVariant[arch]).
FlagWithArg("--instruction-set-features=", global.InstructionSetFeatures[arch]). FlagWithArg("--instruction-set-features=", global.InstructionSetFeatures[arch]).
Flag("--no-generate-debug-info"). Flag("--no-generate-debug-info").
@@ -519,10 +519,10 @@ func odexOnSystemOther(module ModuleConfig, global GlobalConfig) bool {
} }
// PathToLocation converts .../system/framework/arm64/boot.art to .../system/framework/boot.art // PathToLocation converts .../system/framework/arm64/boot.art to .../system/framework/boot.art
func PathToLocation(path, arch string) string { func PathToLocation(path string, arch android.ArchType) string {
pathArch := filepath.Base(filepath.Dir(path)) pathArch := filepath.Base(filepath.Dir(path))
if pathArch != arch { if pathArch != arch.String() {
panic(fmt.Errorf("last directory in %q must be %q", path, arch)) panic(fmt.Errorf("last directory in %q must be %q", path, arch.String()))
} }
return filepath.Join(filepath.Dir(filepath.Dir(path)), filepath.Base(path)) return filepath.Join(filepath.Dir(filepath.Dir(path)), filepath.Base(path))
} }

View File

@@ -76,7 +76,7 @@ var testModuleConfig = ModuleConfig{
OptionalUsesLibraries: nil, OptionalUsesLibraries: nil,
UsesLibraries: nil, UsesLibraries: nil,
LibraryPaths: nil, LibraryPaths: nil,
Archs: []string{"arm"}, Archs: []android.ArchType{android.Arm},
DexPreoptImages: []string{"system/framework/arm/boot.art"}, DexPreoptImages: []string{"system/framework/arm/boot.art"},
PreoptExtractedApk: false, PreoptExtractedApk: false,
NoCreateAppImage: false, NoCreateAppImage: false,

View File

@@ -100,14 +100,14 @@ func (d *dexpreopter) dexpreopt(ctx android.ModuleContext, dexJarFile android.Mo
return dexpreopt.GlobalConfig{} return dexpreopt.GlobalConfig{}
}).(dexpreopt.GlobalConfig) }).(dexpreopt.GlobalConfig)
var archs []string var archs []android.ArchType
for _, a := range ctx.MultiTargets() { for _, a := range ctx.MultiTargets() {
archs = append(archs, a.Arch.ArchType.String()) archs = append(archs, a.Arch.ArchType)
} }
if len(archs) == 0 { if len(archs) == 0 {
// assume this is a java library, dexpreopt for all arches for now // assume this is a java library, dexpreopt for all arches for now
for _, target := range ctx.Config().Targets[android.Android] { for _, target := range ctx.Config().Targets[android.Android] {
archs = append(archs, target.Arch.ArchType.String()) archs = append(archs, target.Arch.ArchType)
} }
if inList(ctx.ModuleName(), globalConfig.SystemServerJars) && !d.isSDKLibrary { if inList(ctx.ModuleName(), globalConfig.SystemServerJars) && !d.isSDKLibrary {
// If the module is not an SDK library and it's a system server jar, only preopt the primary arch. // If the module is not an SDK library and it's a system server jar, only preopt the primary arch.