diff --git a/.gitignore b/.gitignore index f11e27d274..3ec053d928 100644 --- a/.gitignore +++ b/.gitignore @@ -7,5 +7,4 @@ /build /captures .externalNativeBuild -.cxx -.gitlab-ci.yml \ No newline at end of file +.cxx \ No newline at end of file diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000000..6f35450937 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,25 @@ +stages: + - analyze + +inspect java and kotlin codes: + tags: + - apk + - android + stage: analyze + script: + - echo "$CI_COMMIT_BEFORE_SHA $CI_COMMIT_SHA $CI_COMMIT_BRANCH" + - echo "$CI_JOB_STAGE}_reports_${CI_PROJECT_NAME}_${CI_BUILD_REF_NAME}" + - ./gradlew runCodeInspect + before_script: + - source change_java_version + artifacts: + name: "$CI_JOB_STAGE}_reports_${CI_PROJECT_NAME}_$CI_COMMIT_REF_SLUG" + when: on_failure + expire_in: 1 days + paths: + - "build/reports/*" + only: + - "$CI_COMMIT_BRANCH" + except: + - master + allow_failure: true diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/selectline/SelectLineView.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/selectline/SelectLineView.kt index e86953b46b..f8f6b348d2 100644 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/selectline/SelectLineView.kt +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/selectline/SelectLineView.kt @@ -45,8 +45,6 @@ import org.greenrobot.eventbus.EventBus */ class SelectLineView : ConstraintLayout, SelectLineViewModel.SelectLineViewCallback { - private val TAG = "OrderInfoView" - constructor(context: Context) : super(context) constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet) @@ -100,7 +98,7 @@ class SelectLineView : ConstraintLayout, SelectLineViewModel.SelectLineViewCallb rlv_line_list.layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) rlv_line_list.addItemDecoration( - com.mogo.och.charter.passenger.ui.selectline.layoutmanage.BottomDecoration( + BottomDecoration( AutoSizeUtils.dp2px(context, 60f) ) ) @@ -109,7 +107,7 @@ class SelectLineView : ConstraintLayout, SelectLineViewModel.SelectLineViewCallb rv_site_list.layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) rv_site_list.addItemDecoration( - com.mogo.och.charter.passenger.ui.selectline.layoutmanage.BottomDecoration( + BottomDecoration( AutoSizeUtils.dp2px(context, 90f) ) ) diff --git a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/InfoVideoView.kt b/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/InfoVideoView.kt index d8212bac16..e521cfbc50 100644 --- a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/InfoVideoView.kt +++ b/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/InfoVideoView.kt @@ -61,7 +61,7 @@ internal class InfoVideoView @JvmOverloads constructor( "蘑菇车联之红旗车队" )) add( - com.mogo.och.taxi.passenger.bean.TaxiPassengerVideoPlay( + TaxiPassengerVideoPlay( "https://img.zhidaohulian.com/fileServer/online_car_hailing/1655708499497/大运会合作解说版.m4v", "https://img.zhidaohulian.com/fileServer/online_car_hailing/1655969536177/大运会.png", "蘑菇车联牵手成都大运会" @@ -79,7 +79,7 @@ internal class InfoVideoView @JvmOverloads constructor( fun exitFullScreenMode(resetVideoPlayer: Boolean) { val carouselLayoutManager = rvVideoPlaylist?.layoutManager as CarouselLayoutManager - val (centerItemPosition: Int, player) = getPlayer(carouselLayoutManager) + val (_: Int, player) = getPlayer(carouselLayoutManager) player?.let { it.exitFullScreenMode() it.onVideoPause() @@ -100,7 +100,7 @@ internal class InfoVideoView @JvmOverloads constructor( return } val carouselLayoutManager = rvVideoPlaylist?.layoutManager as CarouselLayoutManager - val (centerItemPosition: Int, player) = getPlayer(carouselLayoutManager) + val (_: Int, player) = getPlayer(carouselLayoutManager) when (visibility) { View.VISIBLE -> { player?.let { @@ -218,7 +218,7 @@ internal class InfoVideoView @JvmOverloads constructor( override fun onWindowFocusChanged(hasWindowFocus: Boolean) { super.onWindowFocusChanged(hasWindowFocus) val carouselLayoutManager = rvVideoPlaylist?.layoutManager as CarouselLayoutManager - val (centerItemPosition: Int, player) = getPlayer(carouselLayoutManager) + val (_: Int, player) = getPlayer(carouselLayoutManager) player?.let { if(it.isInPlayingState&&!it.isIfCurrentIsFullscreen&&!hasWindowFocus){ player.onVideoPause() diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiCurrentTaskViewModel.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiCurrentTaskViewModel.kt index 62ae3073ba..3905c64d3b 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiCurrentTaskViewModel.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiCurrentTaskViewModel.kt @@ -303,6 +303,10 @@ class TaxiCurrentTaskViewModel : BaseViewModel(), */ override fun onStopAutopilot() { UiThreadHandler.removeCallbacks(startTaskRunnable) + if (!TaxiTaskModel.checkCurrentTaskCondition()) { + d(TAG, "onStopAutopilot: 无任务无需流转状态") + return + } startTask(false) } diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiTaskModel.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiTaskModel.kt index c1d5857c2f..745dfa717b 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiTaskModel.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiTaskModel.kt @@ -1322,6 +1322,7 @@ object TaxiTaskModel { */ fun clearCurrentOCHOrder() { clearAutopilotControlParameters() + mIsArrivedSiteStartTag = false isRestartAutopilot = false if (FunctionBuildConfig.isDemoMode) { // 当美化模式(演示模式)开启时: 取消或订单已完成时,置false diff --git a/app/src/main/java/com/mogo/launcher/lancet/MainBlockCheck.kt b/app/src/main/java/com/mogo/launcher/lancet/MainBlockCheck.kt index 8fd39e4280..14b4401f1a 100644 --- a/app/src/main/java/com/mogo/launcher/lancet/MainBlockCheck.kt +++ b/app/src/main/java/com/mogo/launcher/lancet/MainBlockCheck.kt @@ -19,7 +19,6 @@ import com.mogo.eagle.core.block.runtime.config.recorder.* import com.mogo.eagle.core.block.runtime.utils.TimeUtils.Companion.now import com.mogo.eagle.core.function.call.devatools.* import com.mogo.eagle.core.utilcode.util.* -import kotlinx.coroutines.* import kotlinx.coroutines.Runnable import java.lang.ref.WeakReference import java.util.LinkedList diff --git a/build.gradle b/build.gradle index fb29e29960..190f5f0714 100644 --- a/build.gradle +++ b/build.gradle @@ -39,7 +39,7 @@ buildscript { classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.18' classpath "com.mogo.sticky:service:${plugin_version}" classpath "io.github.knight-zxw:lancet-plugin:${lancetx_plugin_version}" - classpath "io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.21.0" + classpath "io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.15.0" classpath 'com.mogo.cloud:matrix:1.0.0' // classpath 'com.bytedance.btrace:rhea-gradle-plugin:2.0.0' } @@ -52,7 +52,6 @@ buildscript { } allprojects { - apply from: rootProject.file('codequality/pmd.gradle') repositories { mavenLocal() maven { url 'http://nexus.zhidaoauto.com/repository/maven-releases/' } @@ -73,6 +72,17 @@ allprojects { } google() } + + if (isCodeInspectEnable ) { + def basePath = new File(codequality, 'code_inspect_increment.gradle').path + apply from: "$basePath" + def pmdPath = new File(codequality, 'pmd.gradle').path + apply from: "$pmdPath" + def detektPath = new File(codequality, 'detekt.gradle').path + apply from: "$detektPath" + def codeInspectPath = new File(codequality, 'code_inspect.gradle').path + apply from: "$codeInspectPath" + } } task clean(type: Delete) { diff --git a/codequality/baseline.xml b/codequality/baseline.xml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/codequality/code_inspect.gradle b/codequality/code_inspect.gradle new file mode 100644 index 0000000000..2853f3d1f0 --- /dev/null +++ b/codequality/code_inspect.gradle @@ -0,0 +1,24 @@ +task runCodeInspect { + group = "codeInspect" + description = "静态代码检查,统一触发pmd detekt任务" +} + +project.afterEvaluate { + bindTask("pmd", "runCodeInspect") + bindTask("detekt", "runCodeInspect") +} + +/** + * 绑定任务 + * @param taskName 任务名称 + * @param targetTaskName 被绑定的任务名称 + * @param action taskName指定的任务执行完成后的回调 + */ +def bindTask(String taskName, String targetTaskName) { + def task = project.tasks.findByName(taskName) + if (task != null) { + logger.lifecycle("${task} will be run") + def targetTask = project.tasks.findByName(targetTaskName) + targetTask.finalizedBy(task) + } +} diff --git a/codequality/code_inspect_increment.gradle b/codequality/code_inspect_increment.gradle new file mode 100644 index 0000000000..5893cd5223 --- /dev/null +++ b/codequality/code_inspect_increment.gradle @@ -0,0 +1,187 @@ +ext { + //存储增量的Java文件,给pmd使用 + commitJavaFiles = new ArrayList() + //存储增量的kotlin文件,给detekt使用 + commitKotlinFiles = new ArrayList() + commitAuthor = "" + appVersionName = "" +} + +/** + * 增量开关, 给 lint 插件做增量扫描使用 + */ +def isIncrement = false + +/** + * 通过cmd命令获取结果值 + * @return string 结果值 + */ +def getResultFromCmd(String cmd) { + logger.lifecycle("${project.name} cmd:$cmd") + def out = new ByteArrayOutputStream() + if (System.properties['os.name'].toLowerCase().contains('windows')) { + project.exec { + ExecSpec execSpec -> + executable 'cmd' + args '/c', "$cmd" + standardOutput = out + }.assertNormalExitValue() + } else { + // jenkins 打包出异常,需要区分linux和macOS +// project.exec { +// ExecSpec execSpec -> +// executable 'bash' +// args '-c', "$cmd" +// standardOutput = out +// }.assertNormalExitValue() + } + return out.toString().trim() +} + +/** + * 获取提交作者 + * @return 提交作者 + */ +def getCommitAuthor() { + def commitAuthor = "" +// if (isCiServer()) { +// commitAuthor = "${System.env.CI_COMMIT_AUTHOR}" +// commitAuthor = commitAuthor.substring(0, commitAuthor.indexOf('<')).trim() +// } else { + commitAuthor = getResultFromCmd("git config --get user.name") +// } + return commitAuthor +} + +/** + * 获取提交 sha,用于 git diff 出增量文件,其它项目仓库,这个方法需要更改实现 + * @return 提交 sha + */ +def getCommitTargetSha() { + //目前这个仓库只能根据上一个merge节点,进行代码增量检测 + def commitTargetSha = getResultFromCmd("git log --max-count=1 --pretty=%H --merges") + return commitTargetSha +} + +/** + * 获取提交文件,只包含.java和.kt的文件 + * @return 文件相对路径数组 + */ +def getCommitFiles() { + def commitTargetSha = getCommitTargetSha() + def commitSha = getResultFromCmd("git log --max-count=1 --pretty=%H") + def commitAuthor = getCommitAuthor() + def cmd = "git log --name-only --author=$commitAuthor --pretty=\"format:\" $commitTargetSha..$commitSha" + def result = getResultFromCmd(cmd) + def projectStartPath = getProjectStartPath() + logger.lifecycle("projectStartPath=$projectStartPath") + if (result != null && result.trim().length() > 0) { + def files = result.readLines() + .findAll { it.startsWith("${projectStartPath}") && isFilePathValid(it) }.toArray() + return files.toUnique() + } + return null +} + +/** + * 判断文件路径是否合理 + * @param path 文件路径 + * @return true合理,否则不合理 + */ +static def isFilePathValid(String path) { + return (path.endsWith('.kt') || path.endsWith('.java') || path.endsWith('.xml') || path.endsWith('.png')) && !path.contains('/test/') && !path.contains('/androidTest/') && !path.contains('/generated/') +} + +/** + * 获取src目录下的所有文件,只包含.java和.kt的文件 + * @return 文件相对路径数组 + */ +def getAllFiles() { + def fileCollection = project.files("src") + if (fileCollection == null) { + return null + } + def files = fileCollection.asFileTree.getFiles() + def iterator = files.iterator() + def allFiles = new ArrayList(files.size()) + while (iterator.hasNext()) { + File file = iterator.next() + def path = getProjectStartPath() + File.separator + project.relativePath(file.path) + if (path != null && isFilePathValid(path)) { + allFiles.add(path) + } + } + return allFiles.toArray(new Object[allFiles.size()]) +} + +/** + * 获取项目名称,如gradleengine,framework/asmbase + * @return 项目名称 + */ +def getProjectStartPath() { + def projectRelativePath = project.relativePath(project.path).replaceAll(':', '/') + return projectRelativePath.substring(1) +} + +/** + * 存储提交文件 + * @param commitFiles 提交文件 + */ +def saveCommitFiles(Object[] commitFiles) { + //commitFiles 是对象 + def lintBuildDir = new File(project.buildDir, "code_inspect") + if (!lintBuildDir.exists()) { + lintBuildDir.mkdirs() + } + def changedFile = new File(lintBuildDir, "commit_files.txt") + def fileOutputStream = new FileOutputStream(changedFile) + def rootProjectPath = project.rootProject.rootDir.path + File.separator + //存储绝对路径 + for (int i = 0; i < commitFiles.length; i++) { + def commitFile = commitFiles[i].toString() + fileOutputStream.write((rootProjectPath + commitFile).getBytes("utf-8")) + if (i != commitFiles.length - 1) + fileOutputStream.write("\n".getBytes("utf-8")) + } + fileOutputStream.flush() + fileOutputStream.close() + logger.lifecycle("Save Commit Files In: ${changedFile.path} \n$commitFiles") +} + + +task runCodeInspectIncrement { +// group = "codeInspect" +// description = "存储增量文件" +// def commitJavaFiles = new ArrayList() +// def commitKotlinFiles = new ArrayList() +// +// def commitFiles = new Object[0] +// if (isIncrement) { +// commitFiles = getCommitFiles() +// } else { +// commitFiles = getAllFiles() +// } +// saveCommitFiles(commitFiles) +// if (commitFiles != null && commitFiles.length > 0) { +// def projectStartPath = getProjectStartPath() +// for (String s : commitFiles) { +// def commitFile = s.toString().trim() +// if (commitFile.endsWith('.kt')) { +// commitKotlinFiles.add(commitFile.substring(projectStartPath.length() + 1)) +// } else if (commitFile.endsWith('.java')) { +// commitJavaFiles.add(commitFile.substring(projectStartPath.length() + 1)) +// } +// } +// } +// if (!commitKotlinFiles.isEmpty()) { +// logger.lifecycle("${project.name} commitKotlinFiles:$commitKotlinFiles") +// } +// if (!commitJavaFiles.isEmpty()) { +// logger.lifecycle("${project.name} commitJavaFiles:$commitJavaFiles") +// } +// project.setProperty("commitKotlinFiles", commitKotlinFiles) +// project.setProperty("commitJavaFiles", commitJavaFiles) +// project.setProperty("commitAuthor", getCommitAuthor()) +} + + diff --git a/codequality/custom-pmd-ruleset.xml b/codequality/custom-pmd-ruleset.xml index 835269cdce..f8260e7b3f 100644 --- a/codequality/custom-pmd-ruleset.xml +++ b/codequality/custom-pmd-ruleset.xml @@ -9,6 +9,7 @@ + .*.kt .*/R.java .*/gen/.* .*Dagger*.* @@ -25,8 +26,6 @@ - - @@ -44,9 +43,7 @@ - - - + diff --git a/codequality/detekt.gradle b/codequality/detekt.gradle index e69de29bb2..bc451259e5 100644 --- a/codequality/detekt.gradle +++ b/codequality/detekt.gradle @@ -0,0 +1,54 @@ +apply plugin: 'io.gitlab.arturbosch.detekt' + +def configPath = rootProject.file("codequality").path + +detekt { + toolVersion = "1.15.0" + input = files( + "src/main/java", + "src/jinlvvan/java", + "src/driverm1/java" + ) + parallel = false + //将配置文件应用于detekt的默认配置文件之上 + buildUponDefaultConfig = false + //规则集 + config.setFrom("${configPath}/detekt.yml") + //指定基准文件。在detekt的后续运行中,所有发现都存储在此文件中 +// baseline = file("${configPath}/baseline.xml") + disableDefaultRuleSets = false + ignoreFailures = true + // Android: Don't create tasks for the specified build types (e.g. "release") +// ignoredBuildTypes = ["release"] + // Android: Don't create tasks for the specified build flavor (e.g. "production") +// ignoredFlavors = ["production"] + // Android: Don't create tasks for the specified build variants (e.g. "productionRelease") +// ignoredVariants = ["productionRelease"] +} + +tasks.detekt.jvmTarget = "1.8" + +tasks.named("detekt").configure { + reports { + // Enable/Disable HTML report (default: true) + html { + enabled = true + // Path where HTML report will be stored (default: `build/reports/detekt/detekt.html`) + destination = new File(new File("${project.rootProject.buildDir.path}/reports/detekt"), "${project.name}-detekt.html") + } + xml { + enabled = true + destination = new File(new File("${project.rootProject.buildDir.path}/reports/detekt"), "${project.name}-detekt.xml") + } + txt { + enabled = false +// destination = new File(new File("${project.rootProject.buildDir.path}/reports/detekt"), "${project.name}-detekt.txt") + } + sarif { + // Enable/Disable SARIF report (default: false) + enabled = true + // Path where SARIF report will be stored (default: `build/reports/detekt/detekt.sarif`) + destination = new File(new File("${project.rootProject.buildDir.path}/reports/detekt"), "${project.name}-detekt.sarif") + } + } +} diff --git a/codequality/detekt.yml b/codequality/detekt.yml new file mode 100644 index 0000000000..3128e1d0d2 --- /dev/null +++ b/codequality/detekt.yml @@ -0,0 +1,803 @@ +build: + excludeCorrectable: false + +config: + validation: true + warningsAsErrors: false +# checkExhaustiveness: false + # when writing own rules with new properties, exclude the property path e.g.: 'my_rule_set,.*>.*>[my_property]' + excludes: 'custom-checks.*' + +processors: + active: true + exclude: + - 'DetektProgressListener' + # - 'KtFileCountProcessor' + # - 'PackageCountProcessor' + # - 'ClassCountProcessor' + # - 'FunctionCountProcessor' + # - 'PropertyCountProcessor' + # - 'ProjectComplexityProcessor' + # - 'ProjectCognitiveComplexityProcessor' + # - 'ProjectLLOCProcessor' + # - 'ProjectCLOCProcessor' + # - 'ProjectLOCProcessor' + # - 'ProjectSLOCProcessor' + # - 'LicenseHeaderLoaderExtension' + +console-reports: + active: true + exclude: + - 'ProjectStatisticsReport' + - 'ComplexityReport' + - 'NotificationReport' + - 'FindingsReport' + - 'FileBasedFindingsReport' + # - 'LiteFindingsReport' + +output-reports: + active: true + exclude: + # - 'TxtOutputReport' + # - 'XmlOutputReport' + # - 'HtmlOutputReport' + # - 'MdOutputReport' + # - 'SarifOutputReport' + +comments: + active: false + AbsentOrWrongFileLicense: #报告每个没有所需许可证标头的Kotlin源文件 + active: false + licenseTemplateFile: 'license.template' +# licenseTemplateIsRegex: false + CommentOverPrivateFunction: #报告private函数的注释和文档 + active: false + CommentOverPrivateProperty: #报告私有属性的注释和文档 + active: false +# DeprecatedBlockTag: #报告注释中使用@deprecated块标记,可以使用@ReplaceWith annotations +# active: false + EndOfSentenceFormat: #验证KDoc注释的第一句话的结尾 + active: false + endOfSentenceFormat: '([.?!][ \t\n\r\f<])|([.?!:]$)' +# KDocReferencesNonPublicProperty: #报告任何引用类的非公共属性的KDoc注释 +# active: false + excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**'] +# OutdatedDocumentation: #报告任何具有与声明签名不匹配的KDoc的类、函数或构造函数 +# active: false +# matchTypeParameters: true +# matchDeclarationsOrder: true +# allowParamOnConstructorProperties: false + UndocumentedPublicClass: #报告没有所需文档的公共类、对象和接口 + active: false + excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**'] + searchInNestedClass: true + searchInInnerClass: true + searchInInnerObject: true + searchInInnerInterface: true +# searchInProtectedClass: false + UndocumentedPublicFunction: #报告任何没有所需文档的公共方法 + active: false + excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**'] +# searchProtectedFunction: false + UndocumentedPublicProperty: #报告任何没有所需文档的公共字段 + active: false + excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**'] +# searchProtectedProperty: false + +complexity: + active: true +# CognitiveComplexMethod: #报告复杂方法 +# active: false +# allowedComplexity: 15 + ComplexCondition: #报告复杂条件 + active: false +# allowedConditions: 4 + ComplexInterface: #包含太多函数和/或属性的复杂接口表明该接口一次处理太多事情。接口应该遵循单一责任原则,以鼓励该接口的实现不要同时处理太多事情 + active: false +# allowedDefinitions: 10 + includeStaticDeclarations: false + includePrivateDeclarations: false +# ignoreOverloaded: false + + #该规则使用McCabe的循环复杂性(MCC)度量来测量函数源代码中线性独立路径的数量{https://www.ndepend.com/docs/code-metrics#CC} +# CyclomaticComplexMethod: #复杂的方法很难理解和阅读。复杂方法的副作用可能并不明显。更喜欢把复杂的方法分解成更小的方法,这样更容易理解。较小的方法也可以命名得更清晰,从而提高代码的可读性。 +# active: true +# allowedComplexity: 14 +# ignoreSingleWhenExpression: false +# ignoreSimpleWhenEntries: false +# ignoreNestingFunctions: false +# ignoreLocalFunctions: false +# nestingFunctions: +# - 'also' +# - 'apply' +# - 'forEach' +# - 'isNotNull' +# - 'ifNull' +# - 'let' +# - 'run' +# - 'use' +# - 'with' + LabeledExpression: #报告已标记的表达式 + active: false + ignoredLabels: [] + LargeClass: #报告大型类 + active: true +# allowedLines: 600 + LongMethod: #报告大方法 + active: true +# allowedLines: 60 + LongParameterList: #报告参数超过特定阈值的函数和构造函数。 + active: true +# allowedFunctionParameters: 6 +# allowedConstructorParameters: 15 + ignoreDefaultParameters: false + ignoreDataClasses: true +# ignoreAnnotatedParameter: [] + MethodOverloading: #报告经常重载的方法 + active: false +# allowedOverloads: 6 + NamedArguments: #报告参数超过某个阈值且全部未命名的函数调用。参数过多的调用更难理解,因此命名参数会有所帮助。 + active: false +# allowedArguments: 3 +# ignoreArgumentsMatchingNames: false + NestedBlockDepth: #报告函数中嵌套深度过大 + active: true +# allowedDepth: 4 +# NestedScopeFunctions: #避免嵌套作用域函数 +# active: false +# allowedDepth: 1 +# functions: +# - 'kotlin.apply' +# - 'kotlin.run' +# - 'kotlin.with' +# - 'kotlin.let' +# - 'kotlin.also' + ReplaceSafeCallChainWithRun: #不可为null的类型上的安全调用链是冗余的,可以通过将冗余的安全调用封装在run{}块中来删除 {xxx?.run} + active: false + StringLiteralDuplication: #规则检测并报告重复的字符串文字 + active: false + excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**'] +# allowedDuplications: 2 + ignoreAnnotation: true +# allowedWithLengthLessThan: 5 + ignoreStringsRegex: '$^' + TooManyFunctions: #此规则报告包含过多函数的文件、类、接口、对象和枚举。每个元素可以配置有不同的阈值。 + active: true + excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**'] +# allowedFunctionsPerFile: 11 +# allowedFunctionsPerClass: 11 +# allowedFunctionsPerInterface: 11 +# allowedFunctionsPerObject: 11 +# allowedFunctionsPerEnum: 11 + ignoreDeprecated: false + ignorePrivate: false + ignoreOverridden: false + +#协程规则集分析代码中潜在的协程问题。 +coroutines: + active: true + GlobalCoroutineUsage: + active: false +# InjectDispatcher: #始终使用依赖项注入来注入调度器,以便于测试 +# active: true +# dispatcherNames: +# - 'IO' +# - 'Default' +# - 'Unconfined' + RedundantSuspendModifier: #suspend修饰符只能在需要的地方使用,否则该函数只能从其他挂起函数中使用。这不必要地限制了函数的使用,应该通过删除不需要的suspend修饰符来避免 + active: true +# SleepInsteadOfDelay: #报告Thread.sleep在挂起函数和协同程序块中的使用情况。由于协程的轻量级性质,一个线程可以同时包含多个协程,因此如果一个协程调用thread.sleep,它可能会停止执行不相关的协程,并导致不可预测的行为。 +# active: true +# SuspendFunSwallowedCancellation: #不应在runCatching的lambda块内部调用suspend函数 +# active: false +# SuspendFunWithCoroutineScopeReceiver: #将CoroutineScope用作接收器的挂起函数不应标记为挂起。 +# active: false + SuspendFunWithFlowReturnType: #从kotlin.coroutines.Flow返回Flow的函数不应标记为挂起,简单地调用一个返回Flow的函数的行为不应该有任何副作用。只有当针对返回的Flow开始收集时,才应该实际完成工作。 + active: true + +#空块规则集包含将报告应避免的空代码块的规则。 +empty-blocks: + active: true + EmptyCatchBlock: #报告空的捕获块。空的catch块表示异常被忽略而未被处理 + active: true + allowedExceptionNameRegex: '_|(ignore|expected).*' + EmptyClassBlock: #报告空类。空的代码块没有任何作用,应该删除 + active: true + EmptyDefaultConstructor: #报告空的默认构造函数。空的代码块没有任何作用,应该删除 + active: true + EmptyDoWhileBlock: #报告空的do/while循环。空的代码块没有任何作用,应该删除 + active: true + EmptyElseBlock: #报告为空的else块。空的代码块没有任何作用,应该删除 + active: true + EmptyFinallyBlock: #报告为空的finally块。空代码块没有任何作用,应该删除 + active: true + EmptyForBlock: #报告为空的for块。空代码块没有任何作用,应该删除 + active: true + EmptyFunctionBlock: #报告为空的方法块。空代码块没有任何作用,应该删除 + active: true + ignoreOverridden: false + EmptyIfBlock: #报告为空的if块。空代码块没有任何作用,应该删除 + active: true + EmptyInitBlock: #报告为空的init块。空代码块没有任何作用,应该删除 + active: true +# EmptyKotlinFile: #报告为空的kotlin文件。空代码块没有任何作用,应该删除 +# active: true + EmptySecondaryConstructor: #报告为空的辅助构造函数。空代码块没有任何作用,应该删除 + active: true + EmptyTryBlock: #报告为空的try块。空代码块没有任何作用,应该删除 + active: true + EmptyWhenBlock: #报告为空的when块。空代码块没有任何作用,应该删除 + active: true + EmptyWhileBlock: #报告为空的while块。空代码块没有任何作用,应该删除 + active: true + +exceptions: + active: true + ExceptionRaisedInUnexpectedLocation: #此规则报告从不应引发异常的函数。如果存在引发异常的函数,则会报告该函数。默认情况下,此规则检查toString、hashCode、equals和finalize。此规则可通过methodNames配置进行配置 + active: true + methodNames: + - 'equals' + - 'finalize' + - 'hashCode' + - 'toString' + InstanceOfCheckForException: #此规则报告通过is检查或强制转换检查异常类型的捕获块。代码应该使用多个catch块,而不是捕获一般的异常类型,然后检查特定的异常类型。然后,这些捕获块应该捕获特定的异常 + active: true + excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**'] + NotImplementedDeclaration: #此规则报告引发的所有NotImplementedError类型的异常。它还报告所有TODO(..)函数。这表明功能仍在开发中,无法正常工作。这两种声明都只能作为临时声明,不应放入生产环境中 + active: false +# ObjectExtendsThrowable: #避免抛出单例Throwable +# active: false + PrintStackTrace: #打印堆栈 + active: true + RethrowCaughtException: #重新抛出异常 + active: true + ReturnFromFinally: # finally return + active: true + ignoreLabeled: false + SwallowedException: #报告所有捕获异常且未正确传递(例如作为原因)到新引发异常的实例 + active: true + ignoredExceptionTypes: + - 'InterruptedException' + - 'MalformedURLException' + - 'NumberFormatException' + - 'ParseException' + allowedExceptionNameRegex: '_|(ignore|expected).*' + ThrowingExceptionFromFinally: #报告从finally块抛出异常 + active: true + ThrowingExceptionInMain: #报告在主方法中引发的所有异常。只有当异常可以由“更高”的函数处理时,才应该抛出异常 + active: false + ThrowingExceptionsWithoutMessageOrCause: #报告在没有参数或进一步描述的情况下抛出的所有异常 + active: true + excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**'] + exceptions: + - 'ArrayIndexOutOfBoundsException' + - 'Exception' + - 'IllegalArgumentException' + - 'IllegalMonitorStateException' + - 'IllegalStateException' + - 'IndexOutOfBoundsException' + - 'NullPointerException' + - 'RuntimeException' + - 'Throwable' + ThrowingNewInstanceOfSameException: #异常不应封装在同一异常类型中,然后重新抛出。更喜欢用更有意义的异常类型包装异常 + active: true + TooGenericExceptionCaught: #规则为类型过于通用的异常报告捕获块。最好捕获当前处理的案例的特定异常,避免扩大区域 + active: true + excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**'] + exceptionNames: + - 'ArrayIndexOutOfBoundsException' + - 'Error' +# - 'Exception' + - 'IllegalMonitorStateException' + - 'IndexOutOfBoundsException' + - 'NullPointerException' + - 'RuntimeException' +# - 'Throwable' + allowedExceptionNameRegex: '_|(ignore|expected).*' + TooGenericExceptionThrown: #规则报告类型过于通用的抛出异常。对于当前发生的情况,最好抛出特定的异常 + active: true + exceptionNames: + - 'Error' + - 'Exception' + - 'RuntimeException' + - 'Throwable' + +naming: + active: true +# BooleanPropertyNaming: +# active: false +# allowedPattern: '^(is|has|are)' + ClassNaming: + active: true + classPattern: '[A-Z][a-zA-Z0-9]*' + ConstructorParameterNaming: + active: true + parameterPattern: '[a-z][A-Za-z0-9]*' + privateParameterPattern: '[a-z][A-Za-z0-9]*' + excludeClassPattern: '$^' + EnumNaming: + active: true + enumEntryPattern: '[A-Z][_a-zA-Z0-9]*' + ForbiddenClassName: + active: false + forbiddenName: [] +# FunctionNameMaxLength: +# active: false +# maximumFunctionNameLength: 30 +# FunctionNameMinLength: +# active: false +# minimumFunctionNameLength: 3 + FunctionNaming: + active: true + excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**'] + functionPattern: '[a-z][a-zA-Z0-9]*' + excludeClassPattern: '$^' + FunctionParameterNaming: + active: true + parameterPattern: '[a-z][A-Za-z0-9]*' + excludeClassPattern: '$^' + InvalidPackageDeclaration: + active: true + rootPackage: '' +# requireRootInDeclaration: false +# LambdaParameterNaming: +# active: false +# parameterPattern: '[a-z][A-Za-z0-9]*|_' + MatchingDeclarationName: + active: true + mustBeFirst: true +# multiplatformTargets: +# - 'ios' +# - 'android' +# - 'js' +# - 'jvm' +# - 'native' +# - 'iosArm64' +# - 'iosX64' +# - 'macosX64' +# - 'mingwX64' +# - 'linuxX64' + MemberNameEqualsClassName: + active: true + ignoreOverridden: true +# NoNameShadowing: +# active: true + NonBooleanPropertyPrefixedWithIs: + active: false + ObjectPropertyNaming: + active: true + constantPattern: '[A-Za-z][_A-Za-z0-9]*' + propertyPattern: '[A-Za-z][_A-Za-z0-9]*' + privatePropertyPattern: '(_)?[A-Za-z][_A-Za-z0-9]*' + PackageNaming: + active: true + packagePattern: '[a-z]+(\.[a-z][A-Za-z0-9]*)*' + TopLevelPropertyNaming: + active: true + constantPattern: '[A-Z][_A-Z0-9]*' + propertyPattern: '[A-Za-z][_A-Za-z0-9]*' + privatePropertyPattern: '_?[A-Za-z][_A-Za-z0-9]*' + VariableMaxLength: + active: false + maximumVariableNameLength: 64 + VariableMinLength: + active: false + minimumVariableNameLength: 1 + VariableNaming: + active: true + variablePattern: '[a-z][A-Za-z0-9]*' + privateVariablePattern: '(_)?[a-z][A-Za-z0-9]*' + excludeClassPattern: '$^' + +performance: + active: true + ArrayPrimitive: #使用Array<Primitive>会导致隐含拳击和性能打击。更喜欢使用Kotlin专用的数组实例 + active: true +# CouldBeSequence: #由于每个调用都会创建一个新的列表,因此长链的收集操作将带来性能损失。请考虑使用序列 +# active: false +# allowedOperations: 2 + ForEachOnRange: #在一个范围内使用forEach可能会产生巨大的性能成本。因此,在大多数情况下,应该使用简单的for循环 (for example: {(1..10).forEach}) + active: true + excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**'] + SpreadOperator: #在大多数情况下,使用排列运算符会导致在调用方法之前创建数组的完整副本。这会带来非常高的性能损失 + active: true + excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**'] +# UnnecessaryPartOfBinaryExpression: #仅在表达式仅使用以下运算符之一||或&&的情况下验证二进制表达式 +# active: false + UnnecessaryTemporaryInstantiation: #将基元类型转换为字符串时,请避免使用临时对象。与直接使用基元类型相比,这会降低性能。若要解决此问题,请删除包装类型 + active: true + +#潜在错误规则集提供了检测潜在错误的规则。 +potential-bugs: + active: true +# AvoidReferentialEquality: #检查平等 +# active: true +# forbiddenTypePatterns: +# - 'kotlin.String' +# CastNullableToNonNullableType: #可空强转null +# active: false +# ignorePlatformTypes: true +# CastToNullableType: #将不安全的强制转换报告为可为null的类型。作为字符串?未填充,可能被误用为安全类型转换(如?字符串) +# active: false +# CharArrayToStringCall: +# active: false + Deprecation: + active: false +# DontDowncastCollectionTypes: #检查集合向下类型转换,建议方法转换({list as MutableList} convert : {list.toMutableList()}) +# active: false +# DoubleMutabilityForCollection: #MutableState可变var,不可变建议val +# active: true +# mutableTypes: +# - 'kotlin.collections.MutableList' +# - 'kotlin.collections.MutableMap' +# - 'kotlin.collections.MutableSet' +# - 'java.util.ArrayList' +# - 'java.util.LinkedHashSet' +# - 'java.util.HashSet' +# - 'java.util.LinkedHashMap' +# - 'java.util.HashMap' +# ElseCaseInsteadOfExhaustiveWhen: #当表达式包含else大小写时,即使它们有一组详尽的大小写,该规则也会报告 +# active: false +# ignoredSubjectTypes: [] + EqualsAlwaysReturnsTrueOrFalse: #报告始终返回true或false的equals()方法。 + active: true + EqualsWithHashCodeExist: #当一个类重写equals()方法时,它也应该重写hashCode()方法 + active: true +# ExitOutsideMain: #报告主函数之外使用System.exit()、Runtime.exit()、Runtime.holt()和Kotlin的exitProcess()时的使用情况 +# active: false + ExplicitGarbageCollectionCall: #报告所有显式触发垃圾回收器的调用。代码应该独立于垃圾收集器工作,并且不应该要求在某些时间点触发GC。 + active: true + HasPlatformType: #必须在公共API中显式声明平台类型,以防止出现意外错误 + active: true + + #此规则对使用@CheckReturnValue或@CheckResult注释的函数返回值但未以任何方式使用该值的实例发出警告Kotlin编译器通常不会对这种情况发出警告,所以这就是该规则背后的基本原理。 + IgnoredReturnValue: + active: false +# restrictToConfig: true + returnValueAnnotations: + - 'CheckResult' + - '*.CheckResult' + - 'CheckReturnValue' + - '*.CheckReturnValue' +# ignoreReturnValueAnnotations: +# - 'CanIgnoreReturnValue' +# - '*.CanIgnoreReturnValue' +# returnValueTypes: +# - 'kotlin.sequences.Sequence' +# - 'kotlinx.coroutines.flow.*Flow' +# - 'java.util.stream.*Stream' +# ignoreFunctionCall: [] + ImplicitDefaultLocale: #格式化字符串或执行大小写转换时,更喜欢显式传递[java.util.Locale],而不是使用隐式默认值 + active: false + ImplicitUnitReturnType: #使用表达式语句的函数具有隐式返回类型 + active: false + allowExplicitReturnType: true + InvalidRange: #报告为空的范围 + active: true + IteratorHasNextCallsNextMethod: #验证Iterator接口的实现。Iterator实现的hasNext()方法不应该有任何副作用 + active: true + IteratorNotThrowingNoSuchElementException: #报告在next()方法的实现中不抛出NoSuchElementException的Iterator接口的实现。当没有更多的元素要返回时,迭代器应该抛出NoSuchElementException + active: true + LateinitUsage: #报告Late-init修饰符的用法。 + active: false + excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**'] + ignoreOnClassesPattern: '' + MapGetWithNotNullAssertionOperator: #使用非null断言运算符报告对map访问方法map[]或map.get()的调用!!。这可能会导致NullPointerException + active: true +# MissingPackageDeclaration: #当缺少包声明时报告 +# active: false +# excludes: ['**/*.kts'] +# NullCheckOnMutableProperty: #报告对可变属性的null检查,因为这些属性的值可以在执行if语句后更改,从而使null检查无效 +# active: false + NullableToStringCall: #使用可能返回字符串“null”的可为null的接收器报告toString()调用 + active: false +# PropertyUsedBeforeDeclaration: #报告在声明之前使用的属性 +# active: false + UnconditionalJumpStatementInLoop: #报告包含跳转语句的循环,这些语句在任何条件下都会跳转 + active: false +# UnnecessaryNotNullCheck: #使用requireNotNull或checkNotNull报告用户可以删除的不必要的非null检查。 +# active: false + UnnecessaryNotNullOperator: #报告用户可以删除的不必要的非null运算符用法(!!) + active: true + UnnecessarySafeCall: #报告用户可以删除的不必要的非null运算符用法(?) + active: true +# UnreachableCatchBlock: #报告无法访问的捕获块。如果在上面的块中已经捕获到异常,则捕获块可能无法访问(Exception or Throwable)catch顺序 +# active: true + UnreachableCode: #报告无法访问的代码。代码可能无法访问,因为它位于return、throw、continue或break表达式后面 + active: true + UnsafeCallOnNullableType: #报告对可为null的类型的不安全调用 + active: true + excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**'] + UnsafeCast: #报告不安全的强制转换 + active: true +# UnusedUnaryOperator: #检测未使用的一元运算符 +# active: true + UselessPostfixExpression: #报告未使用因而不必要的后缀表达式(++,--) + active: true + WrongEqualsTypeParameter: #报告接受错误类型参数的equals()方法 + active: true + +#{link https://detekt.dev/docs/rules/style#explicititlambdaparameter} +style: + active: true +# AbstractClassCanBeConcreteClass: +# active: true +# AbstractClassCanBeInterface: +# active: true +# AlsoCouldBeApply: +# active: false +# BracesOnIfStatements: +# active: false +# singleLine: 'never' +# multiLine: 'always' +# BracesOnWhenStatements: +# active: false +# singleLine: 'necessary' +# multiLine: 'consistent' +# CanBeNonNullable: +# active: false +# CascadingCallWrapping: +# active: false +# includeElvis: true + ClassOrdering: + active: false + CollapsibleIfStatements: + active: false + DataClassContainsFunctions: + active: false +# conversionFunctionPrefix: +# - 'to' +# allowOperators: false + DataClassShouldBeImmutable: + active: false +# DestructuringDeclarationWithTooManyEntries: +# active: false +# maxDestructuringEntries: 3 +# DoubleNegativeLambda: +# active: false +# negativeFunctions: +# - reason: 'Use `takeIf` instead.' +# value: 'takeUnless' +# - reason: 'Use `all` instead.' +# value: 'none' +# negativeFunctionNameParts: +# - 'not' +# - 'non' + EqualsNullCall: + active: true + EqualsOnSignatureLine: + active: false + ExplicitCollectionElementAccessMethod: + active: false + ExplicitItLambdaParameter: + active: true + ExpressionBodySyntax: + active: false + includeLineWrapping: false +# ForbiddenAnnotation: +# active: false +# annotations: +# - reason: 'it is a java annotation. Use `Suppress` instead.' +# value: 'java.lang.SuppressWarnings' +# - reason: 'it is a java annotation. Use `kotlin.Deprecated` instead.' +# value: 'java.lang.Deprecated' +# - reason: 'it is a java annotation. Use `kotlin.annotation.MustBeDocumented` instead.' +# value: 'java.lang.annotation.Documented' +# - reason: 'it is a java annotation. Use `kotlin.annotation.Target` instead.' +# value: 'java.lang.annotation.Target' +# - reason: 'it is a java annotation. Use `kotlin.annotation.Retention` instead.' +# value: 'java.lang.annotation.Retention' +# - reason: 'it is a java annotation. Use `kotlin.annotation.Repeatable` instead.' +# value: 'java.lang.annotation.Repeatable' +# - reason: 'Kotlin does not support @Inherited annotation, see https://youtrack.jetbrains.com/issue/KT-22265' +# value: 'java.lang.annotation.Inherited' + ForbiddenComment: + active: false +# comments: +# - reason: 'Forbidden FIXME todo marker in comment, please fix the problem.' +# value: 'FIXME:' +# - reason: 'Forbidden STOPSHIP todo marker in comment, please address the problem before shipping the code.' +# value: 'STOPSHIP:' +# - reason: 'Forbidden TODO todo marker in comment, please do the changes.' +# value: 'TODO:' + allowedPatterns: '' + ForbiddenImport: + active: false + imports: [] + forbiddenPatterns: '' + ForbiddenMethodCall: + active: false + methods: + - reason: 'print does not allow you to configure the output stream. Use a logger instead.' + value: 'kotlin.io.print' + - reason: 'println does not allow you to configure the output stream. Use a logger instead.' + value: 'kotlin.io.println' +# ForbiddenSuppress: +# active: false +# rules: [] + ForbiddenVoid: + active: true + ignoreOverridden: false + ignoreUsageInGenerics: false + FunctionOnlyReturningConstant: + active: true + ignoreOverridableFunction: true +# ignoreActualFunction: true +# excludedFunctions: [] + LoopWithTooManyJumpStatements: + active: true + maxJumpCount: 1 + MagicNumber: + active: true + excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**', '**/*.kts'] + ignoreNumbers: + - '-1' + - '0' + - '1' + - '2' + ignoreHashCodeFunction: true + ignorePropertyDeclaration: false + ignoreLocalVariableDeclaration: false + ignoreConstantDeclaration: true + ignoreCompanionObjectPropertyDeclaration: true + ignoreAnnotation: false + ignoreNamedArgument: true + ignoreEnums: false + ignoreRanges: false +# ignoreExtensionFunctions: true + MandatoryBracesLoops: + active: false +# MaxChainedCallsOnSameLine: +# active: false +# maxChainedCalls: 5 + MaxLineLength: + active: true + maxLineLength: 120 + excludePackageStatements: true + excludeImportStatements: true + excludeCommentStatements: false +# excludeRawStrings: true +# MayBeConstant: +# active: true + ModifierOrder: + active: true +# MultilineLambdaItParameter: +# active: false +# MultilineRawStringIndentation: +# active: false +# indentSize: 4 +# trimmingMethods: +# - 'trimIndent' +# - 'trimMargin' + NestedClassesVisibility: #嵌套类从父类继承其可见性,通常用于实现嵌套在其中的类的本地功能。这些嵌套类的可见性不能高于其父类 + active: true + NewLineAtEndOfFile: + active: true + NoTabs: + active: false +# NullableBooleanCheck: +# active: false +# ObjectLiteralToLambda: #除了实现单个方法之外什么都不做的匿名对象可以用作lambda。 +# active: true + OptionalAbstractKeyword: + active: true + OptionalUnit: + active: false + PreferToOverPairSyntax: + active: false + ProtectedMemberInFinalClass: + active: true +# RangeUntilInsteadOfRangeTo: +# active: false + RedundantExplicitType: + active: false + RedundantHigherOrderMapUsage: + active: true + RedundantVisibilityModifierRule: + active: false +# ReturnCount: #在一个函数中有许多出口点可能会造成混乱,并影响代码的可读性。 +# active: false +# max: 2 +# excludedFunctions: +# - 'equals' +# excludeLabeled: false +# excludeReturnFromLambda: false +# excludeGuardClauses: false + SafeCast: + active: true + SerialVersionUIDInSerializableClass: + active: true +# SpacingAfterPackageDeclaration: +# active: false +# StringShouldBeRawString: +# active: false +# maxEscapedCharacterCount: 2 +# ignoredCharacters: [] + ThrowsCount: #限制函数中抛出语句的数量,函数应该有明确的throw语句 + active: true + max: 2 +# excludeGuardClauses: false + TrailingWhitespace: + active: false +# TrimMultilineRawString: +# active: false +# trimmingMethods: +# - 'trimIndent' +# - 'trimMargin' + UnderscoresInNumericLiterals: + active: false +# acceptableLength: 4 +# allowNonStandardGrouping: false + UnnecessaryAnnotationUseSiteTarget: + active: false + UnnecessaryApply: + active: true +# UnnecessaryBackticks: +# active: false +# UnnecessaryBracesAroundTrailingLambda: +# active: false +# UnnecessaryFilter: +# active: true + UnnecessaryInheritance: #此规则报告不必要的超类型 + active: true +# UnnecessaryInnerClass: +# active: false + UnnecessaryLet: + active: false + UnnecessaryParentheses: + active: false +# allowForUnclearPrecedence: false +# UnusedImport: +# active: false +# UnusedParameter: +# active: true +# allowedNames: 'ignored|expected' + UnusedPrivateClass: + active: true + UnusedPrivateMember: + active: true + allowedNames: '' +# UnusedPrivateProperty: +# active: true +# allowedNames: '_|ignored|expected|serialVersionUID' +# UseAnyOrNoneInsteadOfFind: +# active: true + UseArrayLiteralsInAnnotations: + active: true + UseCheckNotNull: + active: true + UseCheckOrError: + active: true + UseDataClass: + active: false + allowVars: false + UseEmptyCounterpart: + active: false + UseIfEmptyOrIfBlank: + active: false + UseIfInsteadOfWhen: + active: false +# ignoreWhenContainingVariableDeclaration: false +# UseIsNullOrEmpty: +# active: true +# UseLet: +# active: false +# UseOrEmpty: +# active: true + UseRequire: + active: true + UseRequireNotNull: + active: true +# UseSumOfInsteadOfFlatMapSize: +# active: false + UselessCallOnNotNull: + active: true + UtilityClassWithPublicConstructor: + active: true + VarCouldBeVal: + active: true +# ignoreLateinitVar: false + WildcardImport: + active: true + excludeImports: + - 'java.util.*' \ No newline at end of file diff --git a/codequality/pmd.gradle b/codequality/pmd.gradle index 3a7aa35a78..1e196ef19b 100644 --- a/codequality/pmd.gradle +++ b/codequality/pmd.gradle @@ -4,15 +4,15 @@ def pmdConfigPath = rootProject.file("codequality").path task pmd(type:Pmd){ //忽略失败,如果设置为true,检测出bug会停止task - ignoreFailures = false + ignoreFailures = true consoleOutput = true //filter路径 - ruleSetFiles = files("${pmdConfigPath}/custom-pmd-ruleset.xml") // todo 新增rules + ruleSetFiles = files("${pmdConfigPath}/custom-pmd-ruleset.xml") //新增rules ruleSets = [] //检测资源路径 source 'src/main/java','src/jinlvvan/java','src/driverm1/java' //排除项 - exclude '**/gen/**' + exclude '**/gen/**,*.kt' reports { xml.getRequired().set(false) diff --git a/config.gradle b/config.gradle index d5d4d49b8c..108f48c3d8 100644 --- a/config.gradle +++ b/config.gradle @@ -2,6 +2,12 @@ apply from: rootProject.file('gradle/ext.gradle') ext { time = "" kotlin_version = "1.6.21" + + //插件工具存放目录 + codequality = new File(projectDir, 'codequality') + //静态代码检查开关 + isCodeInspectEnable = true + dependencies = [ // androidx androidxappcompat : "androidx.appcompat:appcompat:1.3.1", @@ -224,14 +230,8 @@ ext { block_detector : "com.mogo.eagle.core.block:runtime:10.0.21" ] android = [ - launcherApplicationId : "com.mogo.launcher", - independentApplicationId : "com.mogo.launcher.app", fLauncherApplicationId : "com.mogo.launcher.f", - bydautoIndependentApplicationId: "com.mogo.launcher.app.bydauto", fLauncherAmapApiValue : "ace34d685cc04836c03905e4d1536125", - bydautoIndependentApiValue : "b1e1d527b02a493913c50985827c943a", - commonLauncherAmapApiValue : "a36b9f7b086fa3951bb35338a5a06dd3", - commonIndependentAmapApiValue : "1c3fbc5f5e183619ffb1e7bc01e6751f", compileSdkVersion : 33, buildToolsVersion : "29.0.2", minSdkVersion : 23, diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt index 48891547c5..0263d37654 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt @@ -17,6 +17,7 @@ import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_AD import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_VEHICLE import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_CAR_CONFIG import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_CAR_LOC +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_PARALLEL import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_P_ACTIONS import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_P_OBJECTS import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_STATUS_QUERY_RESP @@ -771,6 +772,12 @@ class MoGoAdasListenerImpl : OnAdasListener { * @param sysTime 当前时间戳 * @param parallelTaskProcessNotice 数据 */ + @ChainLog( + linkChainLog = CHAIN_TYPE_SOCKET_AUTOPILOT, + linkCode = CHAIN_SOURCE_ADAS, + nodeAliasCode = CHAIN_CODE_ADAS_PARALLEL, + paramIndexes = [0, 1, 2, 4] + ) override fun onParallelDrivingResp( header: MessagePad.Header, messageType: AiCloudTask.MessageType, diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/UpgradeAppNetWorkManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/UpgradeAppNetWorkManager.kt index 5938237bd3..7716227eb4 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/UpgradeAppNetWorkManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/UpgradeAppNetWorkManager.kt @@ -19,6 +19,8 @@ import com.mogo.eagle.core.network.* import com.mogo.eagle.core.network.utils.* import com.mogo.eagle.core.utilcode.download.Config import com.mogo.eagle.core.utilcode.kotlin.* +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import com.mogo.eagle.core.utilcode.mogo.getMisChannelCode import com.mogo.eagle.core.utilcode.mogo.logger.scene.* import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr import com.mogo.eagle.core.utilcode.util.* @@ -66,6 +68,7 @@ class UpgradeAppNetWorkManager private constructor() { "${ it.first } -> ${ it.second }" } } + itx["role"] = AppIdentityModeUtils.getMisChannelCode(FunctionBuildConfig.appIdentityMode) }) } Log.d(TAG, "getAppUpgradeInfo: -> records:" + records?.entries?.joinToString(",") { itx -> "key:${itx.key} -> value:[${itx.value.joinToString(",") { "${it.first},${it.second}" } }]"}) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ParallelDriveView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ParallelDriveView.kt index 84742609d3..6d3b9e4e4c 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ParallelDriveView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ParallelDriveView.kt @@ -93,16 +93,19 @@ class ParallelDriveView @JvmOverloads constructor( reqParaDrive() listener?.onReqClick() } + APP_REQUESTING -> { cancelParaDrive() Log.d(TAG, "Click-请求已取消") ToastUtils.showShort("请求已取消!") checkAvailableAndUpdateUI() } + AD_REQUESTING -> { Log.d(TAG, "Click-自动驾驶正在请求平行驾驶") ToastUtils.showShort("自动驾驶正在请求平行驾驶") } + UNAVAILABLE -> { Log.d(TAG, "Click-请P档驻车并松开油门刹车后请求") ToastUtils.showShort("请P档驻车并松开油门刹车后请求") @@ -118,41 +121,36 @@ class ParallelDriveView @JvmOverloads constructor( override fun onAutopilotStatusResponse(state: Int) { super.onAutopilotStatusResponse(state) - if (state != autopilotState) { - synchronized(this) { - when (state) { - 7 -> { - if (this.autopilotState != 7) { - isAutoDriving = false - Log.d(TAG, "onAutopilotStatusResponse-7") - ThreadUtils.runOnUiThread({ - updateUI(PARALLEL_DRIVING) - }, ThreadUtils.MODE.QUEUE) - } - } + when (state) { + 7 -> { + isAutoDriving = false + Log.d(TAG, "onAutopilotStatusResponse-7") + ThreadUtils.runOnUiThread({ + updateUI(PARALLEL_DRIVING) + }, ThreadUtils.MODE.QUEUE) + } - 2 -> { - if (this.autopilotState != state) { - isAutoDriving = true - Log.d(TAG, "onAutopilotStatusResponse-2") - } - } - - else -> { - if (this.autopilotState != state) { - isAutoDriving = false - Log.d(TAG, "onAutopilotStatusResponse-else") - if (this.autopilotState == 7) { - ThreadUtils.runOnUiThread({ - checkAvailableAndUpdateUI() - }, ThreadUtils.MODE.QUEUE) - } - } - } + 2 -> { + isAutoDriving = true + Log.d(TAG, "onAutopilotStatusResponse-2") + if (this.autopilotState == 7) { + ThreadUtils.runOnUiThread({ + checkAvailableAndUpdateUI() + }, ThreadUtils.MODE.QUEUE) + } + } + + else -> { + isAutoDriving = false + Log.d(TAG, "onAutopilotStatusResponse-else") + if (this.autopilotState == 7) { + ThreadUtils.runOnUiThread({ + checkAvailableAndUpdateUI() + }, ThreadUtils.MODE.QUEUE) } - this.autopilotState = state } } + this.autopilotState = state } override fun onParallelDrivingAbility( diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/chain/ChainConstant.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/chain/ChainConstant.kt index e393ead0aa..670ce998aa 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/chain/ChainConstant.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/chain/ChainConstant.kt @@ -70,6 +70,7 @@ class ChainConstant { const val CHAIN_CODE_ADAS_P_OBJECTS = "CHAIN_CODE_ADAS_P_OBJECTS" const val CHAIN_CODE_ADAS_P_ACTIONS = "CHAIN_CODE_ADAS_P_ACTIONS" const val CHAIN_CODE_ADAS_STATUS_QUERY_RESP = "CHAIN_CODE_ADAS_STATUS_QUERY_RESP" + const val CHAIN_CODE_ADAS_PARALLEL = "CHAIN_CODE_ADAS_PARALLEL" const val CHAIN_CODE_RECORD_NATIVE_LEAK = "CHAIN_CODE_RECORD_NATIVE_LEAK" const val CHAIN_CODE_RECORD_ANR = "CHAIN_CODE_RECORD_ANR" diff --git a/core/mogo-core-res/src/main/java/com/mogo/eagle/core/widget/media/video/NoticeSimpleVideoPlayer.kt b/core/mogo-core-res/src/main/java/com/mogo/eagle/core/widget/media/video/NoticeSimpleVideoPlayer.kt index 5aece47920..c89a65f341 100644 --- a/core/mogo-core-res/src/main/java/com/mogo/eagle/core/widget/media/video/NoticeSimpleVideoPlayer.kt +++ b/core/mogo-core-res/src/main/java/com/mogo/eagle/core/widget/media/video/NoticeSimpleVideoPlayer.kt @@ -1,5 +1,6 @@ package com.mogo.eagle.core.widget.media.video +import android.annotation.SuppressLint import android.content.Context import android.os.Build import android.util.AttributeSet @@ -212,6 +213,7 @@ class NoticeSimpleVideoPlayer : StandardGSYVideoPlayer { } } + @SuppressLint("ObsoleteSdkInt") override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { super.onSizeChanged(w, h, oldw, oldh) if (!mIfCurrentIsFullscreen) { diff --git a/foudations/mogo-commons/src/main/java/com/mogo/commons/koom/KoomInitTask.kt b/foudations/mogo-commons/src/main/java/com/mogo/commons/koom/KoomInitTask.kt index f442e7e573..1d0a46ea0c 100644 --- a/foudations/mogo-commons/src/main/java/com/mogo/commons/koom/KoomInitTask.kt +++ b/foudations/mogo-commons/src/main/java/com/mogo/commons/koom/KoomInitTask.kt @@ -1,5 +1,6 @@ package com.mogo.commons.koom +import android.annotation.SuppressLint import android.app.Application import android.os.Build import com.kwai.koom.base.CommonConfig @@ -8,6 +9,7 @@ import com.kwai.koom.base.MonitorManager object KoomInitTask : InitTask { + @SuppressLint("ObsoleteSdkInt") override fun init(application: Application) { val config = CommonConfig.Builder() .setApplication(application) // Set application diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index b850a7a179..1b511f962f 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Fri Sep 22 11:53:55 CST 2023 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-6.8-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-bin.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME diff --git a/libraries/mapmodule/src/main/aidl/com/autonavi/nge/dm/INavigationCore.aidl b/libraries/mapmodule/src/main/aidl/com/autonavi/nge/dm/INavigationCore.aidl deleted file mode 100644 index bea7074392..0000000000 --- a/libraries/mapmodule/src/main/aidl/com/autonavi/nge/dm/INavigationCore.aidl +++ /dev/null @@ -1,85 +0,0 @@ -//package com.autonavi.nge.dm; -// -//import android.os.IBinder; -//import com.autonavi.nge.guidance.RouteBook; -//import com.autonavi.nge.guidance.NaviInfo; -//import com.autonavi.nge.guidance.RouteImage; -//import com.autonavi.nge.guidance.LaneMask; -//import com.autonavi.nge.obj.Category; -//import com.autonavi.nge.obj.UpdateRegion; -//import com.autonavi.nge.trafficInfo.TMCID; -//import com.autonavi.nge.search.SPPoiItem; -//import com.autonavi.nge.search.SPCategories; -//import com.autonavi.nge.search.SPQuery; -//import com.autonavi.nge.search.SPSearchResult; -//import com.autonavi.nge.map.LonLat; -//import com.autonavi.nge.guidance.GuidanceStatListener; -//interface INavigationCore { -//// IBinder getHandler(); -// void Routing_SetOrigin(float lon, float lat, int sessionid); -// void Routing_SetDest(float lon, float lat, int sessionid); -// void Routing_GetRoute(int sessionid); -// boolean Routing_GetStatus(int sessionid); -// void Routing_Reset(int sessionid); -// void Routing_ClearTour(int sessionid); -// void RoutingSetCostModel(int model, int sessionid); -// void RoutingSetAvoidHighway(boolean isAvoidHighway, int sessionid); -// void RoutingSetAvoidToll(boolean isAvoidToll, int sessionid); -// -// void Traffic_Update(in List ids, int evt); -// void Traffic_UpdateByTile(int tile, in int[] ids, in byte[] speeds); -// void RoutingSetUseTraffic(boolean useTraffic, int sessionid); -// int RoutingGetRouteNum(int sessionid); -// int RoutingGetLength(int route, int sessionid); -// int RoutingGetSTime(int route, int sessionid); -// int RoutingGetDTime(int route, int sessionid); -// void addwaypoint(float lon, float lat, int heading, int sessionid); -// void clearwaypoints(int sessionid); -// -// void Guidance_UpdatePosition(float lon, float lat, float speed, float heading); -// void Guidance_StartNavi(int type); -// void Guidance_StopNavi(); -// void Guidance_SetSimSpeed(int speed); -// void Guidance_PauseSimNavi(); -// void Guidance_ResumeSimNavi(); -// RouteBook Guidance_RouteBook(int session,int start,int end); -// NaviInfo Guidance_NaviInfo(); -// NaviInfo GetNaviInfo(in byte[] datas); -// String Guidance_TTS(); -// RouteImage Guidance_Image(int imageUr,int imageBg,int imageArrow,int type); -// LaneMask Guidance_LaneMask(); -// double Guidance_getRoadAngle(); -// -// List Search_getSearchResult(int productId, double lon, double lat, double radius, int kindfilter, int updateregionId, String keyWord, int pageIdx, int searchType); -// SPPoiItem getPoiItemByPoiId(int poiId); -// List getPoiItemListByLonLat(int prodId, int urId, float lon, float lat, int pageCount, int pageIdx); -// List queryPoiItemByCircle(float centerLon,float centerLat,float radius); -// List queryPoiItemByRect(float topLeftLon,float topLeftLat,float bottomRightLon,float bottomRightLat); -// List queryPoiItemByPolygon(in List latLonPoints); -// List getFTSDataByDA( int urid, String keyStr, int keytype, int maxResultCount); -// List getInputResult(int productId, int updateregionId, String inputStr); -// List getInputResultByDA(); -// List getCatList(int urid); -// List getURListByDA(int prodid); -// void play(String text,boolean forcePlay); -// -// int RoutingGetSearchedCnt(int route, int sessionid); -// -// int [] getMemoryInfo(); -// -// void startServer(); -// -// void stopServer(); -// -// int getMDSVersion(); -// String getDataVersion(); -// String getCopyRight(); -// String getCompilerVersion(); -// -// void onGuidanceStatusChanged(int statCode, in byte[] datas); -// -// void setGuidanceStatListener(GuidanceStatListener listener); -// -// SPCategories getAllPoiCategories(int languageCode); -// List getPoiItemList(in SPQuery query); -//} diff --git a/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/inner/map/MapController.kt b/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/inner/map/MapController.kt index be37e8c49a..6087b945b2 100644 --- a/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/inner/map/MapController.kt +++ b/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/inner/map/MapController.kt @@ -1025,7 +1025,7 @@ class MapController(private var context: Context?, private val mMapView: IMapVie val data = polylineOptions.lonLats var polyline: Polyline? = null try { - if (data == null || data.size <= 1) { + if (data.size <= 1) { throw RuntimeException("传入的坐标数必须大于1") } val strOptionsJson = JSON.toJSONString(polylineOptions) @@ -1054,7 +1054,7 @@ class MapController(private var context: Context?, private val mMapView: IMapVie val colorSize = colorValues?.size ?: 0 var polyline: Polyline? = null try { - if (data == null || data.size <= 1) { + if (data.size <= 1) { throw RuntimeException("传入的坐标数必须大于1") } if (polylineOptions.getIsGradient() && colorSize > data.size) { @@ -1090,7 +1090,7 @@ class MapController(private var context: Context?, private val mMapView: IMapVie val data = deadZoneOptions.getPosition() var deadZone: DeadZone? = null try { - if (data == null || data.size <= 1) { + if (data.size <= 1) { throw RuntimeException("传入的坐标数必须大于1") } val strOptionsJson = JSON.toJSONString(deadZoneOptions)