Generate a default wrapper for device java_binary
Any device java_binary that doesn't have a specific wrapper must have a main_class property, which is used to generate its default wrapper. Otherwise its build should fail. Bug: 250851599 Test: TestDeviceBinaryWrapperGeneration in java_test.go Change-Id: Ice4c580bcfc1b92f95e217b39e984c55d25a3a02
This commit is contained in:
@@ -63,6 +63,7 @@ func TestDexpreoptEnabled(t *testing.T) {
|
|||||||
java_binary {
|
java_binary {
|
||||||
name: "foo",
|
name: "foo",
|
||||||
srcs: ["a.java"],
|
srcs: ["a.java"],
|
||||||
|
main_class: "foo.bar.jb",
|
||||||
}`,
|
}`,
|
||||||
enabled: true,
|
enabled: true,
|
||||||
},
|
},
|
||||||
|
34
java/java.go
34
java/java.go
@@ -211,6 +211,14 @@ var (
|
|||||||
PropertyName: "java_tests",
|
PropertyName: "java_tests",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Rule for generating device binary default wrapper
|
||||||
|
deviceBinaryWrapper = pctx.StaticRule("deviceBinaryWrapper", blueprint.RuleParams{
|
||||||
|
Command: `echo -e '#!/system/bin/sh\n` +
|
||||||
|
`export CLASSPATH=/system/framework/$jar_name\n` +
|
||||||
|
`exec app_process /$partition/bin $main_class "$$@"'> ${out}`,
|
||||||
|
Description: "Generating device binary wrapper ${jar_name}",
|
||||||
|
}, "jar_name", "partition", "main_class")
|
||||||
)
|
)
|
||||||
|
|
||||||
// JavaInfo contains information about a java module for use by modules that depend on it.
|
// JavaInfo contains information about a java module for use by modules that depend on it.
|
||||||
@@ -1398,7 +1406,31 @@ func (j *Binary) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
|||||||
ctx.PropertyErrorf("wrapper", "wrapper is required for Windows")
|
ctx.PropertyErrorf("wrapper", "wrapper is required for Windows")
|
||||||
}
|
}
|
||||||
|
|
||||||
j.wrapperFile = android.PathForSource(ctx, "build/soong/scripts/jar-wrapper.sh")
|
if ctx.Device() {
|
||||||
|
// device binary should have a main_class property if it does not
|
||||||
|
// have a specific wrapper, so that a default wrapper can
|
||||||
|
// be generated for it.
|
||||||
|
if j.binaryProperties.Main_class == nil {
|
||||||
|
ctx.PropertyErrorf("main_class", "main_class property "+
|
||||||
|
"is required for device binary if no default wrapper is assigned")
|
||||||
|
} else {
|
||||||
|
wrapper := android.PathForModuleOut(ctx, ctx.ModuleName()+".sh")
|
||||||
|
jarName := j.Stem() + ".jar"
|
||||||
|
partition := j.PartitionTag(ctx.DeviceConfig())
|
||||||
|
ctx.Build(pctx, android.BuildParams{
|
||||||
|
Rule: deviceBinaryWrapper,
|
||||||
|
Output: wrapper,
|
||||||
|
Args: map[string]string{
|
||||||
|
"jar_name": jarName,
|
||||||
|
"partition": partition,
|
||||||
|
"main_class": String(j.binaryProperties.Main_class),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
j.wrapperFile = wrapper
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
j.wrapperFile = android.PathForSource(ctx, "build/soong/scripts/jar-wrapper.sh")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ext := ""
|
ext := ""
|
||||||
|
@@ -1783,3 +1783,26 @@ func TestGenAidlIncludeFlagsForMixedBuilds(t *testing.T) {
|
|||||||
t.Errorf("expected flags to be %q; was %q", expectedFlags, flags)
|
t.Errorf("expected flags to be %q; was %q", expectedFlags, flags)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestDeviceBinaryWrapperGeneration(t *testing.T) {
|
||||||
|
// Scenario 1: java_binary has main_class property in its bp
|
||||||
|
ctx, _ := testJava(t, `
|
||||||
|
java_binary {
|
||||||
|
name: "foo",
|
||||||
|
srcs: ["foo.java"],
|
||||||
|
main_class: "foo.bar.jb",
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
wrapperPath := fmt.Sprint(ctx.ModuleForTests("foo", "android_arm64_armv8-a").AllOutputs())
|
||||||
|
if !strings.Contains(wrapperPath, "foo.sh") {
|
||||||
|
t.Errorf("wrapper file foo.sh is not generated")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scenario 2: java_binary has neither wrapper nor main_class, its build
|
||||||
|
// is expected to be failed.
|
||||||
|
testJavaError(t, "main_class property is required for device binary if no default wrapper is assigned", `
|
||||||
|
java_binary {
|
||||||
|
name: "foo",
|
||||||
|
srcs: ["foo.java"],
|
||||||
|
}`)
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user