engineers_blogAndroidエンジニアの黒田です。当社マネーフォワード株式会社は「お金を前へ。」をビジョンに、個人および法人のお金の悩みを解決することを目指しサービスを提供しています。よいサービスを提供してお客様の人生をもっと前へすすめるためには、我々開発者も常に前へ進まないといけません。いうわけで今回は「Android開発をもっと前へ」というテーマで、Android開発を効率的に、かつスピーディーに行うためのツールやTipsを紹介したいと思います。Studioを使いましょう。StudioはよりよいAndroidアプリを開発すための機能を多く備えています。開発を便利にする様々なプラグインが揃っています。何かしらの理由でEclipseでの開発を余儀なくされる場合があるかもしれませんが、長期的に考えると多少のコストを払ってでもなるべく早く移行するべきです。Developersショートカットを使うショートカットを使う/使わないで開発スピードは圧倒的に差がでます。開発中、特によく使う基本的なショートカットだけ紹介します。アクション(大概のことはここからやれます)他にも様々なショートカットがありますし、カスタマイズして自分好みのショートカットキーを割り当てることができます。Templateよく書く定型文はLiveTemplateが便利です。goneと打った後にTABを押すと.setVisibility(View.GONE);と入力されます。あとはそのままインスタンスへの参照を入力するだけでOKです。LiveTemplateは自分で追加することも可能です。J)】から確認、選択することができます。TemplateCustomViewを作る時に毎回似たような3つのコンストラクターを書いてませんか?FragmentのnewInstanceなどお決まりのコードを手で書いたりしていませんか?こんな場合はTemplate機能がオススメです。事前にテンプレートとして用意しておくとファイル作成と同時に必要なコードが記載された状態になります。QiitaLogCatを色分けする個人的な趣味ですが、LogCatを色分けしておくことで視覚的に追うべきログがハッキリとします。Debugログを出しつつもErrorやWarningにいち早く気づけるようになります。Logcatから変更できます。paletteから適当に選んで設定しています。彩度の高い色にすると目がやられるのでおすすめしません。fly」の設定をしておくと、クラスを書くだけで自動的にimportしてくれるようになります。AutoImportさせたくないクラスを個別に除外することも可能です。複数人で開発する場合は、フォーマットを共通化しておくことでレビューの際に余計な差分がでるのを防げます。「インテントが揃っていない」や「xmlで閉じタグの前にスペースがある/なし」など細かい差分はレビューコストを上げます。プロジェクトをまたがった場合にプロジェクト毎で差分が出たりするのでできれば全社共通で一つのフォーマットに揃えたほうが望ましいです。Settingsから可能です。自動フォーマットフォーマットを共有してもついついフォーマットすること自体を忘れてしまうことがあります。フォーマット漏れを防ぐ為に、ファイル保存時に自動的にフォーマットするようなマクロを作成し、こちらもチームメンバーに共有しておくことをおすすめします。StudioでVCS(VersionControlSystem)を有効にしましょう。Studioのマージ機能を使うことをおすすめします。ターミナルやGitクライアントでやってもいいのですが、ポチポチっとマージ作業をやりながらビルドエラーが無いことに気づけるのでマージミスを防ぐことができます。Plugin自動入力系のプラグインを使うPluginのなかには面倒な入力を自動でやってくれる便利なものがあります。これらはキーを幾つか打つだけでコードを自動入力してくれるので楽ですし、なによりTypoや実装漏れを防げます。主なもでは下記のようなものを使わせてもらっています。ZelexnyButterKnifeはAndroid用のViewInjectionライブラリで、非常に多くのプロダクトで使われています。このプラグインはViewからid一覧を取得して自動的にAnnotationと変数を定義してくれるので、非常に楽です。generatorParcelableはデータをParcelにして読み書きを行うものです。Intentに付加してActivity間でのデータのやりとりに使います。Parcelableは便利な反面、読み書き用のメソッドを記述するのが非常に大変です。Percelerという便利なプラグインもありますが、メソッド数節約のため、Pluginでのコード自動生成を採用しています。generator他にも色々便利な自動入力系のプラグインがあります。プロジェクトに導入しているライブラリや仕様に併せて上手に活用しましょう。Importer画像ファイルをそれぞれ適切なサイズにリサイズして、かつ所定のフォルダに格納する、といった処理が簡単にできます。SupportLibrary23.2からvectorDrawableを使えるようになったので、解像度毎に画像ファイルを用意するのではなくXMLのベクターグラフィックに置き換えていくと幸せになれそうですね。MoneyForwardこのようにショートカットでCamelCaseとSnakeCaseに変換できます。CamelCaseCodeGlance(SublimeTextのGuideみたいなやつ)SublimeTextの右側のアレみたいなやつです。これを入れているから高速化する、というわけではありません。これを見て如何にクラスが肥大化したか自分を戒めるために使っています。CamelCaseビルドの高速化Android開発において一番時間の無駄になりやすいのはビルドです(iOSもそうですが)ビルドが長いとついつい別のことをやってしまい、気付いたらビルドがとっくに終わっていたということもしばしば。ビルドが終わったら通知するなどの工夫もありますが、ビルドが早くなるに越したことはありません。gradleプロパティーの設定で下記を指定しておくとビルドが高速化されます。-Xmx1024mプロジェクトが複数ある場合はorg.gradle.parallel=trueも効果的かもしれません。Multidexにしない色々なライブラリを使っていると65Kの壁をいとも簡単に超えてしまいます。Multidexでのビルドは非常に時間がかかります。Multidexにならないためにはproguardを使ってメソッドを削減するか、導入するライブラリを制限するしかありません。ライブラリのメソッド数を表示してくれるサービスがあるので、導入時の参考にしています。MultiDexになったとしても開発時はminSdkVersionを21にするなどして高速化することも可能です。BuildsbuildVariantsで開発環境毎にapkを分ける開発環境と本番環境でAPIの接続先が異なる場合、毎回コード書き換えるのは面倒ですし、デバック時のみ動作するような処理をif文で分けるのは事故のもとです。開発環境毎にbuildVariantsやFlavorをつかってソースコード/バイナリを分けると開発が楽になります。その際、アイコンもアプリ名も一緒だと区別がつかないので、buildVariants毎にアプリ名やアイコンを変えると社内テストしてくれる方が迷わなくて済みます。commandadbコマンドadbコマンドを使いこなすことでデバッグ作業が非常に効率化されます。Studioから簡単にadbコマンドが使えます。アプリをアインストールしたり、アプリのデータをクリアしたりといった若干手間のかかる作業がコマンド一発で終わるのでとても便利です。dumpsysを使いこなすadbコマンドの一つですが、dumpsysコマンドはOSの情報を把握する上でとても便利なコマンドです。現在表示中のActivityが何か、タイマーがどれくらいで発動するかなどがスグにわかります。Blogpecoを使ったコマンドAndroid開発が難しいのは端末やバージョン、解像度の多さにあります。デバッグ時は複数の端末を起動し確認することもあるかと思います。そんなときはpecoが非常に便利です。pecoに関してはこちらが非常に参考になります。クックパッド開発者ブログそれ以外ですとdumpsysで現在のTOPにいるActivityが何かを調べる際にactというコマンドを用意しています。起動しているのが一台であればact、actdで事足りるのですが、複数台起動しているときはact_pecoのようなものを用意しておくと簡単に叩けます。#[0-9]*:"}ToolsGenymotionGenymotionは非常に高速なAndroidエミュレータです。VirtualBoxのインストールやPlayStoreアプリのインストールなどちょっとした作業は必要ですが、Genymotionでの開発はその後の開発速度に大きく影響します。shellで端末にアクセスしてSharedPreferenceファイルを確認したり、SQLiteコマンドでDBの中身を確認したりすることができるようになります。EmulationJsonExportアプリ-サーバー間通信でのフォーマットにJSONを使っている方は多いと思います。AndroidではGsonやJacksonを使ってJavaオブジェクトに変換することがよくあります。その際にいちいちJSONの構造を把握してメンバー変数を定義するのは非常に手間が掛かりますし、間違いも多いです。JSONExportを使うとJSONテキストを入れるだけで任意のフォーマットでクラスを生成してくれます。残念ながらGsonフォーマットは無かったので、ちょっと変更を加えてGson形式で出力するようにしています。SketchSketchはアプリ開発(特にデザインデータの扱い)を劇的に変えてくれました。今までデザイナーさんに「ここをこう切り出して、ファイル名は◯◯で。あとサイズ別にリサイズして・・・」などというやりとりから一気に開放されます。デザイナーもエンジニアも本質的な作業に集中できるようになります。Architecure、など様々なアーキテクチャがあり、それぞれ良いところも悪いところもあります。アーキテクチャの選定はアプリの内容や規模、開発人数、スキルレベルに依存すると思います。ひとりで開発する場合は特に定めず好きに書いてもいいと思います。複数人で開発する場合、最初にアーキテクチャをしっかりと固めることでその後の開発速度が格段に違います。レビューの度に、「これはここに書くんだっけ?」「個人的にはこちらのほうが好み」などといった不毛な議論がなくなりますし、コードの見通しがよくなるためバグも少なくなります。はじめは窮屈かもしれませんが、是非トライしてみてください。以上、非常に長々と書いてしまいましたが、まだまだ開発を加速させるTipsは存在します。技術力の向上はもちろんですが、常にアンテナを張って便利なツールや機能を積極的に取り入れることが開発速度向上には一番効率的かもしれません。参考になれば幸いです。最後にマネーフォワードでは前のめりなAndroidエンジニアを募集しています!皆様のご応募お待ちしております。