Android Lintでコードの宣言順をチェッ クする / check-declaration-order-with-android-custom-lint
by
Yusuke Suzuki
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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