Add a rule about platform_apis
As sdk_check.mk checks, soong starts to check every app.
If sdk_version is empty, platform_apis must be true.
If sdk_version is not empty, platform_apis must be false.
Test: soong test
Test: m
Bug: 132780927
Change-Id: I7ba702d616404d155f8ac40cd008828663ad1488
diff --git a/java/app.go b/java/app.go
index a679e88..674e5ec 100644
--- a/java/app.go
+++ b/java/app.go
@@ -191,9 +191,12 @@
}
}
+func (a *AndroidTestHelperApp) GenerateAndroidBuildActions(ctx android.ModuleContext) {
+ a.generateAndroidBuildActions(ctx)
+}
+
func (a *AndroidApp) GenerateAndroidBuildActions(ctx android.ModuleContext) {
- a.aapt.useEmbeddedNativeLibs = a.useEmbeddedNativeLibs(ctx)
- a.aapt.useEmbeddedDex = Bool(a.appProperties.Use_embedded_dex)
+ a.checkPlatformAPI(ctx)
a.generateAndroidBuildActions(ctx)
}
@@ -422,6 +425,9 @@
func (a *AndroidApp) generateAndroidBuildActions(ctx android.ModuleContext) {
var apkDeps android.Paths
+ a.aapt.useEmbeddedNativeLibs = a.useEmbeddedNativeLibs(ctx)
+ a.aapt.useEmbeddedDex = Bool(a.appProperties.Use_embedded_dex)
+
// Check if the install APK name needs to be overridden.
a.installApkName = ctx.DeviceConfig().OverridePackageNameFor(a.Name())
@@ -584,8 +590,6 @@
a.additionalAaptFlags = append(a.additionalAaptFlags, "--rename-instrumentation-target-package "+manifestPackageName)
}
}
- a.aapt.useEmbeddedNativeLibs = a.useEmbeddedNativeLibs(ctx)
- a.aapt.useEmbeddedDex = Bool(a.appProperties.Use_embedded_dex)
a.generateAndroidBuildActions(ctx)
a.testConfig = tradefed.AutoGenInstrumentationTestConfig(ctx, a.testProperties.Test_config, a.testProperties.Test_config_template, a.manifestPath, a.testProperties.Test_suites)
diff --git a/java/app_test.go b/java/app_test.go
index 32de019..f6a307e 100644
--- a/java/app_test.go
+++ b/java/app_test.go
@@ -72,6 +72,7 @@
ctx := testApp(t, moduleType+` {
name: "foo",
srcs: ["a.java"],
+ sdk_version: "current"
}
`)
@@ -117,6 +118,7 @@
name: "foo",
srcs: ["a.java"],
package_splits: ["v4", "v7,hdpi"],
+ sdk_version: "current"
}`)
foo := ctx.ModuleForTests("foo", "android_common")
@@ -139,6 +141,40 @@
}
}
+func TestPlatformAPIs(t *testing.T) {
+ testJava(t, `
+ android_app {
+ name: "foo",
+ srcs: ["a.java"],
+ platform_apis: true,
+ }
+ `)
+
+ testJava(t, `
+ android_app {
+ name: "foo",
+ srcs: ["a.java"],
+ sdk_version: "current",
+ }
+ `)
+
+ testJavaError(t, "platform_apis must be true when sdk_version is empty.", `
+ android_app {
+ name: "bar",
+ srcs: ["b.java"],
+ }
+ `)
+
+ testJavaError(t, "platform_apis must be false when sdk_version is not empty.", `
+ android_app {
+ name: "bar",
+ srcs: ["b.java"],
+ sdk_version: "system_current",
+ platform_apis: true,
+ }
+ `)
+}
+
func TestResourceDirs(t *testing.T) {
testCases := []struct {
name string
@@ -169,6 +205,7 @@
bp := `
android_app {
name: "foo",
+ sdk_version: "current",
%s
}
`
@@ -349,12 +386,14 @@
bp := `
android_app {
name: "foo",
+ sdk_version: "current",
resource_dirs: ["foo/res"],
static_libs: ["lib", "lib3"],
}
android_app {
name: "bar",
+ sdk_version: "current",
resource_dirs: ["bar/res"],
}
@@ -461,6 +500,7 @@
platformSdkCodename string
platformSdkFinal bool
expectedMinSdkVersion string
+ platformApis bool
}{
{
name: "current final SDK",
@@ -481,6 +521,7 @@
{
name: "default final SDK",
sdkVersion: "",
+ platformApis: true,
platformSdkInt: 27,
platformSdkCodename: "REL",
platformSdkFinal: true,
@@ -489,6 +530,7 @@
{
name: "default non-final SDK",
sdkVersion: "",
+ platformApis: true,
platformSdkInt: 27,
platformSdkCodename: "OMR1",
platformSdkFinal: false,
@@ -504,11 +546,16 @@
for _, moduleType := range []string{"android_app", "android_library"} {
for _, test := range testCases {
t.Run(moduleType+" "+test.name, func(t *testing.T) {
+ platformApiProp := ""
+ if test.platformApis {
+ platformApiProp = "platform_apis: true,"
+ }
bp := fmt.Sprintf(`%s {
name: "foo",
srcs: ["a.java"],
sdk_version: "%s",
- }`, moduleType, test.sdkVersion)
+ %s
+ }`, moduleType, test.sdkVersion, platformApiProp)
config := testConfig(nil)
config.TestProductVariables.Platform_sdk_version = &test.platformSdkInt
@@ -630,18 +677,21 @@
android_app {
name: "app",
jni_libs: ["libjni"],
+ sdk_version: "current",
}
android_app {
name: "app_noembed",
jni_libs: ["libjni"],
use_embedded_native_libs: false,
+ sdk_version: "current",
}
android_app {
name: "app_embed",
jni_libs: ["libjni"],
use_embedded_native_libs: true,
+ sdk_version: "current",
}
android_test {
@@ -715,6 +765,7 @@
android_app {
name: "foo",
srcs: ["a.java"],
+ sdk_version: "current",
}
`,
certificateOverride: "",
@@ -726,7 +777,8 @@
android_app {
name: "foo",
srcs: ["a.java"],
- certificate: ":new_certificate"
+ certificate: ":new_certificate",
+ sdk_version: "current",
}
android_app_certificate {
@@ -743,7 +795,8 @@
android_app {
name: "foo",
srcs: ["a.java"],
- certificate: "expiredkey"
+ certificate: "expiredkey",
+ sdk_version: "current",
}
`,
certificateOverride: "",
@@ -755,7 +808,8 @@
android_app {
name: "foo",
srcs: ["a.java"],
- certificate: "expiredkey"
+ certificate: "expiredkey",
+ sdk_version: "current",
}
android_app_certificate {
@@ -801,6 +855,7 @@
android_app {
name: "foo",
srcs: ["a.java"],
+ sdk_version: "current",
}
`,
packageNameOverride: "",
@@ -815,6 +870,7 @@
android_app {
name: "foo",
srcs: ["a.java"],
+ sdk_version: "current",
}
`,
packageNameOverride: "foo:bar",
@@ -856,11 +912,13 @@
android_app {
name: "foo",
srcs: ["a.java"],
+ sdk_version: "current",
}
android_test {
name: "bar",
instrumentation_for: "foo",
+ sdk_version: "current",
}
`
config := testConfig(nil)
@@ -885,6 +943,7 @@
srcs: ["a.java"],
certificate: "expiredkey",
overrides: ["qux"],
+ sdk_version: "current",
}
override_android_app {
@@ -984,6 +1043,7 @@
android_app {
name: "foo",
srcs: ["a.java"],
+ sdk_version: "current",
}
override_android_app {
@@ -1253,18 +1313,21 @@
name: "foo",
srcs: ["a.java"],
api_packages: ["foo"],
+ sdk_version: "current",
}
java_sdk_library {
name: "bar",
srcs: ["a.java"],
api_packages: ["bar"],
+ sdk_version: "current",
}
android_app {
name: "app",
srcs: ["a.java"],
uses_libs: ["foo"],
+ sdk_version: "current",
optional_uses_libs: [
"bar",
"baz",
@@ -1339,6 +1402,7 @@
android_app {
name: "foo",
srcs: ["a.java"],
+ sdk_version: "current",
}
`,
noCode: false,
@@ -1348,6 +1412,7 @@
bp: `
android_app {
name: "foo",
+ sdk_version: "current",
}
`,
noCode: true,
@@ -1358,11 +1423,13 @@
android_app {
name: "foo",
static_libs: ["lib"],
+ sdk_version: "current",
}
java_library {
name: "lib",
srcs: ["a.java"],
+ sdk_version: "current",
}
`,
noCode: false,
@@ -1373,10 +1440,12 @@
android_app {
name: "foo",
static_libs: ["lib"],
+ sdk_version: "current",
}
java_library {
name: "lib",
+ sdk_version: "current",
}
`,
// TODO(jungjw): this should probably be true
@@ -1406,6 +1475,7 @@
jni_libs: ["libjni"],
notice: "APP_NOTICE",
embed_notices: true,
+ sdk_version: "current",
}
// No embed_notice flag
@@ -1414,6 +1484,7 @@
srcs: ["a.java"],
jni_libs: ["libjni"],
notice: "APP_NOTICE",
+ sdk_version: "current",
}
// No NOTICE files
@@ -1421,6 +1492,7 @@
name: "baz",
srcs: ["a.java"],
embed_notices: true,
+ sdk_version: "current",
}
cc_library {
@@ -1435,6 +1507,7 @@
srcs: [
":gen",
],
+ sdk_version: "current",
}
genrule {
@@ -1510,6 +1583,7 @@
android_app {
name: "foo",
srcs: ["a.java"],
+ sdk_version: "current",
}
`,
uncompressedPlatform: true,
@@ -1522,6 +1596,7 @@
name: "foo",
use_embedded_dex: true,
srcs: ["a.java"],
+ sdk_version: "current",
}
`,
uncompressedPlatform: true,
@@ -1534,6 +1609,7 @@
name: "foo",
privileged: true,
srcs: ["a.java"],
+ sdk_version: "current",
}
`,
uncompressedPlatform: true,
diff --git a/java/dexpreopt_test.go b/java/dexpreopt_test.go
index 22b7bb9..5550a4c 100644
--- a/java/dexpreopt_test.go
+++ b/java/dexpreopt_test.go
@@ -30,6 +30,7 @@
android_app {
name: "foo",
srcs: ["a.java"],
+ sdk_version: "current",
}`,
enabled: true,
},
@@ -57,6 +58,7 @@
bp: `
android_app {
name: "foo",
+ sdk_version: "current",
}`,
enabled: false,
},
@@ -66,11 +68,13 @@
android_app {
name: "foo",
static_libs: ["lib"],
+ sdk_version: "current",
}
java_library {
name: "lib",
srcs: ["a.java"],
+ sdk_version: "current",
}`,
enabled: true,
},
diff --git a/java/java.go b/java/java.go
index 5f4a090..ecafa1e 100644
--- a/java/java.go
+++ b/java/java.go
@@ -52,6 +52,20 @@
android.RegisterSingletonType("logtags", LogtagsSingleton)
}
+func (j *Module) checkPlatformAPI(ctx android.ModuleContext) {
+ if sc, ok := ctx.Module().(sdkContext); ok {
+ usePlatformAPI := proptools.Bool(j.deviceProperties.Platform_apis)
+ if usePlatformAPI != (sc.sdkVersion() == "") {
+ if usePlatformAPI {
+ ctx.PropertyErrorf("platform_apis", "platform_apis must be false when sdk_version is not empty.")
+ } else {
+ ctx.PropertyErrorf("platform_apis", "platform_apis must be true when sdk_version is empty.")
+ }
+ }
+
+ }
+}
+
// TODO:
// Autogenerated files:
// Renderscript
@@ -178,8 +192,8 @@
// list of module-specific flags that will be used for dex compiles
Dxflags []string `android:"arch_variant"`
- // if not blank, set to the version of the sdk to compile against. Defaults to compiling against the current
- // sdk if platform_apis is not set.
+ // if not blank, set to the version of the sdk to compile against.
+ // Defaults to compiling against the current platform.
Sdk_version *string
// if not blank, set the minimum version of the sdk that the compiled artifacts will run against.
@@ -190,7 +204,8 @@
// Defaults to sdk_version if not set.
Target_sdk_version *string
- // if true, compile against the platform APIs instead of an SDK.
+ // It must be true only if sdk_version is empty.
+ // This field works in only android_app, otherwise nothing happens.
Platform_apis *bool
Aidl struct {
diff --git a/java/java_test.go b/java/java_test.go
index f95f88b..81d1f2c 100644
--- a/java/java_test.go
+++ b/java/java_test.go
@@ -222,6 +222,29 @@
android.FailIfErrored(t, errs)
}
+func testJavaError(t *testing.T, pattern string, bp string) {
+ t.Helper()
+ config := testConfig(nil)
+ ctx := testContext(bp, nil)
+
+ pathCtx := android.PathContextForTesting(config, nil)
+ setDexpreoptTestGlobalConfig(config, dexpreopt.GlobalConfigForTests(pathCtx))
+
+ ctx.Register()
+ _, errs := ctx.ParseBlueprintsFiles("Android.bp")
+ if len(errs) > 0 {
+ android.FailIfNoMatchingErrors(t, pattern, errs)
+ return
+ }
+ _, errs = ctx.PrepareBuildActions(config)
+ if len(errs) > 0 {
+ android.FailIfNoMatchingErrors(t, pattern, errs)
+ return
+ }
+
+ t.Fatalf("missing expected error %q (0 errors are returned)", pattern)
+}
+
func testJava(t *testing.T, bp string) (*android.TestContext, android.Config) {
t.Helper()
config := testConfig(nil)