环境
mac min(2014)
android studio 3.1.2
jdk 1.8(之前jdk是1.5导致启动不了soanr服务器)
sonar-runner-2.4(代码扫描器,也可以用sonar-scanner,扫描后会将结果上传服务器)
sonarqube-6.7.6(相当于服务器,tomcat,需要启动)
配置环境变量
这里就不多描述,软件什么的,随便搜一下就能下;
使用:
1. 启动sonar服务器
命令行输入 sonar.sh start
如下图所示启动完成;(实际中启动完成后,打开localhost 可能失败,耐心等等就行)
2. 打开浏览器验证
打开浏览器输入地址:localhost:9000
右上角有登陆按钮,账号密码都是admin/admin(如果配置文件未修改的话)
3. 新增sonar配置文件
打开android studio;
module目录下新建一个文件sonar-project.property
编辑内容:
//唯一便可
sonar.projectKey=nsps
sonar.projectName=nsps//将会显示在
sonar.projectVersion=1.0
sonar.sourceEncoding=UTF-8
//下面的都是绝对路径
sonar.sources=/Users/zx/codes/nsps/nsps/src/main
sonar.projectBaseDir=/Users/zx/codes/nsps/nsps
sonar.java.source=1.8
sonar.java.binaries=/Users/zx/codes/nsps/nsps/build
如下图所示:
4. 运行代码检查器
打开android studio 内的terminal
此时默认的路径是项目的根目录内,输入“cd module名称” 进入 module根目录中
在 module的根目录下 输入指令 sonar-runner 代码检查器便会检查当前module的代码
等待片刻,检查完毕
5. 查看代码检查结果
浏览器进入localhost:9000 就能看到结果了
一般我们只需要修改bugs,漏洞两项内的内容即可;
6. 查看代码检查结果
点击上图马赛克(左上角)项目名称
因为我修改过代码,所以这里的bugs为0
由上图可以看到漏洞有231个(简直不敢相信,有这么多吗?);
点进去查看一下我们的代码有什么问题:
7. 检查修复代码
问题1:Make keyword a static final constant or non-public and provide accessors if needed.
大致意思是说:把它变成final 常量,或者提供 getter()方法;
这个挺好解决的,看看有没有其他类用到了这个类的属性,根据实际需求修改;
一般这个问题是没有提供getter/setter 方法;
如果这个问题你觉得不是问题,比如说下图这个,是个内部类adapter的ViewHolder,不想改,只需要 点击 打开(登陆后才有),里面有个误判,选中它就行;刷新一下界面这个问题便不会出现了,同时你会发现 对应的数量也会少1;
问题2: Make this IP “192.168.31.175” address configurable.
这个问题不知道怎么解决,没懂他想表达什么意思,如大佬有缘看到了这句话麻烦解释一下,
不甚感激!
下图为sonar的详细介绍:
问题3:Make this “public static DEFAULT_MIN_DISTANCE” field final
意思是说 把那个变量申明为常量,在 static 后面加上final就行;
问题4:Use a logger to log this exception.
让我们用logger来打印异常
Throwable.printStackTrace(...) prints a Throwable and its stack trace to some stream. By default that stream System.Err, which could inadvertently expose sensitive information.
Loggers should be used instead to print Throwables, as they have many advantages:
Users are able to easily retrieve the logs.
The format of log messages is uniform and allow users to browse the logs easily.
This rule raises an issue when printStackTrace is used without arguments, i.e. when the stack trace is printed to the default stream.