基于小米便签开源代码在Android中配置SonarQube并进行分析
- 自行安装AndroidStudio,我的AndroidStudio版本 Android Studio Hedgehog | 2023.1.1
- 基于AndroidStudio配置SonarQube(工具配置步骤,SonarQube)
- SonarQube版本sonarqube-9.1.0.47736
- jdk11 + AndroidStudio + SonarQube9.1 + MiNotes
- 百度网盘: https://pan.baidu.com/s/1Pc2UIhM7snZT8ziyzduxiw?pwd=1111
https://pan.baidu.com/s/1Pc2UIhM7snZT8ziyzduxiw?pwd=1111
首先,确保你的机器上已经安装了Java 11(Oracle JRE 11或OpenJDK 11),并且配置了相应的环境变量,这是运行SonarQube的先决条件。
SonarQube的版本为9.1。
图1配置jdk
其次,在Android Studio中安装SonarLint插件。这可以通过访问Android Studio的插件市场,搜索并下载SonarLint插件来完成。安装完成后,按照指导重启Android Studio。
图2 安装SonarLint插件
在官网下载SonarQube
图3下载SonarQube
安装 SonarQube,将SonarQube的压缩包解压至 Windows 某个路径
图4解压SonarQube
找到Path…\sonarqube-9.1.0.47736\bin\windows-x86-64\ StartSonar.bat 双击启动
图5 启动SonarQube
SonarQube服务器启动成功。
图6 SonarQube启动成功
在网页中打开http://localhost:9000,初始账号密码都是admin。
图7登录服务器
在Android Studio配置SonarQube,在Android Studio的菜单栏中点击 File > Settings,在搜索框中搜索SonarLint
图8-1 找到settings
图8-2 搜索SonarLint
在小米便签项目中配置SonarQube,自定义Connection Name,并在SonarQube URL:中粘入http://localhost:9000/
图9 配置SonarQube URL
选择Login/Password,填入登录的SonarQube 账号密码
图10-1 配置SonarQube账号密码
图10-2 配置SonarQube账号密码
在项目中配置SonarQube
在build:gradle(Project)中添加插件:
classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.3"
图11-1 添加SonarQube插件
在build:gradle(Project)中添加如下代码:
maven { url "https://plugins.gradle.org/m2/" }
图11-2在项目中配置SonarQube
在build:gradle(Project)中添加如下代码:
apply plugin: "org.sonarqube"
图11-3在项目中配置SonarQube
在gradle.properties中添加服务器配置
systemProp.sonar.host.url=http://localhost:9000 systemProp.sonar.login=admin systemProp.sonar.password=admin
打开网页http://localhost:9000,新建一个手工项目
图13-1 新建新建一个手工项目
自定义新建项目名称,需要记住
图13-2 自定义新建项目名称
创建本地分析项目
图13-3 创建本地分析项目
在app项目中的build.gradle中添加配置,注意sonar.projectKey,对应的是自定义的名字
sonarqube { properties { property "sonar.host.url", "http://localhost:9000" //sonar管理系统地址 property "sonar.login", "admin" // sonar管理系统账号 property "sonar.password", "admin" // sonar管理系统密码 property "sonar.sourceEncoding", "UTF-8" property "sonar.projectKey", "MItest" //sonar平台中相对应项目的key property "sonar.projectName", "MItest" //sonar平台中相对应项目的名字 property "sonar.sources", "src/main/java" //源码,sonar检测的源文件目录 property "sonar.projectVersion", project.version //版本,随意 property "sonar.projectName", project.name } }
图14 在app项目中的build.gradle中添加配置
在Android Studio的File>>settings中,找到SonarLint在Connection中找到刚才设置的Connection Name 名称
图15 在Android Studio中配置SonarLint
打开Android Studio 的Terminar(终端)。
在Project 项目文件名字位置右键,打开Terminal
图16-1 打开Terminal
在Terminal中执行
./gradlew sonarqube
或者
gradlew sonarqube
开始运行
图16-2 输入命令
图16-3执行命令
命令执行成功
图16-4 执行成功
- 在http://localhost:9000/中打开项目,可以看到已经生成项目分析报告了
图17-1 查看分析报告
查看报告
图17-2 查看分析报告
图17-3 查看分析报告
- 使用SonarQube进行分析
对小米代码分析情况概述
在项目视图中选中待分析的包,在右键选项中使用SonarLint进行分析。对小米便签全部源码(37个文件)自动完成质量审查,得到如下代码质量分析报告:
图4-1-1 使用SonarQube进行分析
图4-1-2 SonarLint分析结果
在小米便签软件的源代码中,共审查出37个文件中的372个问题,经过人工审查,其中大量的问题在于规范和代码的简洁性要求,例如有45个Critical Issues为GTaskClient类中的常量命名问题,所以总体来说,小米便签软件的质量较为不错。
代码中的缺陷分为如下几个等级:
Blocker(阻断级): 这是最严重的缺陷级别,表示代码中存在严重的问题,可能会导致系统崩溃、数据丢失或者安全漏洞等严重后果。这些问题需要立即解决,以确保系统的可靠性和安全性。
Critical(严重级): 这类缺陷表示代码中存在严重的问题,可能会导致系统功能严重受损或性能显著降低。尽管它们不会导致系统崩溃,但仍然需要尽快修复,以免对系统的整体可用性和用户体验造成不利影响。
Major(重要级): 这类缺陷表示代码中存在较严重的问题,可能会对系统功能或性能产生一定影响,但影响程度没有严重缺陷那么严重。尽管修复这些问题不是非常紧急,但也应该在适当的时候解决,以确保系统的质量和稳定性。
Minor(次要级): 这类缺陷表示代码中存在一些小问题或者改进建议,对系统功能或性能影响较小。修复这些问题通常是可选的,可以在其他重要任务完成之后再考虑。
Info(信息级): 这类缺陷并不影响代码的功能或性能,而是提供一些额外的信息或者改进建议,以帮助开发人员编写更好的代码。
现对代码存在的质量问题进行汇总统计,对严重程度为Blocker、Critical和Major的问题进行逐一的分析:
1)严重程度:Blocker
- Use try-with-resources or close this "FileQutputStream" in a "finally" clause.
图4-2-1 严重程度Blocker
这个警告表明在使用 FileOutputStream 打开文件时,没有使用 try-with-resources 或在 finally 语句块中手动关闭流。这可能导致资源泄漏,因为文件流没有被正确地关闭。
在 Java 中,可以使用 try-with-resources 语句来自动关闭实现了 AutoCloseable 接口的资源,包括文件流。这样可以确保资源在使用完毕后被正确关闭,无需手动编写 finally 语句块。
2)严重程度:Critical
- Use static access with "android.provider.ContactsContract$DataColumns" for "MIMETYPE"
图4-2-2 严重程度Critical
要使用静态访问 "MIMETYPE",你可以直接使用类名 "ContactsContract.DataColumns",而不需要创建该类的实例。这样做可以更清晰地表达意图,因为 "MIMETYPE" 是该类的静态成员。
- Use static access with "android.provider.ContactsContract$DataColumns" for "RAW CONTACT ID".
图4-2-3 严重程度Critical
要使用静态访问 "RAW CONTACT ID",你可以直接使用类名 "ContactsContract.DataColumns",并结合内部类 "RawContacts",而不需要创建该类的实例。这样做可以更清晰地表达意图,因为 "RAW CONTACT ID" 是该类的静态成员。
3)严重程度:Major
Add a private constructor to hide the implicit public one.
图4-2-4 严重程度Major
添加一个私有构造函数来隐藏隐式公共构造函数。
Change the visibility of this constructor to "protected".
图4-2-5 严重程度Major
将这个构造函数的可见性改为"protected"。
4)严重程度:Minor
Replace the type specification in this constructor call with the diamond operator ("").
图4-2-6 严重程度Minor
将此构造函数调用中的类型说明替换为菱形操作符("")
Rename this fieId "NOTES SNIPPET SEARCH QUERY" to match the regular expression '^[a-z][a-zA-Z0-9]*$'
图4-2-7 严重程度Minor
将此字段重命名为“NOTES SNIPPET SEARCH QUERY”以匹配正则表达式“^[a-z][a-zA-Z0-9]*$”。
5)严重程度:Info
Complete the task associated to this ToDO comment.
图4-2-8 严重程度Info
完成与此ToDO注释关联的任务。