DroidKaigi 2024 ã«ç¾å°åå ãã¦ããã®ã§ãè¨æ¶ããããã¡ã«ãã£ããã¨è¨é²ãæ®ãè¨äºã§ãã
1 æ¥ç®: Workshop Day
Kotlin Multiplatform (KMP) 㨠Compose Multiplatform (CMP; ä»åã¹ã©ã¤ãå ã§ããç¥ããã¦ãã) ã®ã¯ã¼ã¯ã·ã§ããã以åã社å å宿ã§ã©ã¡ãã使ã£ããã¨ãããã®ã§ãç´ æ¯ãã¯ã§ãã¦ããç¶æ ã§è¨ã¿ã¾ãããJetbrains ã® Developer Advocate ã®æ¹ããç´ä¼ãããæ©ä¼ã¯è²´éã§ããããéãããã«ã¯ããã¾ãããã
ã¾ããäºåã« 3 ã¤ã課é¡ã®ããç¨æããããµã³ãã«ã¢ããªãããã¾ãã:
- å ¥åãããã¼ã¯ã¼ããä¿åãã¦æ°¸ç¶åããã storage-exercise
- é³¥ã®ç»åããããã¯ã¼ã¯ããåå¾ãã¦ä¸è¦§ãã bird-app
- è¡åã TODO ãªã¹ãã¿ããã«ä¸è¦§ã«ãã£ã¦ããããããã«ã¦ã³ãã¢ãã/ãã¦ã³ã§ãã habit-tracker
ããããã¯å®è£ ãè¶³ãã¦ãªãã¦æ©è½ãå®ç¾ã§ãã¦ãªãã®ã§ã å®è£ ãåã ã§æãåããã¦å®æããã¾ããããã¨ããã¯ã¼ã¯ã
iOS ã®ãã«ãã¯ãªãã£ãããã§ããããã㯠macOS ãå¿ è¦ã ããã§ãåå è ã¯ã©ã® OS ã使ããã¯ä¸æãªã®ã§ãããªã£ã¦ããã®ã§ãããå®éåã®é£ã«ãããã㯠Linux (NixOS) ã使ããã¦ããã®ã§ãã¯ãã¹ãã©ãããã©ã¼ã ãªãã§ã¯äºæ ã¨ããæãã§ã¦ãã¼ã¯ã
(1) ã§ã¯ expect
/ actual
ã使ã£ã¦ããã©ãããã©ã¼ã åºæã®å®è£
ãå
±éã®ã¤ã³ã¿ã¼ãã§ã¼ã¹ã«ãã¤ã³ããããã¯ãå¦ã¶ã®ããã¤ã³ãããã¨ãã° Web ã§ã¯ Local Storage ã®å®è£
ã使ã£ã¦ããã¹ã¯ãããã¯ãã¡ã¤ã«ã®èªã¿æ¸ããAndroid ã§ã¯ DataStore ã®å®è£
ã使ãã¨ããã§ãããKMP ãå¼·åãã¤æè»ãªæ©æ§ãæã¡åããã¦ããã®ãä½é¨ã§ããã
(2) ã¯ãããã¯ã¼ã¯ã¢ã¯ã»ã¹ãè¡ãå®ç¨çãªåãçµã¿ãKtor ãªã KMP ã§ãããæãã«åãã¦ããã¦ç¹ã«æããªãæãã§ä¾¿å©ã§ããã以åãã£ãã¨ãã¯ãKtor ã® Engine ããã©ãããã©ã¼ã ã«ãããã¦è¨å®ãããããå¿ è¦ããã£ãè¨æ¶ããããã©ããã®èª²é¡ã§ã¯ç¹ã«è¨å®ã¯ä¸å¿ è¦ã§ãããã ã®ã§ããã
(3) 㯠Compose Multiplatform ã®èª²é¡ãAndroid ã¨ã³ã¸ãã¢ãªããããåç¥ã§ããããã¨ããæãã§æ®éã« Compose ã®ã³ã¼ããæ¸ãã°ãã¹ã¯ãããã Web ã UI ãæ§ç¯ã§ããã®ãããããè¦ãç®ãå·®ç°ããªãããã§ãã
ãã£ã¨è¨ãã¨ãCMP ã®å®è£ 㯠Android ã§ã¯ Android å®è£ ã¸ã®ãã ã®ã¨ã¤ãªã¢ã¹ã«ãªã£ã¦ã¦ã¤ã³ã¼ã«ã¿ãããªè©±é¡ã¨ãããã¹ã¯ãããã»Web ã Skiko/Skia ã§ Canvas ã«ã¬ã³ãã¼ãã¦ããã¨ããé¢ç½ã話ãããã¾ã (Flutter ãåãä»çµã¿ã¨ãã話ãèããè¦ãã)ã
cursor: text
ãè¨å®ããã
ãããã£ã¦ãWeb ã¯å 容ã«å¿ãã DOM ãæ§ç¯ããã¦ããããã§ã¯ãªããããWeb ã®ä¸ç観çã«ã¯çµæ§ã¢ã¯ãããããªå°è±¡ãåãã¾ãããã¢ã¯ã»ã·ããªãã£ã¨ã Web æè¡ã¨ã®è¦ªåæ§ãã©ããªã£ã¦ããã®ãã¯ä¸æã§ã (tab ãã¼ã§ç§»åã¯ã§ãã¦ãã¾ããã§ãæ¬ææ¤ç´¢ã¨ãã¯ã§ããªãã®ã§ããã©ã¦ã¶å´ã®æ©è½ã¯æå¾ ã§ããªããã)ã
KMP ã«ã¯çµ±åã®ã¬ãã«æã¿ãããªã®ããã£ã¦ãä¸é¨ã®ãã¸ãã¯ãå ±æãããã®ãããCMP ã§ UI ã¾ã§å ±æã§ããå¹ åºããããã®ãã¦ãã¼ã¯ã§ãããããããã¨ãã¸ãã¹ãã¸ãã¯ã ã㯠KMP ã«ãã¦ã¿ã¾ããããã¨ããæ©éãè¦ãã¦ããæãããã¦å¸æãæã¦ãæãããã¾ãã
å®éã®ã¨ããã¯ãããããªèª²é¡ãããããã§ããâ¦â¦ãã¤ãã£ãã¢ãã¤ã«ã¢ããªéçºè ã®å¤§äºã«ãããã¨ãããèæ ®ãããã¨ãã¦ãããã¨ã KMP ãä»ã®ã¯ãã¹ãã©ãããã©ã¼ã æè¡ã¨å¤§ããªéããæããã¦ããé¨åã ã¨æãã¾ãã (ãã¹ã¯ãããã Web éçºè çã«ã¯â¦â¦ã©ããªã®ã§ããã)ã
ã»ãã·ã§ã³
è峿·±ãã»ãã·ã§ã³ãããªãã¦æéãéãªã£ã¦ãã¦ãªã¢ã«ã¿ã¤ã ã§è¦³ããªãã£ããã®ããã£ã¦æ®å¿µã§ããã ãªã¢ã«ã¿ã¤ã ã§æè´ãããã®ããã¤ã¸ã§ã¹ãã§ãç´¹ä»ããã³ã¼ãã¼ã§ãã
PDF Viewer使ã®ä»ã¾ã§ã¨ãããã ~ Android 15ã§é²åããPdfRenderer ~
対象è ã«é»åæ¸ç±ã»æ¼«ç»ã¢ããªãéçºè ã¨ãã£ãã®ã§æè´ã
ååã¯èªåã§ PDF ã Bitmap ã«ã¬ã³ãã¼ãããããæ¨ªã«è¡¨ç¤ºãã¦ãã¥ã¼ã¯ã¼ãä½ã話ãé ã追ã£ã¦èª¬æãè¤æ°ãã¼ã¸ã®ã¬ã³ãã¼ã®ããã« Mutex ãåã£ã¦æä»å¶å¾¡ãå¿ è¦ãªã®ããªãã»ã©ãã¨æã£ãããã¸ã§ã¹ãã£ã¼ã«ããæ¡å¤§ãå®è£ ããã¦ãã¦è¦äºãªãã¥ã¼ã¯ã¼ãã§ããæµãã解説ããã¦ãã¾ããã
ãªãã§ããããã©ã¼ãã³ã¹ã®æ¹åææ³ãå°è±¡çã§ãç»é¢ã«æ±ãããã大ããã«ã¬ã³ãã¼ãããã¨ãããã£ãã·ã¥ãæ´»ç¨ãããã¨ã§ã¡ã¢ãªä½¿ç¨éãæãããã¯ããã¯ã¯å¹æçã«æãã¾ããã
å ¨ä½ãéãã¦èªåå®è£ ãandoidx.pdf ã¾ã§å®è£ ãç´¹ä»ããã¦ãã¦ãããããã®ã¡ãªããã»ãã¡ãªããã話ããã¦ããã®ã§ãPDF ãã¥ã¼ã¯ã¼ã«ã¤ãã¦é夿¼¢ã®èªåã¨ãã¦ã¯ã¾ã¨ã¾ã£ãæ å ±ãå¾ããã¦ãªãã»ã©ãã¨ãªãã¾ããã
Google Sign-inã®ç§»è¡ããå§ããCredential Manageræ´»ç¨
Google Sign-in ã¨èªè¨¼æ å ±ã®åãæ±ãã«èå³ããã£ãã®ã§æè´ã
ã¾ãããã£ã¦ãGoogle Sign-in ã®å®è£ ããããã¨ã®ãªãèªåã¯ãJetpack ã® Credential Manager ããã£ã¦ãOS ãã¼ã¸ã§ã³å·®ãèæ ®ãã¦ããã¦ãããªã©ãç¥ããªãã£ãæ å ±ãå¾ããã¾ããã
Credential Manager èªä½ã¯èªè¨¼æ å ±ãä¿åããããã§ã¯ãªãã¦ãå¥ã®ãã¹ã¯ã¼ãããã¼ã¸ã£ã¼ã管çãããªã©ãæ å ±ã®æµããçè§£ã§ããã®ã大ããã§ããã
Ask the speaker ã§ã«ã¹ã¿ã å®è£ 㯠Credential Provider ãå®è£ ãããã¨ã§å®ç¾ã§ãããããªã話ã伺ããã®ã§ãããèªåã®ç¥èä¸è¶³ã§ããã¯ç¢ºèªã§ãã¦ããã¾ããâ¦â¦ã
WebADBã使ç¨ããAndroidå°ç¨ç«¯æ«åã¸ã®èªåãããã£ã³ã°ææ³
ADB ã QA çã§ãã¾ã使ããªããã¨å¸¸æ¥é æã£ã¦ããã®ã§è峿·±ãã¨æãæè´ã
ã¿ã¯ã·ã¼åãä»ã端æ«ã®ã»ããã¢ãããã¢ããã¼ã·ã§ã³ã«ãªã£ã¦ããããã©ã¦ã¶çµç±ã§ã®ã¢ããªã®ã»ããã¢ããã®è©±ãéã¨ã³ã¸ãã¢ã« adb ãå°å ¥ãã¦ããã£ã¦ãã½ã¡ã½ã¡ã»ããã¢ããããã®ã¯å¤§å¤ã ãã©ããã©ã¦ã¶ã§ç«¯æ«ãç¹ãã ããªã¼ãã¡ã¼ã·ã§ã³ã§è¨å®ãããããã«ãªã£ã¦ãç¹æ®ãªã»ããã¢ãããä¸è¦ã§èªååããã¦æé«ããã ã£ãã
ããè¦ç´ ã®ã¿ãããåº§æ¨æå®ãªã®ã¯å¤§å¤ããã ãªãã¨è´ããªããæãã¦ããã®ã ãã©ãAccessibilityService ãå®è£ ãããã¨ã§ã¦ã¼ã¶ã¼è£å©æ å ±ãã対象ã®è¦ç´ ãè¦ã¤ãã¦ã¿ãããã§ããã¨ãããã¨ã§ãªãã»ã©ãã¨ããæãã§ããã
ãã¶ã¤ã³ããã¢ããªå®è£ ã¾ã§ä¸è²«ãããã¶ã¤ã³ã·ã¹ãã ãæ§ç¯ãããã¹ããã©ã¯ãã£ã¹
ãã¶ã¤ã³ã·ã¹ãã ã®éç¨ã«ã¤ãã¦èå³ããã£ãã®ã§æè´ã
ã¨ã«ãããã話ã§ããï¼ ä¼ããããªãã®ã§å 容ãè¦ã¦ã»ãããè¯ãã£ãã®ã§å³ç¤¾å Slack ã«å ±æãããããã
ãã¼ã«é¢ã§ãStyle Dictionary ã¨ãããã¼ã«ã§ãã¶ã¤ã³ãã¼ã¯ã³ãå®è£ ã«é£æºãã話ãè峿·±ãã£ãã§ãã:
éã¨ã³ã¸ãã¢ãWeb ã¨ã³ã¸ãã¢ã«ã¨ã£ã¦ãè峿·±ã話ãè©°ã¾ã£ã¦ããã®ã§ãå 容ã®è¶£æ¨ããè¨ã£ã¦ããã¼ã ã§èªãã§ããç¸ä¹å¹æããã話ã ãªãã¨æãã¦ãã¾ãã
GraphQLã®é åãå¼ãåºãAndroidã¯ã©ã¤ã¢ã³ãå®è£
apollo-kotlin ã§ GraphQL ã¨ãã話é¡ã§èªåã®ãã¼ã ã¨åãã¹ã¿ãã¯ãªã®ã§è峿·±ãæãæè´ã
Fragment Colocation ã®ã«ã¼ã«æ±ºãã¯ãªãã»ã©ãã¨æããã¤ã³ãã§ãFragment 㯠UI ã³ã³ãã¼ãã³ã㨠1:1 対å¿ãããã¨ã決ãã¦ãã¾ããã¨ããã®ããå ±éã§ä½¿ã Fragment  ãç¨æããã¨ãªã¼ãã¼ãã§ããã®åå ã«ãªãã¨ãããã¨ã§ãæã ã®ãã¼ã ã§ã¯å ±éã§ä½¿ãä¸éç¶æ ã® Fragment ãããã®ã§ãåèã«ã§ããã話ã ãªãã¨æãã¦ãã¾ããã
ã¾ããAppendix ã® GraphQL ã®ã¯ã¨ãªå®å ¨æ§ã®ããã« Signed Query ã使ã£ã¦ããã¨ããããViewModel ã使ããªãææ³ã®æ¨¡ç´¢ãè峿·±ãèªã¾ãã¦ããã ãã¾ãããã¹ã©ã¤ãæ«å°¾ã«ãã£ã¦ã»ãã·ã§ã³ã§ã¯ã話ã¯ããã¦ãªãã£ãã®ã§ããã²åèã«ãããå 容ã§ãã
ã¿ããã¤ãã³ãã®ä»çµã¿ãçè§£ãã¦ã¸ã§ã¹ãã£ã¼ã使ãããªãã
Zoomable ã®ä½è ã® usuiat ããã®çºè¡¨ã使ããã¦ããã ãã¦ãã®ã§è峿·±ãæãæè´ã
ã¸ã§ã¹ãã£ã¼ã¾ããã¨ã£ã¤ããããæ¦å¿µããã£ã¦èª¬æãã»ãããªãã¨æã£ã¦ããã¨ãããã¨ã¦ãããããããé ã追ã£ã¦èª¬æãã¦ãã ãã£ã¦ãã®ã§ãã¸ã§ã¹ãã£ã¼ã¾ãããç¥ããã人ã«ã¾ãè´ãã¦ããã ãããè²´éãªã話ã ãªãã¨æãã¾ããã
ãã¨ãZoomable ãéçºããã«ããã£ãã¢ããã¼ã·ã§ã³ãèãã¦ã¿ãã話ã ã£ãã®ã§ãããèªä½ã®ãã©ããã¥ã¼ã¯ã¼ã«ç«¯ãçºãã¦ããã¨ãããã¨ã§ãã¸ããã¨æã£ã次第ã
Ask the speaker ã§ã¨ã¦ãçªç¶ãèªåã®ãã¼ã ã®ã¢ããªã§ Zoomable 使ããã¦ããã ãã¦ãæ¨ã礼ç³ãä¸ãããåãã§ãã ããã¾ãããããã¡ããããããã¨ããããã¾ãã¨ããæãã§ãâ¦â¦ã
Compose UIã使ã£ãã¯ãªã¨ã¤ãã£ãã§è¤éãªã¦ã¼ã¶ã¼ã¤ã³ã¿ã¼ãã§ã¼ã¹
æå¾ã«ã¨ã¦ãã¦ãã¼ã¯ãªçºè¡¨ãã²ã¼ã å ã® UI ã Compose ã§ããã«å®ç¾ãããã¨ãããã¼ãã§ãå®éã« 0 ããä½ãä¸ãã¦ããã®ãé ã追ã£ã¦èª¬æããã¦ãã¾ãã
ãããéã«è¨ãã¨ã²ã¼ã ã 㨠Canvas ã¨ãã§ç´ æ´ã«æç»ããã¨ããããã㯠3D ã®ã¡ãã·ã¥ãå¤å½¢ã㦠UI ã¨ãã¦è¦ããã¿ãããªæããæ³åãããããªã®ã§ãããããã§ã¯ãªã㦠Compose ã®ã¾ã£ã¨ããªãã¯ã使ã£ã¦å®ç¾ãã¦ããã®ããã¤ã³ãã§ãã
ãããã£ã¦ãã«ã¹ã¿ã ã¬ã¤ã¢ã¦ãã Shape, ã¢ãã¡ã¼ã·ã§ã³ãé§ä½¿ãã¦ãã¤ãããã¯ãªè¦ãç®ãåç¾ãããã¨ã«ãªãã¾ããåæã« Compose ã®è¡¨ç¾åãå¼·åã§ãããã¨ãæ¹ãã¦çè§£ã§ãã¾ããã
Figma ãã Shape ãã¨ã¯ã¹ãã¼ãã§ãã Shape Composer ã¨ãããã©ã°ã¤ã³ãç´¹ä»ããã¦ãã¦ãããã¯ä¾¿å©ããï¼ ã¨æã£ãã®ã§ã使ã£ã¦ã¿ããã¨æãã¾ã:
ã»ãã·ã§ã³å ã§ãèªããã¦ããããã«å®ç¨çãªã¢ããªãå®ç¨ç (ã ãéå±) ãªè¦ãç®ã§ããè¯ãã¨åæã«ãã¨ã³ã¿ã¡ã«å¯ãåã£ãè¤éãªã¦ã¼ã¶ã¼ã¤ã³ã¿ã¼ãã§ã¼ã¹ãé åçã ãªã¨çºè¦ã§ããé¢ç½ãã話ã ã£ããªã¨æãã¾ããã
åã¯ã¹ãã¥ã¼ã¢ãã£ãã¯ãª UI ã好ããªã®ã§ãååã«æã® UI ãåºã¦ããã¨ãã«æãããã¨ç¹æã®è¯ããåèªèãã¾ããâ¦â¦ã
æå¾ã«
ä¹ ã ã«ç¾å°åå ããã®ã§ãããã¨ã¦ãè¯ãä½é¨ã§ããï¼ ããããªæ¹ã¨ã話ããã¦ããã£ãã®ã楽ããã£ãã§ãããã»ãã·ã§ã³ã®å 容ãåºæ¿ãããããã®ã§ããã
ã¾ãæ¥å¹´ãåå ããããªãã¨æããã 3 æ¥éããããã¨ããããã¾ããï¼
宣ä¼
åã¯æ ªå¼ä¼ç¤¾ã¯ã¦ãªã§ Android ã¨ã³ã¸ãã¢ããã£ã¦ãã¾ãããã¹ãã¼ããã©ã³ã¢ããªéçºã¨ã³ã¸ãã¢ã®ä»²éã大åéãã¦ãã¾ãï¼
ð ã«ã¸ã¥ã¢ã«é¢è«ãããã£ã¦ãã¾ãã®ã§ãå°ãã§ãèå³ããããã¾ããããã²ã話ã ãã§ãèãã«ãã¦ãã ããï¼
ð ãã³ã¬ã¢ããªã®éçºããã£ã¦ãã¾ãï¼
ð ã¾ã¤ããã¤ãã³ããããã¾ãï¼