From dc9ddba2e0ee348aa49d986072e3b97893a296d8 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Fri, 14 Dec 2012 21:01:21 +0400 Subject: [PATCH] IDEA-94168 error message if launching debug on real device with "debuggable" attribute set to false --- .../android/run/AndroidRunConfigurationBase.java | 11 ++++++++++- .../jetbrains/android/run/AndroidRunningState.java | 11 ++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/plugins/android/src/org/jetbrains/android/run/AndroidRunConfigurationBase.java b/plugins/android/src/org/jetbrains/android/run/AndroidRunConfigurationBase.java index 368d997b67a4..7bf4f34bf843 100644 --- a/plugins/android/src/org/jetbrains/android/run/AndroidRunConfigurationBase.java +++ b/plugins/android/src/org/jetbrains/android/run/AndroidRunConfigurationBase.java @@ -46,6 +46,7 @@ import com.intellij.util.PsiNavigateUtil; import com.intellij.util.containers.HashMap; import com.intellij.util.xml.GenericAttributeValue; import org.jdom.Element; +import org.jetbrains.android.dom.manifest.Application; import org.jetbrains.android.dom.manifest.Manifest; import org.jetbrains.android.facet.AndroidFacet; import org.jetbrains.android.facet.AndroidFacetConfiguration; @@ -196,7 +197,15 @@ public abstract class AndroidRunConfigurationBase extends ModuleBasedConfigurati } boolean debug = DefaultDebugExecutor.EXECUTOR_ID.equals(executor.getId()); + boolean nonDebuggableOnDevice = false; + if (debug) { + final Manifest manifest = facet.getManifest(); + final Application application = manifest != null ? manifest.getApplication() : null; + + nonDebuggableOnDevice = application != null && Boolean.FALSE.toString(). + equals(application.getDebuggable().getStringValue()); + if (!AndroidSdkUtils.activateDdmsIfNecessary(facet.getModule().getProject(), new Computable() { @Nullable @Override @@ -236,7 +245,7 @@ public abstract class AndroidRunConfigurationBase extends ModuleBasedConfigurati if (applicationLauncher != null) { final boolean supportMultipleDevices = supportMultipleDevices() && executor.getId().equals(DefaultRunExecutor.EXECUTOR_ID); return new AndroidRunningState(env, facet, targetChooser, computeCommandLine(), aPackage, applicationLauncher, - depModule2PackageName, supportMultipleDevices, CLEAR_LOGCAT, this); + depModule2PackageName, supportMultipleDevices, CLEAR_LOGCAT, this, nonDebuggableOnDevice); } return null; } diff --git a/plugins/android/src/org/jetbrains/android/run/AndroidRunningState.java b/plugins/android/src/org/jetbrains/android/run/AndroidRunningState.java index 44650110a63a..4db66b154f17 100644 --- a/plugins/android/src/org/jetbrains/android/run/AndroidRunningState.java +++ b/plugins/android/src/org/jetbrains/android/run/AndroidRunningState.java @@ -134,6 +134,7 @@ public class AndroidRunningState implements RunProfileState, AndroidDebugBridge. private final boolean mySupportMultipleDevices; private final boolean myClearLogcatBeforeStart; private final List myListeners = new ArrayList(); + private final boolean myNonDebuggableOnDevice; public void setDebugMode(boolean debugMode) { myDebugMode = debugMode; @@ -305,7 +306,8 @@ public class AndroidRunningState implements RunProfileState, AndroidDebugBridge. Map additionalFacet2PackageName, boolean supportMultipleDevices, boolean clearLogcatBeforeStart, - @NotNull AndroidRunConfigurationBase configuration) throws ExecutionException { + @NotNull AndroidRunConfigurationBase configuration, + boolean nonDebuggableOnDevice) throws ExecutionException { myFacet = facet; myCommandLine = commandLine; myConfiguration = configuration; @@ -323,6 +325,7 @@ public class AndroidRunningState implements RunProfileState, AndroidDebugBridge. myTargetPackageName = packageName; myAdditionalFacet2PackageName = additionalFacet2PackageName; myClearLogcatBeforeStart = clearLogcatBeforeStart; + myNonDebuggableOnDevice = nonDebuggableOnDevice; } public void setDeploy(boolean deploy) { @@ -633,6 +636,12 @@ public class AndroidRunningState implements RunProfileState, AndroidDebugBridge. } private boolean prepareAndStartApp(IDevice device) { + if (myDebugMode && myNonDebuggableOnDevice && !device.isEmulator()) { + message("Cannot debug the application " + myPackageName + " on device '" + device.getName() + "',\n" + + "because 'debuggable' attribute is set to 'false' in AndroidManifest.xml.\nYou may remove the attribute " + + "and the IDE will automatically assign it during debug and release builds.", STDERR); + return false; + } if (!doPrepareAndStart(device)) { fireExecutionFailed(); return false;