From 927d6de11fa038ee78bb90933eee3ebc20b68751 Mon Sep 17 00:00:00 2001 From: David Brazdil Date: Wed, 24 Jan 2018 19:54:30 +0000 Subject: [PATCH] Show a warning toast/dialog when an app uses hidden APIs Check VMRuntime.hasUsedHiddenApi() on each Activity start and show a toast/dialog urging the user to check logcat. Test: manual Bug: 64382372 Change-Id: Ida8a6ed9ab9b56a76882501b2a3473a5f1448cb3 --- core/java/android/app/Activity.java | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index dbdb81c7c666c..2e7a0ed86fdb2 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -128,6 +128,8 @@ import com.android.internal.app.WindowDecorActionBar; import com.android.internal.policy.DecorView; import com.android.internal.policy.PhoneWindow; +import dalvik.system.VMRuntime; + import java.io.FileDescriptor; import java.io.PrintWriter; import java.lang.annotation.Retention; @@ -7039,11 +7041,12 @@ public class Activity extends ContextThemeWrapper mFragments.dispatchStart(); mFragments.reportLoaderStart(); - // This property is set for all builds except final release - boolean isDlwarningEnabled = SystemProperties.getInt("ro.bionic.ld.warning", 0) == 1; boolean isAppDebuggable = (mApplication.getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0; + // This property is set for all builds except final release + boolean isDlwarningEnabled = SystemProperties.getInt("ro.bionic.ld.warning", 0) == 1; + if (isAppDebuggable || isDlwarningEnabled) { String dlwarning = getDlWarning(); if (dlwarning != null) { @@ -7064,6 +7067,28 @@ public class Activity extends ContextThemeWrapper } } + // We might disable this for final builds. + boolean isApiWarningEnabled = true; + + if (isAppDebuggable || isApiWarningEnabled) { + if (VMRuntime.getRuntime().hasUsedHiddenApi()) { + String appName = getApplicationInfo().loadLabel(getPackageManager()) + .toString(); + String warning = "Detected problems with API compatiblity\n" + + "(please consult log for detail)"; + if (isAppDebuggable) { + new AlertDialog.Builder(this) + .setTitle(appName) + .setMessage(warning) + .setPositiveButton(android.R.string.ok, null) + .setCancelable(false) + .show(); + } else { + Toast.makeText(this, appName + "\n" + warning, Toast.LENGTH_LONG).show(); + } + } + } + mActivityTransitionState.enterReady(this); }