🎃

MisskeyのAndroidクライアントを作った話

2021/12/07に公開

みなさんこんにちは
fediverseアドベントカレンダー7日目を担当するパン太です。
補足ですが私は人間です。

今回は私が以前から開発を続けているMilkteaについての説明と、開発した上で大変なことと採用したアーキテクチャと今後の方針を書きます。

Milkteaとは

Milkteaとは2019年頃から開発していたMisskeyのためのAndroidサードパーティアプリケーションです。
多機能ではないですが、なるべくMisskeyの新機能に追従できるように努力しています
(できているとは言っていない)。
実際にはMisskeyのAndroidサードパーティアプリは2018年から開発をしていますが、
何度か作り直しをしています。
現在OSS(GPL)として開発運用しています。
GitHub
Google Playストア

そもそもMisskeyって何?

Misskeyとは分散型ミニブログの一つで、syuiloさんが筆頭となり開発されているOSSです。
ActivityPubというプロトコル対応していて、
他のActivityPubと対応しているサービスと連携することができます。
そのため他のMisskeyのサーバやMastodonからの投稿を受信したり、送信したりすることができます。
2021年12月7日時点では

  • Misskey.io
  • すしすきー
  • めいすきー
  • Misskey.dev

などの多種多様なインスタンスが運用されています。
Misskeyのリポジトリ
インスタンス一覧

大変なこと・大変だったこと

大変だった、大変なこととしては

個人開発にしては規模が大きい

Misskeyはとにかく規模が大きいのでほぼ全ての機能をサポートしようとすると、とにかく実装量が多くなってしまうことと、
その大きくなってしまったアプリのメンテナンスと機能拡張が大変でした。
また規模が大きくなってしまった&テスト不足のためたびたび不具合が発生してしまうことがあり、ユーザーさんからお怒りのレビューをいただくこともありました。

StreamingAPIの実装が大変

またMisskeyはサーバとのリアルタイムな同期をするためにWebSocketを用いた
StreamingAPIというものをサポートしていますが、
WebSocketはコネクション型のため接続状態をうまく管理しないと途中でサーバとの同期が切れてしまいユーザビリティ的によろしくないことが度々発生しています。

複数バージョンのサポートがきつい

他にもMisskeyは分散型ミニブログのため複数のサーバ(インスタンス)が存在しています。
そのため複数のバージョンやforkをサポートする必要がありました。
通常アプリケーション開発では基本的には単一バージョンのAPIをサポートすることが一般的だと思うのですが、それがMilkteaの開発では通用しないためよく使われるデザインパターンが通用しないため、
非常に苦労しました。

機能追加に追従するのが大変

Misskeyは意欲的に開発されているため、
機能追加と廃止の速度が早く、多くのユーザーさんに満足してもらうために、
メンテナンスをしつつ機能を追加するのが大変で結果的に疲弊してしまうことになりました。

MFM対応が大変

MisskeyはMFMという独自の筆記方法をサポートしているのですが、
よくあるMarkdown改良型であれば、既存のライブラリをforkするなどをして対応できたと思うのですが、
Misskeyはテキストにアニメーションをかけたりなど、
実装するには初めから作るしかありませんでした。
また親要素を超えて文字を回転させるなどの仕組みをAndroidで実装するのは可能ではあると思いますが、
僕の技術力ではそれは困難だと考えたため現在ではサポートを諦めました。

採用したアーキテクチャ

MilkteaはアーキテクチャにMVVMアーキテクチャを採用しました。
Milkteaの前身となるMisskey NESTではMVPアーキテクチャで実装していたのですが、
途中DataBindingとMVVMが流行っていることを知ってMilkteaとして作り直す時に、
アーキテクチャをMVVMへ変更しました。
しかし僕のMVVMに対しての理解が少なかったため、
結果的にFat ViewModelになってしまい後々リファクタリングを繰り返すこととなりました。

今後の予定

アプリとして

今後の予定としては、既存機能の強化とMilktea独自の機能の追加を予定しています。
特に品質向上によるユーザビリティ向上を目指したいと考えています。

技術として

リファクタリングをして、コードのてスタビリティを向上させて
テストをなるべく自動化したいと考えています。
またリファクタリング時になるべく状態をimmutableな状態管理にして、
人間にとってイベントを状態の変化を追いやすいコードにして、
私以外の人でもメンテナンス可能にしていきたいと考えています。

最後に

最後まで読んでいただきありがとうございました。
今後ともMilkteaをよろしくお願いします。

Discussion