直すのに苦労したバグはあるか?

川原友希氏(以下、川原):ここまでいろいろとFlutterとKotlinの違いとかに、フォーカスを当ててお話ししてきました。ここから先は事前にパネラー同士で質問を出していて、そこに回答していくかたちで進めたいと思います。

1つ目、こちらはoidyさんですね。お願いします。

追田泰宏氏(以下、追田):はい。アプリを作る上で厄介なバグがいくつかあったりすると思います。例えば特定の端末でしか起きないバグとか、あとはライブラリ側で落ちているからどうしようもないというバグとか、そういうのがいろいろあると思うのですが、もし「こういうのがあった」という事例があれば聞きたいなと思います。

山田淳登氏(以下、山田):これはFlutterのほうが多そうですね。

久野文菜氏(以下、久野):そうですね(笑)。ちょっと考えたのですが、iOS側はわりと直すのに大変なバグ、EngineをフォークしたりFlutterSDKをフォークして直さないといけないバグとか……。

iOSユーザーだったらわかるかもしれないのですが、時計の部分をタッチすると、リストがピュッと上に戻るみたいな。「X(旧Twitter)」でも、タップしたらリストがピュッと上がるみたいな挙動をするのに、Flutterだとサポートしていない。なぜならiOSだけの機能だから、みたいな。マージしてくれないとかがあるから、iOSだとバグを直してくれなかったり、そもそも取り入れてくれなかったりする。

だけど、AndroidだとAndroidのバグのissueが上がったら、Flutterのコミュニティがすぐに直してくれる。なので、実はそこまで「困っちゃった」みたいなのはなかったなぁ。

追田:確かに。自分もiOSのほうでSwiftで作るアプリとFlutterで作るアプリとで挙動が違ってどうしようもないことがあるので、それはすごくわかります。

山田:Kotlin側の話でいうと、たぶん言語側のバグみたいな話や、あとはAndroid SDKのバグみたいな話になると思うのですが、そういうのは近年ほとんどないですよね。

昔は「この端末でしかクラッシュしない」みたいなものがあったのですが、近年はあまりないかなと思います。けど、先ほど聞いたのですが、一応oidyさんから1つなんかあったりもしましたね(笑)。

追田:そうですね。メディア系の音声とか動画系の機能を作っていた時に、その特定の端末だけで録音ができないというバグがあって、結局わからないので会社でその端末を買ってもらって直すということをしていたのですが、たまにそういうのがあったりしますね。

ただ、普通に作る分には、公式のJetpackライブラリという、後方互換性を保つためのライブラリが提供されているので、だいたいそれを使えば大丈夫という感じにはなっていると思います。

川原:いろいろアップデートされて開発しやすくなっているけれど、珍しいものを開発する時は、やはりバグにぶつかりがちみたいな?

追田:そうですね。

川原:なるほど。でも新しいものを作っていくのはいいですよね。

アニメーション、難しくないですか?

川原:(スライドを示して)次、これはどういうことでしょう? 山田さん。

山田:はい。かなりざっくりした疑問なのですが、最近開発でアニメーションを対応することが多くて。「TIPSTAR」というサービス上もアニメーションが多いのですが、どういうアニメーションのことを言っているかというと、例えば表示するアイテムがスライドしてサッと画面に入ってくるような、そういうアニメーションとかの話です。

今はJetpack Composeでそういったアニメーションの実装をしていて、抽象化がかなり進んで、ただ単にスライドするだけのアニメーションだったら簡単に作れるのですが、捻ってスライドさせて上に上げるみたいな、そういうのが難しかったりします。

お二人はそういうアニメーションについての実装は何かありますか?

追田:そこまで入り組んだものは今まで作ったことはありません。確かにアニメーションは、無限ループするのか、1回だけなのか、どれぐらい複雑なものなのか、何をアニメーションするのかによって何通りかAPIがあって、いろいろな種類があるので何を使えばいいのかをまず調べるのが大変なことはあります。

ただ、Composeで作っていて思ったのは、前のComposeが出てくる前のViewでアニメーションを作っていた時よりは、Androidのバージョン依存のバグとかがなかったりして、ある程度は開発がしやすくなったかなとは思いますね。

山田:そうですね。AndroidのViewの頃のアニメーションは落とし穴があって、あの頃は単純に数字を0から1に上げるアニメーションみたいな感じで、その数値をビューに移動量をセットしてあげるみたいなかたちでやっていたりしました。

内部でリフレクションを使っていたりするので、バージョン違いによってそのメソッドが存在しないみたいな、そういうことがあると古いAndroidバージョンでクラッシュしてしまうみたいなことがありましたね。

追田:ありました。

(一同笑)

追田:Android 5.0とかはもの凄く古いバージョンでそのバグが起きていたという話なので。最近では古いバージョンをサポートしていないことが多いので、今だとそんなに問題が起きないかなとは思いますね。

山田:僕はFlutterは触った程度しか知らないのですが、Flutterのアニメーションってどうなっているのですか?

久野:そうですね。アニメーション用のウィジェットがもうすでに用意されていて、AnimatedWidgetとTransitionのウィジェットなどがあって、物体が動くとか、シュワッと出るみたいな感じのものは、ウィジェットをポンッと置いて時間と座標を指定したらできてくれるみたいな感じなので、すごくシンプルなアニメーションはめちゃくちゃ簡単にできます。

先ほどと一緒で、こだわって作ろうとしたら、「どこからどう配置してどう出すか」みたいなのは大変かなということと、あとはCustomPaintといって、座標と時間を指定して、「ここからここに動く」みたいな感じで、例えば骨格検出した骨に線を描くみたいなやつは、ゴリゴリにめちゃくちゃ大量に書かないといけないけど、でもCustomPaintで座標指定、時間指定を書いたら一応動くみたいなものは出来上がるなという感じです。

山田:近年の言語は抽象化して簡単にできるけど……。

久野:だけど、こだわると。

山田:こだわると、そういうところがあるんですよね。

久野:「パラメーターは生えていないんかい!」ってなる。

川原:いいですね。ありがとうございます。

Flutterでサクッとできること、ネイティブじゃないとしんどいこと

川原:あと2問ですね。いきます。次、「Flutterでサクッとできること、ネイティブじゃないとしんどいこと」。先ほどの延長ですかね?

山田:はい。僕からの質問なんですが、「Flutterだとこんなことをやるのは簡単だったよ。逆に、ネイティブじゃないとこんなことができなかったよ」みたいなエピソードがあればお願いします。

久野:そうですね。先ほども触れたのですが、ネイティブのViewを呼び出す系とか、あとはウィジェット。Flutterのウィジェットじゃなくて、ホーム画面にあるウィジェットとかを呼び出すのは、Flutterではまだサポートをしていなかったりするので、そのあたりをやろうとすると、結局ネイティブを書かないといけないとか。

あとはちょっとiOSの話になるのですけど、絵文字の表示がバグるとか。赤いビックリマークなのにFlutterで表示すると真っ黒になる、そういうことはあります。テキスト系にこだわる、あとはセンサーを使う、そういうのだとやはりネイティブのほうが美しいな、やりやすいなというのは感じましたね。

山田:なるほど。ホーム画面に置くウィジェットの話ですが、これはけっこう闇深くて(笑)。あれは未だに内部実装がRemoteViewというAndroidだけのAPIでしか使えなくて。Composeで書くこともできるのですが、結局ComposeをそのAPIに変換してできているんですよね。

久野:そうなの(笑)!?

山田:なので、ホームに置くウィジェットを作る時はネイティブを書かないといけないというのがあったりしますね。

久野:そうなのか。

山田:oidyさんとかはどうですか?

追田:逆にFlutterのほうがサクッとできるものもたまにあって。最近おもしろかったのが、SegmentedButtonというマテリアルコンポーネントがあるんですね。OSでよく使われるセグメントコントロールに似たようなUIなんですが、それがつい最近リリースされたComposeで追加されました。

でも実はFlutterだとけっこう前からあって。マテリアルコンポーネントとかは、Flutterのほうが先に対応しているとかがたまにあったりしますね。

川原:ありがとうございます。

駆け出しのAndroidエンジニアが学ぶべきことは?

川原:最後、ちょっと違った角度の質問になりますが、「駆け出しのAndroidエンジニアが今、学ぶべきは何?」。これはみなさんどうでしょう?

山田:Androidをずっと書いている身からすると、やはり基本が大事なのかなと思っていて、まずはAndroidのネイティブの開発をやってから、便利な道具であるFlutterに入るほうがいいのかなとは個人的には思いましたね。

追田:そうですね。それでいうと完全にこれは宣伝なのですが、MIXIでは毎年新卒技術研修をやっていて、そこにiOS研修、Android研修、Flutter研修とそれぞれあって。山田さんはもともとAndroid研修の講師をしていて、2023年から自分が講師をやっていて。

動画とか資料とかは毎年公開されているので、それを見ると、なんとなくAndroid開発については理解できるかなと思います。あと、実はFlutter研修の講師を久野さんがしているので。

久野:2024年もやります。

追田:なのでそのあたりを見るといいかなと思います。

久野:でも確かに新卒研修は、ちゃんとAndroidをやって、iOSをやってからFlutter研修の流れになっているね(笑)。

追田:順番が。

久野:順番がちゃんと。

山田:そうですね。ちゃんとネイティブもあるという。

久野:「だからちゃんと楽に書けるんやで」という。Flutterで締めるみたいなものになっている気がする。

川原:この質問の回答は、「MIXIの新卒研修のAndroidとiOSをやって、Flutterをやりましょう!」ですね。

(一同笑)

久野:大宣伝(笑)。

川原:ありがとうございます(笑)。最後に宣伝になっちゃいましたが。では10の質問は以上になりますので、最後に本日見ていただいた方々に、みなさんから一言ずつお願いします。じゃあ久野ちゃんから。

久野:そうですね。久野はAndroidはちょっと苦手だなという意識を持っていたのですが、今日ここで話したことを踏まえて、Android開発をわりと気軽に楽しんでもいいんじゃないかなと思ったので、みなさんもそんな気持ちを持って一緒に開発をがんばっていきましょう! 今日はありがとうございました。

追田:Androidアプリを作ると言っても、今話したようにいろいろな選択肢があったりして、Flutter、Kotlin以外の作り方もあると思うので、自分がときめいた方法で、好きな方法で楽しく作れるといいと思います。今日はありがとうございました。

山田:こんな座談会みたいな感じで、MIXIのエンジニアの雰囲気というのはこれでわかったのかなと思っていて、見ている方々でMIXIで一緒にアプリ開発したいなという人がもしいればうれしいなと思います。本日はありがとうございました。

川原:では以上を持ちまして、本セッションは終了とします。ご視聴いただきありがとうございました。