diff options
Diffstat (limited to 'java/dexpreopt.go')
-rw-r--r-- | java/dexpreopt.go | 246 |
1 files changed, 0 insertions, 246 deletions
diff --git a/java/dexpreopt.go b/java/dexpreopt.go deleted file mode 100644 index 3ee1205e..00000000 --- a/java/dexpreopt.go +++ /dev/null @@ -1,246 +0,0 @@ -// Copyright 2018 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 ( - "path/filepath" - "strings" - - "github.com/google/blueprint" - "github.com/google/blueprint/proptools" - - "android/soong/android" - "android/soong/dexpreopt" -) - -type dexpreopter struct { - dexpreoptProperties DexpreoptProperties - - installPath android.OutputPath - isPrivApp bool - isSDKLibrary bool - - builtInstalled []string -} - -type DexpreoptProperties struct { - Dex_preopt struct { - // If false, prevent dexpreopting and stripping the dex file from the final jar. Defaults to - // true. - Enabled *bool - - // If true, generate an app image (.art file) for this module. - App_image *bool - - // If true, use a checked-in profile to guide optimization. Defaults to false unless - // a matching profile is set or a profile is found in PRODUCT_DEX_PREOPT_PROFILE_DIR - // that matches the name of this module, in which case it is defaulted to true. - Profile_guided *bool - - // If set, provides the path to profile relative to the Android.bp file. If not set, - // defaults to searching for a file that matches the name of this module in the default - // profile location set by PRODUCT_DEX_PREOPT_PROFILE_DIR, or empty if not found. - Profile *string - } -} - -func (d *dexpreopter) dexpreoptDisabled(ctx android.ModuleContext) bool { - if ctx.Config().DisableDexPreopt(ctx.ModuleName()) { - return true - } - - if ctx.Config().UnbundledBuild() { - return true - } - - if !BoolDefault(d.dexpreoptProperties.Dex_preopt.Enabled, true) { - return true - } - - // TODO: contains no java code - // TODO: is test - - return false -} - -func (d *dexpreopter) dexpreopt(ctx android.ModuleContext, dexJarFile android.ModuleOutPath) android.ModuleOutPath { - if d.dexpreoptDisabled(ctx) { - return dexJarFile - } - - globalConfig := ctx.Config().Once("DexpreoptGlobalConfig", func() interface{} { - if f := ctx.Config().DexpreoptGlobalConfig(); f != "" { - ctx.AddNinjaFileDeps(f) - globalConfig, err := dexpreopt.LoadGlobalConfig(f) - if err != nil { - panic(err) - } - return globalConfig - } - return dexpreopt.GlobalConfig{} - }).(dexpreopt.GlobalConfig) - - var archs []string - for _, a := range ctx.MultiTargets() { - archs = append(archs, a.Arch.ArchType.String()) - } - if len(archs) == 0 { - // assume this is a java library, dexpreopt for all arches for now - for _, target := range ctx.Config().Targets[android.Android] { - archs = append(archs, target.Arch.ArchType.String()) - } - 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. - archs = archs[:1] - } - } - if ctx.Config().SecondArchIsTranslated() { - // Only preopt primary arch for translated arch since there is only an image there. - archs = archs[:1] - } - - dexLocation := android.InstallPathToOnDevicePath(ctx, d.installPath) - - strippedDexJarFile := android.PathForModuleOut(ctx, "dexpreopt", dexJarFile.Base()) - - deps := android.Paths{dexJarFile} - - var profileClassListing android.OptionalPath - profileIsTextListing := false - if BoolDefault(d.dexpreoptProperties.Dex_preopt.Profile_guided, true) { - // If dex_preopt.profile_guided is not set, default it based on the existence of the - // dexprepot.profile option or the profile class listing. - if String(d.dexpreoptProperties.Dex_preopt.Profile) != "" { - profileClassListing = android.OptionalPathForPath( - android.PathForModuleSrc(ctx, String(d.dexpreoptProperties.Dex_preopt.Profile))) - profileIsTextListing = true - } else { - profileClassListing = android.ExistentPathForSource(ctx, - ctx.Config().DexPreoptProfileDir(), ctx.ModuleName()+".prof") - } - } - - if profileClassListing.Valid() { - deps = append(deps, profileClassListing.Path()) - } - - uncompressedDex := false - if ctx.Config().UncompressPrivAppDex() && - (d.isPrivApp || inList(ctx.ModuleName(), ctx.Config().ModulesLoadedByPrivilegedModules())) { - uncompressedDex = true - } - - dexpreoptConfig := dexpreopt.ModuleConfig{ - Name: ctx.ModuleName(), - DexLocation: dexLocation, - BuildPath: android.PathForModuleOut(ctx, "dexpreopt", ctx.ModuleName()+".jar").String(), - DexPath: dexJarFile.String(), - PreferIntegrity: false, - UncompressedDex: uncompressedDex, - HasApkLibraries: false, - PreoptFlags: nil, - - ProfileClassListing: profileClassListing.String(), - ProfileIsTextListing: profileIsTextListing, - - EnforceUsesLibraries: false, - OptionalUsesLibraries: nil, - UsesLibraries: nil, - LibraryPaths: nil, - - Archs: archs, - DexPreoptImageLocation: "", - - PreoptExtractedApk: false, - - NoCreateAppImage: !BoolDefault(d.dexpreoptProperties.Dex_preopt.App_image, true), - ForceCreateAppImage: BoolDefault(d.dexpreoptProperties.Dex_preopt.App_image, false), - - StripInputPath: dexJarFile.String(), - StripOutputPath: strippedDexJarFile.String(), - } - - dexpreoptRule, err := dexpreopt.GenerateDexpreoptRule(globalConfig, dexpreoptConfig) - if err != nil { - ctx.ModuleErrorf("error generating dexpreopt rule: %s", err.Error()) - return dexJarFile - } - - var inputs android.Paths - for _, input := range dexpreoptRule.Inputs() { - if input == "" { - // Tests sometimes have empty configuration values that lead to empty inputs - continue - } - rel, isRel := android.MaybeRel(ctx, android.PathForModuleOut(ctx).String(), input) - if isRel { - inputs = append(inputs, android.PathForModuleOut(ctx, rel)) - } else { - // TODO: use PathForOutput once boot image is moved to where PathForOutput can find it. - inputs = append(inputs, &bootImagePath{input}) - } - } - - var outputs android.WritablePaths - for _, output := range dexpreoptRule.Outputs() { - rel := android.Rel(ctx, android.PathForModuleOut(ctx).String(), output) - outputs = append(outputs, android.PathForModuleOut(ctx, rel)) - } - - for _, install := range dexpreoptRule.Installs() { - d.builtInstalled = append(d.builtInstalled, install.From+":"+install.To) - } - - if len(dexpreoptRule.Commands()) > 0 { - ctx.Build(pctx, android.BuildParams{ - Rule: ctx.Rule(pctx, "dexpreopt", blueprint.RuleParams{ - Command: strings.Join(proptools.NinjaEscape(dexpreoptRule.Commands()), " && "), - CommandDeps: dexpreoptRule.Tools(), - }), - Implicits: inputs, - Outputs: outputs, - Description: "dexpreopt", - }) - } - - stripRule, err := dexpreopt.GenerateStripRule(globalConfig, dexpreoptConfig) - if err != nil { - ctx.ModuleErrorf("error generating dexpreopt strip rule: %s", err.Error()) - return dexJarFile - } - - ctx.Build(pctx, android.BuildParams{ - Rule: ctx.Rule(pctx, "dexpreopt_strip", blueprint.RuleParams{ - Command: strings.Join(proptools.NinjaEscape(stripRule.Commands()), " && "), - CommandDeps: stripRule.Tools(), - }), - Input: dexJarFile, - Output: strippedDexJarFile, - Description: "dexpreopt strip", - }) - - return strippedDexJarFile -} - -type bootImagePath struct { - path string -} - -var _ android.Path = (*bootImagePath)(nil) - -func (p *bootImagePath) String() string { return p.path } -func (p *bootImagePath) Ext() string { return filepath.Ext(p.path) } -func (p *bootImagePath) Base() string { return filepath.Base(p.path) } -func (p *bootImagePath) Rel() string { return p.path } |