Как подавить конкретное предупреждение 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);
                            ^

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

Ответы

Ответ 1

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

//noinspection deprecation

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

//noinspection deprecation
e.setBackgroundDrawable(editTextDrawable);

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

Ответ 2

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

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

android {
    lintOptions {
        disable 'Deprecation'
    }
}

или on может назначить один довольно подробный файл конфигурации 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

обновление В заметках о выпуске Android Studio 2.3 упоминается новая функция:

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

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

android {
    lintOptions {
        baseline file("lint-baseline.xml")
    }
}

Ответ 3

У меня возникла аналогичная проблема. Сначала я получил предупреждение о компиляторе:

: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) чтобы намекнуть, что метод/класс могут использовать методы, зависящие от API версии 13, а не то, что вы установили как minSdkVersion (например, 9).

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

Ответ 4

Вам нужно создать файл lint.xml, чтобы сообщить, что игнорировать.

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")

Ответ 5

Важен регистр, используйте следующее встроенное или общеклассовое:

@Suppress("DEPRECATION")

Это в Котлине.

Ответ 6

Попробуйте найти метод из ViewCompat, чтобы заменить устаревший метод.

В вашем случае используйте ViewCompat.setBackground(View, Drawable).

Для таких случаев существует множество классов с именем XXXCompat, таких как ContextCompat, ActivityCompat и так далее.

Ответ 7

Чтобы избежать предупреждений lint, всегда разделяйте функции так, чтобы одна функция имела дело со старой системой, а другая - с новой системой. Старый может безопасно подавить предупреждение. Новый должен быть аннотирован для использования только на новейших уровнях 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()

Ответ 8

Просто используйте @SuppressWarnings("deprecation") над функцией, чтобы @SuppressWarnings("deprecation") это конкретное предупреждение только для этой функции.

Работает как шарм!

У @Blackd есть лучший ответ. Вы должны принять это!