Android Lintでコードの宣言順をチェッ クする / check-declaration-order-with-android-custom-lint
by
Yusuke Suzuki
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Slide 1
Slide 1 text
Android Lintでコードの宣言順をチェッ クする 2021/12/06(Mon) ZOZO Tech Talk #1 - Android 株式会社ZOZO ZOZOTOWN開発本部 ZOZOTOWNアプリ部 Androidブロック 鈴木 優佑 Copyright © ZOZO, Inc.
Slide 2
Slide 2 text
© ZOZO, Inc. 株式会社ZOZO ZOZOTOWN開発本部 ZOZOTOWNアプリ部 Androidブロック 鈴木 優佑 ● 2020年 新卒入社 ● 静岡県出身 実家はお茶農家🍵 2
Slide 3
Slide 3 text
© ZOZO, Inc. 3 課題
Slide 4
Slide 4 text
© ZOZO, Inc. 4 課題 コードの宣言順を意識して実装・レビューをしなければならない ● 宣言順が開発ガイドに定義されている ○ コードの保守性向上のため ○ 基本的にはKotlinのコーディング規約に準拠 ○ ZOZOTOWN固有のルールあり ● 開発ガイドを確認する必要があり、開発・レ ビューの負担につながる ● レビュー時に指摘漏れが発生する可能性が ある コードの宣言順についての開発ガイド 参考: Kotlinのコーディング規約: https://kotlinlang.org/docs/coding-conventions.html
Slide 5
Slide 5 text
© ZOZO, Inc. 5 課題 コードの宣言順を意識して実装・レビューをしなければならない ● 宣言順が開発ガイドに定義されている ○ コードの保守性向上のため ○ 基本的にはKotlinのコーディング規約に準拠 ○ ZOZOTOWN固有のコードあり ● 開発ガイドを確認する必要があり、開発・レ ビューの負担につながる ● レビュー時に指摘漏れが発生する可能性が ある コードの宣言順についての開発ガイド 参考: Kotlinのコーディング規約: https://kotlinlang.org/docs/coding-conventions.html
Slide 6
Slide 6 text
© ZOZO, Inc. 6 解決方法
Slide 7
Slide 7 text
© ZOZO, Inc. 7 Android Lintのカスタムルール作成により コードの宣言順をチェックする
Slide 8
Slide 8 text
© ZOZO, Inc. 8 Android Lintとは?
Slide 9
Slide 9 text
© ZOZO, Inc. Android Lintとは? ● Androidプロジェクト標準のLint ● Gradle, XML, Java, Kotlinなどのファイル解 析が可能 ● カスタムルールを作成することが可能 9 Android開発のための静的コード解析ツール Android StudioでのLint指摘の例
Slide 10
Slide 10 text
© ZOZO, Inc. 10 Android Lintの仕組み
Slide 11
Slide 11 text
© ZOZO, Inc. 11 Lintチェック ソースコード 抽象構文木 レポート Android Lintの仕組み 全体の流れ
Slide 12
Slide 12 text
© ZOZO, Inc. 12 Lintチェック ソースコード 抽象構文木 レポート Android Lintの仕組み 全体の流れ
Slide 13
Slide 13 text
© ZOZO, Inc. 13 PSI(Program Structure Interface) IntelliJ製のAST 言語ごとに異なるPSIが存在する 今回はこちらを使用する UAST(Universal AST) UASTをサポートする言語で共通の表現を提供 Java/Kotlin両方で同じ表現を使用できる Android Lintの仕組み 抽象構文木(AST; Abstract Syntax Tree) 通常の構文木から、意味的な情報のみを取り出したもの PSIの例 UASTの例
Slide 14
Slide 14 text
© ZOZO, Inc. 14 Lintチェック ソースコード 抽象構文木 レポート Android Lintの仕組み 全体の流れ
Slide 15
Slide 15 text
© ZOZO, Inc. 15 Registry Issueを登録 ServiceLoader経由でインスタンスを提供 Issue Lintチェックで特定される問題 問題の種類、深刻度などの情報が含まれる Detector ASTの情報をもとにコードを解析 Issueをレポート Android Lintの仕組み Lintチェック ASTの情報をもとに、コードの問題を検出する 依存関係
Slide 16
Slide 16 text
© ZOZO, Inc. 16 実装の概要
Slide 17
Slide 17 text
© ZOZO, Inc. 17 モジュールについて ← Detectorを定義 ← Registryを定義 ← Issueを定義 ↓ RegistryをLint APIへ提供
Slide 18
Slide 18 text
© ZOZO, Inc. 18 Registry: Issueを登録、ServiceLoader経由でインスタンスを提供
Slide 19
Slide 19 text
© ZOZO, Inc. 19 Registry: Issueを登録、ServiceLoader経由でインスタンスを提供 検出するIssueのリスト定義
Slide 20
Slide 20 text
© ZOZO, Inc. 20 Registry: Issueを登録、ServiceLoader経由でインスタンスを提供 Lint APIのバージョンを設定 基本的にはCURRENT_APIを設定
Slide 21
Slide 21 text
© ZOZO, Inc. 21 Registry: Issueを登録、ServiceLoader経由でインスタンスを提供 Lintの作成者情報を定義
Slide 22
Slide 22 text
© ZOZO, Inc. 22 Registry: Issueを登録、ServiceLoader経由でインスタンスを提供 ● resources/META-INF/services/ 配下にファイルを作成 ● Detectorを完全修飾名で定義 ● Lint APIからServiceLoaderを使用してインスタンス化される
Slide 23
Slide 23 text
© ZOZO, Inc. 23 Issue: Lintチェックで特定される問題
Slide 24
Slide 24 text
© ZOZO, Inc. 24 Issue: Lintチェックで特定される問題 IssueのID
Slide 25
Slide 25 text
© ZOZO, Inc. 25 Issue: Lintチェックで特定される問題 Issueの要約(通常5~6語以下)修正方法ではなく問題点を説明 宣言順が正しくない旨の文言を設定
Slide 26
Slide 26 text
© ZOZO, Inc. 26 Issue: Lintチェックで特定される問題 Issueの種類 開発者の生産性に関連するIssueのためPRODUCTIVITYを設定
Slide 27
Slide 27 text
© ZOZO, Inc. 27 Issue: Lintチェックで特定される問題 Issueの説明と修正方法 開発ガイドを参照し、宣言順の修正を促す文言を設定
Slide 28
Slide 28 text
© ZOZO, Inc. 28 Issue: Lintチェックで特定される問題 Issueの優先度(1〜10の範囲) Lintタスクによって検出した問題の並び替えに使用される 今回はサンプルコードと同じ6を設定
Slide 29
Slide 29 text
© ZOZO, Inc. 29 Issue: Lintチェックで特定される問題 Issueの深刻度(Fatal, Error, Warning, etc.) 問題を無視しても正しく動作するためWARNINGを設定
Slide 30
Slide 30 text
© ZOZO, Inc. 30 Issue: Lintチェックで特定される問題 DetectorとScopeを設定 Kotlinのファイルに対してチェックを行うためJAVA_FILE_SCOPEを設定
Slide 31
Slide 31 text
© ZOZO, Inc. 31 1. テストの作成 2. 正しい宣言順の定義 3. 宣言の種類を判別 4. 宣言の種類をModelへ変換 5. 宣言順が正しいかチェック 6. テストがPassすることを確認 Detector: ASTの情報をもとにコードを解析、Issueをレポート
Slide 32
Slide 32 text
© ZOZO, Inc. 32 1. テストの作成 2. 正しい宣言順の定義 3. 宣言の種類を判別 4. 宣言の種類をModelへ変換 5. 宣言順が正しいかチェック 6. テストがPassすることを確認 Detector: ASTの情報をもとにコードを解析、Issueをレポート
Slide 33
Slide 33 text
© ZOZO, Inc. 33 Detector: ASTの情報をもとにコードを解析、Issueをレポート テストの作成 ● Detector実装前にテストを作 成 ● Detectorが正しく警告をレ ポートするかのテスト Detectorのテストコード
Slide 34
Slide 34 text
© ZOZO, Inc. 34 1. テストの作成 2. 正しい宣言順の定義 3. 宣言の種類を判別 4. 宣言の種類をModelへ変換 5. 宣言順が正しいかチェック 6. テストがPassすることを確認 Detector: ASTの情報をもとにコードを解析、Issueをレポート
Slide 35
Slide 35 text
© ZOZO, Inc. 35 ● 開発ガイドに記載されている宣言順をenumで定義 ● ordinalにより順番の取得が可能 ○ 例: DeclarationType.VAL.ordinal -> 2 Detector: ASTの情報をもとにコードを解析、Issueをレポート 正しい宣言順の定義 宣言順を定義したenum
Slide 36
Slide 36 text
© ZOZO, Inc. 36 1. テストの作成 2. 正しい宣言順の定義 3. 宣言の種類を判別 4. 宣言の種類をModelへ変換 5. 宣言順が正しいかチェック 6. テストがPassすることを確認 Detector: ASTの情報をもとにコードを解析、Issueをレポート
Slide 37
Slide 37 text
© ZOZO, Inc. 37 Detector: ASTの情報をもとにコードを解析、Issueをレポート 宣言の種類を判別 PSIの情報をもとに、どの宣言の種類かを判別 宣言の種類の判別ロジック(全体像) メソッドの判別ロジック
Slide 38
Slide 38 text
© ZOZO, Inc. 38 1. テストの作成 2. 正しい宣言順の定義 3. 宣言の種類を判別 4. 宣言の種類をModelへ変換 5. 宣言順が正しいかチェック 6. テストがPassすることを確認 Detector: ASTの情報をもとにコードを解析、Issueをレポート
Slide 39
Slide 39 text
© ZOZO, Inc. 39 Detector: ASTの情報をもとにコードを解析、Issueをレポート 宣言の種類をModelへ変換 ● 決定した宣言の種類に関する情報をModel へmap ● List化 宣言の種類の情報を格納するクラス
Slide 40
Slide 40 text
© ZOZO, Inc. 40 1. テストの作成 2. 正しい宣言順の定義 3. 宣言の種類を判別 4. 宣言の種類をModelへ変換 5. 宣言順が正しいかチェック 6. テストがPassすることを確認 Detector: ASTの情報をもとにコードを解析、Issueをレポート
Slide 41
Slide 41 text
© ZOZO, Inc. 41 Detector: ASTの情報をもとにコードを解析、Issueをレポート 宣言順が正しいかチェック
Slide 42
Slide 42 text
© ZOZO, Inc. 42 Detector: ASTの情報をもとにコードを解析、Issueをレポート 宣言順が正しいかチェック list: 宣言の種類が格納されたList context: Issueレポート作成用のJavaContext
Slide 43
Slide 43 text
© ZOZO, Inc. 43 Detector: ASTの情報をもとにコードを解析、Issueをレポート 宣言順が正しいかチェック Listの先頭から2つずつ要素を取得
Slide 44
Slide 44 text
© ZOZO, Inc. 44 Detector: ASTの情報をもとにコードを解析、Issueをレポート 宣言順が正しいかチェック weight(正しい宣言順の番号)を比較 currentDeclarationのweight > nextDeclarationのweight → Issueをレポートする
Slide 45
Slide 45 text
© ZOZO, Inc. 45 1. テストの作成 2. 正しい宣言順の定義 3. 宣言の種類を判別 4. 宣言の種類をModelへ変換 5. 宣言順が正しいかチェック 6. テストがPassすることを確認 Detector: ASTの情報をもとにコードを解析、Issueをレポート
Slide 46
Slide 46 text
© ZOZO, Inc. 46 weight(正しい宣言順の番号)を比較 currentDeclarationのweight > nextDeclarationのweight → Issueをレポートする Android Studio上でDetectorのテストを実行した結果 テストがPassすることを確認 Detector: ASTの情報をもとにコードを解析、Issueをレポート
Slide 47
Slide 47 text
© ZOZO, Inc. 47 導入結果
Slide 48
Slide 48 text
© ZOZO, Inc. 48 導入結果 Android Studio上での警告例 GitHub上での指摘
Slide 49
Slide 49 text
© ZOZO, Inc. 49 宣言順の修正をしている様子 動画が再生されない場合: https://drive.google.com/file/d/1PSV0dAqGX9S_XmHMt2N12CFe3XJonSHF/view?usp=sharing
Slide 50
Slide 50 text
© ZOZO, Inc. 50 今後の展望
Slide 51
Slide 51 text
© ZOZO, Inc. 51 今後の展望 ● プロダクト(ZOZOTOWN Android)に導入する ○ 細かなプログラムの修正 ○ ビルドエラーの修正 ● 自動コード整形機能を導入する ○ Android Lint LintFixの追加 ○ Ktlintに移行してFormatterを作成
Slide 52
Slide 52 text
No content