SonarRunner:无法找到文件警告

SonarRunner: Unable to find file warning

我已经配置了一个 Android 示例应用程序项目以检测 Lint 错误并将它们包含到 SonarQube 服务器中。一切正常,但是当我在 AndroidManifest.xml 中明确引入错误(删除 allowBackup 行)时,sonar-runner 执行显示下一个警告:

16:33:57.681 WARN  - Unable to find file C:\Code\Android\SampleApp\app\src\main\AndroidManifest.xml to report issue

路径没问题,所以不是问题。此外,当我制作 gradle lint 并写入 lint-results.xml 文件时,错误定位正确:

<issue
    id="AllowBackup"
    severity="Warning"
    message="Should explicitly set `android:allowBackup` to `true` or `false` (it&apos;s `true` by default, and that can have some security implications for the application&apos;s data)"
    category="Security"
    priority="3"
    summary="Missing `allowBackup` attribute"
    explanation="The allowBackup attribute determines if an application&apos;s data can be backed up and restored. It is documented at http://developer.android.com/reference/android/R.attr.html#allowBackup

By default, this flag is set to `true`. When this flag is set to `true`, application data can be backed up and restored by the user using `adb backup` and `adb restore`.

This may have security consequences for an application. `adb backup` allows users who have enabled USB debugging to copy application data off of the device. Once backed up, all application data can be read by the user. `adb restore` allows creation of application data from a source specified by the user. Following a restore, applications should not assume that the data, file permissions, and directory permissions were created by the application itself.

Setting `allowBackup=&quot;false&quot;` opts an application out of both backup and restore.

To fix this warning, decide whether your application should support backup, and explicitly set `android:allowBackup=(true|false)&quot;`"
    url="http://developer.android.com/reference/android/R.attr.html#allowBackup"
    urls="http://developer.android.com/reference/android/R.attr.html#allowBackup"
    errorLine1="    &lt;application
"
    errorLine2="    ^"
    quickfix="studio,adt">
    <location
        file="C:\Code\Android\SampleApp\app\src\main\AndroidManifest.xml"
        line="5"
        column="5"/>
</issue>

什么可能导致此警告以及为什么 SonarQube 服务器中未显示错误?

显示此警告是因为 xml 文件未被平台索引。因此,android lint 插件会尝试报告您的问题,但无法在服务器端找到该文件。

这是应该很快解决的平台当前限制。

要解决此限制并为您的 xml 文件编制索引,您可以:

  • 安装 xml 插件(这将强制索引 xml 文件)
  • 如果您使用的是 SonarQube 5.1,您可以将 sonar.import_unknown_files 设置为 true。

(您也可以查看此 thread 了解更多信息)

我遇到了同样的问题。按照@benzonico 建议的解决方案进行操作,但仍然面临问题。然后我发现了我的问题。在 sonar.sources 中,我刚刚提到了 'src' 路径,但忘记了 'res' (在我的项目中,我在 src 之外有 res)。然后我将两条路径都放到 sonar.sources。然后所有 xml 文件都被索引了。谢谢@benzonico。

确实,您需要为项目的 .xml 文件编制索引: - 将资源路径添加到 src 属性 - 确保 xml 插件安装在您的 SQ 服务器上 - 确保项目的语言设置为 java 和 xml

此时,SQ 将索引 xml 个文件,它们必须显示在仪表板中。

那么问题是你问题的'severity'属性只有"warning"。貌似sonar插件不导入warnings,只导入errors

您可能需要创建一个 lint 配置文件来覆盖默认配置,它应该如下所示:

lint.xml:

<?xml version="1.0" encoding="UTF-8"?>
<lint>
    <issue id="AllowBackup" severity="error" />
</lint>

然后在 build.gradle 的 android 部分:

lintOptions {
    lintConfig = file("${projectDir}/lint.xml")
    showAll true
    abortOnError false
    ...
}  

[编辑] gradle 插件似乎有一个将警告视为错误的选项。我还没有测试过,但您可以尝试以下操作而不是使用自定义 lintConfig 文件

lintOptions {
    warningsAsErrors true
    showAll true
    abortOnError false
    ...
}

我在SonarQube v6.0上遇到了同样的问题,我在here上找到了官方解决方案:

配置

为了在分析过程中执行规则,该功能需要 SQ 导入 XML 文件。 这可以使用两种不同的方法来完成:

1.安装 XML 插件 : XML plugin,在其他功能之上,索引 XML 文件。

2.(SQ 5.1+) 导入未知文件 : 通过设置 属性 "sonar.import_unknown_files" 为您的项目打开 import of unknown files "true"。

方法一:

仍然显示 "Unable to find file warning" 错误消息。

解决方法:

1.Like @Henry 说:将 'res' 文件夹添加到来源:sonar.sources=src, res

2.Remove sonar.language=java 来自配置,因为SQ现在支持多种语言。如果你不移除语言,SQ只会处理你移除的java files.When和运行,一些日志会输出如下:

11:06:30.781 INFO  - Index files
11:06:31.016 INFO  - 120 files indexed
11:06:31.029 INFO  - Quality profile for java: Android Rules
11:06:31.029 INFO  - Quality profile for xml: Sonar way

方法2呢?

它可以工作,但是很多未知文件将被索引。甚至包括一些png、jpg文件,SQ中的"Lines of Code"也会包含这些未知文件。所以,我真的不推荐这种方式!