Movatterモバイル変換


[0]ホーム

URL:


Yukiya Nakagawa, profile picture
Uploaded byYukiya Nakagawa
PDF, PPTX16,639 views

AndroidLint #DroidKaigi

DroidKaigi2016で講演したAndroid Lintについての資料です

Embed presentation

Download as PDF, PPTX
Android Lintで正しさを学ぼう2015.02.18 DroidKaigi 2016Yukiya Nakagawa / @NkznROOM:B 13:00-13:50#DroidKaigiB
Who are you?• Yukiya Nakagawa / @Nkzn• ウォーターセル株式会社@新潟• 農業向けサービス「アグリノート」• エンジニア募集中です• Androidは2009年からチマチマと
Recent Activity• C89コミケ• とびだそう!Androidプログラミングレシピ• https://techbooster.booth.pm/• Android Lintネタ書いてました
Target• まだAndroidプログラミングのベストプラクティスが分からない初学者• Androidアプリの品質を表す指標がほしい
品質担当者
Agenda• Android Lintとは• 初学者がやりがちなミス• もっと上を目指す人のために• 品質指標としてのAndroid Lintを考える
Android Lintとは
LintとはAnother HTML-lint HTMLの構文チェックツールJSLint, JSHint, ESLint JavaScriptの構文チェックツールtextlint 日本語の構文チェックツール
lintとは、主にC言語のソースコードに対し、コンパイラより詳細かつ厳密なチェックを行うプログラムである。• 型の一致しない関数呼び出し• 初期化されていない変数の参照• 宣言されているが使われていない変数• 同じ関数を参照しているが、戻り値を使う場合と使わない場合がある• 関数が戻り値を返す場合と返さない場合があるなど、コンパイラではチェックされないが、バグの原因になるような曖昧な記述についても警告される。https://ja.wikipedia.org/wiki/Lint
Javaの場合?
Android Lintとは• Google公式• 222個のルール(ver25.0.4現在)• Category, Severity, Priorityで分類される• 結構手広い• 不具合予備軍の検出• ユーザビリティチェック
Categoryカテゴリ名 チェックする内容Correctness SDKの使い方の正しさCorrectness:Messages Correctnessのうち、特にメッセージSecurity セキュリティPerformance パフォーマンス(動作速度)Usability ユーザビリティ(使い勝手)Usability:Icons Usabilityのうち、特にアイコンUsability:Typography Usabilityのうち、特に文字Accessibility アクセシビリティInternationalization 国際化・多言語化Bi-directional Text Right-to-Leftモードでの見た目
Severityレベル 意味 アプリへの影響Fatal 致命的 ビルドや実行に必ず失敗するError エラービルドはできるが実行時エラーを引き起こす可能性が高いWarning 警告動作はするが修正したほうがより良いアプリになるInformation 情報ほぼ問題ないが頭の片隅に置いておいたほうがよいIgnore 無視問題があったとしても検出しない
チェックできるファイルの種類• https://android.googlesource.com/platform/tools/base• com.android.tools.lint.detector.api.Detector
https://android.googlesource.com/platform/tools/base/+/master/lint/libs/lint-api/src/main/java/com/android/tools/lint/detector/api/Detector.java
1. Manifest file2. Resource files, in alphabetical order by resource type3. Java sources4. Java classes5. Gradle files6. Generic files7. Proguard files8. Property files
Priority• 1から10まで• あまりあてにならない
どんな問題を解決するのか
お作法分かりづらい問題https://twitter.com/konifar/status/698760224409169920
Android Way is どこhttps://twitter.com/konifar/status/698760496837603328
Googleによる正解集(あるいはアンチパターン集)Android Lint
事例紹介Part 1. 初学者がやりがちなミス
Case 1. LinearLayoutに並べたビューが表示されないのは何故?(Orientation)
こんなコード書いてませんか<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="one" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="two" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="three" />
</LinearLayout>
何故かアイテムがひとつしか出ない・・・?
Orientation• Summary: Missing explicit orientation• Priority: 2 / 10• Severity: Error• Category: Correctness
何故いけないのか?デフォルトのorientationはhorizontal
こう書きましょう<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="one" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="two" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="three" />
</LinearLayout>
Case 2: Fragmentが表示されない
こんなコード書いてませんか@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_commit_transaction);

getSupportFragmentManager().beginTransaction()
.add(R.id.container, new MyFragment());
}あれー? Fragmentが表示されないなー?
CommitTransaction• Summary: Missing commit() calls• Priority: 7 / 10• Severity: Warning• Category: Correctness
何故いけないのか?• beginTransaction()から始まるメソッドチェーンは、commit()が呼び出されてから描画処理に入ります• そりゃcommit()を呼んでなきゃ何も表示されません• DBのトランザクションみたいなイメージ
こう書きましょう@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_commit_transaction);

getSupportFragmentManager().beginTransaction()
.add(R.id.container, new MyFragment()).commit();
}
Case 3. SharedPreferenceが保存されない
こんなコード書いてませんかSharedPreferences pref =PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor editor = pref.edit();
editor.putLong("now", new Date().getTime());pref.getLong("now", -1); // -1SharedPreferencesに保存したはずのデータが取れないなあ
CommitPrefEdits• Summary: Missing commit() onSharedPreference editor• Priority: 6 / 10• Severity: Warning• Category: Correctness
何故いけないのか?• SharedPreferencesにデータを保存する場合、実際に保存されるタイミングはcommit()のとき• そりゃcommit()を呼んでなきゃ何も表示されません
こう書きましょうSharedPreferences pref =PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor editor = pref.edit();
editor.putLong("now", new Date().getTime());editor.commit();// consider using apply() insteadpref.getLong("now", -1); // 1455620005841
おまけ: commit()とapply()• SharedPreferencesはアプリ内領域のXMLを読み書きすることでデータを永続化している
/data/data/[applicationId]/shared_prefs/hoge.xmlEditor XMLMemoryCachecommit()は待つapply()は待たない
こう書くとなおよいSharedPreferences pref =PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor editor = pref.edit();
editor.putLong("now", new Date().getTime());editor.apply();// OR// if(editor.commit()) {// pref.getLong(“now”, -1); // 1455620005841// }
Case 4: Toastが出ない
こんなコード書いてませんかToast.makeText(this,“this line is passed”,Toast.LENGTH_LONG)なんでだ、絶対にこの行を通ってるはずなのに!なんでトーストが出ないんだ!!!!
ShowToast• Summary: Toast created but not shown• Priority: 6 / 10• Severity: Warning• Category: Correctness
こう書きましょうToast.makeText(this,“this line is passed”,Toast.LENGTH_LONG).show()
Case 5: なんかこのOKボタン押しづらくない?
こんなコード書いてませんか<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@android:string/ok" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@android:string/cancel" />
</LinearLayout>
ButtonOrder• Summary: Button order• Priority: 8 / 10• Severity: Warning• Category: Usability
何故いけないのか?• デザインガイドラインに書いてある
https://www.google.com/design/spec/components/dialogs.html#dialogs-specs• 単にダイアログを閉じるだけの「キャンセル」のようなものは左、本来やりたかった操作を続ける「OK」のようなものは右に置く• 「削除」はネガティブなイメージなので左に置いてしまいがちだけど右
こう書きましょう<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@android:string/cancel" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@android:string/ok" />
</LinearLayout>
おまけ: 検出条件1. targetSdkがAPI Level 14以上• API Level 13まではOKが左で正しかった2. ラベルが”OK”, “Cancel”, android.R.string.ok, android.R.string.cancelのいずれか3. 親レイアウトの設定上、並びが明らか• LinearLayoutかTableRowで、orientationがhorizontal• RelativeLayoutで、toRightOf, toLeftOfの関係で順序が分かる• RelativeLayoutで、alignParentLeft, alignParentRightの関係で順序が分かる
Case 6: このアプリ英語化して
こんなコード書いてませんか<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ユーザーを選択してください" />

<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="犬のアイコン"
android:src=“@drawable/ic_dog” />

<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="入力してください" />日本語が表示されるところを全部探して英語に書き直す・・・? 1日じゃ無理だよ!
HardcodedText• Summary: Hardcoded text• Priority: 5 / 10• Severity: Warning• Category: Internationalization
検出対象• レイアウトXML(res/layout/)• android:text• android:contentDescription• android:hint• android:prompt• AndroidManifest.xml• android:label• メニューXML(res/menu/)• android:title
何故いけないのか?• 文字列リソースに抜き出したほうが総合的にメリットが多い• Java側で言語情報を切り替えることもできなくもないがかなり煩雑• リソースファイルの自動切り替えに頼ったほうが遥かに楽
こう書きましょう<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=“@string/select_a_user“ />

<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription=“@string/dog_icon“
android:src=“@drawable/ic_dog” />

<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint=“@string/input_please“ />
おまけ• デモ• クイックフィックス• 言語コードごとにstrings.xmlを用意した場合のAndroid Studioの挙動
事例紹介Interlude: konifar/droidkaigi2016
./gradlew lintapp/build/outputs/lint-results.html
👍
事例紹介part2. もっと上を目指す人のために
Case 7: アプリが管理していた個人情報が別のアプリから奪われた!
こんなコード書いてませんか<!—- AndroidManifest.xml —-><provider
android:name=".provider.MyContentProvider"
android:authorities="info.nkzn.mycontentprovider" />ContentProviderを使うときはマニフェストに書くんだろ? そんなこと知ってるよ!
ExportedContentProvider• Summary: Content provider does not requirepermission• Priority: 5 / 10• Severity: Warning• Category: Security
何故いけないのか?• 実は<provider>にはexportedというパラメータがあり、デフォルトでtrue• 外部のアプリからでも content://hogehoge のようなURIでデータにアクセスできてしまう• Dropboxが2011年にやらかしてた
http://codezine.jp/article/detail/6286
こう書きましょう<!—- AndroidManifest.xml —-><provider
android:name=".provider.MyContentProvider"
android:authorities=“info.nkzn.mycontentprovider"android:exported=“false" />※ minSdkVersion, targetSdkVersionが  両方とも17以上なら、デフォルトでfalseになります  http://developer.android.com/intl/ja/guide/topics/manifest/provider-element.html
Case 8: これ、何を入力する欄?
こんなコード書いてませんか<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content" />

<EditText
android:id=“@+id/phone_number"android:hint=“電話番号を入力してください"android:layout_width="match_parent"
android:layout_height="wrap_content" />

<EditText
android:id="@+id/pin"
android:hint=“PINコードを入力してください"android:layout_width="match_parent"
android:layout_height="wrap_content" />

<EditText
android:id="@+id/site_url"
android:hint=“サイトのURLを入力してください"android:layout_width="match_parent"
android:layout_height="wrap_content" />電話番号を入れたいのに日本語キーボードが出てきて切り替えるの面倒くさい・・・何入れたらいいのかわからない・・・
TextFields• Summary: Missing inputType or hint• Priority: 5 / 10• Severity: Warning• Category: Usability
何故いけないのか?• ユーザーはhintを見て何を入力する欄なのかを判断するので、無いと不便• inputTypeを指定すれば適切なキーボードが現れることが多いので、キーボードを切り替える手間が省けて便利
こう書きましょう<EditText
android:hint="メモを入力してください"android:layout_width="match_parent"
android:layout_height="wrap_content" />

<EditText
android:id=“@+id/phone_number"android:hint=“電話番号を入力してください”android:inputType=“phone”android:layout_width="match_parent"
android:layout_height="wrap_content" />

<EditText
android:id="@+id/pin"
android:hint=“PINコードを入力してください”android:inputType="numberPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

<EditText
android:id="@+id/site_url"
android:hint=“サイトのURLを入力してください”android:inputType="textUri"android:layout_width="match_parent"
android:layout_height="wrap_content" />
Case 9: やっぱりアイコンはカラフルじゃなきゃ
こんなアイコン作ったことありませんか色がついててみづらい色がついててみづらい
IconColors• Summary: Icon colors do not follow therecommended visual style• Priority: 6 / 10• Severity: Warning• Category: Usability:Icons
何故いけないのか• マテリアルデザインの登場などもあり、ステータスバーやActionBarの色はアプリごとに鮮やかに変わるようになった• アイコンと同系色の背景になったときに見づらくなってしまう• 通知アイコンは白、アクションアイコンはグレーにしておけば、なんとなく大体の色に合う• というような話が developer.android.com/design に載っていたような気がするのだけれど、www.google.com/design に移ったときにその辺の話がなくなってしまった気がする
こうしましょう
おまけ// com.android.tools.lint.checks.IconDetector.javafor (int y = 0,height = image.getHeight();y < height; y++) {
for (int x = 0,width = image.getWidth();x < width; x++) {
int rgb = image.getRGB(x, y);
if ((rgb & 0xFF000000) != 0) {
int r = (rgb & 0xFF0000) >>> 16;
int g = (rgb & 0x00FF00) >>> 8;
int b = (rgb & 0x0000FF);
if (r != g || r != b) {1pxずつ色を評価していて執念を感じた
Case 10: 文字は正しく使いましょう
こんなコード書いてませんか<string name="continue_to_read">続きを読む...</string>3点リーダ(…)の入れ方わかんないからピリオド3つでいいや
TypographyEllipsis• Summary: Ellipsis string can be replaced withellipsis character• Priority: 5 / 10• Severity: Warning• Category: Usability:Typography
何故いけないのか• フォントによってはピリオドが都合よく…と見えてくれるかどうかはわからない• ISO-8859-1で…は”&#8230;”として定義されており、各フォントも…が3点リーダとして見やすくなるようにしてくれているはず• 用意されている文字はちゃんと使おうというスタンス
こう書きましょう<string name=“continue_to_read”>続きを読む…</string><!—- または —-><string name=“continue_to_read”>続きを読む&#8230;</string>
品質管理担当者の方へ:品質指標として使ってみませんか
エンジニアの勝手な言い分• Googleが「これやると良くないアプリになるよ」と言っているものを回避しているので、相対的にアプリの品質は上がっていると言っていいのでは• こんな重箱の隅を突くようなチェックを200項目以上も回避するのはそれなりの経験値がないと難しい• 正しくAndroid SDKを使えるように気を使いながら開発できているという点は、品質上の成果として計上して、取引先や経営層が評価してもらえると嬉しい
品質指標に使う場合• 優先度が低いルールは事前に設定でignoreしておく(Bi-directional Textカテゴリなど)• 予算やスケジュールに応じて事前に「Fatal, Errorはすべて直す」「Warningは15件以内の検出」などの品質目標を定めておく• カテゴリ単位での採用・不採用を各プロジェクトごとに定めるのもよいと思います
エンジニアの方へ:abortOnErrorを切らないで
abortOnError,checkReleaseBuilds// build.gradleandroid {lintOptions {abortOnError falsecheckReleaseBuilds false}}abortOnError:危険度がErrorまたはFatalのルールに抵触したらビルドを中断するcheckReleaseBuilds:リリースビルド時にFatalのルールに抵触したらビルドを中断する
趣味でやってたりプロトタイプならともかくお仕事でやるときにfalseにするのよくないと思います本当に対応しないルールだけignoreしましょう
droidkaigi2016/app/build.gradlelintOptions {abortOnError falsedisable 'InvalidPackage'}😡
さいごに• Android Studioがソースコードに黄色いのとか赤いのとか付けてたら、マウスオーバーして何が起きてるか見てね!• すべてのルールを倒したら胸を張ろう• Android Lintと俺達の戦いはこれからだ!
ご清聴ありがとうございました
参考文献• lint | Android Developers
http://developer.android.com/intl/ja/tools/help/lint.html• Improving Your Code with lint | Android Developers
http://developer.android.com/intl/ja/tools/debugging/improving-w-lint.html• Android Lint - Android Tools Project Site
http://tools.android.com/tips/lint• Writing a Lint Check - Android Tools Project Site
http://tools.android.com/tips/lint/writing-a-lint-check• platform_tools_base
https://android.googlesource.com/platform/tools/base• LintOptions - Android Plugin 1.5.0 DSL Reference
http://google.github.io/android-gradle-dsl/current/com.android.build.gradle.internal.dsl.LintOptions.html

Recommended

PDF
5 年続く 「はてなブックマーク」 アプリを継続開発する技術
PPTX
ネットワークの切り替えを感知する方法
PDF
Android Dev Tools Knowledge
PDF
パーミッションモデルの過渡期への対応
PDF
Android,Brillo,ChromeOS
 
PDF
Androidのセキュア開発について考えてみた(明日、敗訴しないためのセキュアコーディング.ver2)
PDF
20150425 DroidKaigi つかえるGradleプロジェクトの作り方
PDF
DroidKaigi2016 windows環境での効率的なアプリ開発手法
PDF
開発を効率的に進めるられるまでの道程
PDF
Android App Development with Gradle & Android Studio
PDF
用途に合わせたアニメーションの実装方法
PDF
Androidアプリのストレージ戦略
PDF
Android学ぶを君へ。生き抜くためのナレッジ共有
PDF
Android lint-srp-practice
PDF
go.mobile で Android 開発
PDF
Go MobileでAndroidアプリ開発
PDF
【ヒカ☆ラボ】 dely株式会社 梅森 翔氏 登壇資料 20171121
PDF
あるゲームアプリケーションの構成とアップデートサイクル
ODP
Fuchsia概略その1
 
PDF
Android 6.0 Marshmallow App Permissions 実践編
PDF
僕がAndroid開発する時にちょっと便利だと思うtips
PDF
DroidKaigi 2019 シームレスに遷移可能な画面を他のアプリに提供する方法
PDF
Android Studioの魅力
PDF
2015年のAndroidアプリ開発入門 - ABCD 2015 Kanazawa
PDF
Android6.0 RuntimePermissionの実装と注意点
PDF
Android Studio開発講座
PDF
minneにおけるテスト〜リリース〜リリース後にやっている事の紹介
PDF
What is tested by pre-launch (security) reports?
PDF
ニュースアプリで起きた不具合から学んだ 最適への一歩
PDF
アプリリリース後に後悔しないための20のこと

More Related Content

PDF
5 年続く 「はてなブックマーク」 アプリを継続開発する技術
PPTX
ネットワークの切り替えを感知する方法
PDF
Android Dev Tools Knowledge
PDF
パーミッションモデルの過渡期への対応
PDF
Android,Brillo,ChromeOS
 
PDF
Androidのセキュア開発について考えてみた(明日、敗訴しないためのセキュアコーディング.ver2)
PDF
20150425 DroidKaigi つかえるGradleプロジェクトの作り方
PDF
DroidKaigi2016 windows環境での効率的なアプリ開発手法
5 年続く 「はてなブックマーク」 アプリを継続開発する技術
ネットワークの切り替えを感知する方法
Android Dev Tools Knowledge
パーミッションモデルの過渡期への対応
Android,Brillo,ChromeOS
 
Androidのセキュア開発について考えてみた(明日、敗訴しないためのセキュアコーディング.ver2)
20150425 DroidKaigi つかえるGradleプロジェクトの作り方
DroidKaigi2016 windows環境での効率的なアプリ開発手法

What's hot

PDF
開発を効率的に進めるられるまでの道程
PDF
Android App Development with Gradle & Android Studio
PDF
用途に合わせたアニメーションの実装方法
PDF
Androidアプリのストレージ戦略
PDF
Android学ぶを君へ。生き抜くためのナレッジ共有
PDF
Android lint-srp-practice
PDF
go.mobile で Android 開発
PDF
Go MobileでAndroidアプリ開発
PDF
【ヒカ☆ラボ】 dely株式会社 梅森 翔氏 登壇資料 20171121
PDF
あるゲームアプリケーションの構成とアップデートサイクル
ODP
Fuchsia概略その1
 
PDF
Android 6.0 Marshmallow App Permissions 実践編
PDF
僕がAndroid開発する時にちょっと便利だと思うtips
PDF
DroidKaigi 2019 シームレスに遷移可能な画面を他のアプリに提供する方法
PDF
Android Studioの魅力
PDF
2015年のAndroidアプリ開発入門 - ABCD 2015 Kanazawa
PDF
Android6.0 RuntimePermissionの実装と注意点
PDF
Android Studio開発講座
PDF
minneにおけるテスト〜リリース〜リリース後にやっている事の紹介
PDF
What is tested by pre-launch (security) reports?
開発を効率的に進めるられるまでの道程
Android App Development with Gradle & Android Studio
用途に合わせたアニメーションの実装方法
Androidアプリのストレージ戦略
Android学ぶを君へ。生き抜くためのナレッジ共有
Android lint-srp-practice
go.mobile で Android 開発
Go MobileでAndroidアプリ開発
【ヒカ☆ラボ】 dely株式会社 梅森 翔氏 登壇資料 20171121
あるゲームアプリケーションの構成とアップデートサイクル
Fuchsia概略その1
 
Android 6.0 Marshmallow App Permissions 実践編
僕がAndroid開発する時にちょっと便利だと思うtips
DroidKaigi 2019 シームレスに遷移可能な画面を他のアプリに提供する方法
Android Studioの魅力
2015年のAndroidアプリ開発入門 - ABCD 2015 Kanazawa
Android6.0 RuntimePermissionの実装と注意点
Android Studio開発講座
minneにおけるテスト〜リリース〜リリース後にやっている事の紹介
What is tested by pre-launch (security) reports?

Similar to AndroidLint #DroidKaigi

PDF
ニュースアプリで起きた不具合から学んだ 最適への一歩
PDF
アプリリリース後に後悔しないための20のこと
PDF
Android api-levels
PDF
Java/Androidセキュアコーディング
PPTX
ああ、素晴らしきTDD ~アプリとエンジニアの心に安寧を~
PDF
Android Lintを覚えてベテラン開発者に追いつこう #ndsmeetup
PPTX
ミクシィ 21卒向け Android研修
 
PDF
Unit test in android
PDF
ピュアJavaだと思った?残念androidでした~いつからAndroidをJavaだと錯覚していた?~
PDF
Android Lecture #01 @PRO&BSC Inc.
PDF
Tokyo GTUG Bootcamp2010
ODP
はじめてのAndroid
PDF
Android4.2徹底解剖!
ODP
はじめてのAndroid in 高知
PPTX
Android 開発, 運用時に使いたいライブラリやサービスの紹介
PPTX
アプリの不具合を少なくするために
PPTX
学生向けAndroid勉強会(入門編)
PDF
ScalaでAndroidアプリ開発
ODP
OSC2011 Androidハンズオン
PDF
Android Lecture #03 @PRO&BSC Inc.
ニュースアプリで起きた不具合から学んだ 最適への一歩
アプリリリース後に後悔しないための20のこと
Android api-levels
Java/Androidセキュアコーディング
ああ、素晴らしきTDD ~アプリとエンジニアの心に安寧を~
Android Lintを覚えてベテラン開発者に追いつこう #ndsmeetup
ミクシィ 21卒向け Android研修
 
Unit test in android
ピュアJavaだと思った?残念androidでした~いつからAndroidをJavaだと錯覚していた?~
Android Lecture #01 @PRO&BSC Inc.
Tokyo GTUG Bootcamp2010
はじめてのAndroid
Android4.2徹底解剖!
はじめてのAndroid in 高知
Android 開発, 運用時に使いたいライブラリやサービスの紹介
アプリの不具合を少なくするために
学生向けAndroid勉強会(入門編)
ScalaでAndroidアプリ開発
OSC2011 Androidハンズオン
Android Lecture #03 @PRO&BSC Inc.

More from Yukiya Nakagawa

PDF
僕らのデータ同期プラクティス
PDF
React Nativeはクロスプラットフォームモバイルアプリ開発の夢を見るか #DroidKaigi
PDF
Atomic Designは「マルチ」で真価を発揮する
PPTX
アグリノートを支える技術
PDF
アグリノートにおけるGIS情報を活かした圃場・作付管理の取り組み @ FOSS4GJ
PPTX
Androidで使えるJSON-Javaライブラリ
PDF
React Nativeアプリをリリースし続けるために、最初に行う8つの取り組み
PDF
もう一度Kotlinの話をしよう #ndsmeetup4
PDF
Android再入門 〜Eclipseのことは忘れろ〜
PPTX
ぼくのかんがえたふつうのあんどろいどかいはつ
PDF
React Nativeの光と闇
PDF
Androidの入門書を書いたときに気にしたこと #NDS57
PDF
React Native Androidはなぜ動くのか
PPTX
Niigata.rb#03
PPTX
Coworking Business Forum in NIIGATA 2013
PPTX
NFCLAB会津
PDF
NDS36 Java7&Java8
PPTX
PechaKucha Niigata #3 2013.7.27
PDF
CSS in JSの話 #friday13json
PDF
NDS36 Kotlin Cute
僕らのデータ同期プラクティス
React Nativeはクロスプラットフォームモバイルアプリ開発の夢を見るか #DroidKaigi
Atomic Designは「マルチ」で真価を発揮する
アグリノートを支える技術
アグリノートにおけるGIS情報を活かした圃場・作付管理の取り組み @ FOSS4GJ
Androidで使えるJSON-Javaライブラリ
React Nativeアプリをリリースし続けるために、最初に行う8つの取り組み
もう一度Kotlinの話をしよう #ndsmeetup4
Android再入門 〜Eclipseのことは忘れろ〜
ぼくのかんがえたふつうのあんどろいどかいはつ
React Nativeの光と闇
Androidの入門書を書いたときに気にしたこと #NDS57
React Native Androidはなぜ動くのか
Niigata.rb#03
Coworking Business Forum in NIIGATA 2013
NFCLAB会津
NDS36 Java7&Java8
PechaKucha Niigata #3 2013.7.27
CSS in JSの話 #friday13json
NDS36 Kotlin Cute

AndroidLint #DroidKaigi


[8]ページ先頭

©2009-2025 Movatter.jp