IDEA-94168 error message if launching debug on real device with "debuggable" attribute set to false

This commit is contained in:
Eugene Kudelevsky
2012-12-14 21:05:50 +04:00
parent 0152a4042c
commit dc9ddba2e0
2 changed files with 20 additions and 2 deletions
@@ -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<AndroidDebugBridge>() {
@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;
}
@@ -134,6 +134,7 @@ public class AndroidRunningState implements RunProfileState, AndroidDebugBridge.
private final boolean mySupportMultipleDevices;
private final boolean myClearLogcatBeforeStart;
private final List<AndroidRunningStateListener> myListeners = new ArrayList<AndroidRunningStateListener>();
private final boolean myNonDebuggableOnDevice;
public void setDebugMode(boolean debugMode) {
myDebugMode = debugMode;
@@ -305,7 +306,8 @@ public class AndroidRunningState implements RunProfileState, AndroidDebugBridge.
Map<AndroidFacet, String> 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;