Android调试器隐藏了本地变量

时间:2013-11-28 16:46:10

标签: java android debugging undefined-behavior

执行以下代码时,我使用Android的调试器有一种奇怪的行为。变量 value 在窗口小部件初始化后立即消失。我把它移到了手表上,但它说"Cannot find local variable value"。无论我在何处放置变量,在for循环之前或内部,无论如何都行为相同。我也打印了变量,你可以在代码中看到"value is null"但是当我通过if (value == null)检查它时它不会停止并最终在尝试将其转换为整数时抛出错误。 / p>

代码:

    for (int i=0; i < (view != null ? ((ViewGroup)view).getChildCount() : 0); i++)
    {
        // Get name of the widget for example field__id,
        // Convert to field name replacing field__id for id
        // or for example field_name to name
        // Check if the field exists in the column name, if so, add the ContentValue
        View widget = ((ViewGroup)view).getChildAt(i);
        String widgetName = view.getResources().getResourceEntryName(widget.getId());
        String fieldName = widgetName.replace(Model.fieldPrefix,"");
        Object value = null;

        if (columnNames.contains(fieldName)) {
            // TableField on the table matches the field on the form
            try {
                if (widget instanceof TextView) {
                    value = ((TextView) widget).getText().toString();
                } else if (widget instanceof Spinner) {
                    value = ((SpinnerRow) ((Spinner) widget).getSelectedItem()).getId();
                } else if (widget instanceof DatePicker) {
                    String date = AppDatabase.formatDateTime( getContext(), ((DatePicker) widget).getYear() + "-" + ((DatePicker) widget).getMonth() + "-" + ((DatePicker) widget).getDayOfMonth());
                    contentValues.put(fieldName, date ) ;
                } else {
                    throw new ClassCastException("Could not cast the widget"+widget.getClass().toString());
                }
                Log.d(AppController.DEBUG_TAG, "Widget "+widgetName+" value is " + value.toString());

            } catch (NullPointerException e) {
                // Ignore exception:
                value = null;
            }

            TableField tableField = this.getTable().getFieldByName(fieldName);

            if ( (tableField.isPrimaryKey() && (value.equals("-1") || value.equals("")))
                    || !tableField.getNotNull() && value.toString().length()==0  )
                value = null;

            if ( value == null || tableField.getType() == SQLiteCursor.FIELD_TYPE_NULL ) {
                contentValues.putNull(fieldName);
            } else  if (tableField.getType() == SQLiteCursor.FIELD_TYPE_STRING || tableField.getType() == SQLiteCursor.FIELD_TYPE_VARCHAR) {
                contentValues.put(fieldName, String.valueOf(value));
            } else if (tableField.getType() == SQLiteCursor.FIELD_TYPE_INTEGER) {
                contentValues.put(fieldName, Integer.valueOf(value.toString()) );
            } else if (tableField.getType() == SQLiteCursor.FIELD_TYPE_FLOAT) {
                contentValues.put(fieldName,Float.valueOf(value.toString()));
            } else if (tableField.getType() == SQLiteCursor.FIELD_TYPE_BLOB) {
                contentValues.put(fieldName,String.valueOf(value));
            }

        }

    }

7 个答案:

答案 0 :(得分:13)

你是否使用带有混淆的proguard?

如果是,那可能是问题 - 用

禁用它
-dontobfuscate

你应该用proguard规则放入你的文件(通常是proguard-rules.txt,检查build.gradle文件中的proguard配置,如下例所示:

buildTypes {
        debug {
            runProguard true
            zipAlign true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
            signingConfig signingConfigs.debug
            testCoverageEnabled true
        }
}

答案 1 :(得分:8)

我遇到了同样的问题。最后,通过删除&#39; testCoverageEnabled true&#39;来自gradle构建文件。

答案 2 :(得分:6)

由gradle version 1.0.0中的错误导致的类似问题已在以后version 1.0.1

中解决

在您的项目中搜索'com.android.tools.build:gradle:1.0.0'文件中的build.gradle。如果包含模块,则可能有多个build.gradle文件。

只要你有:

  

'com.android.tools.build:gradle:1.0.0'

将其更改为:

  

'com.android.tools.build:gradle:1.0.1'

然后同步gradle。 Android Studio将下载新的gradle jar文件并使用它进行编译。

答案 3 :(得分:2)

如果您的构建使用jack toolchain,则可能是问题的根源。就我而言,禁用插孔解决了这个问题:

buildTypes {
...
    debug {
        jackOptions {
            enabled false
        }
    }
}

注意:1.8源兼容性需要插孔!

答案 4 :(得分:0)

这对我有用。 与Proguard一起使用时,Android studio无法显示本地变量数据。

需要在调试期间使用以下设置:

1

在proguard-rules.pro文件下添加-donotobfuscate属性, -dontobfuscate OR

2

在build.grade中的debug buildtypes下, minifyEnabled false shrinkResources false

更推荐后期选项,因为你需要压缩你的生产apk。

buildTypes {
    debug {
        applicationIdSuffix '.debug'
        versionNameSuffix '-DEBUG'
        minifyEnabled false
        shrinkResources false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    release {
        minifyEnabled true
        shrinkResources true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.release
    }
}

答案 5 :(得分:0)

有类似的问题。这是Android Studio中使用的Kotlin与应用级build.gradle文件中声明的Kotlin版本不匹配(可能是在Android Studio更新之后)。颠覆build.gradle中的版本很有帮助。

答案 6 :(得分:-1)

嗯...就我而言,我只是重建项目来修复它!