Как подавить определенное предупреждение Lint для устаревшей функции Android?

Я использую переключатель версий для поддержки старых версий Android.

int sdk = Build.VERSION.SDK_INT;
if (sdk < Build.VERSION_CODES.HONEYCOMB) {
    ColorDrawable colorDrawable = new ColorDrawable(shapeColor);
    //noinspection deprecation
    viewHolder.shape.setBackgroundDrawable(colorDrawable);
} else {
    viewHolder.shape.setColor(shapeColor);
}

Когда построить проект с Gradle изкомандная строка Lint выдает следующее предупреждение:

app/src/main/java/com/example/MyApp/CustomListAdapter.java:92: warning: 
[deprecation] setBackgroundDrawable(Drawable) in View has been deprecated
            viewHolder.shape.setBackgroundDrawable(colorDrawable);
                            ^

Могу ли я аннотировать конкретную строку или метод, чтобы отключить предупреждение (поскольку я делаю это специально)? я делаюне хочу отключитьвсе предупреждения.

 MrEngineer1313 июн. 2014 г., 17:22
Вы пытались добавитьlintOptions { abortOnError false } в ваш build.gradle?
 JJD13 июн. 2014 г., 17:09
@ MrEngineer13 Я уже аннотировал устаревшую версию в коде. Это предупреждение Lint. - OrhanC1: Спасибо, я знал ярлык. Хотелось быть явным здесь.
 JJD18 мар. 2016 г., 00:34
@LarsH Gradle по-прежнему выводит предупреждение сjava.lang.SuppressWarnings.
 JJD13 июн. 2014 г., 17:05
@ MrEngineer13 Да. Но здесь я строю из командной строки через./gradlew clean assembleDebug assembleRelease.
 aleb11 июл. 2014 г., 21:01
«// noinspection» - это способ игнорирования предупреждений IntelliJ (Android Studio основана на IntelliJ). Выглядит как несоответствие в Android SDK - IDE предлагает использовать эту // noinspection вещь (когда вы нажимаете alt-enter), но система сборки игнорирует ее. Я подалаcode.google.com/p/android/issues/detail?id=73475
 LarsH16 мар. 2016 г., 21:09
Сообщение об ошибке @ aleb было закрыто как «WorksAsIntended», в котором говорилось, что // noinspection должен быть специфичным для IDE и не должен влиять на операции командной строки, такие как сборки gradle. Тем не менее, документация не делает этого различия, поэтому я подал документацию:code.google.com/p/android/issues/...
 OrhanC113 июн. 2014 г., 17:07
@JJD Не связано, но маленький совет:./gradlew aD
 JJD17 мар. 2016 г., 10:12
@LarsH Что именно вы предлагаете использовать? Я пытался добавить@SuppressLint("deprecation") к методу - все еще Gradle сообщает о предупреждении.
 MrEngineer1313 июн. 2014 г., 17:06
Что происходит, когда вы помещаете курсор в viewHolder.shape.setBackgroundDrawable (colorDrawable); и нажмите Alt + Enter?
 LarsH17 мар. 2016 г., 14:37
@JJD: Извините, я не знаю. Я ожидаю, что это сработает. Вы попробовали предложение user1,@SuppressWarnings("deprecation")?
 bestdayever13 июн. 2014 г., 18:04
Вы случайно не видели мой отредактированный ответ? Я думаю, что это охватывает то, что вы спрашивали.
 MrEngineer1313 июн. 2014 г., 17:03
Вы используете Android Studio?

Ответы на вопрос(5)

Не уверен насчет Android Studio, но, чтобы удалить это предупреждение из этой строки, вы можете использовать:

//noinspection deprecation

Это удаляет предупреждение со следующей строки. Например:

//noinspection deprecation
e.setBackgroundDrawable(editTextDrawable);

Это не покажет ошибку.Тем не мение, как сказал @JJD, это все еще выводит предупреждение на консоль. Но, по крайней мере, у вас может быть хороший безошибочный код, который может быть полезен, например, для Git. И это предотвращает проблему с@SupressWarnings, то есть игнорирует все предупреждения в методе. Так что если у вас есть что-то осуждаемое, о чем вы не знаете,@SupressWarnings скроет это, и вы не будете предупреждены. Это преимущество//noinspection

http://tools.android.com/tips/lint/suppressing-lint-warnings см. это для более подробной информации

ваш может выглядеть немного так

<?xml version="1.0" encoding="UTF-8"?>
<lint>
    <!-- Disable the given check in this project -->
    <issue id="Deprecation">
        <ignore path="app/src/main/java/com/example/MyApp/CustomListAdapter.java" />
    </issue>
</lint>

Чтобы справиться с этим в источнике, вы должны использовать что-то вроде

 @SuppressLint("Deprecation")
 bestdayever13 июн. 2014 г., 17:36
Ссылка охватывает это. @SuppressLint («Устаревание») встроенный.
 bestdayever13 июн. 2014 г., 18:45
И вы получили это:}
 JJD13 июн. 2014 г., 18:50
Ты имеешь в виду//noinspection deprecation? Но кроме этого Gradle все еще выводит предупреждение на консоль.
 bestdayever13 июн. 2014 г., 18:53
// noinspection AndroidLintDeprecation Я пробовал это на тестовом проекте, и он работал нормально. Я предполагаю, что у вас есть проблемы с устаревшими инструментами или чем-то еще.
 JJD13 июн. 2014 г., 18:13
Я старался//noinspection AndroidLintDeprecation как предложено в документации, но предупреждение все еще появляется. Я не уверен, что подразумевается подЯ бы,lintId извлекается как видноВотстрока 169. -@SuppressLint("Deprecation") можно установить только на уровне метода, если я правильно понимаю.
 LarsH16 мар. 2016 г., 21:07
К вашему сведению, я подал отчет об ошибке в документации:code.google.com/p/android/issues/...
 LarsH16 мар. 2016 г., 20:43
JJD прав - на сегодняшний день с последними инструментами и обновлениями IDE,//noinspection не в состоянии отключить предупреждения lint для системы сборки. Отслеживание проблем наcode.google.com/p/android/issues/detail?id=73475 говорит, что это по замыслу, но документация наtools.android.com/tips/lint/suppressing-lint-warnings не может упомянуть эту важную разницу между//noinspection а также@SuppressLint().
 JJD13 июн. 2014 г., 17:28
Я не хочу отключать все предупреждения об устаревании. Я бы предпочел добавить аннотацию Lint к конкретной строке в коде.
 JJD13 июн. 2014 г., 18:26
Подумал об этом - в любом случае было бы неплохо:
 JJD13 июн. 2014 г., 20:44
Это не работает дляэтот проект, Инструменты почти в актуальном состоянии (работа в процессе)
 bestdayever13 июн. 2014 г., 18:21
Разве не проще всего было бы выделить этот оператор if в отдельный метод, помеченный аннотацией suppress lint?

@SuppressLint("deprecated") встроенные аннотации больше не будут приниматься - пока@SuppressWarnings("deprecation") является быть подобранным

можно отключитьDeprecation проверяет Gradle линтер сlintOptions на уровне модуляbuild.gradle файл; в то время как нет возможности определить отдельные файлы следующим образом:

android {
    lintOptions {
        disable 'Deprecation'
    }
}

или же можно назначить один довольно подробныйlint.xml файл конфигурации сLintOptions: lintConfig (когда настройкиshowAll true, он по-прежнему будет отображать предупреждения - независимо от предоставленной конфигурации XML):

android {
    lintOptions {
        lintConfig file("lint.xml")
        showAll false
    }
}

где можно добавить отдельные файлы, добавив их пути:

<?xml version="1.0" encoding="UTF-8"?>
<lint>
    <issue id="Deprecation" severity="Error">
        <ignore path="app/src/main/java/com/example/MyApp/CustomListAdapter.java" />
    </issue>
</lint>

Исходный кодcom.android.builder.model.LintOptions может объяснить, что на самом деле там происходит (и подтверждает около 50% того, что я написал).

чтобы избавиться от встроенных предупреждений в Android Studio ... этот линтер выглядит как другой линтер - и эти аннотации не влияют на линтер сборки Gradle (может потребоваться использовать его в сочетании с одним из указанных методов выше, чтобы игнорировать известные устаревшие классы и методы):

//noinspection deprecation

Обновить Студия Android2,3 В заметках о выпуске упоминается новая функция:

Базовая линия Lint: в Android Studio 2.3 вы можете установить нерешенные предупреждения о задержках в качестве базовой линии в своем проекте. С этого момента Lint будет сообщать только о новых проблемах. Это полезно, если у вас в приложении много проблем с ворсом, но вы просто хотите сосредоточиться на исправлении новых проблем. Узнайте больше о базовых показателях Lint и новых проверках и аннотациях Lint, добавленных в этот выпуск.

Вот объясняется, как создавать предупреждения Lintbaseline - который записывает обнаруженные предупреждения в файл XML, а затем отключает их (что намного лучше, чем встроенные аннотации кода, распределенные повсеместно); Смею предположить, что вариантыlintConfig а такжеbaseline должен быть совместим (в зависимости от требований).

android {
    lintOptions {
        baseline file("lint-baseline.xml")
    }
}
 JJD06 мар. 2017 г., 19:53
я делаюне хочу отключитьвсе предупреждения.
 JJD10 мар. 2017 г., 15:31
Когда я помещаю вашlint.xml (с моим путем к классу) в корневой папке проекта, тоGradle все еще уведомляет мне, что класс "использует или переопределяет устаревший API" при выполнении сборки в командной строке. Кроме того, исключать весь класс - это слишком много, так как я хочу толькомолчание об устаревании для одной строки или функции.
 Martin Zeitler13 мар. 2017 г., 23:14
@JDD взгляните на обновленный ответ; такжеjetbrains.com/help/idea/2016.1/... представляется актуальным для проверки кода в реальном времени.
 Martin Zeitler11 мар. 2017 г., 13:46
мог только представить, чтоlint.xml не упоминается вlintOptions изbuild.gradle ... и, следовательно, может не подчиняться линтеру.
 Martin Zeitler10 мар. 2017 г., 11:15
@JJD объяснил это лучше; в основном нужно настроить два линтера (один из Android Studio, который линкует в прямом эфире - и один из Gradle, который линтирует во время сборки) - чтобы отключить все предупреждения, которые не представляют интереса.
 JJD15 мар. 2017 г., 23:34
Спасибо за обновление, я тоже увидел объявление. Выглядит действительно интересно. Я забыл упомянуть, что вы можете скомпилировать проект самостоятельно. этоОткрытый исходный код, Все, что вы хотите сделать, этозапрещать этиаргументы компилятора временно чтобы увидеть уведомление в оболочке при компиляции с Gradle.

мпилятора:

:compileDebugJava
Note: /path/file.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.

Что вы можете подавить с помощью@SuppressWarnings("deprecation") или просто игнорируйте, так как это предупреждение, которое приводит к сбою сборки. Кроме того, я получил ошибку Lint (подробности вbuild/lint-results.html):

Call requires API level 13 (current min is 9)

Это может быть подавлено путем добавления@SuppressLint("NewApi"), В качестве альтернативы вы можете использовать@TargetApi(13) намекнуть, что метод / класс может использовать методы, которые зависят от версии 13 API, а не от того, что вы установили какminSdkVersion (например, 9).

Аннотации могут быть сделаны только на уровне класса или функции, а не для одной строки. Также обратите внимание, что «амортизация» не должна начинаться с заглавной буквы, хотя для «NewApi» это не имеет значения.

всегда разделяйте функции, чтобы одна функция имела дело со старой системой, а другая - с новой системой. Старый может безопасно подавить предупреждение. Новый должен быть аннотирован для использования только на новейших уровнях API.

Вот пример того, как это должно выглядеть:

    @SuppressWarnings("deprecation")
    private static int getVersionCode_old(@NonNull Context appContext) {
        PackageInfo pInfo;
        try {
            pInfo = appContext.getPackageManager().getPackageInfo(appContext.getPackageName(), 0);
            return pInfo.versionCode;
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }

    @RequiresApi(api = Build.VERSION_CODES.P)
    private static int getVersionCode_new(@NonNull Context appContext) {
        PackageInfo pInfo ;
        try {
            pInfo = appContext.getPackageManager().getPackageInfo(appContext.getPackageName(), 0);
            return (int) pInfo.getLongVersionCode();
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }

    public static int getVersionCodeUniversal(@NonNull Context appContext)
    {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            return getVersionCode_new(appContext);
        }
        else
        {
            return getVersionCode_old(appContext);
        }
    }

Еще один важный совет, чтобы избежать предупреждений lint: если вы используете весь устаревший класс, вы должны удалить все явные импорты для этого класса. Затем просто получите доступ к этому классу напрямую, используя его полный путь, и делайте это только в старых версиях ваших функций.

И, наконец, вы должны начать использовать androidX, новые библиотеки Google, где вы найдете множество универсальных функций, готовых к использованию. Тогда вы можете сэкономить много времени с такими мелкими проблемами. Например, вы можете удалить весь код из приведенного выше примера и просто использовать эту новую и универсальную функцию androidX:

    PackageInfo.getLongVersionCode()

Ваш ответ на вопрос