Lint报告“命名空间中的硬编码包”

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lint报告“命名空间中的硬编码包”相关的知识,希望对你有一定的参考价值。

今天当我想从我的项目中获得一个版本时,android studio显示这个错误:

android {
    lintOptions {
        checkReleaseBuilds false
        // Or, if you prefer, you can continue to check for errors in release builds,
        // but continue the build even when errors are found:
        abortOnError false
    }
}

所以我打开lint的报告文件夹,看到这个错误:

<issue
    id="ResAuto"
    severity="Fatal"
    message="In Gradle projects, always use `http://schemas.android.com/apk/res-auto` for custom attributes"
    category="Correctness"
    priority="9"
    summary="Hardcoded Package in Namespace"
    explanation="In Gradle projects, the actual package used in the final APK can vary; for example,you can add a `.debug` package suffix in one version and not the other. Therefore, you should **not** hardcode the application package in the resource; instead, use the special namespace `http://schemas.android.com/apk/res-auto` which will cause the tools to figure out the right namespace for the resource regardless of the actual package used during the build."
    errorLine1="    xmlns:app=&quot;http://schemas.android.com/apk/res/ir.app.appname&quot;>">"
    errorLine2="               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
    quickfix="studio">
    <location
        file="C:...appsrcmain
escolormybutton_backgroundcolor.xml"
        line="3"
        column="16"/>
</issue>

mybutton_backgroundcolor.xml:

<selector xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res/ir.app.appname">

    <item android:state_enabled="true" app:state_read ="false" android:color="@color/backgrpund_button_success"/>

    <item android:state_enabled="false" app:state_read ="false" android:color="@color/gray_4"/>
    <item app:state_read ="true" android:color="@color/gray_4"/>

</selector>

错误在此xmlns:app =“http://schemas.android.com/apk/res/ir.app.appname”>行中。

有人可以帮我解决这个问题吗?!

更新:将com.android.support库更新到版本28后发生此错误

答案

app名称空间应声明为xmlns:app="http://schemas.android.com/apk/res-auto"

正如Lint所说:

在Gradle项目中,最终APK中使用的实际包可能会有所不同;因为你可以在一个版本中添加一个.debug包后缀而不是另一个版本。因此,您不应该在资源中硬编码应用程序包;相反,使用特殊的命名空间http://schemas.android.com/apk/res-auto,这将使工具找出资源的正确命名空间,而不管构建期间使用的实际包。

以上是关于Lint报告“命名空间中的硬编码包”的主要内容,如果未能解决你的问题,请参考以下文章

lint工具删除无用资源最佳示例

gradle命令行运行lint时在apk项目中的build.gradle配置选项

Sonar Lint 与服务器规则不同步

Android 性能优化:使用 Lint 优化代码去除多余资源

错误:这个片段内部类应该是静态的 [ValidFragment]

Android 自定义Lint 基础教程