于今腐草无萤火,终古垂杨有暮鸦。这篇文章主要讲述Android 端接入代码检测简介相关的知识,希望能为你提供帮助。
达成功能 :
- 对 java 和 kotlin 文件都进行检测;
- 检测规则可以配置;
- IDE(android Studio) 可以实时进行不符合设定的代码报错(但是没有自动纠错)
- 对接 gerrit ,每次提交代码进行检测(现在直播的检测是只对修改的文件进行检测,不是全局扫描),可以在检测未通过时对 commit -2.
- 环境无关,不需要在不同的设备上安装额外的东西(在项目里保留检测工具的 jar 包,直接运行 jar 包进行)
checkStyle :?https://checkstyle.sourceforge.io/checks.html
detekt :?https://detekt.github.io/detekt/index.html
AS 接入实时检测报错对 checkstyle : 使用 checkstyle 插件,在 Plugin?→ Market 中可以找到, 并且在 Preferences→ Other Settings → CheckStyle 中可以新增配置, 选择项目中的
checkstyle.xml
即可新增规则,并在 CheckStyle 栏(使用 "
Action → 搜 checkstyle"
可以呼出)选择相应配置即可。对 detekt : 使用 detekt 插件,在 Plugin→ Market 中可以找到, 在 Preferences?→ Tools?→ detekt 中可以设置配置文件,并且可以设置其他的一些选项(是否 enable / 是否将报错视为 error 等)
检测规则具体参见 checkStyle 和 deteky 的官方配置。
其中
【Android 端接入代码检测简介】checkStyle 推荐使用 google-checkstyle 作为基础进行修改
detekt 推荐使用 detekt 默认规则配置作为基础进行修改
监测脚本 demo 代码 (只对提交修改的文件进行检测):
#!/usr/bin/env python
# coding=utf-8import subprocess
import sysdef printUsage():
print("
"
"
code check .
对一些文件进行代码检查,java 文件使用 checkStyle 进行检测, kt 文件使用 deteKt 进行检测.
检查的文件包含 : [指定的 A commit 的代码]和[指定的 B commit 的代码]之间不同的文件. 检查规则参见 `config/` 目录. 使用方法 : "
sh codeCheck.sh commitA commitB"
. commit 可以是有效的 commit id,
也可以是 "
HEAD"
,"
origin/develop"
等
"
"
"
)def exitWithErrorMsg(msg):
alertStr = "
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
print(alertStr)
print("
Error : "
, msg)
print(alertStr)def getDiffFileListBetweenTwoCommits(commitA, commitB):
completeProcess = subprocess.run([‘git‘, ‘diff‘, ‘--name-only‘, commitA, commitB], capture_output=True)
if completeProcess.returncode != 0:
exitWithErrorMsg("
`git diff --name-only "
+ commitA + "
"
+ commitB + "
` failed with return code : "
+ completeProcess.returncode)
outputStr = completeProcess.stdout.decode(‘utf-8‘)
diffFiles = outputStr.splitlines()
return diffFiles# 返回 [javaFiles, ktFiles]
def sortFilesToJavaAndKt(files):
javaFiles = []
ktFiles = []
for fileName in files:
if fileName.endswith(‘.kt‘):
ktFiles.append(fileName)
elif fileName.endswith(‘.java‘):
javaFiles.append(fileName)
return [javaFiles, ktFiles]def checkJavaFiles(javaFiles):
if (len(javaFiles) != 0):
subprocess.run([‘java‘, ‘-jar‘, ‘config/checkstyle/checkstyle-8.33-all.jar‘, ‘-c‘, ‘config/checkstyle/checkstyle.xml‘, *javaFiles])def checkKtFiles(ktFiles):
if (len(ktFiles) != 0):
subprocess.run([‘java‘, ‘-jar‘, ‘config/detekt/detekt-cli-1.9.1-all.jar‘, ‘-c‘, ‘config/detekt/detekt-config.yml‘, ‘-i‘, ‘,‘.join(ktFiles)])if __name__ == ‘__main__‘:
if len(sys.argv) != 3:
printUsage()
exitWithErrorMsg("
error usage!"
)
diffFiles = getDiffFileListBetweenTwoCommits(sys.argv[1], sys.argv[2])
sortedFilesList = sortFilesToJavaAndKt(diffFiles)
print(sortedFilesList)
checkJavaFiles(sortedFilesList[0])
checkKtFiles(sortedFilesList[1])
文件位置
config
├── checkstyle
│?? ├── checkstyle-8.33-all.jar
│?? └── checkstyle.xml
└── detekt
├── detekt-cli-1.9.1-all.jar
└── detekt-config.yml
推荐阅读
- uniapp H5 百度地图
- Qt error: C1083: 无法打开包括文件: “QApplication”: No such file or directory
- Android 获取 View 宽高的常用正确方式,避免为零
- Crypto Exchange Security: Approaches and Trends
- AS新安装Android Studio运行项目前报错(Unable to access Android SDK add-on list)
- Springboot+Mybatisplus替换mybatis整合报错Mapped Statements collection does not contain value
- AttributeError: ‘_io.TextIOWrapper‘ object has no attribute ‘xreadlines‘
- Android之compileSdkVersionminSdkVersion 以及 targetSdkVersion
- AndroidThe layout "activity_main" in layout has no declaration in the base layout folde