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