19
カスタムLint Check

Custom lintcheckをつくろう

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Custom lintcheckをつくろう

カスタムLint Check

Page 2: Custom lintcheckをつくろう

自己紹介

• 山﨑 誠(@zaki50)

• (株)ウフィカでAndroidアプリを作ってます

Page 3: Custom lintcheckをつくろう

Android Lint

こんなやつ

Page 4: Custom lintcheckをつくろう

カスタムLint Check

• チェック項目を自分で作れる

• 全プロジェクトに有効なものや

• ライブラリプロジェクトに紐付いたもの

Page 5: Custom lintcheckをつくろう

たとえばAndroid の擬似乱数生成器の初期化バグ

http://android-developers.blogspot.jp/2013/08/some-securerandom-thoughts.html

に対処するライブラリプロジェクトを作ったら

適切にライブラリプロジェクトを使っているかチェックしてあげたい

Page 6: Custom lintcheckをつくろう

一次情報

http://tools.android.com/tips/lint-custom-rules

ただし、現状では書いてある通りにやってもハマりどころ満載です

Page 7: Custom lintcheckをつくろう

というわけで

ハマりどころを示しつつ具体的な手順を解説します

せっかくなので IntelliJで。

注: IntelliJ Ultimate Editionは某イケメンさんの会社で買えますhttp://samuraism.com/products/jetbrains/intellij-idea

この後出てくるコードはコチラ http://goo.gl/CfdHu9

Page 8: Custom lintcheckをつくろう

実装: プロジェクト作成

まずは適当にプロジェクトとモジュールを作る

Page 9: Custom lintcheckをつくろう

実装: 依存ライブラリ追加

• lint-api.jar

• asm-4.0.jar

• asm-analysis-4.0.jar

• asm-tree-4.0.jar

• common.jar

• guava-13.0.1.jar

• layoutlib-api.jar

• lombok-ast.jar

$ANDROID_SDK_HOME/tools/lib/

Page 10: Custom lintcheckをつくろう

実装:IssueRegistryクラスpackage org.zakky.lint;public class MyIssueRegistry extends IssueRegistry { public MyIssueRegistry() { }

@Override public List<Issue> getIssues() { return Arrays.asList( PrngFixDetector.ISSUE ); }}

Page 11: Custom lintcheckをつくろう

実装: MANIFEST.MF

• Lint-Registry: でIssueRegistryクラスを指定する

Page 12: Custom lintcheckをつくろう

実装: Detectorクラスpackage org.zakky.lint;

public class PrngFixDetector extends ResourceXmlDetector implements Detector.ClassScanner {

public static final Issue ISSUE = Issue.create("PrngFix", //$NON-NLS-1$ "擬似乱数生成器の初期化バグへの対処を行っているかをチェックします", "擬似乱数生成器の初期化バグへの対処を行っているかをチェックします", "擬似乱数生成器の初期化バグへの対処を行っているかをチェックします", Category.USABILITY, 4, Severity.WARNING, new Implementation(PrngFixDetector.class, EnumSet.<Scope> of(Scope.MANIFEST, Scope.CLASS_FILE)));...

}

• Detectorクラスの中で ISSUE定数を定義する

• ISSUEでID、説明、チェック実装クラス、Scope等を定義する

• Scopeに合わせて適切なScannerインタフェースを実装する

Page 13: Custom lintcheckをつくろう

実装: Scope• MANIFEST

• JAVA_FILE

• ALL_JAVA_FILES

• RESOURCE_FILE

• ALL_RESOURCE_FILE

• CLASS_FILE

• ALL_CLASS_FILES

• PROGUARD_FILE

• OTHER

排他

排他

排他

JavaScanner

XmlScanner

ClassScanner

OtherFileScanner

Page 14: Custom lintcheckをつくろう

実装: Detectorクラス

ここには貼りきれないので IntelliJ の画面へ

Page 15: Custom lintcheckをつくろう

実装: Jarを作る

• 依存ライブラリは含めない

• MANIFEST.MFを指定

• Build on make お勧め

Page 16: Custom lintcheckをつくろう

配置全プロジェクトに適用

~/.android/lint/の下に適当な名前.jar として置く

ライブラリプロジェクトにひもづける場合

$Project/build/lint/の下にlint.jar という名前で置く

Page 17: Custom lintcheckをつくろう

動作確認公式ドキュメントには

実際にはカスタムCheckは出てきません!←バグeclipse or gradleで確認しましょう

https://code.google.com/p/android/issues/detail?id=61242

Page 18: Custom lintcheckをつくろう

実装例AOSPの既存のコードを見るのが一番

$ repo init -u https://android.googlesource.com/platform/manifest -g tools$ repo sync

repo コマンドについては http://source.android.com/source/

downloading.html を見てね

tools/base/lint/libs/lint-hecks に既存のDetectorがあるtools/base/lint/libs/lint-api の下にはAPIのソースがある

Page 19: Custom lintcheckをつくろう

実際に動かしてみます