如何抑制已弃用的Android功能的特定Lint警告?

时间:2014-06-13 15:00:37

标签: android gradle lint deprecation-warning

我使用版本开关来支持较旧的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);
                            ^

我是否可以注释特定的行或方法来静音警告(因为我是故意这样做的)?我想要停用所有警告。

8 个答案:

答案 0 :(得分:8)

新功能:不确定Android Studio,但是,要从此行中删除此警告,您可以使用:

//noinspection deprecation

这将从下一行中删除警告。  E.g:

//noinspection deprecation
e.setBackgroundDrawable(editTextDrawable);

不会显示错误。 然而,正如@JJD所说,这仍然会向控制台输出警告。但至少你可以拥有一个很好的无错误代码,这对于Git来说非常有用。并且,这可以防止@SupressWarnings的问题,它忽略了方法中的所有警告。因此,如果您有一些您不知道的弃用内容,@SupressWarnings将隐藏它,您将不会收到警告。这是//noinspection

的优势

答案 1 :(得分:4)

我遇到了类似的问题。首先我得到了编译器警告:

: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)。

注释只能在类或函数级别完成,而不能用于单行。另请注意&#34;弃用&#34;不应该大写,而对于#34; NewApi&#34;

这似乎并不重要。

答案 2 :(得分:4)

我注意到@SuppressLint("deprecated")内联注释不再被提取 - 而@SuppressWarnings("deprecation") 被选中。

可以在模块级Deprecation文件中禁用带有lintOptions的Gradle linter的build.gradle检查;虽然没有机会定义这样的单个文件:

android {
    lintOptions {
        disable 'Deprecation'
    }
}

on可以使用LintOptions:lintConfig分配一个相当详细的lint.xml配置文件(当设置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中的内联警告...... linter似乎是另一个linter - 而且这些注释不会影响Gradle构建的linter(可能需要将其与其中一个结合使用)上述方法,以忽略已知的已弃用类和方法):

//noinspection deprecation

更新 Android Studio 2.3发行说明提及了一项新功能:

  

Lint Baseline:使用Android Studio 2.3,您可以将未解决的lint警告设置为项目的基线。从那时起,Lint将仅报告新问题。如果您的应用中有许多遗留的lint问题,这很有用,但只想集中精力解决新问题。了解有关Lint基线和新Lint检查的更多信息。此版本中添加了注释。

here解释了如何创建Lint警告baseline - 将检测到的警告记录到XML文件中然后将其静音(这比获取代码更好)内联注释,遍布整个地方);我假设,选项lintConfigbaseline应该可以合并(取决于要求)。

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

答案 3 :(得分:3)

您需要创建一个lint.xml文件来告诉lint要忽略什么。

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

答案 4 :(得分:2)

大小写很重要,请在行内或全班使用以下代码:

@Suppress("DEPRECATION")

这是在科特林。

答案 5 :(得分:1)

尝试从ViewCompat中找到一个方法来替换不推荐使用的方法。

根据您的情况,使用ViewCompat.setBackground(View, Drawable)

在这种情况下,有许多名为XXXCompat的类,例如ContextCompatActivityCompat等。

答案 6 :(得分:0)

为避免出现棉绒警告,请始终对函数进行拆分,以使一个函数处理旧系统,另一个函数处理新系统。老人可以安全地警告。新的注释应该注释为只能在最新的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);
        }
    }

另一个避免掉毛警告的重要提示:如果使用的是整个不推荐使用的类,则应删除该类的所有显式导入。然后只需直接使用其完整路径访问该类,并且仅在函数的旧版本中进行操作即可。

最后,您应该考虑开始使用androidX,这是新的Google库,您将在其中找到许多可以使用的通用函数。这样一来,您可以节省大量时间解决此类小问题。例如,您可以删除上述示例的所有代码,而只需使用此新的通用androidX函数:

    PackageInfo.getLongVersionCode()

答案 7 :(得分:0)

只需在函数上方使用@SuppressWarnings("deprecation")即可仅针对该函数禁止该特定警告。

像魅力一样工作!

@Blackd有更好的答案。您应该接受!