Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.
カスタムLint Check
自己紹介

• 山

誠(@zaki50)

• (株)ウフィカでAndroidアプリを作ってます
Android Lint
こんなやつ
カスタムLint Check
• チェック項目を自分で作れる
• 全プロジェクトに有効なものや
• ライブラリプロジェクトに紐付いたもの
たとえば
Android の擬似乱数生成器の初期化バグ
http://android-developers.blogspot.jp/2013/08/somesecurerandom-thoughts.html
に対処するライブラリプロジェクトを...
一次情報
http://tools.android.com/tips/lint-custom-rules

ただし、現状では書いてある通りにやっても
ハマりどころ満載です
というわけで
ハマりどころを示しつつ具体的な手順を解説します
せっかくなので IntelliJで。
注: IntelliJ Ultimate Editionは某イケメンさんの会社で買えます
http://samuraism.com/produc...
実装: プロジェクト作成
まずは適当にプロジェクトとモジュールを作る
実装: 依存ライブラリ追加
$ANDROID_SDK_HOME/tools/lib/
• lint-api.jar
• asm-4.0.jar
• asm-analysis-4.0.jar
• asm-tree-4.0.jar
• common...
実装:IssueRegistryクラス
package org.zakky.lint;
public class MyIssueRegistry
extends IssueRegistry {
public MyIssueRegistry() ...
実装: MANIFEST.MF
• Lint-Registry: でIssueRegistryクラスを
指定する
実装: Detectorクラス
package org.zakky.lint;
public class PrngFixDetector extends ResourceXmlDetector implements
Detector.Class...
実装: Scope
• MANIFEST
• JAVA_FILE

排他

JavaScanner

• ALL_JAVA_FILES
• RESOURCE_FILE

排他

• ALL_RESOURCE_FILE
• CLASS_FILE
...
実装: 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=612...
実装例
AOSPの既存のコードを見るのが一番
$ repo init -u https://android.googlesource.com/platform/manifest -g tools
$ repo sync
tools/base/l...
実際に動かしてみます
Nächste SlideShare
Wird geladen in …5
×

Custom lintcheckをつくろう

1.077 Aufrufe

Veröffentlicht am

  • Als Erste(r) kommentieren

Custom lintcheckをつくろう

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

×