【インターンレポート】Android Debug Menuの刷新

はじめに

こんにちは。LINEの2020年度夏季インターンシップに8/3~9/11の期間で参加しました小池椋介です。私は京都大学工学研究科機械理工学専攻の修士1年であり、普段は歩行ロボットの制御に関する研究を行っております。

今回のインターンではLINEアプリのAndroidクライアント開発チームのうちApp Dev 3チームに所属し、玉木英嗣さんにメンターになっていただきました。本記事では、インターン期間中に私が取り組んだことをご紹介します。

問題点

LINEのAndroidクライアント(以下LINE Android)の開発用ビルドではDebug Menuが用意されていて、開発やQAをスムーズに行うための様々な機能があります。このDebug Menuは何年もの間にわたって活用され続け、機能がどんどん追加されていき、現在は数百種の機能が用意されています。そのソースコードは肥大化を続け、5000行以上もあるActivityのクラスにほぼ全ての機能が定義されているという現状です。このままでは機能の追加、削除、編集に手間がかかる上にバグの温床になりかねません。

そこで、今回のインターン期間中にDebug Menuを適切に管理するフレームワークを作成することになりました。

設計

旧Debug Menuはもはや改善が効かないほど肥大化してしまったので、新たに一から(Activityを定義するところから)作成します。

旧Debug Menuでは一つ一つの機能(以下Item)を似た役割ごとのグループ(以下Section)に分けて管理し、SectionをタップするとItemが展開されるようになっています(下図参照)。

LINEの開発者はこのUIに慣れ親しんでいるはずなので、新Debug Menuも同様のUIで作成すれば良さそうです。より詳細な設計は社内wiki上にDesign Docとして作成します。

App Dev 3チームの開発には2段階レビュー体制を採用しているため、作成したDesign Docには必ず2回以上のレビューが入ります。レビューにおける検討の末、下図のようなクラス図で表されるフレームワークを実装することになりました。

Debug Menuは、直接ユーザーの目に触れないので表示効率などに神経質になる必要がない、Sectionを動的に変更するという状況は今後も発生しそうにない、という特徴を持ちます。
そこで、少々古いが簡便なウィジェットであるExpandableListAdapterを使って表示することにします(上図の`TestMenuExpandableListAdapter`)。
旧Debug Menuの最大の問題点は、SectionやItemに相当するものが適切にモジュール化されておらず単一のファイルに全てを押し込んでしまったことです。それを回避するため、SectionやItem(のView)を生成してExpandableListAdapterへ渡すためのインターフェースを作成します(上図の`TestMenuSectionViewCreator`と`TestMenuItemViewCreator`)。
また、Debug Menuに必要とされる機能のうちの大部分は情報表示、クリック処理、スイッチ処理、テキストを送信する処理、というような基本的な動作で賄えるため、そのような基本的なSectionのための抽象クラスを作成します(上図の`SimpleTestMenuSectionViewCreator`)。

以上の設計により、簡単かつ柔軟に新しいSectionやItemを開発者が追加できるようになります。

タスク整理

LINE AndroidではJiraを利用したチケット駆動開発を採用しています。実際に開発を行う前に、タスクをGitにおけるPRと同程度の粒度で分解し、チケットとして発行します。Design Docに記述した内容を実装するためのチケットを全て一気に作り、完成までの必要作業や現在の進捗状況をイメージしやすくします。

実装

コーディングをしていきます。
LINE AndroidはKotlinが浸透する以前までJavaで開発されていましたが、現在は全ての新規開発においてKotlinを使います。私は開発ツールとして主にAndroid Studioを使いました。

App Dev 3チームはここでも2段階レビューを行うため、フィードバックを受けて適宜修正や改善をしながら開発していきます。クラス設計に関わるレベルでの指摘から、チーム内のコーディング規約の違反まで、非常に丁寧なレビューを行っていただきました。

結果

SectionやItemのレイアウトも作成し、概ね当初の目標通りにDebug Menuのフレームワークを開発できました。

外観は下図のようにしてあり以前のものとあまり変わりませんが、SectionやItemなどの要素が増えると特定のクラスが極端に肥大化するという問題は解消されました。

Debug Menu以外の取組

Code Readability

石川宗寿さんにより、自身の公開しているCode Readabilityというプレゼンについてマンツーマンでご講演いただきました。1時間×8回にわたり700ページ以上のスライドを解説していただくことで、可読性を確保するために必要な技術を学習しました。非常に汎用性のある内容となっていて、コーディングのみならず機械系の設計(3D CADのアセンブリ、URDFの設計など)にも活かせそうだという感想を持ちました。

各種勉強会

私が所属したチームでは、Android Study Session(Android開発の知見を共有する勉強会)や英会話の勉強会をインターンに関係なくそれぞれ週1回ずつ行っています。社会人になっても無理なく勉強を続けることができる、良い習慣だと思いました。インターン最終週のAndroid Study Sessionでは私がインターン中にやったことを発表しました。

おわりに

LINE Androidは、貸与されたMacBook Pro(Core i7, RAM16GB)では初回ビルドに2時間程度も要する巨大なプロジェクトです。その巨大なソースコードを覗き、自分のコードを残すというのは非常に貴重な経験になりました。

また、Debug Menu作成というメインタスク以外にも多くの勉強の場が用意されていて、インターン前と比べると確実に実力がつきました。
自分はこの業界における経験が浅いですが、メンターをはじめとするApp Dev 3チームの方々がかなり丁寧に指導してくださったため、効率的に技術を習得しインターン期間の業務を終えることができました。

開発経験を積み、成長したいという目的を持つ人にはLINEの長期インターンシップは非常にお勧めなので、興味を持った方は是非エントリーしてみてください!