package dexpreopt import "android/soong/android" func init() { android.InitRegistrationContext.RegisterSingletonType("dexpreopt_tools_zip_singleton", dexpreoptToolsZipSingletonFactory) } func dexpreoptToolsZipSingletonFactory() android.Singleton { return &dexpreoptToolsZipSingleton{} } type dexpreoptToolsZipSingleton struct{} func (s *dexpreoptToolsZipSingleton) GenerateBuildActions(ctx android.SingletonContext) { // The mac build doesn't build dex2oat, so create the zip file only if the build OS is linux. if !ctx.Config().BuildOS.Linux() { return } global := GetGlobalConfig(ctx) if global.DisablePreopt { return } config := GetCachedGlobalSoongConfig(ctx) if config == nil { return } deps := android.Paths{ ctx.Config().HostToolPath(ctx, "dexpreopt_gen"), ctx.Config().HostToolPath(ctx, "dexdump"), ctx.Config().HostToolPath(ctx, "oatdump"), config.Profman, config.Dex2oat, config.Aapt, config.SoongZip, config.Zip2zip, config.ManifestCheck, config.ConstructContext, config.UffdGcFlag, } out := android.PathForOutput(ctx, "dexpreopt_tools.zip") builder := android.NewRuleBuilder(pctx, ctx) cmd := builder.Command().BuiltTool("soong_zip"). Flag("-d"). FlagWithOutput("-o ", out). Flag("-j") for _, dep := range deps { cmd.FlagWithInput("-f ", dep) } // This reads through a symlink to include the file it points to. This isn't great for // build reproducibility, will need to be revisited later. cmd.Textf("-f $(realpath %s)", config.Dex2oat) builder.Build("dexpreopt_tools_zip", "building dexpreopt_tools.zip") ctx.DistForGoal("droidcore", out) }