ShorebirdãéçºããFlutterçšã®ãCode Pushããšã¯
ã¯ããã«
Shorebird 㯠Flutter éçºã§ããžãã¹ãæåã§ããããã«ãå¿
èŠãªè£œåãéçºãããããªãã¯ãªçµç¹ã§ãããããã¯ãã¯ãã¹ãŠãªãŒãã³ãœãŒã¹ã§ãããéçºã®ç¶æ³ã Discord ã§å
¬éãããŠããŸããããŒã ã«ã¯ãFlutter åµèšè
ã® Eric Seidel æ°ã¯ãããBloc ã Mason ã®äœè
ã§ããã Felix Angelov æ°ãªã©ãèšãããšç¥ãã Flutter ã®ãšãã¹ããŒãã«ãã£ãŠæ§æãããŠããŸãã
ãããŠãçŸåšãããã¯ããšããŠå
¬éãããŠããã®ããCode PushããšãªããŸããä»åŸã¯ä»ã«ããããããããã¯ããéçºããã®ã ãšæããŸãããå·çæç¹ã§å
¬åŒãµã€ãã«æ²èŒãããŠããã®ã¯ Code Push ã®ã¿ã§ãïŒGitHub ãèŠããšä»ã«ãéçºããŠããããšãããããŸãïŒã
Code Push ã¯ãã¢ããªã¹ãã¢ãçµç±ããã«ãŠãŒã¶ãŒã®æå ã«ã€ã³ã¹ããŒã«ãããã¢ããªãæŽæ°ã§ããããŒã«ã§ããäŸãã°ãã¢ããããŒãçŽåŸã«èŽåœçãªãã°ãæœãã§ããããšã«æ°ã¥ãããªãã¹ãæ©ãä¿®æ£ãããããšãã£ãå Žé¢ã«ãããŠãæ¬æ¥ãªãã°ã¢ããªã¹ãã¢ãžããªããªåŸã«å¯©æ»æ¿èªãçµãŠãŠãŒã¶ãŒãžé ä¿¡ãããŸãããããã䜿ããšå³æã«ãã°ä¿®æ£ïŒãããé©çšïŒãå šãŠãŒã¶ãŒã«é©çšã§ããŸãã
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 ã¯æ¢åã®ãœãŒã¹ã³ãŒããæžãæãããæ°ããã³ãŒãã远å ã§ãããããæç¢ºãªéãããããŸãã
ãã¡ãã®èšäºã§ã¢ããªå¯©æ»ãªãã§ã®ã¢ããããŒãæ¹æ³ã®æ¯èŒããããŠãããããããããã§ãã
Flutter ã«ããã Code Push ã®èæ¯
2018幎ãEric Seidel ããŸã Google ã«åšç±ããŠããé ã圌èªèº«ã§èµ·ç¥šãã Code Push ã«é¢ããã€ã·ã¥ãŒããããŸãã
åœæããæ§ã ãªè°è«ãè¡ãããŠããæ§åãèŠãããŸããããåç¥ã®éã Flutter å ¬åŒã§çžå¿ã®ããŒã«ã¯ä»ã§ãååšããŸãããçç±ã¯ã2019幎4æ23æ¥ã«ãã¹ãããã ãã¡ãã®ã³ã¡ã³ã ã«èšèŒãããŠããŸãã3ç¹ã®çç±ããããããŠããŸãã
-
ããã©ãŒãã³ã¹äžã®æžå¿µ
- Android/iOS ã®ã¹ãã¢ããªã·ãŒã«æºæ ããããã«ã¯ JIT ã³ã³ãã€ã«ã«ããããåŸãªããæè¡çã«æ¡çšã¯å¯èœã ããããã©ãŒãã³ã¹ã®äœäžã«ã€ãªããå質ã®äœäžãé²ããªãïŒé ãããïŒã
-
ã»ãã¥ãªãã£äžã®æžå¿µ
- ãããé©çšã¯åºæ¬çã«ä»»æã®ã³ãŒããå®è¡å¯èœã«ããã®ã§ããã«ãŠã§ã¢ã®æœããªã¹ã¯ãé«ãã眲åã§ããçšåºŠã«ããŒã§ããã ãããããã¹ãèµ·ãããããããã¯ã®åœ±é¿ã¯æ·±å»ã§ããã
-
ãã¹ãã£ã³ã°ãµãŒããŒãç¡ã
- ã¢ããªã±ãŒã·ã§ã³ã«ããããåœãŠãããã®ãªãŒãã³ãœãŒã¹ã®ãã¹ãã£ã³ã°ãœãªã¥ãŒã·ã§ã³ãç¡ãããã®ãããéçºè ãç¬èªã« Web ãµãŒããç«ã¡äžããå¿ èŠããããããããã¯ãµãŒãããŒãã£ããŒã«ãå©çšããããªã©ãå¿ èŠã§ããã
ãŸããåœæã¯ Flutter 1.0ã®å®å®çãªãªãŒã¹ã«åããŠä»ã«åªå ããã¹ãéçºããããããã£ãã®ã§ãææçãªé¢ã§ãé颚ã§ã¯ãããŸããã
ããããæå³ã§ã¯ãShorebird ã§éçºããŠãããã®ãããã¯ãã¯ãEric Seidel ã5幎åããæ±ããŠããéæãå®çŸããæ²é¡ã§ãããã®ãããããŸããããããŠãç¡äºã«éçºãé²ããŠãããšããããšã¯ããããã®æžå¿µãææã§ãã or ã§ããèŠèŸŒã¿ããããšããããšãªã®ã§ãããã
ãŠãŒã¹ã±ãŒã¹
以äžã«äž»ãªãŠãŒã¹ã±ãŒã¹ãèšèŒãããŠããŸããshorebird patch ãšããã³ãã³ãåãããåãããŸãããããŸã§ããããé©çšãã®ç¯å²ã§äœ¿çšããã®ãæ³å®ããããŠãŒã¹ã±ãŒã¹ã§ããäžå
·åä¿®æ£ãªã©ãæããäŸã§ãããããã¢ããªã¹ãã¢ã§ã軜埮ãªäžå
·åãä¿®æ£ããŸãããã®ã¿ã®æŽæ°å
容ãã¿ãããŸããããã®ã¢ããããŒããªã©ãäž»ãªå¯Ÿè±¡ã«ãªããšçè§£ããŠããŸãã
- åçšã¢ããªã®ç·æ¥ä¿®æ£
- å€ãããŒãžã§ã³ã®ã¢ããªã䜿çšããŠãããŠãŒã¶ãŒãžã®äžå ·åä¿®æ£
- 宿é ä¿¡ïŒ1æéããšãªã©ïŒ
Note that most app stores prohibit shipping code that changes the behavior of the app in a significant way.
ãããŠéèŠãªäžæããã®å 容ã§ãæ©èœè¿œå ãªã©ã®å€§å¹ ãªã³ãŒãã®å€æŽã¯ã¢ããªã¹ãã¢ã®ã¬ã€ãã©ã€ã³ã§çŠæ¢ãããŠããŸãã®ã§æ³šæããŠãã ããã詳现㯠ã¢ããªã¹ãã¢ã®ã¬ã€ãã©ã€ã³ã«æµè§Šããªãã®ã ã«ãŠèšåããŠããŸãã
CLIã§åãããŠã¿ã
éçºããã¥ã¡ã³ãã¯ãã¡ãã§ããå©çšããã ãã§ããã°èºããã€ã³ãã¯ç¹ã«ãªãã®ã§ãããã¥ã¡ã³ãéãã«ã»ããã¢ããããã°å®äºããŸãïŒShorebird ã®ã¢ã«ãŠã³ãç»é²ãæžãŸããŠãshorebird init ããïŒã
å®éã«æå
ã§åãããŠã¿ãåç»ã§ããã«ã©ãŒã¹ããŒã ã® seedColor ã deepPurple ãã deepOrange ã«æžãæãããšãã¢ããªåŽã«å€æŽãåæ ãããŠããŸããäžèŠããœãŒã¹ã³ãŒããšç«¯æ«ãé£ã«ããã®ã§æ®æ®µã®éçºãšå€ããç¡ãããã«èŠããŸãããäžåºŠãŠãŒã¶ãŒã«é
ä¿¡ãããã¢ããªã«å¯ŸããŠå€æŽãåæ ããããšããã®ãèã§ãã
ã¡ãªã¿ã«ãBackground ã§ããããããŠã³ããŒãããŠé©çšããä»çµã¿ã«ãªã£ãŠãããããäžåºŠã¢ããªãç«ã¡äžããŠã¿ã¹ã¯ãã«ããå¿
èŠããããŸãã
ã¢ããªã¹ãã¢ã®ã¬ã€ãã©ã€ã³ã«æµè§Šããªãã®ã
ã¢ããªéçºè
ãšããŠãã¹ãã¢ãçµç±ããã«ã¢ããããŒãããããšèããŠãŸãçåã«æãã®ãã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 ãšãããŠããããã§ãã
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 ã³ã³ãã€ã«ã«ã€ããŠã¯ãæã«èšäºãæžããŠããŸãã®ã§ãåç §ãã ããã
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 ã§è©³ãã説æãèšèŒããããããªã®ã§ãã²ãšãŸãæ¬æ Œçã«å©çšããã«ã¯ãã®ããã¥ã¡ã³ããæããŸã§åŸ ã£ãã»ããè¯ãããã§ãã
- Does Shorebird comply with Play Store guidelines?
- How does this relate to the App/Play Store review process or policies?
ãŸãšã
ä»åã¯æ³šç®ã® Shorebird ãæäŸãããããã¯ãã Code Push ã«ã€ããŠç޹ä»ããŸããã
æ¬èšäºã§ããŠãŒã¹ã±ãŒã¹ãã¬ã€ãã©ã€ã³ã«è§ŠããŸãããããããŸã§ããããé©çšïŒç·æ¥ã®äžå
·åä¿®æ£ïŒçšéã«éå®ããŠãæ©èœéçºãªã©ã¯åŸæ¥éãã¢ããªã¹ãã¢çµç±ã§ã®é
ä¿¡ã«ããã®ãæ³å®ãããæŽ»ç𿹿³ã ãšæããŸããåœé¢ã¯ iOS/Android ã®ã¢ãã€ã«äžå¿ãšãªããã¹ãã¢ã¬ã€ãã©ã€ã³ãšã®å
Œãåãã§æå€§éæŽ»çšãã¥ããéšåã¯ãããããããŸãããããã㯠Flutter ã®ã¯ãã¹ãã©ãããã©ãŒã æ§èœãããããªãçºæ®ããŠãLinux ãçµã¿èŸŒã¿ç³»ãŸã§æŽæ°ã§ããããã«ãªããšå¹
ãåºããããã§ãã
ãŸããRelease Notes ãèŠãŠããã ããšãããã®ã§ããã2023幎6æã ãã§11åã®ãªãªãŒã¹ãããŠãããªã©ããªãæ©ãã¹ããŒãã§éçºãé²ãã§ãããæ¬èšäºã®å 容ãããã«å€ããã®ã«ãªãå¯èœæ§ãé«ãã§ãã倧ããªæŽæ°ããã£ãéã«ã¯ã§ããã ã远åŸããŠããããã§ãããæ£ç¢ºãªæ å ±ãåŸãã«ã¯èšäºå ã§åŒçšããŠããå ¬åŒããã¥ã¡ã³ãããåç §ãã ããïŒæ¬èšäºã¯ãããŸã§å°å ¥ã®æ³å®ïŒã
ä»åŸã®æ©èœéçºã«ã€ããŠã¯ä»¥äžã«èšèŒãããŠããŸããããããããã¹ãŠå®è£ ããããšããªã䜿ãåæè¯ããªãããã§æ¥œãã¿ã§ãããŸãã¯2023幎7æã«å¯Ÿå¿äºå®ãšèšåãããŠãã iOS 察å¿ãçŽè¿ã®ãã€ã«ã¹ããŒã³ã§ããã
iOS ã§ã®ãã¢ãæ¢ã« YouTube ã«å ¬éãããŠãããåšèŸºã®æŽåãããŠããæ®µéãããã®ã§ããéããªãã§ãããã
ãŸã å°ããã£ããããã¯ããã©ãã©ããšé²åããŠèªç¥ãããŠããæ§åãèŠããšéåžžã«ã¯ã¯ã¯ã¯ããŸãããDiscord ã§éçºã®æ§åããããªãã¯ã«ãããŠãŸããããã®äœæ¥é¢šæ¯ãèŠãã ãã§éåžžã«å匷ã«ãªãã®ã§äžåºŠèŠããŠã¿ãŠã¯ãããã§ããããã
åè
- Shorebird: CodePush & Over-the-Air Updates for Flutter Apps | ITNEXT
- Code Push / Hot Update / out of band updates · Issue #14330 · flutter/flutter
- Reddit - Dive into anything
- Code push for Flutter is finally here - FilledStacks
- ã¢ããªå¯©æ»ãªãã§ã¢ããªã«å€æŽãå ããæ¹æ³ã調ã¹ãŠã¿ã â ã®ã£ããã
Discussion