From 1c93c299fb0036b823e821237a8e52febe82679a 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 Merged-In: I76b9b45fb5773bc4dfc10520108f4f3578723909 --- apex/apex_test.go | 6 ++++-- java/app.go | 21 +++++++++++++++++---- java/app_test.go | 2 ++ 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/apex/apex_test.go b/apex/apex_test.go index 350579ea9..056153f78 100644 --- a/apex/apex_test.go +++ b/apex/apex_test.go @@ -3323,18 +3323,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" ], } diff --git a/java/app.go b/java/app.go index 0ec2502ba..d93765407 100755 --- a/java/app.go +++ b/java/app.go @@ -542,7 +542,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() { @@ -592,7 +592,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) @@ -614,6 +615,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), @@ -1133,7 +1146,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 @@ -1405,7 +1418,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, nil) diff --git a/java/app_test.go b/java/app_test.go index 39460dce6..388014f46 100644 --- a/java/app_test.go +++ b/java/app_test.go @@ -1005,6 +1005,7 @@ func TestJNIPackaging(t *testing.T) { name: "libjni", system_shared_libs: [], stl: "none", + sdk_version: "current", } android_app { @@ -2274,6 +2275,7 @@ func TestEmbedNotice(t *testing.T) { system_shared_libs: [], stl: "none", notice: "LIB_NOTICE", + sdk_version: "current", } java_library {