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

Android Lintでコードの宣言順をチェッ クする / check-declaratio...

Yusuke Suzuki
December 06, 2021

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.
  2. © ZOZO, Inc. 株式会社ZOZO
 ZOZOTOWN開発本部 ZOZOTOWNアプリ部
 Androidブロック 鈴木 優佑
 •

    2020年 新卒入社
 • 静岡県出身 実家はお茶農家🍵
 
 2
  3. © ZOZO, Inc. 4 課題
 コードの宣言順を意識して実装・レビューをしなければならない
 • 宣言順が開発ガイドに定義されている
 ◦ コードの保守性向上のため


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


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

    XML, Java, Kotlinなどのファイル解 析が可能
 
 • カスタムルールを作成することが可能
 9 Android開発のための静的コード解析ツール
 Android StudioでのLint指摘の例
  6. © ZOZO, Inc. 13 PSI(Program Structure Interface)
 IntelliJ製のAST
 言語ごとに異なるPSIが存在する
 今回はこちらを使用する


    
 UAST(Universal AST)
 UASTをサポートする言語で共通の表現を提供
 Java/Kotlin両方で同じ表現を使用できる
 
 Android Lintの仕組み
 抽象構文木(AST; Abstract Syntax Tree)
 通常の構文木から、意味的な情報のみを取り出したもの
 PSIの例 UASTの例
  7. © ZOZO, Inc. 15 Registry
 Issueを登録
 ServiceLoader経由でインスタンスを提供
 
 Issue
 Lintチェックで特定される問題


    問題の種類、深刻度などの情報が含まれる
 
 Detector
 ASTの情報をもとにコードを解析
 Issueをレポート
 Android Lintの仕組み
 Lintチェック
 ASTの情報をもとに、コードの問題を検出する
 依存関係
  8. © ZOZO, Inc. 22 Registry: Issueを登録、ServiceLoader経由でインスタンスを提供
 
 • resources/META-INF/services/ 配下にファイルを作成


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

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

    etc.) 問題を無視しても正しく動作するためWARNINGを設定
  10. © ZOZO, Inc. 31 1. テストの作成 2. 正しい宣言順の定義 3. 宣言の種類を判別

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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