SlideShare une entreprise Scribd logo
1  sur  19
Télécharger pour lire hors ligne
カスタム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/products/jetbrains/intellij-idea

この後出てくるコードはコチラ http://goo.gl/CfdHu9
実装: プロジェクト作成
まずは適当にプロジェクトとモジュールを作る
実装: 依存ライブラリ追加
$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
実装: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

排他

JavaScanner

• ALL_JAVA_FILES
• RESOURCE_FILE

排他

• ALL_RESOURCE_FILE
• CLASS_FILE

排他

• ALL_CLASS_FILES

XmlScanner
ClassScanner

• PROGUARD_FILE
• OTHER

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
tools/base/lint/libs/lint-hecks に既存のDetectorがある
tools/base/lint/libs/lint-api の下にはAPIのソースがある

repo コマンドについては http://source.android.com/source/
downloading.html を見てね
実際に動かしてみます

Contenu connexe

Tendances

Xcode 7におけるUIテストとカバレジ計測 #yidev 第20回勉強会
Xcode 7におけるUIテストとカバレジ計測 #yidev 第20回勉強会Xcode 7におけるUIテストとカバレジ計測 #yidev 第20回勉強会
Xcode 7におけるUIテストとカバレジ計測 #yidev 第20回勉強会
Koji Hasegawa
 
スマートフォンアプリ開発と自動化 〜なじむ。実に!なじむぞ!〜 #AsianAA
スマートフォンアプリ開発と自動化 〜なじむ。実に!なじむぞ!〜 #AsianAAスマートフォンアプリ開発と自動化 〜なじむ。実に!なじむぞ!〜 #AsianAA
スマートフォンアプリ開発と自動化 〜なじむ。実に!なじむぞ!〜 #AsianAA
Koji Hasegawa
 
福井スマートフォンハッカソン Titanium Mobileの紹介
福井スマートフォンハッカソン Titanium Mobileの紹介福井スマートフォンハッカソン Titanium Mobileの紹介
福井スマートフォンハッカソン Titanium Mobileの紹介
Mori Shingo
 

Tendances (20)

Xcode 7におけるUIテストとカバレジ計測 #yidev 第20回勉強会
Xcode 7におけるUIテストとカバレジ計測 #yidev 第20回勉強会Xcode 7におけるUIテストとカバレジ計測 #yidev 第20回勉強会
Xcode 7におけるUIテストとカバレジ計測 #yidev 第20回勉強会
 
Screenshots Test spoon + espresso
Screenshots Test spoon + espressoScreenshots Test spoon + espresso
Screenshots Test spoon + espresso
 
Wantedlyのテスト事情
Wantedlyのテスト事情Wantedlyのテスト事情
Wantedlyのテスト事情
 
第1回ROS勉強会発表資料 ROS+Gazeboではじめるロボットシミュレーション
第1回ROS勉強会発表資料 ROS+Gazeboではじめるロボットシミュレーション第1回ROS勉強会発表資料 ROS+Gazeboではじめるロボットシミュレーション
第1回ROS勉強会発表資料 ROS+Gazeboではじめるロボットシミュレーション
 
UnitTest
UnitTestUnitTest
UnitTest
 
[Android] モジュール管理で ビルド高速化!
[Android] モジュール管理で ビルド高速化!	[Android] モジュール管理で ビルド高速化!
[Android] モジュール管理で ビルド高速化!
 
Hello. Continuous Integration
Hello. Continuous IntegrationHello. Continuous Integration
Hello. Continuous Integration
 
スマートフォンアプリ開発と自動化 〜なじむ。実に!なじむぞ!〜 #AsianAA
スマートフォンアプリ開発と自動化 〜なじむ。実に!なじむぞ!〜 #AsianAAスマートフォンアプリ開発と自動化 〜なじむ。実に!なじむぞ!〜 #AsianAA
スマートフォンアプリ開発と自動化 〜なじむ。実に!なじむぞ!〜 #AsianAA
 
iOSアプリ UIテスト自動化入門
iOSアプリ UIテスト自動化入門iOSアプリ UIテスト自動化入門
iOSアプリ UIテスト自動化入門
 
Robotium を使った UI テスト
Robotium を使った UI テストRobotium を使った UI テスト
Robotium を使った UI テスト
 
Infragistics Web Day 2017 - 継続的な開発を支える テスト自動化技術
Infragistics Web Day 2017 - 継続的な開発を支える テスト自動化技術Infragistics Web Day 2017 - 継続的な開発を支える テスト自動化技術
Infragistics Web Day 2017 - 継続的な開発を支える テスト自動化技術
 
Google Codelabsをやってみた
Google CodelabsをやってみたGoogle Codelabsをやってみた
Google Codelabsをやってみた
 
Android Lintを覚えてベテラン開発者に追いつこう #ndsmeetup
Android Lintを覚えてベテラン開発者に追いつこう #ndsmeetupAndroid Lintを覚えてベテラン開発者に追いつこう #ndsmeetup
Android Lintを覚えてベテラン開発者に追いつこう #ndsmeetup
 
第3回Ques ここからはじめる!Androidアプリのテスト自動化
第3回Ques ここからはじめる!Androidアプリのテスト自動化第3回Ques ここからはじめる!Androidアプリのテスト自動化
第3回Ques ここからはじめる!Androidアプリのテスト自動化
 
RESTful API (JAX-RS) 書くだけで仕様書も 自動で作られていく話 with MicroProfile Open API
RESTful API (JAX-RS) 書くだけで仕様書も自動で作られていく話 with MicroProfile Open APIRESTful API (JAX-RS) 書くだけで仕様書も自動で作られていく話 with MicroProfile Open API
RESTful API (JAX-RS) 書くだけで仕様書も 自動で作られていく話 with MicroProfile Open API
 
はじめてAnsibleのバグ修正に協力してみた
はじめてAnsibleのバグ修正に協力してみたはじめてAnsibleのバグ修正に協力してみた
はじめてAnsibleのバグ修正に協力してみた
 
Robotium を使った UI テストとレイアウト確認の効率化
Robotium を使った UI テストとレイアウト確認の効率化Robotium を使った UI テストとレイアウト確認の効率化
Robotium を使った UI テストとレイアウト確認の効率化
 
Device Farm を使ったスマホアプリの自動テスト
Device Farm を使ったスマホアプリの自動テストDevice Farm を使ったスマホアプリの自動テスト
Device Farm を使ったスマホアプリの自動テスト
 
fastlane触ってみた
fastlane触ってみたfastlane触ってみた
fastlane触ってみた
 
福井スマートフォンハッカソン Titanium Mobileの紹介
福井スマートフォンハッカソン Titanium Mobileの紹介福井スマートフォンハッカソン Titanium Mobileの紹介
福井スマートフォンハッカソン Titanium Mobileの紹介
 

Similaire à Custom lintcheckをつくろう

Potatotips 5 bakusoku_compile
Potatotips 5 bakusoku_compilePotatotips 5 bakusoku_compile
Potatotips 5 bakusoku_compile
ichigotake .
 
Xcode bot
Xcode botXcode bot
Xcode bot
toyship
 
Css nite(2010.09.23)
Css nite(2010.09.23)Css nite(2010.09.23)
Css nite(2010.09.23)
Yoshiki Ushida
 
Twitter クライアント開発のすすめ #twtr_hack
Twitter クライアント開発のすすめ #twtr_hackTwitter クライアント開発のすすめ #twtr_hack
Twitter クライアント開発のすすめ #twtr_hack
Mocel Mocelic
 

Similaire à Custom lintcheckをつくろう (20)

スマートフォンアプリの テスト自動化をはじめよう
スマートフォンアプリの テスト自動化をはじめようスマートフォンアプリの テスト自動化をはじめよう
スマートフォンアプリの テスト自動化をはじめよう
 
ライブラリを作った話
ライブラリを作った話ライブラリを作った話
ライブラリを作った話
 
Jenkins導入ライブ
Jenkins導入ライブJenkins導入ライブ
Jenkins導入ライブ
 
2018_02_01ヒカラボ登壇資料
2018_02_01ヒカラボ登壇資料2018_02_01ヒカラボ登壇資料
2018_02_01ヒカラボ登壇資料
 
Swiftビギナーズ倶楽部 vol.2
Swiftビギナーズ倶楽部 vol.2Swiftビギナーズ倶楽部 vol.2
Swiftビギナーズ倶楽部 vol.2
 
DevLOVE iPhoneアプリ勉強会
DevLOVE iPhoneアプリ勉強会DevLOVE iPhoneアプリ勉強会
DevLOVE iPhoneアプリ勉強会
 
iOS豆知識ver0.0.5
iOS豆知識ver0.0.5iOS豆知識ver0.0.5
iOS豆知識ver0.0.5
 
ABS2015 のセッション紹介
ABS2015 のセッション紹介ABS2015 のセッション紹介
ABS2015 のセッション紹介
 
Potatotips 5 bakusoku_compile
Potatotips 5 bakusoku_compilePotatotips 5 bakusoku_compile
Potatotips 5 bakusoku_compile
 
Xcode bot
Xcode botXcode bot
Xcode bot
 
Qt5のセンサーAPIを使ってみたい
Qt5のセンサーAPIを使ってみたいQt5のセンサーAPIを使ってみたい
Qt5のセンサーAPIを使ってみたい
 
ユーザーを待たせないためにできること
ユーザーを待たせないためにできることユーザーを待たせないためにできること
ユーザーを待たせないためにできること
 
Css nite(2010.09.23)
Css nite(2010.09.23)Css nite(2010.09.23)
Css nite(2010.09.23)
 
兄弟アプリのロジック共通化とビルド高速化の実験
兄弟アプリのロジック共通化とビルド高速化の実験兄弟アプリのロジック共通化とビルド高速化の実験
兄弟アプリのロジック共通化とビルド高速化の実験
 
Line Creators Studio Android With Kotlin
Line Creators Studio Android With KotlinLine Creators Studio Android With Kotlin
Line Creators Studio Android With Kotlin
 
Device Farm を使ったスマホアプリの自動テスト
Device Farm を使ったスマホアプリの自動テストDevice Farm を使ったスマホアプリの自動テスト
Device Farm を使ったスマホアプリの自動テスト
 
Twitter クライアント開発のすすめ #twtr_hack
Twitter クライアント開発のすすめ #twtr_hackTwitter クライアント開発のすすめ #twtr_hack
Twitter クライアント開発のすすめ #twtr_hack
 
ログ管理でウキウキAndroid Life (Log Management in Android)
ログ管理でウキウキAndroid Life (Log Management in Android)ログ管理でウキウキAndroid Life (Log Management in Android)
ログ管理でウキウキAndroid Life (Log Management in Android)
 
カスタムROM開発者の視点から見たAndroid
カスタムROM開発者の視点から見たAndroidカスタムROM開発者の視点から見たAndroid
カスタムROM開発者の視点から見たAndroid
 
【第1回EMS勉強会】Autopilot設計時のポイント
【第1回EMS勉強会】Autopilot設計時のポイント【第1回EMS勉強会】Autopilot設計時のポイント
【第1回EMS勉強会】Autopilot設計時のポイント
 

Plus de Makoto Yamazaki

20150425 DroidKaigi つかえるGradleプロジェクトの作り方
20150425 DroidKaigi つかえるGradleプロジェクトの作り方20150425 DroidKaigi つかえるGradleプロジェクトの作り方
20150425 DroidKaigi つかえるGradleプロジェクトの作り方
Makoto Yamazaki
 
DevQuiz 2011 の模範解答 Android編
DevQuiz 2011 の模範解答 Android編DevQuiz 2011 の模範解答 Android編
DevQuiz 2011 の模範解答 Android編
Makoto Yamazaki
 
USB Host APIで遊んでみた
USB Host APIで遊んでみたUSB Host APIで遊んでみた
USB Host APIで遊んでみた
Makoto Yamazaki
 
ぐだ生 Java入門第三回(文字コードの話)(Keynote版)
ぐだ生 Java入門第三回(文字コードの話)(Keynote版)ぐだ生 Java入門第三回(文字コードの話)(Keynote版)
ぐだ生 Java入門第三回(文字コードの話)(Keynote版)
Makoto Yamazaki
 
ぐだ生 Java入門第ニ回(synchronized and lock)
ぐだ生 Java入門第ニ回(synchronized and lock)ぐだ生 Java入門第ニ回(synchronized and lock)
ぐだ生 Java入門第ニ回(synchronized and lock)
Makoto Yamazaki
 
ぐだ生 Java入門第ニ回(synchronized and lock)
ぐだ生 Java入門第ニ回(synchronized and lock)ぐだ生 Java入門第ニ回(synchronized and lock)
ぐだ生 Java入門第ニ回(synchronized and lock)
Makoto Yamazaki
 
ぐだ生 Java入門第一回(equals hash code_tostring)
ぐだ生 Java入門第一回(equals hash code_tostring)ぐだ生 Java入門第一回(equals hash code_tostring)
ぐだ生 Java入門第一回(equals hash code_tostring)
Makoto Yamazaki
 
20110109 abc2010w gingerbread_api_storage
20110109 abc2010w gingerbread_api_storage20110109 abc2010w gingerbread_api_storage
20110109 abc2010w gingerbread_api_storage
Makoto Yamazaki
 

Plus de Makoto Yamazaki (13)

20150425 DroidKaigi つかえるGradleプロジェクトの作り方
20150425 DroidKaigi つかえるGradleプロジェクトの作り方20150425 DroidKaigi つかえるGradleプロジェクトの作り方
20150425 DroidKaigi つかえるGradleプロジェクトの作り方
 
20120516 第7回ウフィカ社内ハンズオン Git基礎
20120516 第7回ウフィカ社内ハンズオン Git基礎20120516 第7回ウフィカ社内ハンズオン Git基礎
20120516 第7回ウフィカ社内ハンズオン Git基礎
 
ICS ホットトピック
ICS ホットトピックICS ホットトピック
ICS ホットトピック
 
DevQuiz 2011 の模範解答 Android編
DevQuiz 2011 の模範解答 Android編DevQuiz 2011 の模範解答 Android編
DevQuiz 2011 の模範解答 Android編
 
USB Host APIで遊んでみた
USB Host APIで遊んでみたUSB Host APIで遊んでみた
USB Host APIで遊んでみた
 
20110619 live view ideathon_logcatonliveview
20110619 live view ideathon_logcatonliveview20110619 live view ideathon_logcatonliveview
20110619 live view ideathon_logcatonliveview
 
I/O 2011 報告会 ADKで遊んでみた
I/O 2011 報告会 ADKで遊んでみたI/O 2011 報告会 ADKで遊んでみた
I/O 2011 報告会 ADKで遊んでみた
 
ぐだ生 Java入門第三回(文字コードの話)(Keynote版)
ぐだ生 Java入門第三回(文字コードの話)(Keynote版)ぐだ生 Java入門第三回(文字コードの話)(Keynote版)
ぐだ生 Java入門第三回(文字コードの話)(Keynote版)
 
ぐだ生 Java入門第ニ回(synchronized and lock)
ぐだ生 Java入門第ニ回(synchronized and lock)ぐだ生 Java入門第ニ回(synchronized and lock)
ぐだ生 Java入門第ニ回(synchronized and lock)
 
ぐだ生 Java入門第ニ回(synchronized and lock)
ぐだ生 Java入門第ニ回(synchronized and lock)ぐだ生 Java入門第ニ回(synchronized and lock)
ぐだ生 Java入門第ニ回(synchronized and lock)
 
ぐだ生 Java入門第一回(equals hash code_tostring)
ぐだ生 Java入門第一回(equals hash code_tostring)ぐだ生 Java入門第一回(equals hash code_tostring)
ぐだ生 Java入門第一回(equals hash code_tostring)
 
20110326 ネットプリントの紹介
20110326 ネットプリントの紹介20110326 ネットプリントの紹介
20110326 ネットプリントの紹介
 
20110109 abc2010w gingerbread_api_storage
20110109 abc2010w gingerbread_api_storage20110109 abc2010w gingerbread_api_storage
20110109 abc2010w gingerbread_api_storage
 

Custom lintcheckをつくろう