Android - TECH PLAY - TECH PLAY

TECH PLAY

Android

むベント

マガゞン

技術ブログ

はじめに こんにちは、ZOZOTOWN開発2郚Androidブロックの倧江です。普段はZOZOTOWN Androidの開発を担圓しおいたす。 ZOZOTOWN Androidは10幎以䞊にわたっお開発されおいたす。機胜远加を重ねる䞭で、特定のモゞュヌルが肥倧化したり、モゞュヌル構成が耇雑になったりしたため、改善に取り組んでいたす。 本蚘事では、こうしたモゞュヌル構成に぀いお、課題ずその解決に向けお段階的に進めおきた取り組みを䞭心に玹介したす。 目次 はじめに 目次 背景・課題 段階的に敎理を進める方針 dataモゞュヌルの疎結合化 kaptの隔離 coreモゞュヌルずinfraモゞュヌルの䟝存方向の反転 埗られた効果 たずめ 背景・課題 たず、ZOZOTOWN Androidの珟圚のモゞュヌル構成の抂芁を玹介したす。 app 画面や機胜を担う各モゞュヌルを束ね、アプリずしお組み立おる圹割を持぀モゞュヌル feature 画面や機胜ごずに分割された実装を眮くモゞュヌル core 耇数の機胜から参照される叀い共通凊理を眮くモゞュヌル将来的には解䜓したい legacy 新しいアヌキテクチャぞの移行が枈んでいない実装を眮くモゞュヌル将来的には解䜓したい data APIやDBぞのアクセスを担うモゞュヌル infra 倖郚サヌビスずの通信など基盀的な凊理を担うモゞュヌル domain APIやDBの実装から独立したナヌスケヌス業務ロゞックを眮くモゞュヌル 珟圚、ZOZOTOWN Androidは77個のモゞュヌルに分割されおいたす。そのうち app モゞュヌルは特に肥倧化しおいお、単䜓でコヌドベヌス党䜓の玄30を占める芏暡になっおいたす。これは feature モゞュヌルぞの切り出しが枈んでいない画面の実装が app モゞュヌルに残り続けおいるこずが䞻な芁因です。たた legacy ・ core モゞュヌルは、責務が曖昧になったり䟝存関係が耇雑になったりしお、将来的な解䜓が難しくなっおいたした。 こうした状況の䞭、機胜開発を進める䞭で以䞋の問題が発生しおいたした。 legacy モゞュヌルず core モゞュヌルに察する参照が増え続けお、解䜓が先送りになり続ける ビルド時間ずナニットテストの実行時間が延び続ける 段階的に敎理を進める方針 これらの問題を解決するために、倧芏暡になっおいるZOZOTOWN Androidのモゞュヌル構成を䞀気に理想圢ぞ敎理し盎すのは、コストもリグレッションのリスクも倧きくなりたす。そこで察応コストず埗られる効果を芋比べながら、優先順䜍を぀けお段階的に手を入れおいくこずを考えたした。 優先順䜍を぀ける際は、次の3点を意識したした。 今埌も機胜远加が続く前提で、繰り返し効果が積み重なる察応かどうか 察応コストに察しお、ビルド時間や開発のしやすさぞの効果がどれくらい芋蟌めるか AIを掻甚するこずで察応コストそのものを䞋げられるか これらを螏たえお、次の3぀の取り組みを遞びたした。 data モゞュヌルの疎結合化新しく䜜るRepositoryを疎結合な構造に匷制できれば効果が積み重なるうえ、既存の実装にはほずんど手を入れずに進められるため察応コストも小さく、最初に着手した察応 kaptの隔離 @BindingAdapter を䜿った実装を1぀のモゞュヌルぞ集玄するだけで枈み、察応コストが小さい䞀方、ビルド時間の短瞮はチヌム党䜓の開発䜓隓に盎結するため優先床を䞊げた察応 core モゞュヌルず infra モゞュヌルの䟝存方向の反転耇雑な䟝存関係を人手で掗い出すのは時間がかかりそうだが、AIに事前怜蚌させるこずで察応コストを䞋げられる芋通しが立った察応 ここからは、実際に進めた3぀の取り組みを順に玹介したす。 data モゞュヌルの疎結合化 API・DBアクセスを担う data モゞュヌルに配眮されおいるRepositoryの䞭には、interfaceが蚭けられおいないものがありたした。こうしたRepositoryは legacy モゞュヌルや core モゞュヌルの実装に密結合しおおり、䜿甚するたびに䞡モゞュヌルぞの参照が増えおしたいたす。その結果、 legacy モゞュヌルず core モゞュヌルの解䜓コストが䞊がるずいう悪埪環に陥っおいたした。 そこでたずはこの悪埪環を断ち切るこずが必芁だず刀断し、 data モゞュヌルを次の4぀に分割しお新しく䜜るRepositoryは疎結合化を匷制できるようにしたした。 data:definition interfaceずDTOだけを眮くモゞュヌル data:implementation 新しい蚭蚈に沿った実装を眮くモゞュヌル data:legacy 既存の実装をそのたた匕き継ぐ受け皿 data:di DIのバむンディング定矩だけを行うモゞュヌル 利甚偎は data:implementation ではなく data:definition ず data:di にだけ䟝存する構成にしたした。実装クラスを盎接䜿おうずすればビルドが倱敗するので、コヌドレビュヌに頌らずビルド構成で疎結合を保蚌できたした。 data:legacy は単なる未敎理の実装眮き堎ではなく、新しい蚭蚈に沿った実装を既存の実装から隔おる腐敗防止局ずしお意図的に䜍眮づけたした。この䜍眮づけによっお、既存のRepositoryを党件移行しきる前から、新しい蚭蚈を安党に䞊行導入できる状態を䜜れたした。 legacy ・ core モゞュヌルず異なり、 data:legacy はRepositoryの移行が進むに぀れお䞭身が枛っおいく受け皿であり、移行完了埌にはモゞュヌルごず解䜓できる芋通しを持っおいたす。 既存の実装にはほずんど手を入れずに枈むため察応コストは小さく、そのうえ新しく䜜るRepositoryが増えるたびに効果が積み重なりたす。この2点から、3぀の取り組みの䞭でも最初に着手する察応ずしお遞びたした。 kaptの隔離 kaptはJavaスタブを生成する必芁があるため、ビルド時間を圧迫する芁因ずしお知られおいたす。ZOZOTOWNでもモゞュヌルごず、Gradleのタスクごずのビルド時間を蚈枬したした。その結果、kaptに関連する凊理がビルド時間の倧半を占めおいるこずがわかりたした。原因は、Data Bindingの @BindingAdapter を䜿った実装があちこちのモゞュヌルに散らばっおいたこずでした。kaptはモゞュヌルごずに個別の泚釈凊理タスクが実行されるため、同じアノテヌションを䜿うコヌドの分散は、その分だけ凊理コストの積み重なりを招きたす。 そこで @BindingAdapter を䜿う実装だけを ui-databinding ずいう専甚モゞュヌルに集玄し、それ以倖のモゞュヌルからkaptの蚭定を削陀したした。散らばっおいた実装を1぀のモゞュヌルぞ集玄するだけで枈むため察応コストは小さく、ビルド時間の短瞮ずいう効果はチヌム党䜓の開発䜓隓に盎結したす。この察応コストず効果のバランスから、優先床を䞊げお取り組みたした。 この察応によっお耇数のモゞュヌルでビルドにkapt関連の凊理が実行されなくなり、GitHub Actionsの4コアCI環境でのビルド時間が30分から18分ぞず、40皋床短瞮できたした。この数倀はCI環境限定のものですが、ロヌカル開発環境でも同様にビルド時間の短瞮を䜓感できおいたす。なお、珟圚もkaptが残っおいるのは core ・ ui-databinding ず、機胜単䜍のモゞュヌル2぀のみです。 core モゞュヌルの build.gradle には今も「Epoxyを削陀できたらkaptも削陀する」ずいう趣旚のコメントが残っおおり、察応がすべお終わったわけではありたせん。 core モゞュヌルず infra モゞュヌルの䟝存方向の反転 legacy モゞュヌルず core モゞュヌルは様々なモゞュヌルで䜿甚されおいお、䟝存関係が耇雑になっおいるこずもこれらのモゞュヌルの解䜓を先送りさせる原因になっおいたす。耇雑に絡み合っおいる䟝存関係を人手で玐解いお解䜓するのはコストが高く、リファクタリングずしお優先床が䞊がらない状況でした。 しかし、Claude CodeなどのAIが登堎し、こうした人手だず時間のかかる調査や怜蚌を短時間で行えるようになりたした。 そんな䞭、ある機胜の開発を進めおいる際にAPI通信を担う infra モゞュヌルが共通凊理を眮く core モゞュヌルぞ䟝存しおいお、理想ずは逆の方向の䟝存関係を持っおいるこずに気づきたした。この向きの䟝存関係だず、機胜開発に必芁だった core モゞュヌル偎の新しい実装から infra モゞュヌル偎の既存パヌサヌを盎接参照できたせん。そのためinterfaceず実装を分けおDIで泚入するずいう、本来䞍芁なはずの回り道の実装が必芁になっおいたした。 そこでAIに、䟝存方向を反転させる案を別ブランチで怜蚌させたした。䟝存関係の定矩を反転させお、関連するクラス矀も infra モゞュヌル偎のパッケヌゞぞ移動したした。ロゞックの倉曎を䌎わず、ファむルの移動ず参照先の付け替えだけで完結する倉曎だず分かりたした。 この芋極めが、AIに実装たで任せる決め手になりたした。挙動を倉えるロゞック修正が必芁な倉曎であれば、AIが提案した内容でも人間が倉曎の劥圓性を现かく確認する必芁がありたすが、機械的な倉曎だけで枈む堎合は怜蚌から適甚たでを任せやすいず感じおいたす。 䞀般的に䟝存関係の倉曎は圱響範囲が広く、倧量の゜ヌスコヌドを倉曎するこずになりたす。この芋通しを短時間で立おられたこずが、着手の刀断を埌抌ししたした。 実際の察応でも、AIが䜜成したブランチをベヌスに実装を進め、既存のビルドずナニットテストがすべお通るこずを確認できたしたが、圱響範囲の広さから察応コストは高そうに芋えたした。しかし、AIによる事前怜蚌でその刀断コスト自䜓を䞋げられたこずが、優先しお取り組む決め手になりたした。この実瞟によっお、今埌の䟝存関係の敎理や legacy ・ core モゞュヌルの解䜓を加速させられる目凊が立ちたした。 埗られた効果 この3぀の取り組みを通じお、次の効果が埗られたした。 data モゞュヌルの疎結合化新しく䜜るRepositoryが legacy ・ core ぞの密結合を避けられる構造になり、参照が増え続ける悪埪環を断ち切れたした kaptの隔離GitHub Actionsの4コアCI環境でビルド時間を30分から18分40皋床に短瞮できたした core モゞュヌルず infra モゞュヌルの䟝存方向の反転機胜開発に䞍芁だった回り道の実装を解消できたした。加えお、AIに事前怜蚌させるこずで倧芏暡な䟝存関係の倉曎に着手する刀断を玠早く行えるずいう実瞟もできたした たずめ 本蚘事ではZOZOTOWN Androidのモゞュヌル構成に察する課題ずその解決方法を玹介したした。倧芏暡なアプリのモゞュヌル敎理を䞀括ではなく段階的に進める前提で蚭蚈し、移行しきれおいない実装の受け皿を腐敗防止局ずしお甚意するこずで、既存実装ぞの圱響を抑えながら新しい蚭蚈を導入できたした。たた䟝存関係の倧芏暡な組み替えは、AIに実珟可胜性を先に怜蚌させるこずで、着手の刀断を玠早く行えたした。マルチモゞュヌル構成の敎理を怜蚎しおいる方がいれば、ぜひ本蚘事を参考にしおみおください。今埌は残っおいる legacy ・ core モゞュヌルの解䜓や、 app モゞュヌルに残る画面の feature モゞュヌルぞの切り出しなど、匕き続きモゞュヌルの敎理を進めおいきたいず考えおいたす。 ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。 corp.zozo.com
はじめに # GFXBenchずいうGPUベンチマヌク゜フトを取り䞊げたシリヌズの2回目です。 前回でGitHub公開されたGFXBenchのビルドが行えたした。 今回は実際に実行しおベンチマヌクスコアを確認しおみたす。 ベンチマヌク玹介 # GFXBenchは様々なベンチマヌクから構成されおおり、起動時に遞択しお実行する様になっおいたす。 カテゎリは倧きく 高レベルテスト ず 䜎レベルテスト に分かれおいたす。 今回取り䞊げるのは 高レベルテスト の方で、その䞭からいく぀か抜粋しお玹介したす。 --> Information 以降画像は筆者のスマヌトフォンのGFXBench実行時スクリヌンショットより匕甚 スマヌトフォン/タブレットによっおはレむアりト等芋え方が異なる堎合がありたす T-Rex # Manhattan # Manhattan 3.1 # Car Chase # Aztec Ruins # 色々説明されおいたすが、たずは "Required minimum API" の郚分だけに泚目しおみたす。 以䞋の様にベンチマヌクが OpenGL ESバヌゞョン に䌎っお進化しおきた事がわかりたす。 GFXBenchのバヌゞョンアップで各ベンチマヌクが远加されるずいう芋え方 ベンチマヌク OpenGL ES version T-Rex 2.0 Manhattan 3.0 Manhattan 3.1 3.1 Car Chase 3.1 + AEP (Android Extension Pack) そのため、そのAndroid端末が察応しおいる OpenGL ESバヌゞョン によっお実行出来るベンチマヌクが倉わりたす。実行できない堎合は埌のベンチマヌク遞択画面で遞択出来ない状態ずなりたす。 ※ Aztec Ruins は路線が倉わった様なので省略APIのバヌゞョンではなくマルチAPIでのベンチマヌクずいうニュアンスになった暡様 ベンチマヌクむンストヌル # 前回ビルドを行ったapkファむルをAndroid端末にむンストヌルしたす。 Android端末偎は開発者モヌドになっおいおビルド甚PCずadb接続出来おいるずしたす。 なお、adbコマンド実行時は Git Bash でなく Windowsタヌミナル を䜿甚した方が䜕かずトラブルが起きずに枈みたす。 adb install gfxbench-5.1.5+corporate.apk ベンチマヌク実行 # Android端末䞊からGFXBenchのアむコンをクリックし起動したす。 初回起動時は「Pushed data not found」ずいう衚瀺が出たす。 「OK」を遞択しおapkバンドルのデヌタをアプリデヌタ領域にコピヌをしたす。 --> Information 前回も觊れたしたが初回起動時にこのコピヌ分だけアプリサむズが増える事になりたす。 手動でデヌタを配眮する手順も䞊蚘衚瀺の様に案内されたす。 起動するず、ベンチマヌクの初期画面が衚瀺されたす。 そこで "テスト遞択" ボタンを抌すず テスト遞択 の画面になりたす。 実行するベンチマヌクずしおは筆者の思い入れより以䞋の2぀ずしたす。 T-Rex Manhattan たた、それぞれに぀いお、オンスクリヌン版ずオフスクリヌン版がありたす。 オンスクリヌン版では実際に画面にベンチマヌクが描画されお実行されたす。そのためAndroid端末の実際の画面サむズにベンチマヌクスコアが䟝存したす。 オフスクリヌン版では画面に描画されず進行がわかる皋床の描画はありオフスクリヌンサむズ固定で実行されたす。そのためAndroid端末の実際の画面サむズに䟝存せずベンチマヌクスコアを埗る事が出来たす。 Android端末を暪断的に画面サむズに䟝存せずGPU性胜を比范したい堎合はこちらを遞択したす。 最初起動するず党ベンチマヌクがチェックされた状態になっおいるので、実行したいベンチマヌクのみをチェックし "開始" ボタンを抌したす。 高レベルテスト、䜎レベルテスト ずいったカテゎリでチェックを倖すず䞀括でチェックを倖せるので䟿利です ベンチマヌク実行結果 # 実際にオフスクリヌン版を実行しおみたす。 画面描画を芋たい方はオンスクリヌン版でお楜しみください 実行するAndroid端末はAndroidバヌゞョンが(比范的)新しいものを手元のコレクションから芋繕っおみたす。 なお、今回察象ずするAndroid端末のスペック垯はベンチマヌクスコアが最倧でも 100台半ば 皋床のfpsのものずしたす。 ハむスペックな端末にずっおはいたや T-Rex/Manhattan ベンチマヌクは軜い郚類ずなっおしたいたしたので...。 その堎合はもっず重いベンチマヌクが適しおいるず思われたす 以䞋、実枬した結果䟋です。ベンチマヌクスコアはオフスクリヌン版のfps倀です。 --> Caution あくたで 「筆者の環境および枬定時点における䞀䟋」 であり、同様のGUP、手順で枬定された堎合でも、環境によっお異なる結果ずなる可胜性がある点をご了承ください。 GPU SoC Driver version Android version T-Rex score Manhattan score ARM Mali G57 MC1 Allwinner A537 OpenGL ES 3.2 v1.r51p0-00eac0.26a7a06524af59d6533aad5e5bab3098 15 19 13 ARM Mali G57 MC2 Mediatek Helio G99 OpenGL ES 3.2 v1.r32p1-01eac0.394145956bc7cd8e697b330aba11e3d3 13 57 37 ARM Mali G57 MC3 Mediatek Dimensity 800U OpenGL ES 3.2 v1.r32p1-01eac0.461cd25a1c7796cc6d3ad05234c053ac 12 85 54 偶然にも:-) core数(MC)違いのGPUですが、core数が倚いもの皋いい結果ずなりたしたそれはそう。 もう少し比范をするためにベンチマヌクスコアをcore数で割っおみたす。 GPU T-Rex/core score Manhattan/core score ARM Mali G57 MC1 19 13 ARM Mali G57 MC2 28.5 18.5 ARM Mali G57 MC3 28.3 18 今回のAndroid端末のMC2, MC3のものは同じ傟向同等MC1想定倀からの比䟋関係である事がわかりたす。 その倀からするず今回のAndroid端末のMC1のものは控えめな倀である事もわかりたす。 䜎スペック垯なのでそこたで呚波数が高くない等の理由で控えめなのかもしれたせん。 おわりに # 今回はGFXBenchの内容玹介ず、前回ビルドしたGFXBenchを実際に実行しおベンチマヌクスコアを確認したした。 次回は今回実行したAndroid端末よりも叀いAndroidバヌゞョンで実行したい堎合の手順を取り䞊げたす。 ラむセンスおよび免責事項 # 本蚘事に掲茉しおいるスクリヌンショット、怜蚌結果は、BSD 3-Clause Licenseのもずで公開されおいる Kishonti-Opensource/gfxbench の゜フトりェアおよびアセットを利甚・匕甚したものです。 Original Copyright: (c) 2005–2025 Kishonti Ltd. License: BSD 3-Clause License 画像等の暩利に぀いお: 蚘事内で匕甚しおいるGFXBenchのベンチマヌク実行画面およびUIの著䜜暩は、原著䜜者であるKishonti Ltd.に垰属したす。 【免責事項】 本蚘事に掲茉しおいる手順、ベンチマヌクスコア等の枬定結果は、特定の怜蚌環境における珟状のたたAS ISのものであり、その正確性、安党性、再珟性を保蚌するものではありたせん。 本情報の利甚や怜蚌の実行により生じた盎接的・間接的な損害に぀いお、筆者および株匏䌚瀟豆蔵は䞀切の責任を負いたせん。内容を十分にご確認の䞊、ご自身の責任においおご利甚ください。
こんにちは。株匏䌚瀟サむバヌ゚ヌゞェントのAmebaLIFE事業郚でAndroidアプリ゚ンゞニアを ...

動画

曞籍