Upload
makoto-yamazaki
View
380
Download
1
Embed Size (px)
DESCRIPTION
Citation preview
カスタムLint Check
自己紹介
• 山﨑 誠(@zaki50)
• (株)ウフィカでAndroidアプリを作ってます
Android Lint
こんなやつ
カスタムLint Check
• チェック項目を自分で作れる
• 全プロジェクトに有効なものや
• ライブラリプロジェクトに紐付いたもの
たとえばAndroid の擬似乱数生成器の初期化バグ
http://android-developers.blogspot.jp/2013/08/some-securerandom-thoughts.html
に対処するライブラリプロジェクトを作ったら
適切にライブラリプロジェクトを使っているかチェックしてあげたい
一次情報
http://tools.android.com/tips/lint-custom-rules
ただし、現状では書いてある通りにやってもハマりどころ満載です
というわけで
ハマりどころを示しつつ具体的な手順を解説します
せっかくなので IntelliJで。
注: IntelliJ Ultimate Editionは某イケメンさんの会社で買えますhttp://samuraism.com/products/jetbrains/intellij-idea
この後出てくるコードはコチラ http://goo.gl/CfdHu9
実装: プロジェクト作成
まずは適当にプロジェクトとモジュールを作る
実装: 依存ライブラリ追加
• 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/
実装:IssueRegistryクラスpackage org.zakky.lint;public class MyIssueRegistry extends IssueRegistry { public MyIssueRegistry() { }
@Override public List<Issue> getIssues() { return Arrays.asList( PrngFixDetector.ISSUE ); }}
実装: MANIFEST.MF
• Lint-Registry: でIssueRegistryクラスを指定する
実装: 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インタフェースを実装する
実装: Scope• MANIFEST
• JAVA_FILE
• ALL_JAVA_FILES
• RESOURCE_FILE
• ALL_RESOURCE_FILE
• CLASS_FILE
• ALL_CLASS_FILES
• PROGUARD_FILE
• OTHER
排他
排他
排他
JavaScanner
XmlScanner
ClassScanner
OtherFileScanner
実装: Detectorクラス
ここには貼りきれないので IntelliJ の画面へ
実装: Jarを作る
• 依存ライブラリは含めない
• MANIFEST.MFを指定
• Build on make お勧め
配置全プロジェクトに適用
~/.android/lint/の下に適当な名前.jar として置く
ライブラリプロジェクトにひもづける場合
$Project/build/lint/の下にlint.jar という名前で置く
動作確認公式ドキュメントには
実際にはカスタムCheckは出てきません!←バグeclipse or gradleで確認しましょう
https://code.google.com/p/android/issues/detail?id=61242
実装例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のソースがある
実際に動かしてみます