diff --git a/androidmk/cmd/androidmk/android.go b/androidmk/cmd/androidmk/android.go index cba512449..3009d4649 100644 --- a/androidmk/cmd/androidmk/android.go +++ b/androidmk/cmd/androidmk/android.go @@ -21,6 +21,7 @@ var stringProperties = map[string]string{ "LOCAL_SDK_VERSION": "sdk_version", "LOCAL_NDK_STL_VARIANT": "stl", "LOCAL_JAR_MANIFEST": "manifest", + "LOCAL_JARJAR_RULES": "jarjar_rules", } var listProperties = map[string]string{ diff --git a/config/config.go b/config/config.go index 4e9cbf1d4..c08707026 100644 --- a/config/config.go +++ b/config/config.go @@ -195,3 +195,13 @@ func (c *Config) HostBin() string { func (c *Config) HostBinTool(tool string) (string, error) { return filepath.Join(c.HostBin(), tool), nil } + +// HostJavaDir returns the path to framework directory for host targets +func (c *Config) HostJavaDir() string { + return filepath.Join(c.HostOut(), "framework") +} + +// HostJavaTool returns the path to a host tool in the frameworks directory for host targets +func (c *Config) HostJavaTool(tool string) (string, error) { + return filepath.Join(c.HostJavaDir(), tool), nil +} diff --git a/java/builder.go b/java/builder.go index 2c72cabae..f0cfeaea5 100644 --- a/java/builder.go +++ b/java/builder.go @@ -62,6 +62,13 @@ var ( }, "outDir", "dxFlags") + jarjar = pctx.StaticRule("jarjar", + blueprint.RuleParams{ + Command: "java -jar $jarjarCmd process $rulesFile $in $out", + Description: "jarjar $out", + }, + "rulesFile") + extractPrebuilt = pctx.StaticRule("extractPrebuilt", blueprint.RuleParams{ Command: `rm -rf $outDir && unzip -qo $in -d $outDir && ` + @@ -80,6 +87,9 @@ func init() { pctx.VariableFunc("dxCmd", func(c interface{}) (string, error) { return c.(Config).HostBinTool("dx") }) + pctx.VariableFunc("jarjarCmd", func(c interface{}) (string, error) { + return c.(Config).HostJavaTool("jarjar.jar") + }) } type javaBuilderFlags struct { @@ -198,6 +208,21 @@ func TransformDexToJavaLib(ctx common.AndroidModuleContext, resources []jarSpec, return outputFile } +func TransformJarJar(ctx common.AndroidModuleContext, classesJar string, rulesFile string) string { + outputFile := filepath.Join(common.ModuleOutDir(ctx), "classes-jarjar.jar") + ctx.Build(pctx, blueprint.BuildParams{ + Rule: jarjar, + Outputs: []string{outputFile}, + Inputs: []string{classesJar}, + Implicits: []string{"$jarjarCmd"}, + Args: map[string]string{ + "rulesFile": rulesFile, + }, + }) + + return outputFile +} + func TransformPrebuiltJarToClasses(ctx common.AndroidModuleContext, prebuilt string) (classJarSpec, resourceJarSpec jarSpec) { diff --git a/java/java.go b/java/java.go index 8b7e02d24..f93472184 100644 --- a/java/java.go +++ b/java/java.go @@ -33,6 +33,7 @@ type Config interface { SrcDir() string PrebuiltOS() string HostBinTool(string) (string, error) + HostJavaTool(string) (string, error) Getenv(string) string } @@ -90,6 +91,9 @@ type javaBase struct { // Set for device java libraries, and for host versions of device java libraries // built for testing Dex bool `blueprint:"mutated"` + + // jarjar_rules: if not blank, run jarjar using the specified rules file + Jarjar_rules string } // output file suitable for inserting into the classpath of another compile @@ -235,8 +239,19 @@ func (j *javaBase) GenerateJavaBuildActions(ctx common.AndroidModuleContext) { if ctx.Failed() { return } + j.classJarSpecs = classJarSpecs j.resourceJarSpecs = resourceJarSpecs + + if j.properties.Jarjar_rules != "" { + jarjar_rules := filepath.Join(common.ModuleSrcDir(ctx), j.properties.Jarjar_rules) + // Transform classes-full-debug.jar into classes-jarjar.jar + outputFile = TransformJarJar(ctx, outputFile, jarjar_rules) + if ctx.Failed() { + return + } + } + j.classpathFile = outputFile if j.properties.Dex {