基于小米便签开源代码在Android中配置SonarQube并进行分析

首先,确保你的机器上已经安装了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中,找到SonarLintConnection中找到刚才设置的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 执行成功

  1. 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

  1. 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

  1. Use static access with "android.provider.ContactsContract$DataColumns" for "MIMETYPE"

图4-2-2 严重程度Critical

要使用静态访问 "MIMETYPE",你可以直接使用类名 "ContactsContract.DataColumns",而不需要创建该类的实例。这样做可以更清晰地表达意图,因为 "MIMETYPE" 是该类的静态成员。

  1. 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注释关联的任务。

  • 11
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
小米便签是一款非常实用的便签应用,而它的源代码的widget部分是实现快捷便签功能的关键。 widget是指在手机主屏幕上以小组件形式展示的应用功能,用户可以直接在主屏幕上进行一些常用操作,而无需打应用程序。小米便签的widget功能可以让用户直接在主屏幕上添加、编辑和查看便签内容,极大地提高了使用便签的效率。 在小米便签源代码,widget部分主要包含以下几个关键实现: 1. 布局文件:widget部分需要一个布局文件来定义在主屏幕上显示的内容和样式。这个布局文件可能包含便签的标题、内容、时间等信息的显示。 2. 代码逻辑:在widget部分,需要编写代码逻辑来处理用户的操作。比如,当用户点击widget上的编辑按钮时,需要能够打便签编辑页面;当用户保存便签时,需要能够更新主屏幕上的widget显示内容。 3. 数据库操作:为了能够将主屏幕上的widget与实际的便签内容关联起来,widget部分通常需要进行与便签数据库的交互。这样,用户在编辑或添加了新的便签后,widget上的内容就能够及时得到更新。 通过对小米便签源代码widget部分的分析,可以深入了解到widget的实现原理和关键技术。这对于想要设计和发类似的便签类应用程序的发者来说,是非常有帮助的。同时,这也能够让用户更好地理解小米便签的便捷功能,提高日常便签使用的效率。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值