From 094cde443044fabae12a3b6fb695e0f6ef1ba2e9 Mon Sep 17 00:00:00 2001 From: Colin Cross Date: Sat, 15 Feb 2020 10:38:00 -0800 Subject: [PATCH] Require apps built against the SDK to use JNI built against the NDK Apps that expect to run on older platforms should use JNI libraries that will also run on older platforms. Require that apps that set sdk_version have jni_libs modules that also set sdk_version, or set jni_uses_platform_apis: true to bypass the check. Fixes: 149591057 Test: app_test.go Change-Id: I76b9b45fb5773bc4dfc10520108f4f3578723909 --- apex/apex_test.go | 7 +++++-- java/app.go | 21 +++++++++++++++++---- java/app_test.go | 2 ++ 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/apex/apex_test.go b/apex/apex_test.go index 7361fc6d3..86b49327c 100644 --- a/apex/apex_test.go +++ b/apex/apex_test.go @@ -2871,18 +2871,20 @@ func TestApexWithApps(t *testing.T) { android_app { name: "AppFoo", srcs: ["foo/bar/MyClass.java"], - sdk_version: "none", + sdk_version: "current", system_modules: "none", jni_libs: ["libjni"], + stl: "none", apex_available: [ "myapex" ], } android_app { name: "AppFooPriv", srcs: ["foo/bar/MyClass.java"], - sdk_version: "none", + sdk_version: "current", system_modules: "none", privileged: true, + stl: "none", apex_available: [ "myapex" ], } @@ -2892,6 +2894,7 @@ func TestApexWithApps(t *testing.T) { stl: "none", system_shared_libs: [], apex_available: [ "myapex" ], + sdk_version: "current", } `) diff --git a/java/app.go b/java/app.go index bcf08a775..0745bf06b 100755 --- a/java/app.go +++ b/java/app.go @@ -491,7 +491,7 @@ func (a *AndroidApp) generateAndroidBuildActions(ctx android.ModuleContext) { dexJarFile := a.dexBuildActions(ctx) - jniLibs, certificateDeps := collectAppDeps(ctx, a.shouldEmbedJnis(ctx)) + jniLibs, certificateDeps := collectAppDeps(ctx, a.shouldEmbedJnis(ctx), !Bool(a.appProperties.Jni_uses_platform_apis)) jniJarFile := a.jniBuildActions(jniLibs, ctx) if ctx.Failed() { @@ -527,7 +527,8 @@ func (a *AndroidApp) generateAndroidBuildActions(ctx android.ModuleContext) { } } -func collectAppDeps(ctx android.ModuleContext, shouldCollectRecursiveNativeDeps bool) ([]jniLib, []Certificate) { +func collectAppDeps(ctx android.ModuleContext, shouldCollectRecursiveNativeDeps bool, + checkNativeSdkVersion bool) ([]jniLib, []Certificate) { var jniLibs []jniLib var certificates []Certificate seenModulePaths := make(map[string]bool) @@ -549,6 +550,18 @@ func collectAppDeps(ctx android.ModuleContext, shouldCollectRecursiveNativeDeps } seenModulePaths[path.String()] = true + if checkNativeSdkVersion { + if app, ok := ctx.Module().(interface{ sdkVersion() sdkSpec }); ok { + if app.sdkVersion().specified() && + app.sdkVersion().kind != sdkCorePlatform && + dep.SdkVersion() == "" { + ctx.PropertyErrorf("jni_libs", + "JNI dependency %q uses platform APIs, but this module does not", + otherName) + } + } + } + if lib.Valid() { jniLibs = append(jniLibs, jniLib{ name: ctx.OtherModuleName(module), @@ -1045,7 +1058,7 @@ func (a *AndroidAppImport) generateAndroidBuildActions(ctx android.ModuleContext ctx.ModuleErrorf("One and only one of certficate, presigned, and default_dev_cert properties must be set") } - _, certificates := collectAppDeps(ctx, false) + _, certificates := collectAppDeps(ctx, false, false) // TODO: LOCAL_EXTRACT_APK/LOCAL_EXTRACT_DPI_APK // TODO: LOCAL_PACKAGE_SPLITS @@ -1300,7 +1313,7 @@ func (r *RuntimeResourceOverlay) GenerateAndroidBuildActions(ctx android.ModuleC r.aapt.buildActions(ctx, r, "--no-resource-deduping", "--no-resource-removal") // Sign the built package - _, certificates := collectAppDeps(ctx, false) + _, certificates := collectAppDeps(ctx, false, false) certificates = processMainCert(r.ModuleBase, String(r.properties.Certificate), certificates, ctx) signed := android.PathForModuleOut(ctx, "signed", r.Name()+".apk") SignAppPackage(ctx, signed, r.aapt.exportPackage, certificates) diff --git a/java/app_test.go b/java/app_test.go index dfd85711b..0c6da7a47 100644 --- a/java/app_test.go +++ b/java/app_test.go @@ -903,6 +903,7 @@ func TestJNIPackaging(t *testing.T) { name: "libjni", system_shared_libs: [], stl: "none", + sdk_version: "current", } android_app { @@ -2112,6 +2113,7 @@ func TestEmbedNotice(t *testing.T) { system_shared_libs: [], stl: "none", notice: "LIB_NOTICE", + sdk_version: "current", } java_library {