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命令檢查代碼,這部份內容是咱們下一步要講解的內容。 若是個人文章對你有幫助或啓發,辛苦大佬們點個贊👍🏻,支持我一下。 若是有錯漏,歡迎大佬們指正,也歡迎你們一塊兒討論,感謝。

相關文章
相關標籤/搜索