Money Forward Developers Blog

株式会社マネーフォワード公式開発者向けブログです。技術や開発手法、イベント登壇などを発信します。サービスに関するご質問は、各サービス窓口までご連絡ください。

20230215130734

Android開発をもっと前へ!開発を加速させるTips・ツール

Androidエンジニアの黒田です。

当社マネーフォワード株式会社は「お金を前へ。人生をもっと前へ。」をビジョンに、個人および法人のお金の悩みを解決することを目指しサービスを提供しています。

よりよいサービスを提供してお客様の人生をもっと前へすすめるためには、我々開発者も常に前へ進まないといけません。 というわけで今回は「Android開発をもっと前へ」というテーマで、Android開発を効率的に、かつスピーディーに行うためのツールやTipsを紹介したいと思います。

(数が多いので具体的な設定方法や利用方法は割愛します)

Android Studioを使う

いきなり当たり前のことで恐縮ですが、Android Studioを使いましょう。 Android StudioはよりよいAndroidアプリを開発すための機能を多く備えています。 また、より開発を便利にする様々なプラグインが揃っています。 何かしらの理由でEclipseでの開発を余儀なくされる場合があるかもしれませんが、長期的に考えると多少のコストを払ってでもなるべく早く移行するべきです。

Android Studio と SDK Tools のダウンロード | Android Developers

ショートカットを使う

ショートカットを使う/使わないで開発スピードは圧倒的に差がでます。 開発中、特によく使う基本的なショートカットだけ紹介します。(Macのみ)

ショートカット 機能
Cmd + E(⌘ + E) 直近で開いたファイルの一覧を表示
Cmd + O(⌘ + O) class名で検索
Cmd + N(⌘ + N) メソッドの作成/ファイルの作成
Ctrl + R(⌃ + R) ビルド&実行
Ctrl + D(⌃ + D) ビルド&デバック
Shift + F6(⇧ + F6) リファクタ(クラス名/メソッド名/変数名の一括変換)
Cmd + Shift + A(⌘ + ⇧ + A) アクション(大概のことはここからやれます)

他にも様々なショートカットがありますし、カスタマイズして自分好みのショートカットキーを割り当てることができます。 https://resources.jetbrains.com/assets/products/intellij-idea/IntelliJIDEA_ReferenceCard_mac.pdf

Live Template

よく書く定型文はLiveTemplateが便利です。 例えばgoneと打った後にTABを押すと.setVisibility(View.GONE);と入力されます。 あとはそのままインスタンスへの参照を入力するだけでOKです。

live_template

LiveTemplateは自分で追加することも可能です。Preference > Editor > LiveTemplate もしLiveTemplateの省略形を忘れてしまったら【Cmd + J(⌘ + J)】から確認、選択することができます。

File and Code Template

CustomViewを作る時に毎回似たような3つのコンストラクターを書いてませんか?FragmentのnewInstanceなどお決まりのコードを手で書いたりしていませんか? こんな場合はTemplate機能がオススメです。事前にテンプレートとして用意しておくとファイル作成と同時に必要なコードが記載された状態になります。

【Android】もっと先へ「加速」したくはないか、少年 〜File Template編〜 - Qiita

LogCatを色分けする

個人的な趣味ですが、LogCatを色分けしておくことで視覚的に追うべきログがハッキリとします。 Debugログを出しつつもErrorやWarningにいち早く気づけるようになります。 Preference > Editor > Colors & Fonts > Android Logcatから変更できます。 私はMaterial design Color paletteから適当に選んで設定しています。あまり彩度の高い色にすると目がやられるのでおすすめしません。

Auto Import

通常、クラスのimportはOption + returnでできますが、「Add unambiguous imports on the fly」の設定をしておくと、クラスを書くだけで自動的にimportしてくれるようになります。

auto_import

AutoImportさせたくないクラスを個別に除外することも可能です。

フォーマットの共通化

複数人で開発する場合は、フォーマットを共通化しておくことでレビューの際に余計な差分がでるのを防げます。 「インテントが揃っていない」や「xmlで閉じタグの前にスペースがある/なし」など細かい差分はレビューコストを上げます。 プロジェクトをまたがった場合にプロジェクト毎で差分が出たりするのでできれば全社共通で一つのフォーマットに揃えたほうが望ましいです。 フォーマットのexportはFile > Export Settingsから、importはFile > Import Settingsから可能です。

自動フォーマット

フォーマットを共有してもついついフォーマットすること自体を忘れてしまうことがあります。 フォーマット漏れを防ぐ為に、ファイル保存時に自動的にフォーマットするようなマクロを作成し、こちらもチームメンバーに共有しておくことをおすすめします。

formatting - Intellij reformat on file save - Stack Overflow

マージ機能

まずAndroid StudioでVCS(VersionControlSystem)を有効にしましょう。 コンフリクトが起きた場合はAndroid Studioのマージ機能を使うことをおすすめします。 ターミナルやGitクライアントでやってもいいのですが、ポチポチっとマージ作業をやりながらビルドエラーが無いことに気づけるのでマージミスを防ぐことができます。 コンフリクトしているファイルで右クリック Git -> Resolve conflict

Android Studio Plugin

自動入力系のプラグインを使う

Pluginのなかには面倒な入力を自動でやってくれる便利なものがあります。 これらはキーを幾つか打つだけでコードを自動入力してくれるので楽ですし、なによりTypoや実装漏れを防げます。

主なもでは下記のようなものを使わせてもらっています。

Android ButterKnife Zelexny

ButterKnifeはAndroid用のViewInjectionライブラリで、非常に多くのプロダクトで使われています。 このプラグインはViewからid一覧を取得して自動的にAnnotationと変数を定義してくれるので、非常に楽です。

Android ButterKnife Zelexny

JetBrains Plugin Repository :: Android ButterKnife Zelezny

Android Parcelable code generator

ParcelableはデータをParcelにして読み書きを行うものです。Intentに付加してActivity間でのデータのやりとりに使います。 Parcelableは便利な反面、読み書き用のメソッドを記述するのが非常に大変です。 Percelerという便利なプラグインもありますが、メソッド数節約のため、Pluginでのコード自動生成を採用しています。

Android Parcelable code generator

JetBrains Plugin Repository :: Android Parcelable code generator

他にも色々便利な自動入力系のプラグインがあります。 プロジェクトに導入しているライブラリや仕様に併せて上手に活用しましょう。

その他プラグイン

Android Drawable Importer

画像ファイルをそれぞれ適切なサイズにリサイズして、かつ所定のフォルダに格納する、といった処理が簡単にできます。 SupportLibrary23.2からvectorDrawableを使えるようになったので、解像度毎に画像ファイルを用意するのではなくXMLのベクターグラフィックに置き換えていくと幸せになれそうですね。

JetBrains Plugin Repository :: Android Drawable Importer

CamelCase

MoneyForward -> moneyForward -> money_forward -> MONEY_FORWARD -> MoneyForward

このようにショートカットでCamelCaseとSnakeCaseに変換できます。

CamelCase

JetBrains Plugin Repository :: CamelCase

CodeGlance(SublimeTextのGuideみたいなやつ)

SublimeTextの右側のアレみたいなやつです。 これを入れているから高速化する、というわけではありません。 これを見て如何にクラスが肥大化したか自分を戒めるために使っています。

CodeGlance

JetBrains Plugin Repository :: CamelCase

ビルドの高速化

Android開発において一番時間の無駄になりやすいのはビルドです(iOSもそうですが) ビルドが長いとついつい別のことをやってしまい、気付いたらビルドがとっくに終わっていたということもしばしば。 ビルドが終わったら通知するなどの工夫もありますが、ビルドが早くなるに越したことはありません。

gradleプロパティーの設定で下記を指定しておくとビルドが高速化されます。 デーモンを起動してビルドを高速化してくれます

org.gradle.daemon=true
org.gradle.jvmargs=-Xms256m -Xmx1024m

プロジェクトが複数ある場合は

org.gradle.parallel=true

も効果的かもしれません。

Multidexにしない

色々なライブラリを使っていると65Kの壁をいとも簡単に超えてしまいます。 Multidexでのビルドは非常に時間がかかります。 Multidexにならないためにはproguardを使ってメソッドを削減するか、導入するライブラリを制限するしかありません。 ライブラリのメソッド数を表示してくれるサービスがあるので、導入時の参考にしています。

MultiDexになったとしても開発時はminSdkVersionを21にするなどして高速化することも可能です。

Optimizing Multidex Development Builds

buildVariantsで開発環境毎にapkを分ける

開発環境と本番環境でAPIの接続先が異なる場合、毎回コード書き換えるのは面倒ですし、デバック時のみ動作するような処理をif文で分けるのは事故のもとです。 開発環境毎にbuildVariantsやFlavorをつかってソースコード/バイナリを分けると開発が楽になります。 その際、アイコンもアプリ名も一緒だと区別がつかないので、buildVariants毎にアプリ名やアイコンを変えると社内テストしてくれる方が迷わなくて済みます。

command

adbコマンド

adbコマンドを使いこなすことでデバッグ作業が非常に効率化されます。

Android Debug Bridge

ADB IdeaというPluginを使えばAndroid Studioから簡単にadbコマンドが使えます。 アプリをアインストールしたり、アプリのデータをクリアしたりといった若干手間のかかる作業がコマンド一発で終わるのでとても便利です。

dumpsysを使いこなす

adbコマンドの一つですが、dumpsysコマンドはOSの情報を把握する上でとても便利なコマンドです。 現在表示中のActivityが何か、タイマーがどれくらいで発動するかなどがスグにわかります。

Androidアプリ開発者なら知っておくべきdumpsysコマンド | Engineers' Blog

pecoを使ったコマンド

Android開発が難しいのは端末やバージョン、解像度の多さにあります。 デバッグ時は複数の端末を起動し確認することもあるかと思います。 そんなときはpecoが非常に便利です。 pecoに関してはこちらが非常に参考になります。

Android開発を爆速にする10のコマンドラインスクリプト - クックパッド開発者ブログ

それ以外ですとdumpsysで現在のTOPにいるActivityが何かを調べる際にactというコマンドを用意しています。 起動しているのが一台であればactactdで事足りるのですが、複数台起動しているときはact_pecoのようなものを用意しておくと簡単に叩けます。

# dumpsys activity
alias act='adb -e shell dumpsys activity | grep "Run #[0-9]*:"'
alias actd='adb -d shell dumpsys activity | grep "Run #[0-9]*:"'

# dumpsys acitivty peco
function act_peco() {
  device=`adb devices -l | sed -e '1d' | peco`
  device_id=`echo $device | cut -d' ' -f1`
  adb -s $device_id shell dumpsys activity | grep "Run #[0-9]*:"
}

act_peco

Tools

Genymotion

Genymotionは非常に高速なAndroidエミュレータです。 VirtualBoxのインストールやPlayStoreアプリのインストールなどちょっとした作業は必要ですが、Genymotionでの開発はその後の開発速度に大きく影響します。 root権限もありますので、adb shellで端末にアクセスしてSharedPreferenceファイルを確認したり、SQLiteコマンドでDBの中身を確認したりすることができるようになります。

Genymotion – Fast And Easy Android Emulation

JsonExport

アプリ-サーバー間通信でのフォーマットにJSONを使っている方は多いと思います。 AndroidではGsonやJacksonを使ってJavaオブジェクトに変換することがよくあります。 その際にいちいちJSONの構造を把握してメンバー変数を定義するのは非常に手間が掛かりますし、間違いも多いです。

JSONExportを使うとJSONテキストを入れるだけで任意のフォーマットでクラスを生成してくれます。 残念ながらGsonフォーマットは無かったので、ちょっと変更を加えてGson形式で出力するようにしています。

JSONExport

Sketch

Sketchはアプリ開発(特にデザインデータの扱い)を劇的に変えてくれました。 今までデザイナーさんに「ここをこう切り出して、ファイル名は◯◯で。あとサイズ別にリサイズして・・・」などというやりとりから一気に開放されます。 デザイナーもエンジニアも本質的な作業に集中できるようになります。

Sketch Appを使おう(導入編) | Engineers' Blog

アーキテクチャを固める・共通認識をもつ

MVC、MVVM、MVP、Flux、Clean Architecure、など様々なアーキテクチャがあり、それぞれ良いところも悪いところもあります。 アーキテクチャの選定はアプリの内容や規模、開発人数、スキルレベルに依存すると思います。 当然、ひとりで開発する場合は特に定めず好きに書いてもいいと思います。 ただし、複数人で開発する場合、最初にアーキテクチャをしっかりと固めることでその後の開発速度が格段に違います。 レビューの度に、「これはここに書くんだっけ?」「個人的にはこちらのほうが好み」などといった不毛な議論がなくなりますし、コードの見通しがよくなるためバグも少なくなります。 はじめは窮屈かもしれませんが、是非トライしてみてください。

--

以上、非常に長々と書いてしまいましたが、まだまだ開発を加速させるTipsは存在します。 技術力の向上はもちろんですが、常にアンテナを張って便利なツールや機能を積極的に取り入れることが開発速度向上には一番効率的かもしれません。

少しでも参考になれば幸いです。

最後に

マネーフォワードでは前のめりなAndroidエンジニアを募集しています! 皆様のご応募お待ちしております。

【採用サイト】 ■マネーフォワード採用サイトWantedly | マネーフォワード

【プロダクト一覧】 ■家計簿アプリ・クラウド家計簿ソフト『マネーフォワード』家計簿アプリ・クラウド家計簿ソフト『マネーフォワード』 iPhone,iPad家計簿アプリ・クラウド家計簿ソフト『マネーフォワード』 Androidクラウド型会計ソフト『MFクラウド会計』クラウド型請求書管理ソフト『MFクラウド請求書』クラウド型給与計算ソフト『MFクラウド給与』経費精算システム『MFクラウド経費』消込ソフト・システム『MFクラウド消込』マイナンバー対応『MFクラウドマイナンバー』創業支援トータルサービス『MFクラウド創業支援サービス』お金に関する正しい知識やお得な情報を発信するウェブメディア『マネトク!』