Make javac rules output a jar with soong_zip
Make javac rules output a jar file instead of a classes.list.
Combine the output jar, static jar dependencies, and resources
into the final jar using a separate rule. For now, use a shell
command with unzip and soong_zip to create the final jar,
eventually it will be done with a zip2zip-style jar combiner.
Bug: 64691570
Test: java_test.go
Change-Id: Id8e6313e0097b78947d88e86e47b56ad08caca1a
diff --git a/java/builder.go b/java/builder.go
index e359529..c39bd4e 100644
--- a/java/builder.go
+++ b/java/builder.go
@@ -43,8 +43,8 @@
`$javacFlags $bootClasspath $classpath ` +
`-source $javaVersion -target $javaVersion ` +
`-d $outDir -s $annoDir @$out.rsp && ` +
- `find $outDir -type f | sort | ${config.JarArgsCmd} $outDir > $out`,
- CommandDeps: []string{"${config.JavacCmd}", "${config.JarArgsCmd}"},
+ `${config.SoongZipCmd} -jar -o $out -C $outDir -D $outDir`,
+ CommandDeps: []string{"${config.JavacCmd}", "${config.SoongZipCmd}"},
Rspfile: "$out.rsp",
RspfileContent: "$in",
},
@@ -57,12 +57,12 @@
`$javacFlags $bootClasspath $classpath ` +
`-source $javaVersion -target $javaVersion ` +
`-d $outDir -s $annoDir @$out.rsp && ` +
- `find $outDir -type f | sort | ${config.JarArgsCmd} $outDir > $out`,
+ `${config.SoongZipCmd} -jar -o $out -C $outDir -D $outDir`,
CommandDeps: []string{
"${config.JavaCmd}",
"${config.ErrorProneJavacJar}",
"${config.ErrorProneJar}",
- "${config.JarArgsCmd}",
+ "${config.SoongZipCmd}",
},
Rspfile: "$out.rsp",
RspfileContent: "$in",
@@ -71,17 +71,24 @@
jar = pctx.AndroidStaticRule("jar",
blueprint.RuleParams{
- Command: `${config.JarCmd} $operation ${out}.tmp $manifest $jarArgs && ${config.Zip2ZipCmd} -t -i ${out}.tmp -o ${out} && rm ${out}.tmp`,
- CommandDeps: []string{"${config.JarCmd}"},
+ Command: `${config.SoongZipCmd} -jar -o $out $jarArgs`,
+ CommandDeps: []string{"${config.SoongZipCmd}"},
},
- "operation", "manifest", "jarArgs")
+ "jarArgs")
+
+ combineJar = pctx.AndroidStaticRule("combineJar",
+ blueprint.RuleParams{
+ Command: `${config.MergeZipsCmd} -j $out $in`,
+ CommandDeps: []string{"${config.MergeZipsCmd}"},
+ },
+ "outDir")
dx = pctx.AndroidStaticRule("dx",
blueprint.RuleParams{
Command: `rm -rf "$outDir" && mkdir -p "$outDir" && ` +
- `${config.DxCmd} --dex --output=$outDir $dxFlags $in && ` +
- `find "$outDir" -name "classes*.dex" | sort | ${config.JarArgsCmd} ${outDir} > $out`,
- CommandDeps: []string{"${config.DxCmd}", "${config.JarArgsCmd}"},
+ `${config.DxCmd} --dex --output=$outDir $dxFlags $in || ( rm -rf "$outDir"; exit 41 ) && ` +
+ `find "$outDir" -name "classes*.dex" | sort > $out`,
+ CommandDeps: []string{"${config.DxCmd}"},
},
"outDir", "dxFlags")
@@ -91,22 +98,6 @@
CommandDeps: []string{"${config.JavaCmd}", "${config.JarjarCmd}", "$rulesFile"},
},
"rulesFile")
-
- extractPrebuilt = pctx.AndroidStaticRule("extractPrebuilt",
- blueprint.RuleParams{
- Command: `rm -rf $outDir && unzip -qo $in -d $outDir && ` +
- `find $outDir -name "*.class" | sort | ${config.JarArgsCmd} ${outDir} > $classFile && ` +
- `find $outDir -type f -a \! -name "*.class" -a \! -name "MANIFEST.MF" | sort | ${config.JarArgsCmd} ${outDir} > $resourceFile`,
- CommandDeps: []string{"${config.JarArgsCmd}"},
- },
- "outDir", "classFile", "resourceFile")
-
- fileListToJarArgs = pctx.AndroidStaticRule("fileListToJarArgs",
- blueprint.RuleParams{
- Command: `${config.JarArgsCmd} -f $in -p ${outDir} -o $out`,
- CommandDeps: []string{"${config.JarjarCmd}"},
- },
- "outDir")
)
func init() {
@@ -123,23 +114,19 @@
}
type jarSpec struct {
- android.ModuleOutPath
+ fileList, dir android.Path
}
-func (j jarSpec) jarArgs() string {
- return "@" + j.String()
+func (j jarSpec) soongJarArgs() string {
+ return "-C " + j.dir.String() + " -l " + j.fileList.String()
}
-func (j jarSpec) path() android.Path {
- return j.ModuleOutPath
-}
-
-func TransformJavaToClasses(ctx android.ModuleContext, srcFiles android.Paths, srcFileLists android.Paths,
- flags javaBuilderFlags, deps android.Paths) jarSpec {
+func TransformJavaToClasses(ctx android.ModuleContext, srcFiles, srcFileLists android.Paths,
+ flags javaBuilderFlags, deps android.Paths) android.ModuleOutPath {
classDir := android.PathForModuleOut(ctx, "classes")
annoDir := android.PathForModuleOut(ctx, "anno")
- classFileList := android.PathForModuleOut(ctx, "classes.list")
+ classJar := android.PathForModuleOut(ctx, "classes.jar")
javacFlags := flags.javacFlags + android.JoinWithPrefix(srcFileLists.Strings(), "@")
@@ -148,7 +135,7 @@
ctx.ModuleBuild(pctx, android.ModuleBuildParams{
Rule: javac,
Description: "javac",
- Output: classFileList,
+ Output: classJar,
Inputs: srcFiles,
Implicits: deps,
Args: map[string]string{
@@ -161,7 +148,7 @@
},
})
- return jarSpec{classFileList}
+ return classJar
}
func RunErrorProne(ctx android.ModuleContext, srcFiles android.Paths, srcFileLists android.Paths,
@@ -199,22 +186,21 @@
return classFileList
}
-func TransformClassesToJar(ctx android.ModuleContext, classes []jarSpec,
+func TransformResourcesToJar(ctx android.ModuleContext, resources []jarSpec,
manifest android.OptionalPath, deps android.Paths) android.Path {
- outputFile := android.PathForModuleOut(ctx, "classes-full-debug.jar")
+ outputFile := android.PathForModuleOut(ctx, "res.jar")
jarArgs := []string{}
- for _, j := range classes {
- deps = append(deps, j.path())
- jarArgs = append(jarArgs, j.jarArgs())
+ for _, j := range resources {
+ deps = append(deps, j.fileList)
+ jarArgs = append(jarArgs, j.soongJarArgs())
}
- operation := "cf"
if manifest.Valid() {
- operation = "cfm"
deps = append(deps, manifest.Path())
+ jarArgs = append(jarArgs, "-m "+manifest.String())
}
ctx.ModuleBuild(pctx, android.ModuleBuildParams{
@@ -223,15 +209,31 @@
Output: outputFile,
Implicits: deps,
Args: map[string]string{
- "jarArgs": strings.Join(jarArgs, " "),
- "operation": operation,
- "manifest": manifest.String(),
+ "jarArgs": strings.Join(jarArgs, " "),
},
})
return outputFile
}
+func TransformJarsToJar(ctx android.ModuleContext, stem string, jars android.Paths) android.Path {
+
+ outputFile := android.PathForModuleOut(ctx, stem)
+
+ if len(jars) == 1 {
+ return jars[0]
+ }
+
+ ctx.ModuleBuild(pctx, android.ModuleBuildParams{
+ Rule: combineJar,
+ Description: "combine jars",
+ Output: outputFile,
+ Inputs: jars,
+ })
+
+ return outputFile
+}
+
func TransformClassesJarToDex(ctx android.ModuleContext, classesJar android.Path,
flags javaBuilderFlags) jarSpec {
@@ -249,7 +251,7 @@
},
})
- return jarSpec{outputFile}
+ return jarSpec{outputFile, outDir}
}
func TransformDexToJavaLib(ctx android.ModuleContext, resources []jarSpec,
@@ -260,12 +262,12 @@
var jarArgs []string
for _, j := range resources {
- deps = append(deps, j.path())
- jarArgs = append(jarArgs, j.jarArgs())
+ deps = append(deps, j.fileList)
+ jarArgs = append(jarArgs, j.soongJarArgs())
}
- deps = append(deps, dexJarSpec.path())
- jarArgs = append(jarArgs, dexJarSpec.jarArgs())
+ deps = append(deps, dexJarSpec.fileList)
+ jarArgs = append(jarArgs, dexJarSpec.soongJarArgs())
ctx.ModuleBuild(pctx, android.ModuleBuildParams{
Rule: jar,
@@ -273,15 +275,14 @@
Output: outputFile,
Implicits: deps,
Args: map[string]string{
- "operation": "cf",
- "jarArgs": strings.Join(jarArgs, " "),
+ "jarArgs": strings.Join(jarArgs, " "),
},
})
return outputFile
}
-func TransformJarJar(ctx android.ModuleContext, classesJar android.Path, rulesFile android.Path) android.Path {
+func TransformJarJar(ctx android.ModuleContext, classesJar android.Path, rulesFile android.Path) android.ModuleOutPath {
outputFile := android.PathForModuleOut(ctx, "classes-jarjar.jar")
ctx.ModuleBuild(pctx, android.ModuleBuildParams{
Rule: jarjar,
@@ -296,41 +297,3 @@
return outputFile
}
-
-func TransformPrebuiltJarToClasses(ctx android.ModuleContext,
- subdir string, prebuilt android.Path) (classJarSpec, resourceJarSpec jarSpec) {
-
- classDir := android.PathForModuleOut(ctx, subdir, "classes")
- classFileList := android.PathForModuleOut(ctx, subdir, "classes.list")
- resourceFileList := android.PathForModuleOut(ctx, subdir, "resources.list")
-
- ctx.ModuleBuild(pctx, android.ModuleBuildParams{
- Rule: extractPrebuilt,
- Description: "extract classes",
- Outputs: android.WritablePaths{classFileList, resourceFileList},
- Input: prebuilt,
- Args: map[string]string{
- "outDir": classDir.String(),
- "classFile": classFileList.String(),
- "resourceFile": resourceFileList.String(),
- },
- })
-
- return jarSpec{classFileList}, jarSpec{resourceFileList}
-}
-
-func TransformFileListToJarSpec(ctx android.ModuleContext, dir, fileListFile android.Path) jarSpec {
- outputFile := android.PathForModuleOut(ctx, fileListFile.Base()+".jarArgs")
-
- ctx.ModuleBuild(pctx, android.ModuleBuildParams{
- Rule: fileListToJarArgs,
- Description: "file list to jar args",
- Output: outputFile,
- Input: fileListFile,
- Args: map[string]string{
- "outDir": dir.String(),
- },
- })
-
- return jarSpec{outputFile}
-}