From e1d62a8b1f26bb3bd4b6a42980da9b1daf407273 Mon Sep 17 00:00:00 2001 From: Colin Cross Date: Fri, 3 Apr 2015 16:53:05 -0700 Subject: [PATCH] Add support for using prebuilt libraries as static dependencies Extract files out of prebuilt libraries and create list files for classes and resources in order to allow including them in other jars. Change-Id: I9269d1fd6e0f570811a00bf319098ac1f7cdc816 --- java/builder.go | 31 +++++++++++++++++++++++++++++++ java/java.go | 17 +++++++++++++---- 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/java/builder.go b/java/builder.go index 2f9d70185..2c72cabae 100644 --- a/java/builder.go +++ b/java/builder.go @@ -61,6 +61,16 @@ var ( Description: "dex $out", }, "outDir", "dxFlags") + + extractPrebuilt = pctx.StaticRule("extractPrebuilt", + blueprint.RuleParams{ + Command: `rm -rf $outDir && unzip -qo $in -d $outDir && ` + + `find $outDir -name "*.class" > $classFile && ` + + `find $outDir -type f -a \! -name "*.class" -a \! -name "MANIFEST.MF" > $resourceFile || ` + + `(rm -rf $outDir; exit 42)`, + Description: "extract java prebuilt $outDir", + }, + "outDir", "classFile", "resourceFile") ) func init() { @@ -187,3 +197,24 @@ func TransformDexToJavaLib(ctx common.AndroidModuleContext, resources []jarSpec, return outputFile } + +func TransformPrebuiltJarToClasses(ctx common.AndroidModuleContext, + prebuilt string) (classJarSpec, resourceJarSpec jarSpec) { + + classDir := filepath.Join(common.ModuleOutDir(ctx), "classes") + classFileList := filepath.Join(classDir, "classes.list") + resourceFileList := filepath.Join(classDir, "resources.list") + + ctx.Build(pctx, blueprint.BuildParams{ + Rule: extractPrebuilt, + Outputs: []string{classFileList, resourceFileList}, + Inputs: []string{prebuilt}, + Args: map[string]string{ + "outDir": classDir, + "classFile": classFileList, + "resourceFile": resourceFileList, + }, + }) + + return jarSpec{classFileList, classDir}, jarSpec{resourceFileList, classDir} +} diff --git a/java/java.go b/java/java.go index 67bde045e..8b7e02d24 100644 --- a/java/java.go +++ b/java/java.go @@ -361,7 +361,8 @@ type JavaPrebuilt struct { Srcs []string } - classpathFile string + classpathFile string + classJarSpecs, resourceJarSpecs []jarSpec } func (j *JavaPrebuilt) GenerateAndroidBuildActions(ctx common.AndroidModuleContext) { @@ -369,7 +370,15 @@ func (j *JavaPrebuilt) GenerateAndroidBuildActions(ctx common.AndroidModuleConte ctx.ModuleErrorf("expected exactly one jar in srcs") return } - j.classpathFile = filepath.Join(common.ModuleSrcDir(ctx), j.properties.Srcs[0]) + prebuilt := filepath.Join(common.ModuleSrcDir(ctx), j.properties.Srcs[0]) + + classJarSpec, resourceJarSpec := TransformPrebuiltJarToClasses(ctx, prebuilt) + + j.classpathFile = prebuilt + j.classJarSpecs = []jarSpec{classJarSpec} + j.resourceJarSpecs = []jarSpec{resourceJarSpec} + + ctx.InstallFileName("framework", ctx.ModuleName()+".jar", j.classpathFile) } var _ JavaDependency = (*JavaPrebuilt)(nil) @@ -379,11 +388,11 @@ func (j *JavaPrebuilt) ClasspathFile() string { } func (j *JavaPrebuilt) ClassJarSpecs() []jarSpec { - return nil + return j.classJarSpecs } func (j *JavaPrebuilt) ResourceJarSpecs() []jarSpec { - return nil + return j.resourceJarSpecs } func JavaPrebuiltFactory() (blueprint.Module, []interface{}) {