Android静态代码扫描实践—一、静态代码扫描概述与初识ktlint

「本文已参与好文召集令活动,点击查看:后端、大前端双赛道投稿,2万元奖池等你挑战!html

随着技术团队的扩大与开发人员的增加,软件开发必然要实现工程化,所以用静态扫描实现的代码规范管理以及与Gitlab分支管理结合的实践流程就出现了。前端

背景与问题

多人协做的项目中,基于代码稳定性以及代码安全(不安全的API使用和逻辑编写)的考虑,必然要出现团队内的代码风格规范,而为了解决“代码编写听从风格规范全凭开发人员自觉、缺少提示、检查和卡点机制”这一问题,静态代码扫描检查在团队协做的软件工程项目是必不可缺的一环。android

问题举例

  • 日志打印 必须使用统一封装的打印方法,禁止使用System.out.print\android.util.Log,方便release版本禁止在 logcat 输出信息出现数据泄露的状况。git

    错误示范github

    class MainActivity : AppCompatActivity() {
    
      override fun onCreate(savedInstanceState: Bundle?) {
          super.onCreate(savedInstanceState)
          // ......
          Log.d("writelog", "start activity")
          // ......
      }
    
    }
    复制代码
  • setHostnameVerifier 方法调用 禁止调用 setHostnameVerifier 方法设置 ALLOW_ALL_HOSTNAME_VERIFIER 属性,以免中间人攻击劫持,应用使用 STRICT_HOSTNAME_VERIFIER 属性。后端

    错误示范安全

    class MainActivity : AppCompatActivity() {
    
      override fun onCreate(savedInstanceState: Bundle?) {
          super.onCreate(savedInstanceState)
          // ......
          val schemeregistry = SchemeRegistry()
          val sslsocketfactory = SSLSocketFactory.getSocketFactory()
          // set STRICT_HOSTNAME_VERIFIER
          sslsocketfactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER)
          // ......
      }
    
    }
    复制代码
  • 还有诸如必须给继承Activity、Fragment的文件添加注释方便理解;Activity必须继承Activity基础类;Fragment必须继承Fragment基础类等团队开发规范问题。markdown

静态代码扫描工具的选择

因为咱们团队开发已实现全Kotlin化,Kotlin经常使用的静态代码扫描方案有Detekt以及ktlintapp

对好比下: 对比socket

因为我这边并不须要分析潜在性能与bug问题的功能,以及基于轻量化的目的,采用的是Kotlin官方推荐的ktlint工具。

ktlint的集成与使用

咱们采起了项目中使用Gradle集成ktlint的方式来集成ktlint规则,可参考ktlint主页

在项目根目录下的app目录下的build.gradle添加以下配置

...
  configurations {
    ktlint
  }
  ...
  dependencies {
    ...
    ktlint("com.pinterest:ktlint:0.41.0") {
        attributes {
            attribute(Bundling.BUNDLING_ATTRIBUTE, getObjects().named(Bundling, Bundling.EXTERNAL))
        }
    }
    ...
  }
  ...
  task ktlint(type: JavaExec, group: "verification") {
    description = "Check Kotlin code style."
    classpath = configurations.ktlint
    main = "com.pinterest.ktlint.Main"
    args "-a", "src/**/*.kt", "--reporter=html,output=${buildDir}/ktlint.html"
  }
  check.dependsOn ktlint

  task ktlintFormat(type: JavaExec, group: "formatting") {
    description = "Fix Kotlin code style deviations."
    classpath = configurations.ktlint
    main = "com.pinterest.ktlint.Main"
    args "-F", "src/**/*.kt"
  }
复制代码

使用方法运行gradle任务执行

  • 静态检查代码是否符合规范

    Mac或者Lunix系统执行:./gradlew ktlint;
    window系统执行:gradlew ktlint;
    会执行代码检查任务,而后会在./app/build/文件夹生成ktlint.html报告。
    html报告

  • 自动修改代码符合规范

    Mac或者Lunix系统执行:./gradlew ktlintFormat;
    window系统执行:gradlew ktlintFormat;
    会执行自动修改代码符合规范任务。

总结

经过上文,咱们理解了为什么要进行静态代码扫描以及使用ktlint对项目代码进行扫描检查是否符合Kotlin官方代码风格规范,固然在实际实践中要如何限制团队成员遵照规范,毕竟不可能强行要求团队成员每次都使用gradle命令检查代码,这部份内容是咱们下一步要讲解的内容。 若是个人文章对你有帮助或启发,辛苦大佬们点个赞👍🏻,支持我一下。 若是有错漏,欢迎大佬们指正,也欢迎你们一块儿讨论,感谢。

相关文章
相关标签/搜索