クックパッド開発者ブログスマートフォン用の表示で見るクックパッド開発者ブログ2015-03-20新米Android開発者が見落としがちな3つのポイントこんにちは、投稿推進部の吉田(@101kaz)です。Androidアプリの投稿周りの開発を担当しています。去年クックパッドに入社したことをきっかけに、本格的にAndroid開発をするようになりました。今回は私のような開発をはじめて日が浅い人が見落としがちな「非同期処理時のNPE(NullPointerException)」と「Activity破棄に関する問題」と「ProGuardの設定忘れ」について実際の遭遇した事例をベースに紹介します。非同期処理コールバック時のNPEある時Fragmentから非同期処理を行い、コールバック内でFragmentの内のviewにアクセスするコードを書きました。});}このコードは問題なさそうに見えますが、getView()がnullを返す可能性があり、その場合findViewById()でNPEが発生します。これは、非同期処理のコールバックが返ってくる前にFragmentが画面の回転などの理由で既にデタッチされ、Viewが破棄される可能性があるためです。そのためコールバックの処理を行う前にまず自分の状態を確認し、すでにデタッチされているようであれば処理を終了しなければなりません。return;}オフィス内のネットワーク環境ではAPIサーバーからのレスポンスが数十msほどで返ってきます。このままアプリがリリースされてしまうと多くのユーザーの方の手元でアプリがクラッシュする可能性があるので注意が必要です。非同期処理時のNPEを防ぐにはコールバックの冒頭でデタッチされてないか(もしくはアクティビティが既に終了していないか)チェックする事を習慣づけることが重要です。いえ、忘れてしまうこともあるので可能であれば仕組みで解決したいところです。Request上で、botが投稿するチェックリストを開発者自身がチェックすることでミスを事前に防ぐ試みをしています。非同期処理を行うライブラリ側にチェックを委譲する方法もあります。RxAndroidというライブラリでは、bindActivity()、bindFragment()というメソッドがそれぞれ提供されています。これらを利用すると、Activityが既に終了していたり、フラグメントが既にデタッチされている場合にそれ以上の処理が実行されないようにすることが可能です。worldをトーストするサンプルは以下のようになります。このサンプルでは、Fragmentがデタッチされているとcall()は実行されません。失敗した旨のメッセージが表示され、画像が取り込めない事がある。」というバグ報告があり調査したところ、以下の様なコードがありました。ここでは、カメラアプリからSelectPhotoFragmentに戻ってきて、onActivityResultで画像ファイルにアクセスしようとしています。}}このバグは、SelectPhotoFragmentがバックグラウンドにまわった際に破棄され、savedPhotoUriの参照も消えてしまったことが原因でした。AndroidのシステムはActivityがバックグラウンドにまわるとメモリの空き容量などの都合で順番に破棄していきます。破棄のタイミングは環境や機種の性能によって異なるので、これも開発時には見落としがちになります。Activityの破棄に起因するバグを防ぐためには、適切にインスタンス変数をBundleに格納して状態の永続化を行う必要があります。開発者向けオプションにあるアクティビティを保持しない設定を有効にした状態で開発する方法も有効です。Icepickというライブラリを使うと、煩雑な状態の永続化をアノテーションを使って手軽に管理することが出来るようになります。}ProGuardの設定忘れProGuardとは、アプリの最適化と難読化を行うツールです。クックパッドのAndroidアプリもリリースビルド時にはProGuardを利用しますが、ProGuardを有効にするとリフレクションを使った実装が正しく動作しなくなります。これはProGuardが参照のない箇所を削除したり、メソッド名や変数名を書き換えてしまうことが原因です。デバッグビルドでは通常Proguardを有効にしないので、ProGuardに関する問題も開発時に見落としがちです。利用しているライブラリの中で使われている可能性もあるのでこれも注意が必要です。*;}上記のように書くと、com.cookpad.android.sample以下の全てのメンバ変数とメソッドがProguardの対象から外れます。まとめ開発時に発生しにくいバグは、どうしても見落とされてリリースされやすいです。クラッシュしにくいアプリ開発をしていきたいですね。2019夏メディアプロダクト開発部の安部(@STAR_ZERO)です。co...2018-04-18ReactNativeプロジェクトのAndroid環境を整備する投稿開発部の吉田です。Cl...2014-12-12Androidアプリ開発で素早くフィードバックをえるためのライブラリを作りましたモバイルファースト室の山下(@tomorrowkey)です。使ったセキュリティログ検索基盤の構築サービス特性にあった検索システムの設計戦略クックパッド採用説明会「クックパッドはサービスの作り手を採用したいんです。/*}*/スターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。