Custom lintcheckをつくろう

  • 357 views
Uploaded on

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
357
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
0
Comments
0
Likes
1

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

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