Подтвердить что ты не робот

Отладчик Android скрывает локальную переменную

У меня странное поведение с использованием отладчика Android при выполнении следующего кода. Значение переменной исчезает сразу после инициализации виджета. Я перевел его на часы, но он говорит "Cannot find local variable value". Неважно, где я помещаю переменную, перед циклом for или внутри, он ведет себя одинаково независимо от того, что. Я также напечатал переменную, как вы можете видеть в коде, и она говорит "value is null", но когда я проверяю ее на if (value == null), она не останавливается и, наконец, выдает ошибку при попытке передать ее целому числу.

Код:

    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));
            }

        }

    }
4b9b3361

Ответ 1

Используете ли вы proguard с обфускацией?

Если да, это может быть проблема - отключите его с помощью

-dontobfuscate

который вы должны поместить в свой файл с помощью правил proguard (обычно proguard-rules.txt, проверьте конфигурацию proguard в файле build.gradle, как в примере ниже:

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

Ответ 2

У меня была та же проблема. Наконец, разрешено удалением 'testCoverageEnabled true' из файла сборки gradle.

Ответ 3

Аналогичная проблема, вызванная ошибкой в ​​ 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 загрузит новый jar файл gradle и скомпилирует его.

Ответ 4

Имея ту же проблему: Cannot find local variable '[variable_name]', и единственное различие заключается в том, что мое приложение полностью отлаживается, в то время как проблема возникает с кодом библиотеки.

У меня minifyEnabled false для debug buildTypes в библиотеке и приложении. И во время отладки, Build Variant являются debug для обоих модулей. Даже сгенерированное значение BuildConfig.java имеет правильное значение:

public static final boolean DEBUG = Boolean.parseBoolean("true");

Причина

Gradle не распространяется тип сборки (отладка или выпуск) приложения в зависимую библиотеку. Он всегда использует release сборку библиотеки независимо от того, какой тип сборки выбран в приложении (зависимость библиотеки указана как compile project(':library') в приложении build.gradle).

Решение

build.gradle в библиотеке модуль

android {
    defaultConfig {
        defaultPublishConfig 'release'
        publishNonDefault true
    }
}

build.gradle в приложении модуль

dependencies {
    debugCompile project(path: ':library', configuration: "debug")
    releaseCompile project(path: ':library', configuration: "release")
}

вместо выполнения:

compile project(':library')

снимок экрана

Ответ 5

Если ваша сборка использует jack toolchain, это может стать источником проблемы. В моем случае, отключение гнезда решает проблему:

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

Примечание. Для совместимости с исходным кодом 1.8 требуется гнездо!

Ответ 6

Это то, что сработало для меня. Студия Android не может отображать локальные переменные при использовании с Proguard.

При отладке необходимо использовать следующие настройки:

1.

Либо добавьте свойство -donotobfuscate в файл proguard-rules.pro, -dontobfuscate ИЛИ

2.

Внутри отладки buildtypes внутри build.grade, minifyEnabled false shrinkResources false

Опция Latter больше рекомендуется, так как ур-производство 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
    }
}

Ответ 7

э-э... В моем случае , Я просто перестроил проект, чтобы исправить это!