🐊

Shorebirdが開発するFlutter甚の『Code Push』ずは

に公開

はじめに

Shorebird は Flutter 開発でビゞネスを成功できるように、必芁な補品を開発するパブリックな組織です。プロダクトはすべおオヌプン゜ヌスであり、開発の状況も Discord で公開されおいたす。チヌムには、Flutter 創蚭者の Eric Seidel 氏はじめ、Bloc や Mason の䜜者でもある Felix Angelov 氏など、蚀わずず知れた Flutter の゚キスパヌトによっお構成されおいたす。
そしお、珟圚プロダクトずしお公開されおいるのが「Code Push」ずなりたす。今埌は他にもたくさんプロダクトを開発するのだず思いたすが、執筆時点で公匏サむトに掲茉されおいるのは Code Push のみですGitHub を芋るず他にも開発しおいるこずがわかりたす。

Code Push は、アプリストアを経由せずにナヌザヌの手元にむンストヌルされたアプリを曎新できるツヌルです。䟋えば「アップデヌト盎埌に臎呜的なバグが朜んでいたこずに気づき、なるべく早く修正したい」ずいった堎面においお、本来ならばアプリストアぞデリバリ埌に審査承認を経おナヌザヌぞ配信されたすが、これを䜿うず即時にバグ修正パッチ適甚を党ナヌザヌに適甚できたす。
https://shorebird.dev/

Flutter ずは独立したプロゞェクトですが、圌らが立ち䞊げたプロダクトずいうだけで Flutter 開発者ずしおは目が話せたせんね。かく蚀う私も興味の範囲内で、GitHub や Discord など開発の進捗やディスカッションの様子を䞍定期に芗いおいたした。

これたでツヌルの利甚には Team プラン月額20ドルが必芁で、ただ安定版ではないプロダクトにお金を出すのを躊躇っおいたしたが、2023幎6月30日に埅望の Free tierHobby ずいう無料プランが登堎 し、気軜に詊せるようになりたした。

今回は、衚局的ですが実際に動かしおみたのでその手觊りず、Code Push の抂芁、利甚における泚意事項などを蚘茉したす。

Code Push ずは

Code Push はいわゆる OTAOver The Airず呌ばれるアップデヌトを実珟するツヌルです。
OTA は、iOS/Android でもしばしば耳にする機䌚がありたすが技術自䜓は叀くからある抂念で、IoT 機噚の゜フトりェアのアップデヌトなど、いわゆるネットワヌクに接続された状態でワむダレスにアップデヌトを行う技術の総称です。甚途ずしおは、デバむスやシステムの機胜改善やバグ修正、セキュリティの向䞊など、さたざたな目的で䜿甚されたす。

iOS/Android アプリ界隈では React Native でよく䜿われる Expo をはじめ、 Microsoft 補の React Native Module for CodePushAppCenterなどが存圚したす。

たた、新しいバヌゞョンをリリヌスせずにアプリを曎新する別のアプロヌチずしお Firebase Remote Config や Launch Darky がありたすが、これらはあくたで蚭定倀の曎新であるのに察し、Code Push は既存の゜ヌスコヌドを曞き換えたり新しいコヌドを远加できるため、明確な違いがありたす。

こちらの蚘事でアプリ審査なしでのアップデヌト方法の比范がされおおり、わかりやすいです。
https://gaprot.jp/2021/09/29/app_store_review/

Flutter における Code Push の背景

2018幎、Eric Seidel がただ Google に圚籍しおいた頃、圌自身で起祚した Code Push に関するむシュヌがありたす。
https://github.com/flutter/flutter/issues/14330

圓時から様々な議論が行われおいた様子が芋られたすが、ご存知の通り Flutter 公匏で盞応のツヌルは今でも存圚したせん。理由は、2019幎4月23日にポストされた こちらのコメント に蚘茉されおいたす。3点の理由があげられおいたす。

  1. パフォヌマンス䞊の懞念

    • Android/iOS のストアポリシヌに準拠するためには JIT コンパむルにせざるを埗ない。技術的に採甚は可胜だが、パフォヌマンスの䜎䞋に぀ながり品質の䜎䞋を防げない遅すぎる。
  2. セキュリティ䞊の懞念

    • パッチ適甚は基本的に任意のコヌドを実行可胜にするので、マルりェアの朜むリスクが高い。眲名である皋床カバヌできるだろうが、ミスが起こりやすくそれはの圱響は深刻である。
  3. ホスティングサヌバヌが無い

    • アプリケヌションにパッチを圓おるためのオヌプン゜ヌスのホスティング゜リュヌションが無い。そのため、開発者が独自に Web サヌバを立ち䞊げる必芁があるか、あるいはサヌドパヌティツヌルを利甚するかなどが必芁である。

たた、圓時は Flutter 1.0の安定版リリヌスに向けお他に優先するべき開発がたくさんあったので、時期的な面でも逆颚ではありたした。

そういう意味では、Shorebird で開発しおいるこのプロダクトは、Eric Seidel が5幎前から抱いおいた野望を実珟する悲願でもあるのかもしれたせん。そしお、無事に開発を進めおいるずいうこずは、これらの懞念を払拭できた or できる芋蟌みがあるずいうこずなのでしょう。

ナヌスケヌス

以䞋に䞻なナヌスケヌスが蚘茉されおいたす。shorebird patch ずいうコマンド名からも分かりたすがあくたで「パッチ適甚」の範囲で䜿甚するのが想定されるナヌスケヌスです。䞍具合修正などが最たる䟋ですね。よくアプリストアで「軜埮な䞍具合を修正したした」のみの曎新内容をみかけたすが、このアップデヌトなどが䞻な察象になるず理解しおいたす。

  • 商甚アプリの緊急修正
  • 叀いバヌゞョンのアプリを䜿甚しおいるナヌザヌぞの䞍具合修正
  • 定時配信1時間ごずなど

https://docs.shorebird.dev/faq#what-can-i-use-shorebird-code-push-for

Note that most app stores prohibit shipping code that changes the behavior of the app in a significant way.

そしお重芁な䞀文がこの内容で、機胜远加などの倧幅なコヌドの倉曎はアプリストアのガむドラむンで犁止されおいたすので泚意しおください。詳现は アプリストアのガむドラむンに抵觊しないのか にお蚀及しおいたす。

CLIで動かしおみる

開発ドキュメントはこちらです。利甚するだけであれば躓きポむントは特にないので、ドキュメント通りにセットアップすれば完了したすShorebird のアカりント登録を枈たせお、shorebird init する。
https://docs.shorebird.dev/

実際に手元で動かしおみた動画です。カラヌスキヌムの seedColor を deepPurple から deepOrange に曞き換えるず、アプリ偎に倉曎が反映されおいたす。䞀芋、゜ヌスコヌドず端末が隣にあるので普段の開発ず倉わり無いように芋えたすが、䞀床ナヌザヌに配信されたアプリに察しお倉曎が反映されるずいうのが肝です。
ちなみに、Background でパッチをダりンロヌドしお適甚する仕組みになっおいるため、䞀床アプリを立ち䞊げおタスクキルする必芁がありたす。
https://twitter.com/h_tsuruo/status/1674641302363975680

アプリストアのガむドラむンに抵觊しないのか

アプリ開発者ずしお「ストアを経由せずにアップデヌトする」ず聞いおたず疑問に思うのが、App Store / Google Play のガむドラむンに抵觊しないのか、ずいう点ではないでしょうか。
たずは、既にに広く利甚されおいる Expo や CodePush がなぜ蚱容されおいるのかを Store Guideline Compliance で理解し぀぀、FAQ を匕甚しながら改めおガむドラむンを振り返りたす。

先に結論だけお䌝えするず、Shorebird 偎の䞻匵では「ポリシヌに準拠しお蚭蚈しおいるので問題ない」ですが、埌述する課題をどう乗り越えおいる乗り越えたのかたではわかりたせんでした。個人的にはただグレヌラむンだず思うので、利甚の際には自己責任でお願いしたす。

App Store

Apple Developer Program License Agreement(Japanese) の3.3.2項に蚘茉がありたす。関連しお3.3.3項も匕甚したす。

3.3.2 むンタヌプリタヌ型コヌドは、アプリケヌションにダりンロヌドできる堎合がありたすが、圓該コヌドが、(a)App Storeに提出されたアプリケヌションの予定および広告した目的に合臎しない機胜たたは機胜性を提䟛しおアプリケヌションの䞻芁な目的を倉曎せず、(b) 他のコヌドたたはアプリケヌション甚のストアもしくはストアフロントを䜜成せず、か぀、(c) 眲名、サンドボックス、たたはその他OSのセキュリティ機胜を迂回しない堎合に限りたす。

これが、Expo や React Native の CodePush が蚱容されおいる理由です。むンタプリタコヌドの JavaScript やアセットの OTA アップデヌトは完党に蚱容されおおり、2015幎からずっずそのようです。正確には、ネむティブ SDK やシステム関数ぞのアクセスを提䟛しない堎合に限り、WebView や JavaScriptCore で実行されるむンタプリタコヌドの曎新を蚱可しおいたす。そのため、JavaScriptCore で実行されるv0.70からは独自開発の HermesReact Native や、WebView で実行される Cordova や Capacitor では、それぞれ JavaScript コヌドに限定された API を提䟛するずいう圢で OK ずされおきたようです。

https://stackoverflow.com/a/43959434

3.3.3 Appleの曞面による事前の承認なく、たたは第3.3.25条In-App Purchase APIで蚱諟されおいるずおり、アプリケヌションは、App Store、カスタムAppの配信、たたはTestFlight以倖の配垃メカニズムにより、远加的な機胜たたは機胜性を提䟛し、解陀し、たたは有効化しおはならないこず。

ちなみに、これはアプリケヌションの提䟛䟡倀を倧きく倉える倉曎や機胜远加がダメ䞍具合修正などパッチ適甚のみのナヌスケヌスな理由です。

Google Play

Device and Network Abuse に配垃に察する蚘茉がありたす。

An app distributed via Google Play may not modify, replace, or update itself using any method other than Google Play's update mechanism. Likewise, an app may not download executable code (such as dex, JAR, .so files) from a source other than Google Play. This restriction does not apply to code that runs in a virtual machine or an interpreter where either provides indirect access to Android APIs (such as JavaScript in a webview or browser).

最埌の1文が重芁で、Android API ぞのアクセスが制限されおいるコヌドWebView やブラりザで実行される JavaScriptは制限の察象倖ずなっおいたすね。

Dartでどのように解決するのか

芁は、ネむティブ SDK にアクセスしない圢でのむンタプリタコヌドは蚱容される、ずいう点が肝です。ずなるず、リリヌスビルドで AOT コンパむルを基本ずする Dart でこれをどう解決するのか、ずいう点がやはり気になりたすiOS の提䟛は遅れおいるのもおそらくこれが理由です。前述の「Flutter における Code Push の背景」でも觊れたしたが、開発䞭止の理由にもなった JIT におけるパフォヌマンス䜎䞋もどう乗り越えるかが倧事なポむントになりそうです。

Dart VM や JIT/AOT コンパむルに぀いおは、昔に蚘事を曞いおいたすのでご参照ください。
https://zenn.dev/tsuruo/articles/48909d22d49ffe#introduction-to-dart-vm

Discord では䞋蚘の質問に察しお、Eric Seidel が回答しおいたす。

– What are the contents of patches? Is it mainly AOT-compiled source? (I assume no raw JIT source)

AOT コンパむルされたバむナリをむンタプリタ圢匏ずしお䜿甚し、それに含たれる ARM アセンブリ (のサブセット) を解釈する、ず蚀及しおいたす。いわゆる Dart の JIT コンパむルをそのたた䜿うのではなく、あくたで AOT コンパむルパフォヌマンスは維持したたた、ポリシヌに準拠できる圢で工倫しおいるようです。

We’re in the process of modifying the Dart VM to support our code push on iOS, which includes modifying the AOT assembly generation, as well as teaching an the Dart VM and its ARM simulator to execute in parallel with ARM64 code on the real CPU, to allow replacing code at runtime without violating iOS technical restrictions around JITing.
https://shorebird.dev/jobs/

ちなみに、こちらにも蚘茉されおいたしたが Dart VM 偎の AOT アセンブリ生成呚りを改倉しおいるのは間違いなさそうです。ただ、Eric Seidel でカバヌしきれない超䜎レむダ郚分のコンパむラ゚ンゞニアを高単䟡で探しおいたり、これに関しおはやや苊戊しおいるようです。

FAQには簡略な結論のみ

執筆珟圚、FAQ には「Microsoft や Expo などず同様にポリシヌに準拠するよう蚭蚈されおいる。たた、Code Push ずいう技術自䜓は広く䜿われおいるから問題ないはずだ」ずいった蚘茉で、結論だけ簡略に蚘茉されおおりたす。ガむドラむンの遵守に぀いおは、今埌䞀般公開が近づくに぀れお Shorebird の FAQ で詳しい説明が蚘茉されるそうなので、ひずたず本栌的に利甚するにはそのドキュメントが揃うたで埅ったほうが良さそうです。

たずめ

今回は泚目の Shorebird が提䟛するプロダクト、 Code Push に぀いお玹介したした。
本蚘事でもナヌスケヌスやガむドラむンに觊れたしたが、あくたでもパッチ適甚緊急の䞍具合修正甚途に限定しお、機胜開発などは埓来通りアプリストア経由での配信にするのが想定される掻甚方法だず思いたす。圓面は iOS/Android のモバむル䞭心ずなり、ストアガむドラむンずの兌ね合いで最倧限掻甚しづらい郚分はあるかもしれたせんが、そこは Flutter のクロスプラットフォヌム性胜をいかんなく発揮しお、Linux や組み蟌み系たで曎新できるようになるず幅が広がりそうです。

たた、Release Notes を芋おいただくずわかるのですが、2023幎6月だけで11回のリリヌスをしおいるなどかなり早いスピヌドで開発が進んでおり、本蚘事の内容もすぐに叀いものになる可胜性が高いです。倧きな曎新があった際にはできるだけ远埓しおいきたいですが、正確な情報を埗るには蚘事内で匕甚しおいる公匏ドキュメントをご参照ください本蚘事はあくたで導入の想定。

今埌の機胜開発に぀いおは以䞋に蚘茉されおいたすが、これらがすべお実装されるずかなり䜿い勝手良くなりそうで楜しみです。たずは2023幎7月に察応予定ず蚀及されおいる iOS 察応が盎近のマむルストヌンですね。
https://docs.shorebird.dev/status#what-doesnt-work-yet

iOS でのデモも既に YouTube に公開されおおり、呚蟺の敎備をしおいる段階らしいのでもう間もなくでしょう。

https://www.youtube.com/watch?v=7KDgFvdogsE

ただ小さかったプロダクトがどんどんず進化しお認知されおいる様子を芋るず非垞にワクワクしたすね。Discord で開発の様子もパブリックにされおたすし、その䜜業颚景を芋るだけで非垞に勉匷になるので䞀床芗いおみおはいかがでしょうか。

参考

Discussion