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/

Yusuke Suzuki

December 06, 2021
Tweet

More Decks by Yusuke Suzuki

Other Decks in Programming

Transcript

  1. Android Lintでコードの宣言順をチェッ
    クする

    2021/12/06(Mon)

    ZOZO Tech Talk #1 - Android

    株式会社ZOZO

    ZOZOTOWN開発本部 ZOZOTOWNアプリ部 Androidブロック

    鈴木 優佑
    Copyright © ZOZO, Inc.

    View Slide

  2. © ZOZO, Inc.
    株式会社ZOZO

    ZOZOTOWN開発本部 ZOZOTOWNアプリ部

    Androidブロック
    鈴木 優佑

    ● 2020年 新卒入社

    ● 静岡県出身 実家はお茶農家🍵


    2

    View Slide

  3. © ZOZO, Inc.
    3
    課題


    View Slide

  4. © ZOZO, Inc.
    4
    課題

    コードの宣言順を意識して実装・レビューをしなければならない

    ● 宣言順が開発ガイドに定義されている

    ○ コードの保守性向上のため

    ○ 基本的にはKotlinのコーディング規約に準拠

    ○ ZOZOTOWN固有のルールあり


    ● 開発ガイドを確認する必要があり、開発・レ
    ビューの負担につながる


    ● レビュー時に指摘漏れが発生する可能性が
    ある



    コードの宣言順についての開発ガイド
    参考: Kotlinのコーディング規約: https://kotlinlang.org/docs/coding-conventions.html

    View Slide

  5. © ZOZO, Inc.
    5
    課題

    コードの宣言順を意識して実装・レビューをしなければならない

    ● 宣言順が開発ガイドに定義されている

    ○ コードの保守性向上のため

    ○ 基本的にはKotlinのコーディング規約に準拠

    ○ ZOZOTOWN固有のコードあり


    ● 開発ガイドを確認する必要があり、開発・レ
    ビューの負担につながる


    ● レビュー時に指摘漏れが発生する可能性が
    ある



    コードの宣言順についての開発ガイド
    参考: Kotlinのコーディング規約: https://kotlinlang.org/docs/coding-conventions.html

    View Slide

  6. © ZOZO, Inc.
    6
    解決方法


    View Slide

  7. © ZOZO, Inc.
    7

    Android Lintのカスタムルール作成により


    コードの宣言順をチェックする


    View Slide

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


    View Slide

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

    ● Androidプロジェクト標準のLint


    ● Gradle, XML, Java, Kotlinなどのファイル解
    析が可能


    ● カスタムルールを作成することが可能

    9
    Android開発のための静的コード解析ツール

    Android StudioでのLint指摘の例

    View Slide

  10. © ZOZO, Inc.
    10
    Android Lintの仕組み


    View Slide

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

    全体の流れ


    View Slide

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

    全体の流れ


    View Slide

  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の例

    View Slide

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

    全体の流れ


    View Slide

  15. © ZOZO, Inc.
    15
    Registry

    Issueを登録

    ServiceLoader経由でインスタンスを提供


    Issue

    Lintチェックで特定される問題

    問題の種類、深刻度などの情報が含まれる


    Detector

    ASTの情報をもとにコードを解析

    Issueをレポート

    Android Lintの仕組み

    Lintチェック

    ASTの情報をもとに、コードの問題を検出する

    依存関係

    View Slide

  16. © ZOZO, Inc.
    16
    実装の概要


    View Slide

  17. © ZOZO, Inc.
    17
    モジュールについて

    ← Detectorを定義
    ← Registryを定義
    ← Issueを定義
    ↓ RegistryをLint APIへ提供

    View Slide

  18. © ZOZO, Inc.
    18
    Registry: Issueを登録、ServiceLoader経由でインスタンスを提供


    View Slide

  19. © ZOZO, Inc.
    19
    Registry: Issueを登録、ServiceLoader経由でインスタンスを提供


    検出するIssueのリスト定義

    View Slide

  20. © ZOZO, Inc.
    20
    Registry: Issueを登録、ServiceLoader経由でインスタンスを提供


    Lint APIのバージョンを設定
    基本的にはCURRENT_APIを設定

    View Slide

  21. © ZOZO, Inc.
    21
    Registry: Issueを登録、ServiceLoader経由でインスタンスを提供


    Lintの作成者情報を定義

    View Slide

  22. © ZOZO, Inc.
    22
    Registry: Issueを登録、ServiceLoader経由でインスタンスを提供


    ● resources/META-INF/services/ 配下にファイルを作成


    ● Detectorを完全修飾名で定義


    ● Lint APIからServiceLoaderを使用してインスタンス化される


    View Slide

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


    View Slide

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


    IssueのID

    View Slide

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


    Issueの要約(通常5~6語以下)修正方法ではなく問題点を説明
    宣言順が正しくない旨の文言を設定

    View Slide

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


    Issueの種類
    開発者の生産性に関連するIssueのためPRODUCTIVITYを設定

    View Slide

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


    Issueの説明と修正方法
    開発ガイドを参照し、宣言順の修正を促す文言を設定

    View Slide

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


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

    View Slide

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


    Issueの深刻度(Fatal, Error, Warning, etc.)
    問題を無視しても正しく動作するためWARNINGを設定

    View Slide

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


    DetectorとScopeを設定
    Kotlinのファイルに対してチェックを行うためJAVA_FILE_SCOPEを設定

    View Slide

  31. © ZOZO, Inc.
    31
    1. テストの作成
    2. 正しい宣言順の定義
    3. 宣言の種類を判別
    4. 宣言の種類をModelへ変換
    5. 宣言順が正しいかチェック
    6. テストがPassすることを確認
    Detector: ASTの情報をもとにコードを解析、Issueをレポート


    View Slide

  32. © ZOZO, Inc.
    32
    1. テストの作成
    2. 正しい宣言順の定義
    3. 宣言の種類を判別
    4. 宣言の種類をModelへ変換
    5. 宣言順が正しいかチェック
    6. テストがPassすることを確認
    Detector: ASTの情報をもとにコードを解析、Issueをレポート


    View Slide

  33. © ZOZO, Inc.
    33
    Detector: ASTの情報をもとにコードを解析、Issueをレポート

    テストの作成
    ● Detector実装前にテストを作
    成


    ● Detectorが正しく警告をレ
    ポートするかのテスト


    Detectorのテストコード

    View Slide

  34. © ZOZO, Inc.
    34
    1. テストの作成
    2. 正しい宣言順の定義
    3. 宣言の種類を判別
    4. 宣言の種類をModelへ変換
    5. 宣言順が正しいかチェック
    6. テストがPassすることを確認
    Detector: ASTの情報をもとにコードを解析、Issueをレポート


    View Slide

  35. © ZOZO, Inc.
    35
    ● 開発ガイドに記載されている宣言順をenumで定義


    ● ordinalにより順番の取得が可能

    ○ 例: DeclarationType.VAL.ordinal
    -> 2

    Detector: ASTの情報をもとにコードを解析、Issueをレポート

    正しい宣言順の定義

    宣言順を定義したenum

    View Slide

  36. © ZOZO, Inc.
    36
    1. テストの作成
    2. 正しい宣言順の定義
    3. 宣言の種類を判別
    4. 宣言の種類をModelへ変換
    5. 宣言順が正しいかチェック
    6. テストがPassすることを確認
    Detector: ASTの情報をもとにコードを解析、Issueをレポート


    View Slide

  37. © ZOZO, Inc.
    37
    Detector: ASTの情報をもとにコードを解析、Issueをレポート

    宣言の種類を判別

    PSIの情報をもとに、どの宣言の種類かを判別

    宣言の種類の判別ロジック(全体像) メソッドの判別ロジック

    View Slide

  38. © ZOZO, Inc.
    38
    1. テストの作成
    2. 正しい宣言順の定義
    3. 宣言の種類を判別
    4. 宣言の種類をModelへ変換
    5. 宣言順が正しいかチェック
    6. テストがPassすることを確認
    Detector: ASTの情報をもとにコードを解析、Issueをレポート


    View Slide

  39. © ZOZO, Inc.
    39
    Detector: ASTの情報をもとにコードを解析、Issueをレポート

    宣言の種類をModelへ変換

    ● 決定した宣言の種類に関する情報をModel
    へmap


    ● List化

    宣言の種類の情報を格納するクラス

    View Slide

  40. © ZOZO, Inc.
    40
    1. テストの作成
    2. 正しい宣言順の定義
    3. 宣言の種類を判別
    4. 宣言の種類をModelへ変換
    5. 宣言順が正しいかチェック
    6. テストがPassすることを確認
    Detector: ASTの情報をもとにコードを解析、Issueをレポート


    View Slide

  41. © ZOZO, Inc.
    41
    Detector: ASTの情報をもとにコードを解析、Issueをレポート

    宣言順が正しいかチェック

    View Slide

  42. © ZOZO, Inc.
    42
    Detector: ASTの情報をもとにコードを解析、Issueをレポート

    宣言順が正しいかチェック
    list: 宣言の種類が格納されたList
    context: Issueレポート作成用のJavaContext

    View Slide

  43. © ZOZO, Inc.
    43
    Detector: ASTの情報をもとにコードを解析、Issueをレポート

    宣言順が正しいかチェック
    Listの先頭から2つずつ要素を取得

    View Slide

  44. © ZOZO, Inc.
    44
    Detector: ASTの情報をもとにコードを解析、Issueをレポート

    宣言順が正しいかチェック
    weight(正しい宣言順の番号)を比較
    currentDeclarationのweight > nextDeclarationのweight
    → Issueをレポートする

    View Slide

  45. © ZOZO, Inc.
    45
    1. テストの作成
    2. 正しい宣言順の定義
    3. 宣言の種類を判別
    4. 宣言の種類をModelへ変換
    5. 宣言順が正しいかチェック
    6. テストがPassすることを確認
    Detector: ASTの情報をもとにコードを解析、Issueをレポート


    View Slide

  46. © ZOZO, Inc.
    46
    weight(正しい宣言順の番号)を比較
    currentDeclarationのweight > nextDeclarationのweight
    → Issueをレポートする
    Android Studio上でDetectorのテストを実行した結果
    テストがPassすることを確認
    Detector: ASTの情報をもとにコードを解析、Issueをレポート


    View Slide

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


    View Slide

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

    Android Studio上での警告例 GitHub上での指摘

    View Slide

  49. © ZOZO, Inc.
    49
    宣言順の修正をしている様子

    動画が再生されない場合: https://drive.google.com/file/d/1PSV0dAqGX9S_XmHMt2N12CFe3XJonSHF/view?usp=sharing

    View Slide

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


    View Slide

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

    ● プロダクト(ZOZOTOWN Android)に導入する
    ○ 細かなプログラムの修正
    ○ ビルドエラーの修正
    ● 自動コード整形機能を導入する
    ○ Android Lint LintFixの追加
    ○ Ktlintに移行してFormatterを作成

    View Slide

  52. View Slide