概要
どうもAndroidエンジニアの渡邉です。自分は仕事で採用や面談に関わることが多いのですが、入社後に活躍していただけるだろうかというインタビューと、Androidの知識に関するインタビューをします。今回は勉強会の懇親会などで採用に関わっている人とかにも「どんな質問します?」と聞いたことのある、Androidエンジニアインタビューあるあるな質問と回答をまとめたいと思います。自分の場合JetPackやアーキテクチャデザインパターンについては面接で必ずと言っていいほど聞きますが、その他の質問は自分だったら聞かれたら嬉しいなという感じで、技術を習得する姿勢を証明できれば、あとは入社してから覚えていければいいんじゃないというスタンスです。
環境や前提条件
Androidの中途採用の面接やSESでの面談で、テックブログやGitHub、職務経歴書から読み取れないAndroidの知識に関するインタビューをするときを考えます。 答えが一つじゃないものに関しては解答例を挙げたいと思います。
QA
Q. Android OSで知っているバージョンと名前を教えてください
note : ほぼアイスブレイク。KitKatのとき辛かったよね〜みたいな話をするみたいです。
A. あ、はい。
version | name | note |
---|---|---|
Android 10 | - | https://developer.android.com/about/versions/10 |
Android 9 | Pie | https://developer.android.com/about/versions/pie |
Android 8.0 | Oreo | https://developer.android.com/about/versions/oreo |
Android 7.0~7.1 | Nougat | https://developer.android.com/about/versions/nougat |
Android 6.0 | Marshmallow | https://developer.android.com/about/versions/marshmallow |
Android 5.0~5.1 | Lollipop | https://developer.android.com/about/versions/lollipop |
Android 4.4 | KitKat | https://developer.android.com/about/versions/kitkat |
参考:https://developer.android.com/about/versions/10
Q. Android SDKとはなんでしょうか?
A. あ、はい。Androidアプリを開発するときに必要とされるツールセットのことでSoftware Development Kitの略です。Debuggerやエミュレータ、AndroidのAPIがそれになります。Googleが新しいAndroidのバージョンをリリースするたびに、対応するSDKがリリースされるので、開発者は最新の機能を実装するために、SDKをダウンロードしてAndroid Studioにインストールする必要があります。
参考:https://www.techopedia.com/definition/4220/android-sdk
Q. Applicationとはなんのことでしょうか?
A. あ、はい。Applicationクラスは、アクティビティなどすべてのコンポーネントを含むAndroidアプリ内の基本クラス(神クラス)です。 AndroidManifest.xmlのタグの「android:name」属性として指定することにより、サブクラスを実装することででき、アプリケーション/パッケージのプロセスが作成されるときに、他のクラスの前にインスタンス化されます。
Q. Contextとはなんのことでしょうか?
A. あ、はい。Contextというとまぁ2つにわかれて, ApplicationContext, ActivityContextになります。Context自体は、アプリ環境に関するグローバルな情報へのインターフェースで、画像やレイアウト、stringsなどのリソースやDBやPreferenceへのアクセスや、インテントのブロードキャストの受信などアプリケーションレベルの操作や呼び出しをする時に使う抽象クラスですね。
ApplicationContextは、Activityのライフサイクルをまたいでコンテキストを渡す場合に使います。画像を読み込むライブラリのGlideに渡すコンテキストとかで使ったりしますかね。
ActivityContextはアクティビティで使用することができるもので、ライフサイクルに関連付けられているものになります。ActivityのスコープでContextを渡す場合や、現在のContextにライフサイクルが関連付けられているContextが必要な場合は、これを使用する必要があります。画面遷移のIntentに使用するとかですかね。
参考:
- https://developer.android.com/reference/android/content/Context
- https://stackoverflow.com/questions/31964737/glide-image-loading-with-application-context
Q. Activityとはなんでしょうか?
A. あ、はい。 Androidアプリを構成する重要なコンポーネントで、アプリがUIを描画するウィンドウって感じですね。アプリと別アプリのエントリーポイントとして機能します。AndroidManifestのタグ内でタグを宣言してあげる必要があります。アーキテクチャデザインパターンなどではFragmentと並んで、Viewとして位置づけされたりしますかね。Androidの場合はmain()
で起動するWebアプリとかのプログラミングとは異なってライフサイクルのコールバックバックメソッドを呼び出すことで、Activityインスタンス内のコードが開始されるものになってます。
参考: https://developer.android.com/guide/components/activities/intro-activities
Q. Activityのライフサイクルとは何で、何があるかと、それぞれどんなタイミングで呼ばれるのでしょうか?
A. あ、はい。Activityにはアプリ内を遷移したり、バックグラウンドにしたり、電話が来たりっていうイベントなどで変化する状態を認識できるようにライフサイクルのコールバックっていうのが用意されていて、それぞれ、
- onCreate : システムが初めてアクティビティを作成するときに発生するコールバックで、アクティビティの存続期間にわたり一度だけ発生する必要がある基本的なアプリケーション起動ロジックを実行しますね。例えばViewのバインドとかMVVMでいうところのViewModelの関連付け。savedInstanceStateなど以前に保存された状態の復元などですね。
- onStart : Activityが開始状態になると発生するコールバックで、アプリでActivityがフォアグラウンドに移動し、インタラクティブにできる状態ですね。
- onResume : Activityが再開状態になると、Activityはフォアグラウンドに移動し、システムが onResume() コールバックを呼び出しますね。カメラのプレビュー開始などのフォアグラウンドにある状態で実行する必要が機能を有効にする処理なんかを書く感じですね
- onPause : ユーザーが他のActivity起動したり、バックグラウンドにするときなど、Activityから離れる時にシステムが呼ぶコールバックですね。GPSのセンサーとか、電池寿命に関係しそうなリソースを解放する時とかに呼ぶ感じですね。でもマルチウィンドウモードとか考慮すると、解放するタイミング検討する必要があるんですよね〜。
- onStop : ユーザーに対して表示されなくなったActivityって停止状態になるんで、その時システムは onStop() コールバックしますね。Roomとかでデータを永続化する処理なんかでタイミングどうするってなったときとかはここに書いたりしますね。onStopされたActivityが画面復帰するとonRestart()をよびますね。
- onDestory : アクティビティが破棄される前に呼び出されますね。注意したいのは画面が回転した時とかシステムのフォントとか変えたりとかすると実行される感じですね。
Activityのライフサイクルは基礎って感じなのでFragmentとかViewModelのライフサイクルも並行して覚えるのが重要って感じですね。
参考: https://developer.android.com/guide/components/activities/activity-lifecycle
Q. GradleのBuildTypeとは何で、何をするために使うのでしょうか?
A. あ、はい。アプリをビルドする時とかにGradleが使用するプロパティの定義するときに使うんですけど、ProGuardつかって難読化するかとか、flavorでビルドにつかうリソースとかも定義しますし、buildTypeとflavorで組み合わせて依存関係と署名設定を適切に管理するためのbuild variantをつくりますね。
参考:
Q. Fragmentとはなんでしょうか?
A. あ、はい。UIの挙動とか部位を表すもので、最近だとSingleActivityのアプリを作ったりするので1つのActivityで複数のFragmentを組み合わせたりとか、まぁViewPagerとかBottomNavigationとか組み合わせたりですね。別々のActivityでFragmentを再利用したりすることもできて、Activityのモジュラーセクション的なものですね。
参考:https://developer.android.com/guide/components/fragments
Q. 画面を回転するとActivityはどうなりますか?
A. あ、はい。画面を回転するとonDestoryが呼ばれます。つまりActivityのインスタンスが破棄されちゃって新しいインスタンスが回転した新しい向きでできます。他のLifecycleメソッドは最初にActivityが作成されたときと同じフローで呼ばれますね。
Q. 画面が回転してもデータがリセットされたり、リロードされないようにするにはどうすればいいでしょうか?
A. あ、はい。まぁ基本的にはViewModelとonSaveInstanceStateの組み合わせですかね。ViewModelはLifeCycle-Aware、つまり回転しても破棄されることがないのでViewModelにデータを格納してまたバインドしたり、EditTextとかのUIデータはonSaveInstanceState使いますかね。
参考:
- https://developer.android.com/topic/libraries/architecture/lifecycle
- https://developer.android.com/topic/libraries/architecture/viewmodel
Q. Android Studioの機能について便利だと思うところ教えてください
A. あ、はい。例えば、プロファイリングツールが便利ですね。パフォーマンスチューニングする時にCPU、メモリ、グラフィック、ネットワーク、デバイス バッテリーなどのリソースをアプリが効率的に使用できていない場所を発見するのに使います。
他にはpluginは便利そうなのは入れたりしてます。Android StudioはIntelliJ IDEAがベースになってるのでpluginが使えるのはありがたいですね。
Kotlin Fill Classとか
ADB IdeaとかADBコマンド実行する時にショートカットすることで作業が円滑になりますね。
参考:
- https://developer.android.com/studio/intro
- https://plugins.jetbrains.com/plugin/10942-kotlin-fill-class
- https://plugins.jetbrains.com/plugin/7380-adb-idea/
- https://medium.com/@eyal_katz/top-17-plugins-for-android-studio-b53daca83977
Q. Android JetPackについて知っていることを教えてください
A. あ、はい。Android JetPackは2018年のGoogle I/Oで発表された開発を簡単に作成するためのライブラリやツール、ガイダンスのことですね。ボイラープレートコードの手間を省いてくれるのでドメインに集中することができます。あぁこれもJetPackだったのかみたいな項目も多いんですけど、KTX, DataBinding, LiveData, Navigation, Room, ViewModelとかは今まで作ったアプリ的に重視して深掘りしてきました。けっこう勉強会(GDG Tokyo)でも取り上げられる内容なので、特に気になるライブラリはキャッチアップしてました。https://gdg-tokyo.connpass.com/
参考:
https://developer.android.com/jetpack?hl=ja
Q. Androidのアーキテクチャデザインパターンについて知っていることや、MVC,MVP,MVVMと違い、問題点など教えてください
A. あ、はい。最近のモバイルアプリの要件が高まっていることからAndroidのアーキテクチャデザインパターンは関心が集まっていると感じます。2008年にAndroidが登場してから現在に至るまでに、Androidエンジニアは、FatActivity問題といわれる、Activityで複数の機能を実装したり、内部で機能が密結合したり、コールバックをActivity自身で受け取ったりといったコールバック地獄に悩まされていました。その課題を解決するためには機能を適切なモジュールに分離する必要があったのです。それがアーキテクチャデザインパターンを採用するモチベーションとなっていて、各パターンの一般的な原則は「関心の分離」です。ActivityやFragmentといったAndroidのOSとアプリを繋げる結合クラスへの依存を最小限にすることが「アプリのアーキテクチャガイド」でも推奨されていて、MVVMがデファクトスタンダートと言ったところではないでしょうか。
MVCは、Model-View-Controllerの頭文字で、モデルはモデルデータクラスのことを指していて、ビューはxmlファイルを参照し、コントローラーはビジネスロジックです。コントローラーがAndroid APIと密に結合しているため、単体テストが書けないのが問題といったところではないでしょうか。
MVPは、Model-View-Presenterの頭文字です。ビューには、xmlおよびActivityやFragmentクラスが含まれます。そのため、アクティビティはビューインターフェイスを実装するのが理想的だと思います。
MVVMは、Model-View-ViewModelの頭文字です。 Modelは、オンライン上のRemoteデータソース、ローカルのSQLiteやPreference、ビジネスロジックで構成されます。ViewModelはデータをラップし、ビューのデータをLiveDataなどで保持して、準備する役割を果たします。 また、ビューからモデルにイベントを仲介する役割を担います。
参考:
- https://developer.android.com/jetpack/docs/guide?hl=ja
- https://peaks.cc/books/architecture_patterns
- https://github.com/android/architecture-samples
- https://www.techyourchance.com/mvp-mvc-android-1/
まとめ
以上、Androidエンジニア面接で聞きがちな質問をまとめてみました。面接などで役に立てばと思います。あとRxやCoroutineなど聞かれることも多いみたいなので、勉強しておくとよいでしょう。あとだいたい簡単なサンプルアプリの提出などがあるので、細かいところはコードレビューでスキルのチェックをするみたいです。
もちろんこのリストは決して完璧ではありませんので、自分はこういうこと聞いてるよ〜というのがあればTwitter(@nabetaro_jp)で教えてください!
読んでいただいてありがとうございました!