Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Android Lintでコードの宣言順をチェッ クする / check-declaration-order-with-android-custom-lint

Android Lintでコードの宣言順をチェッ クする / check-declaration-order-with-android-custom-lint

2021/12/06(月)開催の「ZOZO Tech Talk #1 - Android」で発表したスライドです。
https://zozotech-inc.connpass.com/event/230668/

E04d03dc377d0d01f9271e9c178f058b?s=128

Yusuke Suzuki

December 06, 2021
Tweet

Other Decks in Programming

Transcript

  1. Android Lintでコードの宣言順をチェッ クする
 2021/12/06(Mon)
 ZOZO Tech Talk #1 - Android


    株式会社ZOZO
 ZOZOTOWN開発本部 ZOZOTOWNアプリ部 Androidブロック
 鈴木 優佑 Copyright © ZOZO, Inc.
  2. © ZOZO, Inc. 株式会社ZOZO
 ZOZOTOWN開発本部 ZOZOTOWNアプリ部
 Androidブロック 鈴木 優佑
 •

    2020年 新卒入社
 • 静岡県出身 実家はお茶農家🍵
 
 2
  3. © ZOZO, Inc. 3 課題


  4. © ZOZO, Inc. 4 課題
 コードの宣言順を意識して実装・レビューをしなければならない
 • 宣言順が開発ガイドに定義されている
 ◦ コードの保守性向上のため


    ◦ 基本的にはKotlinのコーディング規約に準拠
 ◦ ZOZOTOWN固有のルールあり
 
 • 開発ガイドを確認する必要があり、開発・レ ビューの負担につながる
 
 • レビュー時に指摘漏れが発生する可能性が ある
 
 
 コードの宣言順についての開発ガイド 参考: Kotlinのコーディング規約: https://kotlinlang.org/docs/coding-conventions.html
  5. © ZOZO, Inc. 5 課題
 コードの宣言順を意識して実装・レビューをしなければならない
 • 宣言順が開発ガイドに定義されている
 ◦ コードの保守性向上のため


    ◦ 基本的にはKotlinのコーディング規約に準拠
 ◦ ZOZOTOWN固有のコードあり
 
 • 開発ガイドを確認する必要があり、開発・レ ビューの負担につながる
 
 • レビュー時に指摘漏れが発生する可能性が ある
 
 
 コードの宣言順についての開発ガイド 参考: Kotlinのコーディング規約: https://kotlinlang.org/docs/coding-conventions.html
  6. © ZOZO, Inc. 6 解決方法


  7. © ZOZO, Inc. 7 
 Android Lintのカスタムルール作成により
 
 コードの宣言順をチェックする
 


  8. © ZOZO, Inc. 8 Android Lintとは?


  9. © ZOZO, Inc. Android Lintとは?
 • Androidプロジェクト標準のLint
 
 • Gradle,

    XML, Java, Kotlinなどのファイル解 析が可能
 
 • カスタムルールを作成することが可能
 9 Android開発のための静的コード解析ツール
 Android StudioでのLint指摘の例
  10. © ZOZO, Inc. 10 Android Lintの仕組み


  11. © ZOZO, Inc. 11 Lintチェック ソースコード 抽象構文木 レポート Android Lintの仕組み


    全体の流れ

  12. © ZOZO, Inc. 12 Lintチェック ソースコード 抽象構文木 レポート Android Lintの仕組み


    全体の流れ

  13. © ZOZO, Inc. 13 PSI(Program Structure Interface)
 IntelliJ製のAST
 言語ごとに異なるPSIが存在する
 今回はこちらを使用する


    
 UAST(Universal AST)
 UASTをサポートする言語で共通の表現を提供
 Java/Kotlin両方で同じ表現を使用できる
 
 Android Lintの仕組み
 抽象構文木(AST; Abstract Syntax Tree)
 通常の構文木から、意味的な情報のみを取り出したもの
 PSIの例 UASTの例
  14. © ZOZO, Inc. 14 Lintチェック ソースコード 抽象構文木 レポート Android Lintの仕組み


    全体の流れ

  15. © ZOZO, Inc. 15 Registry
 Issueを登録
 ServiceLoader経由でインスタンスを提供
 
 Issue
 Lintチェックで特定される問題


    問題の種類、深刻度などの情報が含まれる
 
 Detector
 ASTの情報をもとにコードを解析
 Issueをレポート
 Android Lintの仕組み
 Lintチェック
 ASTの情報をもとに、コードの問題を検出する
 依存関係
  16. © ZOZO, Inc. 16 実装の概要


  17. © ZOZO, Inc. 17 モジュールについて
 ← Detectorを定義 ← Registryを定義 ←

    Issueを定義 ↓ RegistryをLint APIへ提供
  18. © ZOZO, Inc. 18 Registry: Issueを登録、ServiceLoader経由でインスタンスを提供
 


  19. © ZOZO, Inc. 19 Registry: Issueを登録、ServiceLoader経由でインスタンスを提供
 
 検出するIssueのリスト定義

  20. © ZOZO, Inc. 20 Registry: Issueを登録、ServiceLoader経由でインスタンスを提供
 
 Lint APIのバージョンを設定 基本的にはCURRENT_APIを設定

  21. © ZOZO, Inc. 21 Registry: Issueを登録、ServiceLoader経由でインスタンスを提供
 
 Lintの作成者情報を定義

  22. © ZOZO, Inc. 22 Registry: Issueを登録、ServiceLoader経由でインスタンスを提供
 
 • resources/META-INF/services/ 配下にファイルを作成


    
 • Detectorを完全修飾名で定義
 
 • Lint APIからServiceLoaderを使用してインスタンス化される

  23. © ZOZO, Inc. 23 Issue: Lintチェックで特定される問題
 


  24. © ZOZO, Inc. 24 Issue: Lintチェックで特定される問題
 
 IssueのID

  25. © ZOZO, Inc. 25 Issue: Lintチェックで特定される問題
 
 Issueの要約(通常5~6語以下)修正方法ではなく問題点を説明 宣言順が正しくない旨の文言を設定

  26. © ZOZO, Inc. 26 Issue: Lintチェックで特定される問題
 
 Issueの種類 開発者の生産性に関連するIssueのためPRODUCTIVITYを設定

  27. © ZOZO, Inc. 27 Issue: Lintチェックで特定される問題
 
 Issueの説明と修正方法 開発ガイドを参照し、宣言順の修正を促す文言を設定

  28. © ZOZO, Inc. 28 Issue: Lintチェックで特定される問題
 
 Issueの優先度(1〜10の範囲) Lintタスクによって検出した問題の並び替えに使用される 今回はサンプルコードと同じ6を設定

  29. © ZOZO, Inc. 29 Issue: Lintチェックで特定される問題
 
 Issueの深刻度(Fatal, Error, Warning,

    etc.) 問題を無視しても正しく動作するためWARNINGを設定
  30. © ZOZO, Inc. 30 Issue: Lintチェックで特定される問題
 
 DetectorとScopeを設定 Kotlinのファイルに対してチェックを行うためJAVA_FILE_SCOPEを設定

  31. © ZOZO, Inc. 31 1. テストの作成 2. 正しい宣言順の定義 3. 宣言の種類を判別

    4. 宣言の種類をModelへ変換 5. 宣言順が正しいかチェック 6. テストがPassすることを確認 Detector: ASTの情報をもとにコードを解析、Issueをレポート

  32. © ZOZO, Inc. 32 1. テストの作成 2. 正しい宣言順の定義 3. 宣言の種類を判別

    4. 宣言の種類をModelへ変換 5. 宣言順が正しいかチェック 6. テストがPassすることを確認 Detector: ASTの情報をもとにコードを解析、Issueをレポート

  33. © ZOZO, Inc. 33 Detector: ASTの情報をもとにコードを解析、Issueをレポート
 テストの作成 • Detector実装前にテストを作 成


    
 • Detectorが正しく警告をレ ポートするかのテスト
 
 Detectorのテストコード
  34. © ZOZO, Inc. 34 1. テストの作成 2. 正しい宣言順の定義 3. 宣言の種類を判別

    4. 宣言の種類をModelへ変換 5. 宣言順が正しいかチェック 6. テストがPassすることを確認 Detector: ASTの情報をもとにコードを解析、Issueをレポート

  35. © ZOZO, Inc. 35 • 開発ガイドに記載されている宣言順をenumで定義
 
 • ordinalにより順番の取得が可能
 ◦

    例: DeclarationType.VAL.ordinal -> 2 
 Detector: ASTの情報をもとにコードを解析、Issueをレポート
 正しい宣言順の定義
 宣言順を定義したenum
  36. © ZOZO, Inc. 36 1. テストの作成 2. 正しい宣言順の定義 3. 宣言の種類を判別

    4. 宣言の種類をModelへ変換 5. 宣言順が正しいかチェック 6. テストがPassすることを確認 Detector: ASTの情報をもとにコードを解析、Issueをレポート

  37. © ZOZO, Inc. 37 Detector: ASTの情報をもとにコードを解析、Issueをレポート
 宣言の種類を判別
 PSIの情報をもとに、どの宣言の種類かを判別
 宣言の種類の判別ロジック(全体像) メソッドの判別ロジック

  38. © ZOZO, Inc. 38 1. テストの作成 2. 正しい宣言順の定義 3. 宣言の種類を判別

    4. 宣言の種類をModelへ変換 5. 宣言順が正しいかチェック 6. テストがPassすることを確認 Detector: ASTの情報をもとにコードを解析、Issueをレポート

  39. © ZOZO, Inc. 39 Detector: ASTの情報をもとにコードを解析、Issueをレポート
 宣言の種類をModelへ変換
 • 決定した宣言の種類に関する情報をModel へmap


    
 • List化
 宣言の種類の情報を格納するクラス
  40. © ZOZO, Inc. 40 1. テストの作成 2. 正しい宣言順の定義 3. 宣言の種類を判別

    4. 宣言の種類をModelへ変換 5. 宣言順が正しいかチェック 6. テストがPassすることを確認 Detector: ASTの情報をもとにコードを解析、Issueをレポート

  41. © ZOZO, Inc. 41 Detector: ASTの情報をもとにコードを解析、Issueをレポート
 宣言順が正しいかチェック

  42. © ZOZO, Inc. 42 Detector: ASTの情報をもとにコードを解析、Issueをレポート
 宣言順が正しいかチェック list: 宣言の種類が格納されたList context:

    Issueレポート作成用のJavaContext
  43. © ZOZO, Inc. 43 Detector: ASTの情報をもとにコードを解析、Issueをレポート
 宣言順が正しいかチェック Listの先頭から2つずつ要素を取得

  44. © ZOZO, Inc. 44 Detector: ASTの情報をもとにコードを解析、Issueをレポート
 宣言順が正しいかチェック weight(正しい宣言順の番号)を比較 currentDeclarationのweight >

    nextDeclarationのweight → Issueをレポートする
  45. © ZOZO, Inc. 45 1. テストの作成 2. 正しい宣言順の定義 3. 宣言の種類を判別

    4. 宣言の種類をModelへ変換 5. 宣言順が正しいかチェック 6. テストがPassすることを確認 Detector: ASTの情報をもとにコードを解析、Issueをレポート

  46. © ZOZO, Inc. 46 weight(正しい宣言順の番号)を比較 currentDeclarationのweight > nextDeclarationのweight → Issueをレポートする

    Android Studio上でDetectorのテストを実行した結果 テストがPassすることを確認 Detector: ASTの情報をもとにコードを解析、Issueをレポート

  47. © ZOZO, Inc. 47 導入結果


  48. © ZOZO, Inc. 48 導入結果
 Android Studio上での警告例 GitHub上での指摘

  49. © ZOZO, Inc. 49 宣言順の修正をしている様子
 動画が再生されない場合: https://drive.google.com/file/d/1PSV0dAqGX9S_XmHMt2N12CFe3XJonSHF/view?usp=sharing

  50. © ZOZO, Inc. 50 今後の展望


  51. © ZOZO, Inc. 51 今後の展望
 • プロダクト(ZOZOTOWN Android)に導入する ◦ 細かなプログラムの修正

    ◦ ビルドエラーの修正 • 自動コード整形機能を導入する ◦ Android Lint LintFixの追加 ◦ Ktlintに移行してFormatterを作成
  52. None