heihei blog

Writing for myself!šŸ“

2018幓5꜈悒ęŒÆ悊čæ”ć‚‹

2018å¹“ć‚‚ē“„43%恌ēµ‚ć‚ć£ćŸć‚ˆć†ć§ć™...(ļ¼› ļ½„`Š“ļ½„Ā“)ę±— ā€»6/5(ē«)Ꙃē‚¹

恝悌恧ćÆ5꜈悒ęŒÆ悊čæ”ć‚Šć¾ć™ć€‚

5ęœˆć‚„ć£ćŸć“ćØ

Google I/O 2018ć«å‚åŠ ć—ćŸ

å‚åŠ ć—ć¦ćć¾ć—ćŸć€‚

Google I/O 2018恫恤恄恦恮ęŒÆ悊čæ”ć‚Šć‚„ć€ć„ćć¤ć‹ć®ć‚»ćƒƒć‚·ćƒ§ćƒ³å‹•ē”»ć‚’č¦³ćŸéš›ć®č‹±čŖžćƒ”ćƒ¢ćŖć©ć«é–¢ć—ć¦ćÆäø‹čØ˜ć‚’å¾”č¦§ćć ć•ć„ć€‚

blog.shaunkawano.com

ęœ¬ę„­ć®ęŒÆ悊čæ”ć‚Š

Google I/O 2018å‚åŠ ä»„å¤–ć§ćÆ态ęŒÆ悊čæ”ć‚‹ćØ态

  • ćƒ¢ć‚øćƒ„ćƒ¼ćƒ«åŒ–ä½œę„­ć‚’å§‹ć‚ćŸ
  • BitriseƗfastlane悒ä½æć£ćŸč‡Ŗ動化

ć‚ćŸć‚Šć‚’ä»ŠęœˆćÆ悏悊ćØ集äø­ćƒ»ę„č­˜ć—ć¦ć„ć¾ć—ćŸć€‚

ćƒ¢ć‚øćƒ„ćƒ¼ćƒ«åŒ–ä½œę„­ć‚’å§‹ć‚ćŸ

ä»Šå›žć®Google I/O恫恦aab悄Dynamic Features态Instant Appsęœ€å¤§ć‚¢ćƒ—ćƒŖ悵悤ć‚ŗ恮10MB化ćŖć©ćŒć‚ć‚Šć€ćƒ¢ć‚øćƒ„ćƒ¼ćƒ«åŒ–ć®ę³¢ćŒAndroidē•Œéšˆć§äø€ę°—ć«åŠ é€Ÿć—ćŸć®ć§ćÆćØč€ƒćˆć¦ć„ć¾ć™ć€‚č‡Ŗåˆ†ć®ę‰€å±žć™ć‚‹ćƒćƒ¼ćƒ ć§ćÆć€å€‹äŗŗēš„恫ćÆ@kgmyshin恕悓恮恓恔悉恮DroidKaigi 2018恧恮ē™ŗč”Øå†…å®¹ć‚‚å‚č€ƒć«ć—ć¤ć¤ć€ć¾ćšćÆćƒ¬ć‚¤ćƒ¤ćƒ¼ć”ćØć«ćƒ¢ć‚øćƒ„ćƒ¼ćƒ«åˆ†ć‘ć‚’č”Œć„ć€ćć®å¾Œå„ćƒ¬ć‚¤ćƒ¤ćƒ¼ć®ć‚Æćƒ©ć‚¹ē¾¤ć‹ć‚‰ćć‚Œćžć‚Œę„å‘³ć‚ć‚‹ć¾ćØć¾ć‚Šć”ćØć®ćƒ¢ć‚øćƒ„ćƒ¼ćƒ«ć«åˆ†ć‘ćŸć‚‰ć©ć†ć ć‚ć†ć‹ćŖćØč€ƒćˆć¦ć„ćŸć®ć§ć™ćŒć€ćƒćƒ¼ćƒ å†…ć®ę•°åć§č©±ć—å§‹ć‚ćŸē؋åŗ¦ć§ćÆć‚ć‚Šć¾ć™ćŒć€commonćØappć«åˆ†ć‘ćŸć‚ćØćÆć‚‚ć†ę„å‘³ć‚ć‚‹ć¾ćØć¾ć‚Šć§åˆ†ć‘å§‹ć‚ć‚‹ć®ć‚‚ć‚ć‚ŠćŖ恮恧ćÆ态ćØć„ć†č©±ć‚’ć—ć¦ć„ćŸć‚Šć—ć¾ć™ć€‚ć¤ć¾ć‚Šć¾ć ćµć‚ćµć‚ć£ćØć—ć¦ć„ć‚‹ć‚ć‘ć§ć™ć­ć€‚ē¤¾å†…ćƒ»ē¤¾å¤–å•ć‚ćšć€ę—¢å­˜ćƒ—ćƒ­ćƒ€ć‚Æ惈恫åÆ¾ć—ć¦ćƒ¢ć‚øćƒ„ćƒ¼ćƒ«åŒ–ć‚’é€²ć‚ć¦ć„ć‚‹ēš†ć•ć‚“态恓恓悉ćøć‚“ć©ć†ć‚„ć£ć¦é€²ć‚ć¦ć„ć¾ć™ć‹ļ¼Ÿ

BitriseƗfastlane悒ä½æć£ćŸč‡Ŗ動化

Bitrise Ɨ FastlanećŒę€ć„ć®å¤–ć„ć‚ć„ć‚ćØčØ­å®šć§ćć¦ć‚ˆć•ćć†ćŖć®ć§ć€ć‚‚ć£ćØę“»ē”Øć—ć¦ć„ćć¾ć™ć€‚

꜀čæ‘ć“ć‚Œć‚‰ć®ćƒ„ćƒ¼ćƒ«ć‚’ä½æć£ć¦ć€

恟ćØ恈恰tagć‚’åˆ‡ć£ćŸć‚æć‚¤ćƒŸćƒ³ć‚°ć§ć€

  1. ē½²åä»˜ćAPK悒ē”Ÿęˆ
  2. Changelog悒ē”Ÿęˆ
  3. GitHub Releases恫ꖰ恗恄Draft Releaseć‚’ä½œęˆ
  4. description恫Changelogć‚’å…„åŠ›
  5. assetsćØ恗恦ē½²åä»˜ćAPKć‚’ć‚¢ćƒƒćƒ—ćƒ­ćƒ¼ćƒ‰
  6. Slack恫Draft Release恧恑恟悈通ēŸ„

ć•ć›ćŸć‚Šć—ć¦ć„ć¾ć™ć€‚ä»Šć¾ć§ćÆē‹¬č‡Ŗć®ć‚¹ć‚ÆćƒŖćƒ—ćƒˆć ć£ćŸć‚Šć‚’ä½æć£ćŸć‚Šć—ć¦ć„ćŸć®ć§ć™ćŒć€ćŸćØ恈恰Changelogē”Ÿęˆć€ć‚„GitHub恮Releaseä½œęˆć€APK悒Github恮Releaseć«ć‚¢ćƒƒćƒ—ćƒ­ćƒ¼ćƒ‰ć™ć‚‹ē­‰ćÆfastlane恌ē”Øę„ć—ć¦ćć‚Œć¦ć„ć‚‹action恧态Bitriseć®ę©Ÿčƒ½ć®ćæć§å®Ÿē¾ć§ćć¾ć—ćŸć€‚(怌恝悓ćŖć®ć‚‚ć†ć‚„ć£ć¦ć‚‹ć‚ˆć€ćØć„ć†å£°ćŒčžć“ćˆć¦ććć†ć§ć™ćŒć‚¹ćƒ«ćƒ¼)

č‡Ŗ動化å‘Øć‚Šć§å›°ć£ćŸć“ćØć€č©°ć¾ć£ćŸć“ćØ悄恝悌悉悒č‡Ŗ分ćŖć‚Šć«ć©ć†č§£ę±ŗć—ćŸć‹ć«ć¤ć„ć¦ćÆ6ęœˆć®potatotips@FOLIO恫恦ē™ŗč”Øäŗˆå®šć§ć™ć€‚

ćć®ä»–

  • 個äŗŗć‚¢ćƒ—ćƒŖć«ć‚¢ćƒƒćƒ—ćƒ‡ćƒ¼ćƒˆćƒŖć‚Æć‚Øć‚¹ćƒˆćŒę„ćŸ

恓恓ćÆćƒžć‚¤ćƒšćƒ¼ć‚¹ć«ć‚„ć£ć¦ć„ćć—ć‹ćŖ恄怂

ćƒćƒ­ćƒ³ćƒ‰ćƒ¼ćƒ«å—č³žć—ćŸļ¼ćØć„ć†ćƒ‹ćƒ„ćƒ¼ć‚¹ć‚’SNS恋恩恓恋恧見恦态見恦ćæ悈恆ćØę€ć£ćŸę„Ÿć˜ć§ć™ć€‚ć€Œć‚ć€ć“ć†ć„ć†ć®ć„ć„ćŖ恁(Ā“ļ½Ŗļ½€)怍ćØę€ć†ć‚·ćƒ¼ćƒ³ć‚„ć€é³„č‚ŒćŒē«‹ć¤ć»ć©ć‚øćƒ¼ćƒ³ćØćć‚‹ć‚·ćƒ¼ćƒ³ćŖć©ć€ć„ć‚ć„ć‚ćŖę³¢ć®ć‚ć‚‹ę˜ ē”»ć§ć—ćŸć€‚å®‰č—¤ć‚µć‚Æćƒ©ć•ć‚“ć®ę¼”ęŠ€ćŒē‰¹ć«å°č±”ēš„ć§ć—ćŸć€‚

仄äøŠć«ćŖć‚Šć¾ć™ć€‚5꜈悂恊ē–²ć‚Œę§˜ć§ć—ćŸļ¼

Google I/O 2018恧č³Ŗå•ć—ćŸć“ćØ惻I/O 2018恮ęŒÆ悊čæ”ć‚Š

f:id:shaunkawano:20180521192251j:plain

ā€»Google I/O 2018恮ē™ŗč”Øå†…å®¹ć«ć¤ć„ć¦ćÆć“ć®ćƒ–ćƒ­ć‚°ć§ćÆē“¹ä»‹ć—恦恄ćŖ恄恮恧态ē™ŗč”Øå†…å®¹ć«ć¤ć„ć¦ę°—ć«ćŖć‚‹ę–¹ćÆä»–ćƒ–ćƒ­ć‚°ćƒ»Qiitačؘäŗ‹ć ć£ćŸć‚Šå„åœ°ć§é–‹å‚¬ć•ć‚Œć¦ć„ć‚‹å ±å‘Šä¼šć®č³‡ę–™ćŖć©ć‚’ćœć²å‚č€ƒć«ć—ć¦ćć ć•ć„ć€‚

ęœ¬čؘäŗ‹ć§ćÆ态Google I/O 2018恫恦č³Ŗå•ć—ćŸć“ćØ(ć—ćŸć‹ć£ćŸć“ćØ)ćØ回ē­”ć€ä¼šå “恧Googleć®ę–¹ćØäŗ¤ęµć§ćć‚‹å “ę‰€ć«ć¤ć„ć¦å…±ęœ‰ć‚’ć—ć¦ć€I/Oꜟ間äø­ć‚’ęŒÆ悊čæ”ć£ć¦ć‚‚ć£ćØć“ć†ć™ć‚Œć°ć‚ˆć‹ć£ćŸćŖ态ćØ恄恆恓ćØ悒ęŒÆ悊čæ”ć‚Šć¾ć™ć€‚

Google I/O 2018恫恦č³Ŗå•ć—ćŸć“ćØ(ć—ćŸć‹ć£ćŸć“ćØ)

ē¾åœ°ć«č”Œćå‰ć«äŗ‹å‰ć«ē¤¾å†…恮ć‚Øćƒ³ć‚øćƒ‹ć‚¢ć®ę–¹ć€…ć«ä½•ć‹č³Ŗå•ć—ć¦ćŠćć“ćØćÆćŖ恄恋ē­‰čžć„ćŸć‚Šć€čŖ°ć§ć‚‚ē·Ø集åÆčƒ½ćŖć‚¹ćƒ—ćƒ¬ćƒƒćƒ‰ć‚·ćƒ¼ćƒ‰ć‚’ćƒ„ć‚¤ćƒ¼ćƒˆć‚’é€šć—ć¦å…±ęœ‰ć—ć¦ćŠćē¤¾å¤–恮äŗŗ恋悉悂č³Ŗå•ć‚’å‹Ÿć£ćŸć‚Šć—ć¾ć—ćŸć€‚ ćć®ēµęžœćŖ恮恋态10+恮č³Ŗå•ć‚’ć‚‚ć‚‰ć†ć“ćØćŒć§ćć€ć„ćć¤ć‹ć®ć‚‚ć®ć«é–¢ć—ć¦å›žē­”ć‚’å¾—ć‚‹ć“ćØćŒć§ćć¾ć—ćŸć€‚

docs.google.com

å†’é ­ć«ć‚‚ę›øćć¾ć—ćŸćŒć€å…ØéƒØ恮č³Ŗ問ćÆ恙悋恓ćØćŒć§ćć¾ć›ć‚“ć§ć—ćŸć€‚(ꮋåæµć«ę€ć£ć¦ć—ć¾ć£ćŸę–¹ć€ć™ćæć¾ć›ć‚“ć€‚)

č³Ŗ問ćØ回ē­”

ē¾åœ°ć§ćÆ回ē­”ć‚’å¾—ć‚ŒćŸć‚‚ć®ć‹ć‚‰é©ę™‚Q. A.ćØć„ć†å½¢ć§ćƒ„ć‚¤ćƒ¼ćƒˆć—ć¦ć„ć¾ć—ćŸć€‚äø‹čؘćÆćć®äø€č¦§ć§ć™

ļ¼ˆäøŠčؘćÆKTX恮ē™ŗč”Øå‰ć«č³Ŗå•ć—ć¾ć—ćŸļ¼‰

ć“ć†ć‚„ć£ć¦ćæ悋ćØę€ć£ćŸć‚ˆć‚Šč³Ŗå•ć§ććŸć“ćØ少ćŖ恄恓ćØć«ę°—ć„ćć¾ć™ć­...

個äŗŗēš„恫ćÆRealtime DB恮äøå®‰å®šę„Ÿć«åÆ¾ć™ć‚‹č³Ŗå•ć‚’ęŠ•ć’ć‹ć‘ćŸéš›ć®ć€ē¤¾å“”恕悓恮ē”³ć—čسćŖ恕恝恆ćŖé””ćŒå°č±”ć«ę®‹ć£ć¦ć„ć¦ć€ć€ŒćŒć‚“ć°ć£ć¦ćć ć•ć„ļ¼ć€ćØ恄恆åæœę“ć®ę°—ęŒć”ć§ć™ć€‚

I/O恧Googleć®ę–¹ćØäŗ¤ęµć§ćć‚‹å “ꉀ

Google I/O恧ćÆć‚­ćƒ¼ćƒŽćƒ¼ćƒˆć‚„ć‚»ćƒƒć‚·ćƒ§ćƒ³ć®ä»–ć«ć€ć‚µćƒ³ćƒ‰ćƒœćƒƒć‚Æć‚¹ć‚„ć‚Ŗćƒ•ć‚£ć‚¹ć‚¢ćƒÆćƒ¼ćØć„ć£ćŸGoogleć®ę–¹ćØäŗ¤ęµć™ć‚‹ćŸć‚ć®ć‚¹ćƒšćƒ¼ć‚¹ćŒčØ­ć‘ć‚‰ć‚Œć¦ć„ć¾ć™ć€‚

ć‚µćƒ³ćƒ‰ćƒœćƒƒć‚Æć‚¹

ć‚µćƒ³ćƒ‰ćƒœćƒƒć‚Æć‚¹ć«ćÆ态Googleć®č£½å“ć‚„č£½å“ć‚’ē”Øć„ćŸä½œå“ć®ćƒ‡ćƒ¢ć€å®Ÿę¼”ćŖć©ć®ä»–ć«ć€ć‚­ćƒ¼ćƒŽćƒ¼ćƒˆć€ć‚»ćƒƒć‚·ćƒ§ćƒ³ćŖ恩恧ē™ŗč”Ø恕悌恟開ē™ŗćƒ„ćƒ¼ćƒ«ćŖ恩恮ä½æć„ę–¹ć®å®Ÿę¼”ćŖć©ć‚’č”ŒćŖć†å°‚ē”Øć‚¹ćƒšćƒ¼ć‚¹ć§ć™ć€‚

Android & Pay态AR/VR态Web & Payments态Cloud, Firebase & Flutter态Android Things & NestćØć„ć£ćŸå„ć‚»ć‚Æć‚·ćƒ§ćƒ³ć”ćØć«ćƒ‰ćƒ¼ćƒ åž‹ć®ć‚¹ćƒšćƒ¼ć‚¹ćŒčØ­å–¶ć•ć‚Œć¦ćŠć‚ŠčŖ°ć§ć‚‚č‡Ŗē”±ć«å‡ŗå…„ć‚Šć™ć‚‹ć“ćØćŒć§ćć¾ć™ć€‚äø­ć«ćÆćƒ‡ćƒ¢ć‚„ćƒ„ćƒ¼ćƒ«ć®čŖ¬ę˜Žć‚’č”ŒćŖ恆Googleć®ę–¹ćŒć„ć¦ć€ę°—č»½ć«č©±ć—ć‹ć‘ćŸć‚Šć™ć‚‹ć“ćØćŒć§ćć¾ć™ć€‚

f:id:shaunkawano:20180521192442j:plain

f:id:shaunkawano:20180521192513j:plain

ć‚Ŗćƒ•ć‚£ć‚¹ć‚¢ćƒÆćƒ¼ćØć‚¢ćƒ—ćƒŖćƒ¬ćƒ“ćƒ„ćƒ¼

ć‚Ŗćƒ•ć‚£ć‚¹ć‚¢ćƒÆćƒ¼ć§ćÆ态Googleć®ę–¹ć«å€‹åˆ„ć§č³Ŗå•ć‚’ć™ć‚‹ć“ćØćŒć§ćć¾ć™ć€‚ć‚Ŗćƒ•ć‚£ć‚¹ć‚¢ćƒÆćƒ¼å°‚ē”Øć®ć‚¹ćƒšćƒ¼ć‚¹ć«ćÆ态äø€å®šć®ę™‚間恔ćØć«å„åˆ†é‡Žć®Googleć®å°‚é–€å®¶ć®ę–¹ćŒć„ć¦ć€ćć®ę‰€å®šć®ę™‚é–“ć«å‡ŗå‘ćć“ćØ恧态č‡Ŗåˆ†ć®čˆˆå‘³ć®ć‚ć‚‹åˆ†é‡Žć®Googleć®å°‚é–€å®¶ć®ę–¹ć«č³Ŗå•ć™ć‚‹ć“ćØćŒć§ćć¾ć™ć€‚

ć‚¢ćƒ—ćƒŖćƒ¬ćƒ“ćƒ„ćƒ¼ć§ćÆ态č‡Ŗåˆ†ć®ć‚¢ćƒ—ćƒŖć‚’ćƒ¬ćƒ“ćƒ„ćƒ¼ć—ć¦ć‚‚ć‚‰ć„ć€å…·ä½“ēš„ćŖć‚¢ćƒ‰ćƒć‚¤ć‚¹ć ć£ćŸć‚Šę”¹å–„ē‚¹ćŖć©ć‚’ę•™ćˆć¦ć‚‚ć‚‰ć†ć“ćØćŒć§ćć¾ć™ć€‚

f:id:shaunkawano:20180521192539j:plain

個äŗŗēš„恫ć‚Ŗć‚¹ć‚¹ćƒ”ć®äŗ¤ęµćƒ»č³Ŗå•å “ę‰€

ć‚¢ćƒ—ćƒŖćƒ¬ćƒ“ćƒ„ćƒ¼ć‚’ćŠé”˜ć„ć—ćŸć„å “åˆć«ćÆäŗ‹å‰ć«äŗˆē“„ć‚’ć—ć¦ę‰€å®šć®ę™‚é–“ć«ę‰€å®šć®å “ꉀ恫å‡ŗå‘ćåæ…č¦ćŒć‚ć‚‹ćŸć‚ć€ć¾ćšćÆäŗˆē“„ć‚’ć—ć¦ćŠćć“ćØćŒå¤§åˆ‡ć®ć‚ˆć†ć§ć™ć€‚(꜀ēµ‚ę—„恫ē¾åœ°ć§ć‚¢ćƒ—ćƒŖćƒ¬ćƒ“ćƒ„ćƒ¼ć‚’č”ŒććŸć‹ć£ćŸćŒäŗˆē“„ć§åŸ‹ć¾ć£ć¦ć„ć¦ć§ćć¾ć›ć‚“ć§ć—ćŸ)

č³Ŗå•ć‚„äŗ¤ęµć‚’ć™ć‚‹å “åˆć«ćÆć€å€‹äŗŗēš„恫ćÆć‚µćƒ³ćƒ‰ćƒœćƒƒć‚Æć‚¹ćŒć‚Ŗć‚¹ć‚¹ćƒ”ć ćØę€ć„ć¾ć™ć€‚ć‚Ŗćƒ•ć‚£ć‚¹ć‚¢ćƒÆćƒ¼ć§ć‚‚ć‚‚ć”ć‚ć‚“ć§ćć¾ć™ćŒć€ć‚Ŗćƒ•ć‚£ć‚¹ć‚¢ćƒÆćƒ¼ćÆęœ¬å½“ć«ć€Œč³Ŗå•ć‚’ć™ć‚‹ćŸć‚ć®ć‚¹ćƒšćƒ¼ć‚¹ć€ćŖć®ć§ć€ćŸćć•ć‚“ć®å‚åŠ č€…ć®ę–¹ćŒć„ć¦Googleć®ę–¹ć«č³Ŗå•ć‚’ć—ć¦ć„ć¾ć™ć€‚ć‚µćƒ³ćƒ‰ćƒœćƒƒć‚Æć‚¹ć®å “åˆćÆć€ćƒ‡ćƒ¢ć‚„ä½œå“ćŖć©ć®å±•ē¤ŗćŒć‚ć‚‹ć®ć§ć€ćć†ć„ć£ćŸē‰©ć‚’介恗恦äŗ¤ęµć™ć‚‹ć“ćØćŒć§ćć‚‹ć®ć§č©±ć—ć‹ć‘ć‚„ć™ć„ćØę„Ÿć˜ć¾ć—ćŸć€‚ć‚‚ć”ć‚ć‚“ć‚µćƒ³ćƒ‰ćƒœćƒƒć‚Æć‚¹å†…ć®å±•ē¤ŗ恮å‘Ø悊恫悂Googleć®ę–¹ćÆ恄悋恮恧态č³Ŗå•ć—ćŸć„ć‘ć©Googleć®ę–¹ćŒć„ćŖ恄态ćØ恄恆恓ćØćÆć‚ć‚Šć¾ć›ć‚“ć§ć—ćŸć€‚

ęŒÆ悊čæ”ć£ć¦ćæ恦ꬔćÆ恓恆恗恟恄ćØꀝ恆恓ćØ

ꜟ間äø­ć‚’ęŒÆ悊čæ”ć£ć¦ćæć¦ć€ć‚‚ć£ćØć“ć†ć—ć¦ćŠć‘ć°ć‚ˆć‹ć£ćŸćØ恄恆恓ćØ恫恤恄恦ęŒÆ悊čæ”ć‚Šć¾ć™ć€‚ć“ć‚ŒćÆč³Ŗ問ćØ恋äŗ¤ęµćØ恋ćÆć‚ć¾ć‚Šé–¢äæ‚ćŖćć€ę¬”ć¾ćŸå½“éø恗恟悊恙悋ćŖ恩恧I/Oć«č”Œćę©Ÿä¼šćŒć‚ć‚Œć°ć€ć“ć†ć—ćŸć„ćŖćƒ¼ćƒ•ćƒÆ惕ćƒÆćØę€ć£ć¦ć„ć‚‹ć“ćØ恧恙

  • åˆę—„ć®ć‚­ćƒ¼ćƒŽćƒ¼ćƒˆćƒ»ćƒ‡ć‚£ćƒ™ćƒ­ćƒƒćƒ‘ćƒ¼ć‚­ćƒ¼ćƒŽćƒ¼ćƒˆćŒēµ‚ć‚ć£ćŸć‚‰codelabć«å…„ć‚Šęµø悋

åˆę—„ć®ć‚­ćƒ¼ćƒŽćƒ¼ćƒˆćƒ»ćƒ‡ć‚£ćƒ™ćƒ­ćƒƒćƒ‘ćƒ¼ć‚­ćƒ¼ćƒŽćƒ¼ćƒˆćŒēµ‚ć‚ć£ć¦ć™ććÆ态悏悊ćØcodelab恌ē©ŗć„ć¦ć„ć¾ć™ć€‚codelabć‚¹ćƒšćƒ¼ć‚¹ć§ćÆ态ē”Øę„ć•ć‚Œć¦ć„ć‚‹PCć‚„ęŒå‚ć—ć¦ć„ć‚‹PCćƒ»ćƒ©ćƒƒćƒ—ćƒˆćƒƒćƒ—ć‚’ē”Ø恄恦I/O恧ē™ŗč”Øć•ć‚ŒćŸå†…å®¹ē­‰ć‚’å«ć‚ćŸcodelabć‚’č”ŒćŖ恆恓ćØćŒć§ćć¾ć™ć€‚ä»Šå›žcodelabć«å‚åŠ ć—ć¦ę°—ä»˜ć„ćŸć“ćØćÆ态codelab恮čŖ¬ę˜Žå†…å®¹ćŒć‚»ćƒƒć‚·ćƒ§ćƒ³ć®ē™ŗč”Øå†…å®¹ćć®ć‚‚ć®ćØ恋ćŖ悊重ćŖć£ć¦ć„ć‚‹ćØ恄恆恓ćØć§ć™ć€‚åˆę—„1恤2恤恮codelab悒ēµ‚ćˆć¦codelabćØåŒć˜ćƒˆćƒ”ćƒƒć‚Æć®ć‚»ćƒƒć‚·ćƒ§ćƒ³ć‚’č“č¬›ć—ćŸćØć“ć‚ć€å†…å®¹ćŒć‹ćŖć‚Šé ­ć«å…„ć£ć¦ćć‚„ć™ć‹ć£ćŸå°č±”ć§ć™ć€‚codelabć§å†…å®¹ć‚’äø€é€šć‚Šć‚³ćƒ¼ćƒ‰äøŠć§č§¦ć‚Šēµ‚ćˆć¦ć„ć‚‹ć®ć§ć‚»ćƒƒć‚·ćƒ§ćƒ³ćÆ復ēæ’ć®ć‚ˆć†ćŖå½¢ćØć—ć¦ę‰ćˆć‚‹ć‚ˆć†ćŖ恓ćØćŒć§ćć¾ć—ćŸć€‚ć‚‚ć”ć‚ć‚“ćƒŖć‚¢ćƒ«ć‚æć‚¤ćƒ ć§č“č¬›ć—ć¦ć„ćŖć„åˆ†ć€ćƒ›ćƒ†ćƒ«ć«ęˆ»ć£ć¦ć‚»ćƒƒć‚·ćƒ§ćƒ³å‹•ē”»ē­‰ć‚’見ē›“恙åæ…要ćÆć‚ć‚Šć¾ć™ćŒć€ć„ććŖć‚Šę–°ć—ć„å†…å®¹ć®ē™ŗč”Øć‚’ć‚»ćƒƒć‚·ćƒ§ćƒ³ć§å­¦ć¶ć‚ˆć‚ŠćÆäø€åŗ¦codelabć‚’ęŒŸć‚“ć§ćŠć„ćŸć»ć†ćŒē†č§£ć—ę˜“ćć†ć§ć™ć€‚

  • ć‚‚ć£ćØä»–å›½ć‹ć‚‰ć®å‚åŠ č€…ćØå‹é”ć«ćŖ悋

čØ€ć‚ćšć‚‚ćŒćŖć€‚ä»Šå›žć‚¹ć‚¦ć‚§ćƒ¼ćƒ‡ćƒ³å‡ŗčŗ«ć§åŒć˜ćƒ›ćƒ†ćƒ«ć«å®æę³Šć—ć¦ć„ćŸć‚¹ćƒ†ćƒ•ć‚”ćƒ³ć•ć‚“ć«å£°ć‚’ć‹ć‘ć¦ć‚‚ć‚‰ć„ć€ä¼šå “ć«äø€ē·’ć«å‘ć‹ć†é“äø­ć§ćŠč©±ć—ćŸć‚Šć—ć¦ę„½ć—ć‹ć£ćŸć®ć§ć€ę¬”回ćÆć‚‚ć£ćØ恓恆恄恆äŗŗć‚’å¢—ć‚„ć›ćŸć‚‰ćŖćØę¬²å¼µć‚Šć«ćŖć£ć¦ć„ć¾ć™ć€‚

  • ę—„ē„¼ć‘ę­¢ć‚ć‚’ć”悃悓ćØå”—ć‚‹

ć†ć‚“ć€ć”ć‚ƒć‚“ćØå”—ć‚ć†(ą¹‘ā€¢Ģ€ć…‚ā€¢Ģ)Łˆāœ§é¦–å…ƒć€č€³ćØ恋恮ꗄē„¼ć‘ćŒć‚ć£ć¦ćƒ’ćƒŖ惒ćƒŖ恗恟

  • ē›®č–¬ć‚’ęŒå‚ć™ć‚‹

ćØć“ć‚ć©ć“ć‚ē›®ćŒ(Ī“Ā“Ļ‰ļ½€)ļ½¶ļ¾•ć‹ć£ćŸć®ć§ć€ęŒå‚ć—ćŸć»ć†ćŒć‚ˆć•ćć†

ć¾ćØ悁

ä»Šå¹“ć®Google I/O恧ćÆ态å‡ŗē™ŗå‰ć‹ć‚‰ć§ćć‚‹ć ć‘č‰²ć€…ćŖę–¹ć‹ć‚‰č³Ŗå•ć‚’ć‚‚ć‚‰ć£ć¦ćŠć„ć¦ć€é ‘å¼µć£ć¦č³Ŗå•ć—ć¦å›žē­”ć‚’å¾—ć‚ˆć†ćØč€ƒćˆć¦ć„ć¾ć—ćŸć€‚ē†ē”±ćÆ꘎ē™½ć§ć€č³Ŗå•ć‚„äŗ¤ęµć‚’恙悋ćØć„ć†č”Œē‚ŗ恫åÆ¾ć™ć‚‹åæƒē†ēš„ćƒćƒ¼ćƒ‰ćƒ«ć‚’äø‹ć’悋恓ćØ恌恧恍悋恋悉恧恙怂č³Ŗå•ć‚„äŗ¤ęµć‚’恙悋恮ćÆä½•ć‹ćØå‹‡ę°—ćŒåæ…č¦ć§ć€å«ŒćŖé””ć•ć‚ŒćŖ恄恋ćŖ态ćØć‹å¤‰ćŖč³Ŗå•ć˜ć‚ƒćŖ恄恋ćŖ态ćØć‹č‰²ć‚“ćŖē†ē”±ć‚’恤恑恦éæ恑恟恏ćŖć‚‹å‚¾å‘ćŒč‡Ŗ分ćÆć‚ć‚‹ć®ć§ć™ćŒć€č³Ŗå•ć—ć¦ę¬²ć—ć„å†…å®¹ć‚’ć‚‚ć‚‰ć£ćŸć‹ć‚‰ć«ćÆ态恧恍悋恠恑č³Ŗå•ć—ćŖ恍悃态ćØč‡Ŗåˆ†ć‚’å„®ć„ē«‹ćŸć›ć‚‹ć“ćØćŒć§ćć¾ć™ć€‚č‹±čŖžć®ē·“ēæ’恫ćŖ悋恮ćÆć‚‚ć”ć‚ć‚“ć€å½“ćŸć‚Šå‰ć ć‘ć©č‡Ŗåˆ†ćŒēŸ„悉ćŖ恄恓ćØ悒ēŸ„ć‚‹ćć£ć‹ć‘ć«ć‚‚ćŖć‚Šć¾ć™ć€‚ć‚­ćƒ¼ćƒŽćƒ¼ćƒˆć‚„ć‚»ćƒƒć‚·ćƒ§ćƒ³ć§ćÆē™ŗč”Ø恕悌ćŖ恄悈恆ćŖå†…å®¹ć®ć“ćØć§ć‚ć£ć¦ć‚‚ć€ćØć‚Šć‚ćˆćšęŠ•ć’ć‹ć‘ć¦ćæ恦态ē¾ēŠ¶ć®ć‚¹ćƒ†ćƒ¼ć‚æć‚¹ć ć£ćŸć‚Šć€ä»Šå¾ŒćÆ恓恆恙悋恋悂态ćØć„ć£ćŸę–¹é‡ć ć£ćŸć‚Šć‚’ę•™ćˆć¦ć‚‚ć‚‰ćˆć‚‹ć“ćØć‚‚ć‚ć‚Šć¾ć™ć€‚ļ¼ˆć‚‚ć”ć‚ć‚“ę•™ćˆć¦ć‚‚ć‚‰ćˆćŖ恄恓ćØć‚‚ć‚ć‚Šć¾ć™ć€‚ļ¼‰Win-Win-Winćć‚‰ć„ć®ćƒ”ćƒŖ惃惈恌恂悊恝恆恠ćØꀝ恈悋ćØ态恧恍悋恠恑恟恏恕悓č³Ŗå•ć—ć‚ˆć†ćØ恄恆갗恫ćŖć‚Šć¾ć—ćŸć€‚

ä»–ć®ę–¹ć«ć‚‚ć€č³Ŗå•ć‚’å—ć‘ä»˜ć‘ć¦å›žē­”ć‚’ęŒć£ć¦åø°ć£ć¦ć„ć‚‰ć£ć—ć‚ƒć‚‹ę–¹ćŒć„ć¾ć—ćŸć€‚ć‚­ćƒ¼ćƒŽćƒ¼ćƒˆć‚„ć‚»ćƒƒć‚·ćƒ§ćƒ³ć®å†…å®¹ćÆęÆŽå¹“ćƒ¢ćƒŖćƒ¢ćƒŖć§ć‚­ćƒ£ćƒƒćƒć‚¢ćƒƒćƒ—ć‚‚å¤§å¤‰ć§ć™ćŒć€å…¬å¼ć®å¤§ćć„ē™ŗč”Øä»„å¤–ć«ć‚‚ć€ć©ć‚“ć©ć‚“ę–¹é‡ć ć£ćŸć‚Šć‚°ćƒ¬ćƒ¼ć‚¾ćƒ¼ćƒ³ć®ć‚ˆć†ćŖćØć“ć‚ć®ęƒ…å ±ć‚’é›†ć‚ä»Šå¾Œć®ęµć‚Œć‚’å°‘ć—ć§ć‚‚åƟēŸ„ć—ć¦ć€å¤§ććŖć‚¢ćƒƒćƒ—ćƒ‡ćƒ¼ćƒˆć«å‚™ćˆć¦ć„ććŸć„ć§ć™ć€‚

ęœ€å¾Œć«ć€äø€čˆ¬å‚åŠ ęž ć§ē¾åœ°ć«č”Œć‹ć›ć¦ćć‚ŒćŸå¼Šē¤¾ć«ę„Ÿč¬ć—恦ē· ć‚ć¾ć™ć€‚ć‚ć‚ŠćŒćØć†ć”ć–ć„ć¾ć—ćŸć€‚ šŸ™

Notes - Android Jetpack: whatā€™s new in Android Support Library (Google I/O 2018)

ā€»Notesčؘäŗ‹ć§ćÆ态英čŖžć®ć‚»ćƒƒć‚·ćƒ§ćƒ³å‹•ē”»ć‚„ćƒćƒƒćƒ‰ć‚­ćƒ£ć‚¹ćƒˆć®å†…å®¹ć‚’(雑恫)英čŖžć§ćƒ”ćƒ¢ć«ę›øćę®‹ć™ć“ćØć‚’č”Œć£ć¦ć„ć¾ć™ć€‚ęœ¬čؘäŗ‹ćÆć€ć‚ćć¾ć§å‹•ē”»ć‚’見ćŖćŒć‚‰ć€å‚č€ƒē؋åŗ¦ć«čŖ­ć‚“ć§ć„ćŸć ćć“ćØć‚’ęƒ³å®šć—ć¦ć„ć¾ć™ć€‚Notesčؘäŗ‹ć«ćÆé›‘ćƒ”ćƒ¢ē؋åŗ¦ć®ć‚‚ć®ć ć£ćŸć‚Šć€ę›øćčµ·ć“ć—ć®ć‚ˆć†ćŖć‚‚ć®ć‚‚ć‚ć‚Šć¾ć™ć€‚ć“ć‚Œć‹ć‚‰å®Ÿéš›ć®å‹•ē”»ć‚’見悋際恫ćÆć€ęœ¬čؘäŗ‹ć®å†…å®¹ćŒå°‘ć—ć§ć‚‚ćŠå½¹ć«ē«‹ć¦ć°å¹ø恄恧恙怂ļ¼ˆå†…å®¹ć«ćŠć„ć¦äøå‚™ć€čŖ¤å­—č„±å­—ē­‰ć‚ć‚Šć¾ć—ćŸć‚‰ę°—č»½ć«ć”é€£ēµ”恄恟恠恑悋ćØå¬‰ć—ć„ć§ć™ļ¼m(__)m)

ęœ¬čؘäŗ‹ćÆ态Android Jetpack: whatā€™s new in Android Support Library (Google I/O 2018)恮čؘäŗ‹ć§ć™ć€‚

f:id:shaunkawano:20180514095248p:plain

Packaging

Current Package Name

  • com.android.support
    • support-v4
    • support-v13
    • appcompat-v7
    • cardview-v7
    • gridlayout-v7
    • mediarouter-v7
    • palette-v7
    • preference-v7
    • preference-v14
    • recyclerview-v7

Packaging Versioning Releasing

  • Form of foundation to jetpack: Android Extension Libraries = AndroidX

Jetpack

  • Guidance
  • Recommended libraries and tools
  • Has a cute logo

AndroidX

  • Libraries itself
  • Technical guarantees
  • Does not have a cute logo

Finer-grained artifacts

  • Feature-based Maven groupId and artifactId
  • Scoped to individual widgets, use cases
  • Compatible with old artifacts
  • Binary compatible

Refined versioning

  • Reset from 28.0.0 to 1.0.0
  • Strict semantic versioning
    • Major - binary compatibility
    • Minor - feature release
    • Bug fix
  • Per-artifact versioning & release
  • Dependencies defined in POM

Updated packaging

  • Refactored to androidx java packages
    • 1androidx..ClassName`
  • Consistent Maven naming schemes
    • androidx.<feature>:<feature>-<sub-feature>
  • Removed -v7, -v4, etc. naming

Examples

Support Library 28.0.0-alpha1 => AndroidX 1.0.0-alpha1
com.android.support:multidex
=> androidx.multidex:multidex

com.android.databinding:adapters
=> androidx.databinding:databinding-adapters

android.arch.persistence.room:common
=> androidx.room:room-common

com.android.support:support-compat
=> androidx.core:core

com.android.support:cardview-v7
=> androidx.cardview:cardview

Migrating to AndroidX

  • Tooling for automatic source migration
    • Available in Android Studio 3.2 Canary 14+
    • Wait until Canary 15 to start using this
  • Jetifier tool for prebuilt JAR, AAR transformation
    • Available as standalone JAR or Gradle plugin
  • Use Automated refactoring(As of 05/12/18: Available now in Android Studio 3.2 Canary 14)

    • "Refactor to AndroidXā€¦"
  • Support Library 28.0.x

    • Parity with AndroidX 1.0.x libraries
    • Same old android.support java package
    • Same old com.android.support Maven groupId
  • No feature releases after 28.0.0

What's New Features

RecyclerView Selection

  • Touch and mouse-driven
  • Preserves state between Activity lifecycle events
  • Finger-grained control
dependencies {
  implementation "androidx.recyclerview:recyclerview-selection:1.0.0-alpha1"
}
  • Band selection
  • Item selection area
  • Item rejection
  • State management
  • Much more

RecyclerView ListAdapter

  • Operates on immutable lists
  • Simplified way to use DiffUtil
  • Provides animated updates
  • Concurrency support
  • Efficiently animates changes
  • See also AsyncListDiffer

androidx.webkit

  • Provides access to latest WebView platform APIs(android.webkit.*)
  • Relies on updatable WebView APK
    • API 21+ devices only
dependencies {
  implementation "androidx.webkit:webkit:1.0.0-alpha1"
}

Browser library

  • android.support.customtabs -> androidx.browser
  • Custom tabs supported by major browsers
    • Chrome
    • Firefox
    • Samsung Internet
  • Browser actions
    • Allows apps to hook into browser context-click menu
    • Requires browser support: Chrome v66+

HeifWriter

  • Writing to HEIF files from:
    • YUV byte buffers
    • android.view.Surface
    • android.graphics.Btmap
  • API 28+ (backport coming)

Slices

Android's new approach for remote content

  • Templated
  • Interactive
  • Updatable

Backwards-compatible through API 19+(95% of devices)

Goal

  • One reusable API for presenting remote app content in Android
  • Templated and Interactive

Launching in Search

Enhance Suggestions with rich, live app content

  • App names
  • General terms

Reach hundreds of millions of users with Slices backwards-compatibility

dependencies {
  implementation "androidx:slice-builders:1.0.0-alpha1"
  implementation "androidx:slice-view:1.0.0-alpha1"
  implementation "androidx:slice-core:1.0.0-alpha1"
}

Slice Types

  • Shortcut slice
  • Small slice
  • Large slice

Material Components

  • Adding more customization for color, type, and shape
  • New components
  • Animations
  • Express your brand
dependencies {
  implementation "com.google.android.material:material:1.0.0-alpha1"
}

ę‰€ę„Ÿćƒ»ć¾ćØć‚ćƒ»å€‹äŗŗēš„ć«å°č±”ć«ę®‹ć£ćŸć“ćØćŖ恩

  • Automatic Source MigrationćÆCanary 15恋悉
  • Jetifier名前č‰Æ恄..恩恆恄恆仕ēµ„ćæćØ恋ēŸ„ć‚‹ćŸć‚ć«ćÆē“¹ä»‹ć•ć‚Œć¦ć„ćŸå‹•ē”»ć‚’見悋
  • What's new in Android Support LibraryćŒę„å¹“ć‹ć‚‰What's new in AndroidX恫ćŖ悋ļ¼
  • Androidć‚¢ćƒ—ćƒŖ開ē™ŗć‚’å§‹ć‚ć¦ć‹ć‚‰ä»Šć¾ć§ć€Androidć®ć‚µćƒćƒ¼ćƒˆćƒ©ć‚¤ćƒ–ćƒ©ćƒŖē³»ć®ćƒ‘ćƒƒć‚±ćƒ¼ć‚øćƒ³ć‚°å‘Ø悊悈恏悏恋悉ćŖć‹ć£ćŸć®ć§ć€ä»Šå›žandroidx恫ēµ±äø€ć•ć‚Œć¦åˆ†ć‹ć‚Šć‚„ć™ććŖć‚‹ć®ęœ€é«˜ćć†ļ¼

仄äøŠć§ć™ļ¼

Notes - Android Jetpack sweetening Kotlin development with Android KTX (Google IO 18)

ā€»Notesčؘäŗ‹ć§ćÆ态英čŖžć®ć‚»ćƒƒć‚·ćƒ§ćƒ³å‹•ē”»ć‚„ćƒćƒƒćƒ‰ć‚­ćƒ£ć‚¹ćƒˆć®å†…å®¹ć‚’(雑恫)英čŖžć§ćƒ”ćƒ¢ć«ę›øćę®‹ć™ć“ćØć‚’č”Œć£ć¦ć„ć¾ć™ć€‚ęœ¬čؘäŗ‹ćÆć€ć‚ćć¾ć§å‹•ē”»ć‚’見ćŖćŒć‚‰ć€å‚č€ƒē؋åŗ¦ć«čŖ­ć‚“ć§ć„ćŸć ćć“ćØć‚’ęƒ³å®šć—ć¦ć„ć¾ć™ć€‚Notesčؘäŗ‹ć«ćÆé›‘ćƒ”ćƒ¢ē؋åŗ¦ć®ć‚‚ć®ć ć£ćŸć‚Šć€ę›øćčµ·ć“ć—ć®ć‚ˆć†ćŖć‚‚ć®ć‚‚ć‚ć‚Šć¾ć™ć€‚ć“ć‚Œć‹ć‚‰å®Ÿéš›ć®å‹•ē”»ć‚’見悋際恫ćÆć€ęœ¬čؘäŗ‹ć®å†…å®¹ćŒå°‘ć—ć§ć‚‚ćŠå½¹ć«ē«‹ć¦ć°å¹ø恄恧恙怂ļ¼ˆå†…å®¹ć«ćŠć„ć¦äøå‚™ć€čŖ¤å­—č„±å­—ē­‰ć‚ć‚Šć¾ć—ćŸć‚‰ę°—č»½ć«ć”é€£ēµ”恄恟恠恑悋ćØå¬‰ć—ć„ć§ć™ć€‚)

ęœ¬čؘäŗ‹ćÆ态Android Jetpack sweetening Kotlin development with Android KTX (Google IO 18)恮čؘäŗ‹ć§ć™ć€‚

f:id:shaunkawano:20180514094438p:plain

Last Year at Google I/O

  • We are allowed to extend Android APIs to have new ways of writing Android types.
  • Create more concise version of what we intended to do
  • Intend is to feel semantically equivalent

Why can't we directly offer APIs for it? => Lambda matters

When we pass lambda in Java 8 or in Kotlin by default it has to create anonymous class which eats a method and causes a class loading.

inline

  • Language functionality which allows us to eliminate lambda's allocation
  • By marking a function with inline, the body of the function gets copied inside the caller side, so we have zero overhead.
inline fun ViewGroup.forEachIndexed(action: (Int, View) -> Unit) {
  for (index in 0 until childCount) {
    action(index, getChildAt(index))
  }
}

val userLayout: ViewGroup = findViewById(R.id.users)
userLayout.forEachIndexed ( index, view -> 
  // Do something
)

reified

  • Compiler trick
  • Forces the type information of the generic to be known at the compile time so that it can be made available at runtime
inline fun <reified T> Context: systemService(): = 
  ContextCompat.getSystemService(this, T::class.kava)

val notifications = systemService<NotificationManager>()
var onlyDigits = true
for (c in phoneNumber) {
  if (!c.isDigit()) {
    onlyDigits = false
    break
  }
}

Kotlin has a extension function isDigit() so we can use it with all {}:

val onlyDigits = phoneNumber.all { it.isDigit() }

But Android already has a built-in function:

val onlyDigits = TextUtils.isDigitsOnly(phoneNumber)

We can create a extension function for it:

inline fun CharSequence.isDigitsOnly() = TextUtils.isDigitsOnly(this)

But, is it worth it to extract it as extension? => YES - More natural - With extension, the IDE will show this with auto-complete so you can easily find this API and you can simply press it to use it.

Android KTX

core-ktx -> support-compat -> Android framework
ā†“
core-ktx -> core -> Android framework
fragment-ktx -> fragment
palette-ktx -> palette
collection-ktx -> collection
lifecycle-reactivestreams-ktx -> lifecycle-reactivestreams
sqlite-ktx -> sqlite
navigation-*-ktx -> navigation-*
work-runtime-ktx -> work-runtime

KTX Principles

āœ…

  • Adapt existing functionality and redirect features upstream
    • The body of KTX can be just an alias of current Android APIs
    • The implementation of functions should be trivial
  • Default to inline unless code size or allocation is prohibitive
    • If you write Kotlin by your own making inline as default may not be the best way as it may lead to have more overhead
  • Leverage features unique to Kotlin

āŒ

  • Code golf APIs to be as short as possible
    • KTX is not there to make the code shorter
  • Optimize for a single and/or specific use case

Reference

API reference  |  Android Developers

Android Developers Reference now contains some of the KTX extension functions

  • Extension Function Summary

Building Kotlin-friendly Libraries

Port public API or entire library to Kotlin

  • May not viable for Android Framework or androidx.* libraries
    • Maybe in the future, strongly possible

Ship sibling artifact with Kotlin extensions

KEEP-110

Kotlin Evolution Enhancement Process

@ExtensionFunction / @ExtensionProperty

  • Turn a static method with at least one argument into an extension function or an extension property
class TextUtils {
  @ExtensionFunction // Tell compiler to have an extension function for this method
  static boolean isDigitsOnly(CharSequence str) {
    int len = str.length();
    // ā€¦
  }
}

So in Kotlin side, you can use the extension function made by Kotlin compiler:

val onlyDigits = phoneNumber.isDigitsOnly()

// We no longer need this extension function
// inline fun CharSequence.isDigitsOnly() = TextUtils.isDigitsOnly(this)

// In byte code we get
val onlyDigits = TextUtils.isDigitsOnly(phoneNumber)

@KtName

  • An alternative name for methods, fields, and parameters for use by Kotlin code
  • Advantages
    • You can retain the single source of truth in Java APIs
      • You don't have to add Kotlin code
    • Even in pure Java libraries they can enhance their APIs for Kotlin users

@DefaultValue

Default parameter value

class View {
  void setPadding(
    @KtName("left") @DefaultValue("paddingLeft") int left,
    @KtName("top") @DefaultValue("paddingTop") int top,
    @KtName("right") @DefaultValue("paddingRight") int right,
    @KtName("bottom") @DefaultValue("paddingBottom") int bottom
  ) {
    ā€¦
  }
}
avatarView.setPadding(left = 10, right = 10)

// We no longer need this extension function
// inline fun View.updatePadding { ā€¦ }

// in byte code we get
avatarView.setPadding(left = 10, top = avatarView.paddingTop, right = 10, bottom = avatarView.paddingBottom)

Note

  • Semantics may change
  • Naming may change
  • This proposal may not be accepted and added into Kotlin compiler
    • But some of the prototypes are already in Kotlin compiler

In Bug Tracker we have now new component: Android Public Tracker > App Development > Support Libraries > Android KTX

  • Still accepting PRs, but issues inside GitHub is no longer the single source of truth, Bug Tracker will be.

ę‰€ę„Ÿćƒ»ć¾ćØć‚ćƒ»å€‹äŗŗēš„ć«å°č±”ć«ę®‹ć£ćŸć“ćØćŖ恩

  • 具体ēš„ćŖåŽŸå‰‡ć‚’ć‚‚ćØć«ć©ć†ć„ć†ę‹”å¼µé–¢ę•°ć‚’čæ½åŠ ć™ć‚‹ć‹ć‚’åŸå‘³ć™ć‚‹ć“ćØćÆ态JakećØ恋恗恋恧恍ćŖ恄悈ćŖ恁
  • Dead code elimination(Fragment Transactionć«é–¢ć™ć‚‹ę‹”å¼µé–¢ę•°)ć®ćć ć‚Šć‚’ćæ悋ćØ态Kotlin CompilerćŒć©ć‚Œć ć‘č³¢ć„ć‹ćŒåˆ†ć‹ć‚‹..
  • KEEP-110ćŒć‚‚ć—ęŽ”ęŠžć•ć‚ŒćŸć‚‰ktx恄悉ćŖ恏ćŖ悊恝恆态悂恗恏ćÆć‚ć”ć‚ƒćć”ć‚ƒč»½é‡ć«ćŖć‚Šćć†ć€ć‘ć©ć€ćƒ„ć‚¤ćƒƒć‚æćƒ¼äøŠć§ć©ćŖćŸć‹ćŠć£ć—ć‚ƒć£ć¦ć„ćŸćØ恊悂恆恑恩态Javać®ć‚³ćƒ¼ćƒ‰äøŠć«ć‚‚ć®ć™ć”ć„é‡ć®ć‚¢ćƒŽćƒ†ćƒ¼ć‚·ćƒ§ćƒ³ć¤ććć†ć§ćć‚ŒćÆćć‚Œć§ć¤ć‚‰ćć†ć€‚ć©ć†ćŖć‚‹ć®ć ć‚ć†ć‹ć€ć©ć”ć‚‰ć«ć—ć¦ć‚‚ę„½ć—ćæ
    • ćØćÆ恄恈态Androidćƒ—ćƒ©ćƒƒćƒˆćƒ•ć‚©ćƒ¼ćƒ ć«é©ē”Ø恙悋恓ćØ恫恊恄恦ćÆć‚‚ć®ć™ć”ćę©ęµćŒå¤§ććć†ćŖć®ć§å€‹äŗŗēš„恫ćÆ実ē¾ć—恦恻恗恄ćŖ恂ćØć„ć†å°č±”ć§ć™..!

仄äøŠć§ć™ļ¼

Notes - Android Jetpack how to smartly use Fragments in your UI (Google IO 18)

ā€»Notesčؘäŗ‹ć§ćÆ态英čŖžć®ć‚»ćƒƒć‚·ćƒ§ćƒ³å‹•ē”»ć‚„ćƒćƒƒćƒ‰ć‚­ćƒ£ć‚¹ćƒˆć®å†…å®¹ć‚’(雑恫)英čŖžć§ćƒ”ćƒ¢ć«ę›øćę®‹ć™ć“ćØć‚’č”Œć£ć¦ć„ć¾ć™ć€‚ęœ¬čؘäŗ‹ćÆć€ć‚ćć¾ć§å‹•ē”»ć‚’見ćŖćŒć‚‰ć€å‚č€ƒē؋åŗ¦ć«čŖ­ć‚“ć§ć„ćŸć ćć“ćØć‚’ęƒ³å®šć—ć¦ć„ć¾ć™ć€‚Notesčؘäŗ‹ć«ćÆé›‘ćƒ”ćƒ¢ē؋åŗ¦ć®ć‚‚ć®ć ć£ćŸć‚Šć€ę›øćčµ·ć“ć—ć®ć‚ˆć†ćŖć‚‚ć®ć‚‚ć‚ć‚Šć¾ć™ć€‚ć“ć‚Œć‹ć‚‰å®Ÿéš›ć®å‹•ē”»ć‚’見悋際恫ćÆć€ęœ¬čؘäŗ‹ć®å†…å®¹ćŒå°‘ć—ć§ć‚‚ćŠå½¹ć«ē«‹ć¦ć°å¹ø恄恧恙怂ļ¼ˆå†…å®¹ć«ćŠć„ć¦äøå‚™ć€čŖ¤å­—č„±å­—ē­‰ć‚ć‚Šć¾ć—ćŸć‚‰ć”é€£ēµ”恄恟恠恑悌恰ćØę€ć„ć¾ć™ć€‚)

ęœ¬čؘäŗ‹ćÆ态Android Jetpack how to smartly use Fragments in your UI (Google IO 18)恮čؘäŗ‹ć§ć™ć€‚

f:id:shaunkawano:20180512195201p:plain

The Story so far

Everybody started writing Activity

  • Entry point to your application system
  • main() with lifecycle
  • Creates views
  • Binds view

Enter tables

  • Phone UI + Phone UI = Tablet UI
  • How do I stick two phone UIs together?
  • Enter tables

Fragments of an Activity

  • Design goal of fragments allow splitting up huge Activity classes
  • Requirement: anything an Activity can do, a Fragment can do
    • Lifecycle events
    • Managing view hierarchies
    • Saved instance state
    • Non-configuration instance object passing
    • Back stacks

Can we fix some other APIs?

  • onRetainNonConfigurationInstance
  • Activity#showDialog
  • TabHost/LocalActivityManager

Factoring Activities

  • Recipe for breaking up monoliths:
    • Move loosely related code to separate fragments
    • Repeat

ā†“

Factoring Activities Fragments

  • Recipe for breaking up monoliths:
  • Move loosely related code to separate fragments
  • Repeat

Things Fragments do

  • Lifecycle hooks
  • Back stack management
  • Retain objects across configuration changes
  • (Instance:)Stateful presence in the FragmentManager
  • Manage a View subtree
  • inflatable, reusable components

Architecture Components

Focuses on doing one thing well

LifecycleObservers

  • Strict ordering callback: Last in, first out
  • Created by you, not recreated via reflection
  • NO stateful restoration by the system
  • Isolated, minimal component, easy to test, easy to inject

ViewModel

  • Instances are created by factory you provide
  • LiveData allows easy (lifecycle aware!) reconnection
  • Replace retained instance Fragments
  • Your Activities or Fragments do not have to know where the data comes from; ViewModel is responsible for getting and passing data

Navigation

Fragments are good to be owner of Lifecycle, ViewModel, and views, so Google wants to make it easy for developers to use.

  • Focusing on making "How you move one screen to another screen" better
  • Works well with Fragments
  • Replaces back stack transactions

Why Fragments in 2018?

Android layering

Package Managing

android.widget vs. android.app
  • android.widget - Mechanism

    • Shows state to the user
    • Reports user interaction events
  • android.app - Policy

    • Defines state to bind to widgets
    • Responds to user interaction and issues changes to model

Inflatable Components

ViewGroups that got too smart

  • Composed high-level controls
  • Self-sufficient
  • Lifecycle aware
  • Inflated attributes can become Fragment arguments

=> Cross-cutting UI policy

  • Self sufficient components
  • Ads
  • Independent info cards
  • Parent doesn't need to be involved in data routing from repository

App Screens

Tastes great with Navigation!

Use Activity just as an entry point, and Fragments for showing actual contents

  • Single-Activity apps
  • Common app chrome, decoupled destinations
  • Transitions and animations managed by Navigation, not by hand
  • Can inflate sub-components to help

DialogFragment

Managing another interaction

  • Interaction with another..
    • Floating UI
    • System interaction
  • Leverage instance state restoration
  • Dialogs, bottom sheets
  • Transient UIs you don't want to lose

Options Menus

We still don't have a great answer for this

Merging menus for your Toolbar

  • Fragments support options menus
  • Common use case: setSupportActionBar
    • Useful for fixed common chrome
    • FragmentPagerAdapter
  • Alternative:
    • Directory manage menus as Toolbar View data

Testing Fragments

Diving Fragment Lifecycles

  • FragmentController drives lifecycle
  • Test your larger components in greater isolation
  • Possible, if not the best interface

Loaders

Now decoupled from Fragments!

  • Rebuild on top of LiveData and ViewModel
  • use Loaders from any LifecycleOwner+ViewModelStoreOwner

Where are we going?

  • Separate desired behavior from incidental behavior
  • Reimplementing existing APIs on top of new primitives
    • e.g. LoaderManager on LiveData
  • Make primitive signals and Activity callbacks available to any interested component
  • If you don't like Fragments, write your own!
    • No more magic
    • Use the same composable hooks
  • Fragments + your components working together
  • android.app.Fragment is now official deprecated

ę‰€ę„Ÿćƒ»ć¾ćØć‚ćƒ»å€‹äŗŗēš„ć«å°č±”ć«ę®‹ć£ćŸć“ćØćŖ恩

  • 1恤恮ć‚Øćƒ³ćƒˆćƒŖćƒ¼ćƒć‚¤ćƒ³ćƒˆć«åÆ¾ć—ć¦1恤恮Activity悒态ē”»é¢ć«ć‚³ćƒ³ćƒ†ćƒ³ćƒ„ć‚’č”Øē¤ŗ恙悋恫ćÆFragmentć‚’åˆ©ē”Ø恗恦恄恓恆
    • ćć®éš›ć®Fragment恮Back Stackē®”ē†ć‚„ē”»é¢é·ē§»ę™‚ć®ć‚¢ćƒ‹ćƒ”ćƒ¼ć‚·ćƒ§ćƒ³ćŖ恩ćÆå…Ø恦Navigationć«ä»»ć›ć‚ˆć†ćØć„ć†ęµć‚Œ
  • ä½æć„ć¾ć‚ć—åÆčƒ½ćŖć‚³ćƒ³ćƒćƒ¼ćƒćƒ³ćƒˆćØć—ć¦ć€ć‚³ćƒ³ćƒ†ćƒ³ćƒ„ć‚’č”Øē¤ŗć™ć‚‹å½¹å‰²ć‚’Fragmentć«å®Œå…Ø恫任恛悋恓ćØć§ć€å†åˆ©ē”ØåÆčƒ½ć‹ć¤"恤悉ćæ"恮ćŖć„ć‚¢ćƒ—ćƒŖ開ē™ŗćŒć§ćć‚‹ć‚ˆć†ć«ćŖ悋 => ćć®ćŸć‚ć®AACć€ćć—ć¦ä»Šå›žē‰¹ć«Fragmentć®ćŸć‚ć«ē”Øꄏ恕悌恟Navigation
  • Navigation悒ä½æ恆恓ćØ恧Fragment恮恤悉ćæ态Animationå‘Øć‚Šćƒœć‚¤ćƒ©ćƒ¼ćƒ—ćƒ¬ćƒ¼ćƒˆć‚³ćƒ¼ćƒ‰ć‚’é–‹ē™ŗč€…ćŒę°—ć«ć™ć‚‹åæ…č¦ćŒćŖ恏ćŖ悋
  • ęœŖ恠恫"恤悉ćæ"ć®ć‚ć‚‹ę—¢å­˜ć®ćƒ—ćƒ©ćƒƒćƒˆćƒ•ć‚©ćƒ¼ćƒ APIć‚„ć‚µćƒćƒ¼ćƒˆćƒ©ć‚¤ćƒ–ćƒ©ćƒŖ恮APIćÆć‚ć‚‹ćŒć€ä»Šå¾ŒćÆAACćŖ恩恮ꖰ恗恄API恮äøŠć«ä¹—ć›ć‚‹å½¢ć§ä½œć‚Šē›“恙悈恆ćŖä¾‹ć‚‚å‡ŗć¦ćć‚‹(LoaderManager恌LiveDatać«ä¾å­˜ć™ć‚‹å½¢ć§ä½œć‚ŠćŖćŠć•ć‚ŒćŸć‚ˆć†ć«)
  • 今後ćÆAAC悒ä½æć£ćŸć‚¢ćƒ—ćƒŖ開ē™ŗćÆć€ć‚ˆć‚Šå®‰å…Øć‹ć¤ć‚ˆć‚Šę—©ćć‚¢ćƒ—ćƒŖ開ē™ŗ悒恙悋äøŠć§åæ…é ˆć«ćŖ悊恝恆

仄äøŠć§ć™ļ¼

Notes - Modern Android development: Android Jetpack, Kotlin, and more (Google I/O 2018)

ā€»Notesčؘäŗ‹ć§ćÆ态英čŖžć®ć‚»ćƒƒć‚·ćƒ§ćƒ³å‹•ē”»ć‚„ćƒćƒƒćƒ‰ć‚­ćƒ£ć‚¹ćƒˆć®å†…å®¹ć‚’(雑恫)英čŖžć§ćƒ”ćƒ¢ć«ę›øćę®‹ć™ć“ćØć‚’č”Œć£ć¦ć„ć¾ć™ć€‚ęœ¬čؘäŗ‹ćÆć€ć‚ćć¾ć§å‹•ē”»ć‚’見ćŖćŒć‚‰ć€å‚č€ƒē؋åŗ¦ć«čŖ­ć‚“ć§ć„ćŸć ćć“ćØć‚’ęƒ³å®šć—ć¦ć„ć¾ć™ć€‚Notesčؘäŗ‹ć«ćÆé›‘ćƒ”ćƒ¢ē؋åŗ¦ć®ć‚‚ć®ć ć£ćŸć‚Šć€ę›øćčµ·ć“ć—ć®ć‚ˆć†ćŖć‚‚ć®ć‚‚ć‚ć‚Šć¾ć™ć€‚ć“ć‚Œć‹ć‚‰å®Ÿéš›ć®å‹•ē”»ć‚’見悋際恫ćÆć€ęœ¬čؘäŗ‹ć®å†…å®¹ćŒå°‘ć—ć§ć‚‚ćŠå½¹ć«ē«‹ć¦ć°å¹ø恄恧恙怂ļ¼ˆå†…å®¹ć«ćŠć„ć¦äøå‚™ć€čŖ¤å­—č„±å­—ē­‰ć‚ć‚Šć¾ć—ćŸć‚‰ę°—č»½ć«ć”é€£ēµ”恄恟恠恑悋ćØå¬‰ć—ć„ć§ć™ļ¼m(__)m)

ęœ¬čؘäŗ‹ćÆ态Modern Android development: Android Jetpack, Kotlin, and more (Google I/O 2018)恮Notesčؘäŗ‹ć§ć™ć€‚

f:id:shaunkawano:20181216214559p:plain

Android History

  • 2008 - Android 1.0
  • 2013 - Android Studio
  • 2014 - ART, RecyclerView
  • 2017 - ConstraintLayout, Kotlin, AAC, Studio Profilers
  • 2018 - ktx, Paging

Tools

  • Layout Inspector
  • Trace View -> Systrace
  • New Profiler Tab in Android Studio
  • Memory Tracking
  • Layout Design
    • ConstraintLayout

Runtime in Language

Dalvik

  • Optimized for Space
  • JIT optimizations not as powerful
  • Slow Allocation/collection
  • Heap fragmentation

So

  • Avoid allocations(e.g. Don't use Enums!)
  • Primitive types are cool

ART

  • Optimized for performance
  • JIT + AOT
  • Faster allocation/collection
  • Heap defragmentation
  • Large object heap

So

  • Allocate as necessary(Yes, even enums)
  • Use appropriate types

But

  • Phones are still constrained
  • Buttery is important

Java

  • Started with Java 1.5
  • Extremely popular
  • Available great tools
  • Slow adoption of newer versions

Kotlin

  • Official support in 2017
  • Close collaboration with Jetbrains
  • Many great features that make code more enjoyable to write & read
  • Android project can contain both Kotlin & Java
  • Lint checks in Android Studio
  • Java -> Kotlin conversion
  • Android Kotlin Extension
  • Kotlin Style Guide
  • Kotlin Interop Guide

Benefits of Kotlin

  • Extensions
  • Inline functions
  • Operators
  • De-structuring assignments
  • Data classes
  • Lambdas

Now, new Java APIs in the platform starting with Android P will follow the code convention of Kotlin that when there is a SAM interface as parameter, it goes at the end of the list of parameters.

APIs

  • AbsoluteLayout => Deprecated
  • LinearLayout => Okay for simple cases
  • FrameLayout => Okay
  • GridLayout => Don't use
  • RelativeLayout => Don't use
  • ConstraintLayout => Use it. 2.0 Soon!
  • AdapterViews

Fragments

  • Complicated
  • Core platform bugs+fixes => Core Platform API @deprecated
  • Use Support Library Fragments
    • Improvements ongoing, plans for more
    • New Navigation component simplifies fragment transactions

Activities

  • Android apps consist of many activities
  • Navigating launches an activity
  • Use single activities when possible
    • One per entry point
  • Richer, more continuous use experience
  • Fragments are not necessary, but can help
    • Navigation component, too

Architecture

  • No recommendation for architecture before
    • Handling Android Lifecycle

Lifecycle

  • AAC: Lifecyle
    • Fragment implements LifecycleOwner
    • AppCompatActivity implements LifecycleOwner
    • Activity and Lifecycle-Dependent-Thing now gets seprated

Views and Data

  • Activity had too much stuff
    • Views
    • Data for Views
    • Lifecycle tracking
    • Data change tracking

Live Data and ViewModel

  • Activity now only contains Views and reference for ViewModel
  • Activity observes LiveData

Data

  • Do it your own! => Room

Room

  • Local data persistence via SQLite
  • Compile-time validation
  • LiveData integration
Idea from Repository Pattern
Activity/Fragment
ā†“
ViewModel(contains LiveData)
ā†“
Repository
-> Model(Room) -> SQLite
-> Remote Data(Retrofit) -> WebService

Data Paging

  • Paging Library 1.0
    • Works with RecyclerView
    • Fine-grained item changes, bindings
    • Uses background threads
    • Flexible data fetching options
    • Integration with Room
    • Boring name

Graphics

  • OpenGL ES 1.0 => OpenGL ES 3.1/3.2, Vulkan
  • Software rendering => Hardware accelerated rendering
  • Nine patches => Vector Drawables
  • TextureView vs SurfaceView => Use SurfaceView, not TextureView
  • Managing bitmaps by hand => Recommended Libraries: Glide, Picasso, Lottie

Final Thoughts

  • Profile your code => Profile your code
  • Avoid work when possible
  • Minimize memory consumption
  • Devices are still resource-constrained
  • Battery life is critical
  • Bandwidth is precious
  • User experience matters

ę‰€ę„Ÿć€å€‹äŗŗēš„恫ē‰¹ć«å°č±”ć«ę®‹ć£ćŸć“ćØćŖ恩

  • åÆčƒ½ć§ć‚ć‚Œć°1 Activityć«ę„µåŠ›ć—ć‚ˆć†ć€ćØć„ć†ć®ć‚’å…¬å¼ćØć—ć¦ä»Šå›žę–¹é‡ć‚’ę˜ŽčØ€ć—ć¦ć„ć‚‹ć®ćÆå¤§ćć„ćŖćØę„Ÿć˜ć¾ć—ćŸ
  • Java APIć®ä½œć‚Šć‚‚Kotlinć‚’ę„č­˜ć—ćŸå½¢ć«ć™ć‚‹ć€ćØ恄恆恮ćÆęœ€é«˜ćć†ć§ć™ć­ļ¼
  • Navigation Component态AAC Lifecycleć«ć‚ˆć£ć¦Fragmentć‚‚ę‰±ć„ć‚„ć™ććŖć£ćŸć€ćØ恄恆悈恆ćŖ悏悊ćØFragment恌č‚Æå®šć•ć‚Œć‚‹å†…å®¹ć ć£ćŸć®ć‹ćŖćØ
  • ć‚µćƒ¼ćƒ‰ćƒ¼ćƒ‘ćƒ¼ćƒ†ć‚£ćƒ¼č£½ć®ćƒ©ć‚¤ćƒ–ćƒ©ćƒŖ悂č‰Æ恄悂恮ćÆä½æć£ć¦ć„ć“ć†(Retrofit, Glide, PicassoćŖć©ćŒęœ¬å‹•ē”»ć«ćÆē™»å “ć—ć¦ć„ć¾ć™)ćØ恄恆å§æå‹¢ć‚‚ć€å…Ø恦ēµęžœēš„恫ćÆč‰Æ恄UXć‚’ęä¾›ć—ć‚ˆć†ćØ恄恆ćØć“ć‚ć«ć¤ćŖćŒć£ć¦ć„ć¦ć€čŖ¬å¾—力ćØ恄恆恋ē“å¾—ę„Ÿć‚‚ć‚ć‚Šå®Ÿéš›ćć‚Œć«ć‚ˆć£ć¦é–‹ē™ŗ者悂ꂩćæ少ćŖ恏č‰Æć„ć‚¢ćƒ—ćƒŖć‚’ä½œć‚Œć‚‹ć€ćØ恄恆Win-WinćŖå½¢ćŒć‚ć‚‹ćŖ恁ćØę„Ÿć˜ć¾ć—ćŸ

仄äøŠć§ć™ļ¼

2018幓4꜈悒ęŒÆ悊čæ”ć‚‹

2018å¹“ć‚‚ē“„35%恌ēµ‚ć‚ć£ćŸć‚ˆć†ć§ć™ć€‚( ļ¾Ÿāˆ€ļ¾Ÿ)ļ½„āˆµ. ļ½øļ¾žļ¾Šļ½Æ!!(ę“’č½ć«ćŖ悉ćŖ恄) ā€»5/3(ęœØ)Ꙃē‚¹

å…ˆęœˆć«å¼•ćē¶šćć€ęŒÆ悊čæ”ć‚Šć¾ć™ć€‚

4ęœˆć‚„ć£ćŸć“ćØ

Google I/O 2018 Pre-Partyć«å‚åŠ ć—ćŸ

ę˜Ø幓åŗ¦å‚åŠ ć—ćŸēµŒéØ“ć‹ć‚‰ēµžć‚Šå‡ŗ恗恟Tips悒ē“¹ä»‹ć—ć¾ć—ćŸć€‚å†…å®¹ćÆäø‹čØ˜ć§ć™

  • Office Hourć‚’ęœ‰åŠ¹ę“»ē”Ø恗恦Googler恫č³Ŗå•ć—ćŸć‚Šćƒ‹ćƒ¼ć‚ŗć‚’ä¼ćˆćŸć‚Šć—ć‚ˆć†
  • Sandboxć§ć®å±•ē¤ŗćŖć©ć‚’č¦‹ć‚ˆć†
  • ć€ŒćŠåœŸē”£ć€ćŒć‚ć‚‹ć‹ć‚‚ć—ć‚ŒćŖć„ć®ć§č·ē‰©ć®ē©ŗćć‚¹ćƒšćƒ¼ć‚¹ć«ćÆä½™č£•ć‚’ęŒćØ恆
  • ćƒ‘ćƒ¼ć‚«ćƒ¼ćŖć©ä¼šå “ć§ć®ćŠåœŸē”£ćÆę—©ć‚ć«č²·ćŠć†

Tips for Google I/O 2018 // Speaker Deck

去幓TwitteräøŠć§Office Hour恫Googler恫č³Ŗå•ć™ć‚‹å†…å®¹ć‚’ćć ć•ć„ć€ćØ恄恆ę—Øć®ćƒ„ć‚¤ćƒ¼ćƒˆć‚’ć—ćŸć‚‰ä¼šē¤¾ć®å¾Œč¼©ć‚„åŒęœŸć‹ć‚‰ćƒ”ćƒ³ć‚·ćƒ§ćƒ³ć„ćŸć ć‘ć¦å°‘ć—ć ć‘ć§ć‚‚å½¹ć«ē«‹ć¦ćŸć‹ćŖćØę„Ÿć˜ćŸć®ć§ä»Šå¹“ć‚‚åŒć˜ć‚ˆć†ć«č³Ŗå•ć‚’é›†ć‚ć¦ć„ć¾ć™ć€‚ä»Šć®ćØć“ć‚č©¦ć—ć«Google SpreadSheet悒ä½æć£ć¦ć„ć¾ć™ć€‚ć©ćŖćŸć§ć‚‚ćŠę°—č»½ć«čØ˜č¼‰ć—ć¦ć„ćŸć ć„ć¦ę§‹ć„ć¾ć›ć‚“ć€‚č³Ŗ問ćÆ恂悋恑恩恓恓恫ę›øćć®ćÆę°—ćŒå¼•ć‘ć‚‹ć€ć“ć‚“ćŖč³Ŗå•ć—ć¦ć„ć„ć®ć‹ćŖļ¼ŸćØę‚©ć‚“ć§ć„ć‚‹ę–¹ćÆDM恧悂恏恠恕悌恰ćØę€ć„ć¾ć™ć€‚

docs.google.com

åˆęŠ€č”“ę›øå…ø

ꊀ蔓ę›øå…ø恫恦态Coupling Union Androidę„›å„½ä¼šćØć„ć†ć‚µćƒ¼ć‚Æćƒ«åć§ęœ¬ć‚’å‡ŗć—ć¾ć—ćŸć€‚Coupling Union恫恤恄恦ćÆäø‹čØ˜ć‚’å¾”č¦§ćć ć•ć„ć€‚

CyberAgent COUPLING UNION - CAグループが運営するマッチングサービスの情報メディア

Google Tasks API悄Account Hold, Okio恫恤恄恦3äŗŗć§ćć‚Œćžć‚ŒåŸ·ē­†ć—ć¾ć—ćŸć€‚

åˆć‚ć¦ć®ęŠ€č”“ę›øå…øć§åēœć°ć‹ć‚Šć§ć—ćŸćŒć€ęŽ§ćˆć‚ć®éƒØę•°ć ć£ćŸćØćÆć„ćˆå®Œå£²ć§ćć¦å¬‰ć—ć‹ć£ćŸć®ćØć€ć‚‚ć£ćØę—©ćć€ć‹ć¤ćć‚Œć„ć§åˆ†ć‹ć‚Šć‚„ć™ć„ę–‡ē« ć‚’ę›øć‘ć‚‹ć‚ˆć†ć«ćŖ悊恟恄态ćØę”¹ć‚ć¦ę€ć„ć¾ć—ćŸć€‚č²“é‡ćŖēµŒéØ“ć§ć—ćŸļ¼ä»•äŗ‹ć®ę™‚ęœŸćŖ恩ćÆć‚‚ć”ć‚ć‚“č¦‹ę„µć‚ć‚‹åæ…要ćÆć‚ć‚Šćć†ć§ć™ćŒć€ćœć²ć¾ćŸå‚åŠ ć—ćŸć„ć§ć™ć€‚å®Œå£²å¾Œć®ę—„ęœ¬é…’ćÆęœ¬å½“ć«ęœ€é«˜ć ć£ćŸć€‚ļ¼ˆé£²ćæć™ćŽć¾ć—ćŸć€‚ļ¼‰

ćć®ä»–

  • ꖰ恗恄惗惭ć‚ø悧ć‚Æ惈

ä»Šć€ę–°ć—ć„ćƒ—ćƒ­ć‚ø悧ć‚Æćƒˆć§ę•°å¹“é‹ē”Øć•ć‚Œć¦ć„ć‚‹Androidć‚¢ćƒ—ćƒŖć‚±ćƒ¼ć‚·ćƒ§ćƒ³ć®é–‹ē™ŗć‚’ę‹…å½“ć—ć¦ć„ć¾ć™ć€‚č‰²ć€…ć‚‚ć£ćØč‰Æćć—ć¦ć„ććŸć„ć“ćØćŒć‚ć‚‹ć®ć§ć€é ‘å¼µć‚‹ćžļ¼

  • Ready Player Oneć‚’č¦³ćŸ

4.6 / 5!面ē™½ć‹ć£ćŸć§ć™ć€‚2Dć§č¦³ćŸć®ć§ć€3D恧悂恆äø€åŗ¦č¦³ćŸć„怂

www.youtube.com

仄äøŠć«ćŖć‚Šć¾ć™ć€‚4꜈悂恊ē–²ć‚Œę§˜ć§ć—ćŸļ¼