読者です 読者をやめる 読者になる 読者になる

Mercari Engineering Blog

We're the software engineers behind Mercari. Check out our blog to see the tech that powers our marketplace.

Androidクライアントアプリのデバッグ機能

こんにちは, Androidチームの @tomoaki_imai です。 先日 shibuya.apk というAndroid勉強会で メルカリのデバッグ機能についてお話をさせていただきました。スライドはこちらです。

www.slideshare.net

要点としては以下2点となります。

  1. デバッグ機能はモジュール化して管理し、productionのコードに入れないようにする
  2. メルカリではクライアントのデバッグ設定画面以外にデバッグメニューもあるが、メニュー表示はUIに影響を及ぼすので、ビジビリティをデバッグ機能上で制御できるようにする

今回は発表ではほとんど話さなかった、メルカリのAndroidで実装しているデバッグ機能そのものについてもう少し触れたいと思います。

そもそもデバッグ機能とは

このデバッグ機能は開発者が効率よく開発を進めるためにDEV版のみに追加しているものです。 例えば

  • サーバーサイドエンジニアが、開発中の機能が入ったブランチがデプロイされたサーバーに切替えて動作確認したい
  • クライアントエンジニアがアプリの設定や機能などをサクッと確認したい

といった用途で利用しています。

デバッグ設定画面とデバッグメニューの違い

上でも述べましたとおり、メルカリAndroidではデバッグ設定画面デバッグメニューという2種類のデバッグ機能があります。

  • デバッグ設定画面
    f:id:tomoima525:20150806125925p:plain:w300

  • デバッグメニュー
    f:id:tomoima525:20150806125948p:plain:w300

2つの用途の違いとしては、ざっくり以下のようになっています。

  • デバッグ設定画面 : クライアント全体に影響するような設定を行う場合に利用
  • デバッグメニュー : さっと確認したい値や、画面単位で影響するような設定を行う場合に利用

これらについては必要に応じて開発者が少しずつ機能を追加してきました。それぞれについてどのような機能があるか紹介します。

デバッグ設定画面

デバッグ設定画面では主に以下の様な機能を提供しています。

APIのドメイン変更

メルカリでは多くの機能を並行開発しているため、複数の開発サーバーがあります。そこで柔軟に環境を切替えるために、この機能が利用されます。

特殊画面を開く

エラー画面やメンテ画面など、通常の操作では開くことができない画面を開く機能です。この辺の画面を開発しているときは、さくっと開いて実機で確認できるので、とても便利です。

f:id:tomoima525:20150806130107p:plain:w400

デバッグ・ログアウト

メルカリではログアウト機能を提供していないのですが、開発時にユーザーを切替えて作業を進めたい場合に、最低限の部分だけログアウトすることが出来る機能です。

デバッグメニュー

発表でお見せしたデモ動画です。

youtu.be

デバッグメニューでは主に以下の様な機能を提供してます。

自動入力

例えば入力して確認が必要な画面について、自動で入力する機能です。 仕組みとしては単純で、デバッグメニュー・モジュール経由でBaseActivityに作ったonDevInput()というメソッドを呼ぶだけです。自動入力を使いたい画面についてonDevInput()をoverrideして、入力したい項目に適宜いれてあげます。

//MenuModule.java
private void onDevInput(){
    BaseActivity activity = (BaseActivity)mWeakActivity.get();
    if(activity == null) return;
    activity.onDevInput();
}
//LoginActivity.java
@Override
public void onDevInput() {
    mEmailEt.setText("test@example.com");
    mPasswordEt.setText("password");
}

Activity情報

今開いているActivity名や、そのActivityで利用しているintentを確認できます。Activity名は意外と覚えられないので重宝します。
f:id:tomoima525:20150807104802p:plain:w300

APIブランチ確認

今クライアントに設定しているAPIのブランチ情報を確認できます。デバッグ設定画面でも確認できるのですが、いちいちデバッグ設定画面まで行くのが面倒なので、ここにも用意しています。

システム系情報

デバイスから取得できるシステム情報を取得しています。

  • 画面dpiサイズ
    画面のdpiをgetDisplayMetrics().densityで確認しています
  • デバイス情報
    デバイス名やOSバージョンなどをBuildオブジェクトから確認しています
  • Heapサイズ
    アプリが確保しているメモリをRuntime.getRuntime()でチェックします
  • 各種ID
    Pushを送るために必要なIDなどを確認できるようにしています

マスターリフレッシュ

メルカリでは初回起動時の通信量を減らし、起動を早めるために、クライアント側に"マスターデータ"を保持しています。マスターデータはブランドカテゴリや県名などのような、通常変更がないデータのことです。このマスターデータがサーバーのマスターデータと差分があった場合は差分を取得するようにしています。サーバー側のマスターデータを更新した場合に、差分が反映されているかを確認させるためにこの機能を持っています。

メニューの表示/非表示について

メルカリではデバッグ機能を含むDEV版でもQAを実施しています。デバッグメニューが常に表示されているとUIに影響を及ぼすだけでなく、予期せぬ動作も起こす可能性もあります。そのため、デバッグメニューは表示、非表示をデバッグ設定画面からコントロールできるようにしています。その辺のノウハウはスライドに書いてありますので、ご確認ください。

f:id:tomoima525:20150806141900p:plain:w250 デバッグメニュー表示

f:id:tomoima525:20150806141959p:plain:w250 デバッグメニュー非表示

まとめ

今回はメルカリのAndroidクライントで実装しているデバッグ機能について紹介しました。デバッグ機能はサービスそのものとは関係がありませんが、開発時の効率性を上げるために非常に重要な機能です。うちではこんな便利なデバッグ機能を使ってるよ、というのがあれば、ぜひ教えて下さい!