
- TOP
- ã¿ã°äžèЧ
- Android
Android
ã€ãã³ã
ãã¬ãžã³
æè¡ããã°
ã¯ããã« ããã«ã¡ã¯ãWEARéçºéšAndroidãããã¯ã®éæšã§ããæ®æ®µã¯ãã¡ãã·ã§ã³ã³ãŒãã£ããŒãã¢ããªWEARã®Androidã¢ããªéçºãæ
åœããŠããŸãã ç§ãã¡WEAR AndroidããŒã ã§ã¯ãèšèšãå®è£
ã®èŠçŽããã¹ããšããŠå®è¡ããéåãCIã§æ¢ããèªäœã®ãã¹ãã¢ãžã¥ãŒã«ãarchtestããéçšããŠããŸããæ¬èšäºã§ã¯ãèŠçŽãã§ããåããã®éåãæ°çŸä»¶æ±ããã³ãŒãããŒã¹ã«ããã®ä»çµã¿ãåŸããå
¥ããæ¹æ³ã玹ä»ããŸããäžå¿ãšãªãã®ã¯ãæ¢åã®éåãã©ãæ±ã£ãããšãKotlinã®ãœãŒã¹ãã©ãæ€æ»ããŠãããã®2ç¹ã§ããå°å
¥åŸã¯ãã«ãŒã«ã§æ€åºã§ããæ°ããéåãå
¥ããšãã«CIã§å¿
ãæ°ã¥ããããã«ãªããäžåºŠçŽããç®æã«æ°ã¥ããªããŸãŸéåãæ»ãããšããªããªããŸããã ç®æ¬¡ ã¯ããã« ç®æ¬¡ èæ¯ã»èª²é¡ èŠçŽãå®ãããŠãããã¯ã¬ãã¥ã¢ãŒã«äŸå æ¢åã®ã³ãŒãã«ã¯386ä»¶ã®éå æ±ããæ¡ä»¶ archtestã®å
šäœå æ¢åã®éåã¯åçµããæ°ããéåã ããæ¢ãã baselineã«æ¢åã®éåãæžãåºã çŽããéåãbaselineã«æ®ã£ãŠããŠã倱æã«ãã PSIã§Kotlinã®ãœãŒã¹ãèªããã¹ããèªäœãã æ¢åã®ããŒã«ãèŠéã£ãçç± PSIã§ãœãŒã¹ãæ§ææšã«ãã å解決ã¯ããªã æ§ææšã¯ä¿æããã軜ãã¢ãã«ã«èŠçŽãã ã«ãŒã«ã®å®è£
ãšãã¹ã ã«ãŒã«ã®äŸ ã³ãŒãäŸã®ãã¹ããã«ãŒã«ã®ä»æ§æžã«ãã éåã¡ãã»ãŒãžã ãã§çŽããããã«ãã éçš CIã§ãŠããããã¹ãããå
ã«å®è¡ãã ã«ãŒã«ã远å ãã ã€ãŸãããšéç ã«ãŒã«ãèªåèªèº«ãéåãšããŠåçµããŠãã Kotlinã®æŽæ°ã«ã¯ã³ã³ãã€ã©APIãžã®è¿œåŸãèŠã åæšè«ã§importãæ¶ãããšæ€åºã§ããªã baselineã®ããŒã®ç²åºŠã§æ€åºç¯å²ãå€ãã å°å
¥ããŠã¿ãŠ ãŸãšã æåŸã« èæ¯ã»èª²é¡ èŠçŽãå®ãããŠãããã¯ã¬ãã¥ã¢ãŒã«äŸå WEAR Androidã§ã¯ãèšèšãå®è£
ã®èŠçŽãAGENTS.mdãªã©ã®ææžã«ãŸãšããŠããŸããUiStateã®çµã¿ç«ãŠæ¹ãAPIã¯ã©ã€ã¢ã³ãã®åŒã³åºãçµè·¯ããã¹ãã«äœ¿ãã©ã€ãã©ãªãªã©ã§ããã©ããWEAR Androidåºæã®èŠçŽã§ãå€ãAPIããã®ç§»è¡ã®ãããªæ¹éãæ±ºãŸããã³ã«å¢ããŠãããŸããèŠçŽãå®ãããŠãããã¯ãã³ãŒãã¬ãã¥ãŒã§ç¢ºããããããããŸããã§ããã AGENTS.mdãªã©ã¯AIãšãŒãžã§ã³ãã«ã³ãŒããæžãããéã®æéã§ãããå¿
ãå®ããããšã¯éããŸãããäŸãã°ãå€ãAPIã®ã¢ãã«ã¯ã©ã¹ã¯æ°ãã䜿ããªãããšããèŠçŽããããŸããããããæ¢åã®ã³ãŒããåèã«ããŠæžããšã人ãšAIãšãŒãžã§ã³ãã®ã©ã¡ãããå€ãã¢ãã«ã¯ã©ã¹ããã®ãŸãŸimportããŠããŸããŸããå®éã«ãarchtestã®å°å
¥åŸã«ããæ°ããæžããã³ãŒããå€ãã¢ãã«ã¯ã©ã¹ãimportããCIã§æ¢ãŸã£ãããšããããŸãããAIãšãŒãžã§ã³ãã®æžãã³ãŒããå¢ããã»ã©ãã¬ãã¥ãŒã ãã§ç¢ºãããã®ã¯é£ãããªããŸãã èŠçŽããã¹ãã«ããã°ããã®ç¢ºèªã¯CIã«ä»»ããããŸããããããæ¢åã®ã³ãŒããé害ã«ãªããŸããã æ¢åã®ã³ãŒãã«ã¯386ä»¶ã®éå WEAR Androidã¯é·ãéçºãç¶ããŠããã¢ããªã§ãèŠçŽã®å€ãã¯åŸããæ±ºãããã®ã§ãããã®ãããæ¢åã®ã³ãŒãã«ã¯éåãæ®ã£ãŠããŸããCIã§åããå§ãããšãã13ã®èŠçŽãžã®éåã¯386ä»¶ãããŸãããäŸãã°ãå€ãAPIããã®ã¢ãã«ãRxJavaã®importã187ä»¶ãUiStateãçµã¿ç«ãŠã颿°ã«å€ãåœåã䜿ã£ãŠããç®æã73ä»¶ã§ãã éåã1ä»¶ã§ãèŠã€ããã倱æãããã§ãã¯ãå
¥ãããšãå°å
¥ããæç¹ã§ãã¹ãŠã®PRã®CIãéããªããªããŸããããšãã£ãŠã386ä»¶ãçŽããŠããå°å
¥ããã®ãçŸå®çã§ã¯ãããŸãããå€ãAPIããã®ç§»è¡ã®ããã«ãçŽãã®ã«èšèšã®å€æã倧ããªäœæ¥ãå¿
èŠãªéåãå«ãŸããŠããããã§ããçŽããŠããéã«ããæ°ããéåã¯å
¥ã£ãŠããŸãã æ±ããæ¡ä»¶ ããã§ã次ã®3ã€ãæºããä»çµã¿ãäœãããšã«ããŸããã æ¢åã®éåã¯ãã£ããèš±ããæ°ããéåã ããæ¢ãã éåãçŽããããåãç®æã«éåãæ»ããªãããã«ãã èŠçŽãå¢ãããã³ã«ããããžã§ã¯ãåºæã®ã«ãŒã«ãæè»œã«è¿œå ã§ãã archtestã®å
šäœå archtestã¯ãJUnitã®ãã¹ãã ããæã€Gradleã¢ãžã¥ãŒã«ã§ããç¬èªã®Gradleãã©ã°ã€ã³ãã¿ã¹ã¯ã¯äœãããéåžžã®ãã¹ããšã㊠./gradlew :archtest:test ã§å®è¡ããŸãã archtest/ âââ baselines/ # ã«ãŒã«ããšã®æ¢åã®éåã®äžèЧïŒbaselineïŒ âââ src/test/kotlin/ # ããã±ãŒãžã®ãã£ã¬ã¯ããªã¯çç¥ âââ infra/ # ãœãŒã¹ã®èªã¿èŸŒã¿ãbaselineãšã®ç
§åãªã©ãå
šã«ãŒã«ã§å
±æããéšå âââ rules/ # 1ã«ãŒã«1ãã¡ã€ã«ïŒã«ãŒã«æ¬äœãšãã®ãã¹ãïŒ ãã¹ãã¯æ¬¡ã®é ã«åããŸãã ãªããžããªå
ã®Kotlinãã¡ã€ã«ãéãã ãã¡ã€ã«ããšã«æ§ææšãäœããã«ãŒã«ã®å€å®ã«å¿
èŠãªæ
å ±ã ããæãåºã åã«ãŒã«ããæãåºããæ
å ±ããéåã®äžèЧãäœãïŒã«ãŒã«ã«ãã£ãŠã¯Markdownãªã©ã®ãã¡ã€ã«ãèªãïŒ éåã®äžèЧãbaselineãšç
§åãããã¹ãã®æåŠã決ãã ã«ãŒã«ããšã«æžãã®ã¯3ã ãã§ã1ã2ã4ã¯å
šã«ãŒã«ã§å
±éã®åŠçã§ãã 以éã§ã¯ããŸã4ã®ç
§åã説æããŸããæ¢åã®éåãèš±ãã€ã€æ°ããéåãæ¢ããçŽããç®æã«éåãæ»ãããªãã®ã¯ããã®ç
§åã®åœ¹å²ã§ãããã®ããšã§ãã«ãŒã«ãæè»œã«è¿œå ããããã®1ã3ã®å®è£
ã玹ä»ããŸãã æ¢åã®éåã¯åçµããæ°ããéåã ããæ¢ãã baselineã«æ¢åã®éåãæžãåºã archtestã§ã¯ãå°å
¥æç¹ã§èŠã€ãã£ãéåãã«ãŒã«ããšã®ããã¹ããã¡ã€ã«ã«æžãåºããããã«èŒã£ãŠããéåã ããèš±ããŸãããã®ãã¡ã€ã«ãbaselineãšåŒãã§ããŸãã # R005-hilt-viewmodel ã®æ¢åéåãªã¹ã(archtestã管ç)ã # ãã®ãªã¹ãã¯æžããäžæ¹ãšããæ°èŠã®éåã远å ããŠã¯ãªããªãã # åçæ: ./gradlew :archtest:test -PupdateBaseline=true feature/foo/src/main/kotlin/com/example/FooViewModel.kt|FooViewModel ... 1è¡ãéå1ä»¶ã§ã çžå¯Ÿãã¹|èå¥å ã®åœ¢åŒã§ããèå¥åã«ã¯ã¯ã©ã¹åãªã©ãéåãã宣èšãæãååã䜿ããŸããè¡çªå·ã¯å«ããŠããŸãããéåãšé¢ä¿ã®ãªãç·šéã§è¡ããããã ãã§ãæ¢åã®éåãæ°ããéåãšããŠæ±ãããŠããŸãããã§ãã baselineã¯ãæ¢åã®éçè§£æããŒã«ã§ããAndroid Lintãdetektã«ãããèãæ¹ã§ããããããçŽããéåãbaselineã«èŒã£ããŸãŸã§ããdetektã¯äœãå ±åãããAndroid Lintãæ
å ±ã¬ãã«ã®éç¥ã«ãšã©ãŸããããã©ã¡ããããã©ã«ãã§ã¯å€±æããŸãããarchtestã§å€ããã®ã¯ãã®ç¹ã§ãã çŽããéåãbaselineã«æ®ã£ãŠããŠã倱æã«ãã archtestã®ãã¹ãã¯ãçŸåšã®ã³ãŒãã§èŠã€ãã£ãéåãšbaselineãç
§åããæ¬¡ã®2ã€ã®ã©ã¡ããã«åœãŠã¯ãŸããšå€±æããŸãã ç¶æ³ çµæ baselineã«èŒã£ãŠããªãéåããã 倱æïŒæ°ããéåãæ¢ããïŒ çŽããéåãbaselineã«æ®ã£ãŠãã 倱æïŒbaselineããè¡ãæ¶ãããæ±ããïŒ ã©ã¡ãã§ããªã æå éåãçŽããŠãbaselineã®è¡ãæ®ã£ãŠãããšããã®ç®æã«ã¯åã³éåãæžããŠããŸããŸãã2ã€ç®ã®æ¡ä»¶ã§è¡ã®åé€ã匷å¶ããã°ãäžåºŠçŽããç®æã«éåã¯æ»ããŸãããã«ãŒã«ããšã®baselineã®ä»¶æ°ã¯ãã¬ãã¥ãŒã§åæããŠè¡ãè¶³ããªãéããæžãæ¹åã«ããåããªããªããŸãã ã©ã¡ãã®çµè·¯ã§ãbaselineã¯å¢ãããå³ã®çµè·¯ã§ã¯æžããŸãã ç
§åã®åŠçã¯æ¬¡ã®ãšããã§ãã val baselineKeys = readBaseline(file) val currentKeys = violations.map { it.baselineKey }.toSet() val newViolations = violations.filter { it.baselineKey !in baselineKeys } val staleKeys = baselineKeys - currentKeys if (newViolations.isEmpty() && staleKeys.isEmpty()) return newViolations ãæ°ããéåã staleKeys ãçŽããã®ã«æ®ã£ãŠããè¡ã§ããåŸè
ã§å€±æãããšãã¯ã次ã®ããã«è¡ã®åé€ãä¿ããŸãã è§£æ¶æžã¿ã®éåãbaselineã«æ®ã£ãŠããŸã (1ä»¶): - feature/foo/src/main/kotlin/com/example/FooViewModel.kt|FooViewModel éåã®è§£æ¶ããããšãããããŸããarchtest/baselines/R005-hilt-viewmodel.txt ããäžèšã®è¡ãåé€ãããã ./gradlew :archtest:test -PupdateBaseline=true ã§å
šbaselineãåçæããŠãã ããã æ°ããéåãbaselineã«è¶³ããŠéããã®ã¯ãPRã®ã¬ãã¥ãŒã§åæããå Žåã ãã§ããbaselineãåçæãããšãã¯å·®åãå¿
ã確èªããè¡ãå¢ããŠããªãããšã確ãããŸãã éåããŸã 1ä»¶ããªãèŠçŽã¯ãbaselineã空ã®ã«ãŒã«ãšããŠè¿œå ã§ããŸããäŸãã°ãWEAR Androidã§ã¯ãAPIã¯ã©ã€ã¢ã³ããOpenAPIã®å®çŸ©ããOpenAPI Generatorã§çæããŠããŸãããã®çæããAPIã¯ã©ã€ã¢ã³ããinfrastructureã¢ãžã¥ãŒã«ã®å€ããimportãããªãã«ãŒã«ã¯ãå°å
¥æç¹ã§éåã0ä»¶ã§ãããããããã«ãŒã«ã¯æåã®1ä»¶ããæ¢ããããã®ã§ãè¯ãç¶æ
ã«æ°ã¥ããæç¹ã§è¿œå ããŠããŸãã PSIã§Kotlinã®ãœãŒã¹ãèªããã¹ããèªäœãã æ¢åã®ããŒã«ãèŠéã£ãçç± æåã«æ€èšããã®ã¯ãKotlinåãã®ã¢ãŒããã¯ãã£ãã¹ãã©ã€ãã©ãªã§ããKonsistã§ãããããã2026幎8æã®æç¹ã§ãKonsistã®ãªãªãŒã¹ã¯1幎8ãæã»ã©æ¢ãŸã£ãŠãããKotlin 2.4ç³»ã®WEAR Androidã§ã¯å°æ¥ã³ãŒããæ£ããèªããªããªããããããããŸããã 1 次ã«ãéçè§£æããŒã«ã®detektã®å°å
¥ãæ€èšããŸãããããããã«ãŒã«ãWEAR Androidã«åãããŠèª¿æŽãç¶ããã³ã¹ããšãdetekt 1.xãã2.0ãžã®ç§»è¡ã®ã³ã¹ããèŠåããªããšå€æããèŠéããŸããã å°å
¥æã«ã¯æ€èšããŠããŸããã§ããããã AIãšãŒãžã§ã³ãåãã³ãŒãã£ã³ã°ã«ãŒã«ãArchUnitã§æ©æ¢°çã«æ€èšŒããéçš ãã§ç޹ä»ãããArchUnitããèŠçŽããã¹ãã«ããããã®ã©ã€ãã©ãªã§ããArchUnitã¯ã³ã³ãã€ã«åŸã®ãã€ãã³ãŒããæ€æ»ãããããå®è¡ã®åã«ãã«ããå¿
èŠã§ãã archtestã®ã«ãŒã«ã«ã¯ãimportæããMarkdownã®ãããªãœãŒã¹ä»¥å€ã®ãã¡ã€ã«ã䜿ããã®ããããŸããäŸãã°ãç»é¢ã®äžèЧããŸãšããMarkdownã®èšèŒããå®éã®ã³ãŒãã«ããç»é¢ãšäžèŽããŠãããã確ãããã«ãŒã«ã§ããOpenAPI Generatorãåºåãããã¡ã€ã«äžèЧãšãçæçšã®ãã£ã¬ã¯ããªã«ãããã¡ã€ã«ãçªãåãããææžãã®ãã¡ã€ã«ãçŽã蟌ãã§ããªããã確ãããã«ãŒã«ããããŸããMarkdownãªã©ã®ãã¡ã€ã«ã¯ãã¹ãã³ãŒãããèªã¿ããœãŒã¹ã®è§£æçµæãšçªãåãããŠããŸãããœãŒã¹ãçŽæ¥èªãã®ã§ããã«ããåŸ
ããã«æ€æ»ã§ããŸããarchtestã§ã¯ãKonsistãdetektãå
éšã§äœ¿ã£ãŠããæ§æè§£æã®ä»çµã¿ã§ããPSIãçŽæ¥äœ¿ã£ãŠããœãŒã¹ãèªãã§ããŸãã ããŒã«ããšã®éãããŸãšãããšã次ã®ãšããã§ãã Konsist detekt ArchUnit archtest æ€æ»ãããã® ãœãŒã¹ ãœãŒã¹ ãã€ãã³ãŒã ãœãŒã¹ ãã«ã äžèŠ äžèŠ å¿
èŠ äžèŠ ãããžã§ã¯ãå
šäœã®ãã¡ã€ã«ã®çªãåãã â à â â importæãã®ãã®ã®æ€æ» â â à â åæšè«ã§æ±ºãŸãäŸåã®æ€åº à ⳠⳠà æ¢åéåã®åçµ Ã â â â importæã¯ãã€ãã³ãŒãã«æ®ããªããããArchUnitã§importæãã®ãã®ã¯æ€æ»ã§ããŸããããã ãããã€ãã³ãŒãã«æ®ãåç
§ããäŸåãæ€æ»ã§ããããã±ãŒãžãžã®äŸåã®çŠæ¢ã¯ArchUnitã®äžå¿çãªæ©èœã§ããåæšè«ã§æ±ºãŸãåãžã®äŸåãããã®åã®ã¡ãœãããåŒã¶ãªã©ãã€ãã³ãŒãã«åç
§ãæ®ãã°æ€åºã§ããŸããæ»ãå€ãåãåãã ãã®å ŽåãããŒã«ã«å€æ°ã®åã¯ãåç
§ãæ®ããªãããæ€åºã§ããŸããã detektã®ã«ãŒã«ã§ããå解決ãæå¹ã«ããã°ãå¥ãã¡ã€ã«ã®å®£èšããã©ã£ãããåæšè«ã§æ±ºãŸãäŸåãæ€åºãããã§ããŸãããã ãããããžã§ã¯ãå
šäœã®ãã¡ã€ã«ãéããŠçªãåãããä»çµã¿ããKotlin以å€ã®ãã¡ã€ã«ãå
¥åã«ããä»çµã¿ã¯ãããŸããã æ¢åéåã®åçµã¯ãçŽããéåã®è¡ãæ®ã£ããšãã®æ±ããéããŸããdetektã¯ãè¡ãæ®ã£ãŠã倱æããŸãããArchUnitã¯è¡ããã¡ã€ã«ããèªåã§æ¶ããŸãããæŽæ°ããããã¡ã€ã«ãã³ãããããªããã°ããªããžããªã«ã¯è¡ãæ®ããŸããarchtestã¯ãè¡ãæ¶ããŸã§å€±æãããããšã§ãè¡ã®åé€ãPRã«å¿
ãå«ããŸãã èªäœãããšãã£ãŠããå®è£
ã¯ã»ãŒãã¹ãŠAIãšãŒãžã§ã³ãã®Claude CodeãæžããŸããã調æ»ãèšèšã®èšç»ããããŒãµã®åºç€ãbaselineã®ä»çµã¿ã13ã®ã«ãŒã«ãšããããã®ãã¹ããREADMEãŸã§ã§ããã«ãŒã«ãæå³ã©ããã«å€å®ãããã¯ã次ã®ç« ã§ç޹ä»ããã³ãŒãäŸã®ãã¹ããèªãã§ç¢ºãããŸããã PSIã§ãœãŒã¹ãæ§ææšã«ãã PSIïŒProgram Structure InterfaceïŒã¯ãIntelliJ PlatformããœãŒã¹ã³ãŒããæšæ§é ãšããŠè¡šãä»çµã¿ã§ããIntelliJ IDEAãAndroid Studioãã³ãŒãã®çè§£ã«PSIã䜿ã£ãŠããŠããªããŒã ã䜿çšç®æã®æ€çŽ¢ã¯PSIã®äžã§åããŠããŸããKotlinåãã®å®è£
ã¯Kotlinã³ã³ãã€ã©ã®ã©ã€ãã©ãªçã§ãã kotlin-compiler-embeddable ã«å«ãŸããŠããŠããã¹ãã®äŸåã«å ããã ãã§äœ¿ããŸãã archtestã§ã¯ããœãŒã¹ã®æååãæ¬¡ã®ããã«ããŠæ§ææšïŒ KtFile ïŒã«ããŠããŸãã fun parse(fileName: String , content: String ): KtFile { val virtualFile = LightVirtualFile(fileName, KotlinFileType.INSTANCE, content) return psiManager.findFile(virtualFile) as KtFile } psiManager ã¯ãKotlinã³ã³ãã€ã©ã®å
éšåãã®APIã§ãã KotlinCoreEnvironment ã§æ§æè§£æçšã®ç°å¢ãäœããããããååŸããŠããŸãã æ§ææšã«ããŠãã調ã¹ãã®ã§ãæååæ€çŽ¢ãšéã£ãŠãã³ã¡ã³ããæååãªãã©ã«ã®äžã®åèªã«ã¯åå¿ããŸããããã¹ãããã¯ã©ã¹ãimportã®ãšã€ãªã¢ã¹ãåºå¥ã§ããŸãã å解決ã¯ããªã archtestã¯æ§ææšãäœãã ãã§ãå解決ã¯ããŸãããå解決ãšã¯ãã³ãŒãã«æžãããååãå®éã«ã©ã®ã¯ã©ã¹ãæãã®ãã確å®ãããåŠçã§ãããã®åŠçã«ã¯ãããžã§ã¯ãå
šäœã®äŸåé¢ä¿ãå¿
èŠã§ããã³ã³ãã€ã©ã®åæšè«ã䜿ããªãç¹ã¯ãKonsistãšåãã§ãã å解決ãããªãã®ã§ãarchtestã¯ã¯ã©ã¹ãã¹ãå¿
èŠãšããããã«ããåŸ
ããã«åããŸãããªããžããªå
šäœã®çŽ3,000ãã¡ã€ã«ãæ€æ»ããŠããCIã§ã¯å
šã«ãŒã«ã®ç
§åã6ç§ã»ã©ã§çµãããŸãã ãã®ä»£ãããå€å®ã«äœ¿ããæ
å ±ã¯ã³ãŒãã«æžããã衚èšãšimportæã«éããã衚èšã«çŸããªãäŸåã¯æ€åºã§ããŸãããå®äŸã¯åŸã®ç« ã§ç޹ä»ããŸãã æ§ææšã¯ä¿æããã軜ãã¢ãã«ã«èŠçŽãã æ§ææšã¯ãœãŒã¹ã®æ°åã®ã¡ã¢ãªã䜿ããŸãã3,000ãã¡ã€ã«åãä¿æãããŸãŸå
šã«ãŒã«ã§äœ¿ãåãã®ã¯è² æ
ã倧ãããããarchtestã§ã¯ãã¡ã€ã«ããšã«å¿
èŠãªæ
å ±ã ããæãåºãã軜ãã¢ãã«ã«èŠçŽããŠããŸãã data class ScannedFile( val relativePath: String , val sourceSet: SourceSet, val packageName: String , val imports: List < String >, val classes: List <ScannedClass>, // 颿°ãobjectã®æ
å ±ãªã©ãæã€ ) åã«ãŒã«ã¯ããã® ScannedFile ã®äžèЧã«å¯Ÿãããã£ã«ã¿ãšããŠæžããŸããã«ãŒã«ã¯PSIã®APIã«è§Šããªãã®ã§ãã«ãŒã«ãæžãã®ã«PSIã®ç¥èã¯èŠããŸããã ã«ãŒã«ã®å®è£
ãšãã¹ã ã«ãŒã«ã®äŸ ã«ãŒã«ã®äŸãšããŠããViewModelã«ã¯ @HiltViewModel ãä»ãã ViewModel ãçŽæ¥ç¶æ¿ããããšããèŠçŽãåãäžããŸããã«ãŒã«æ¬äœã¯æ¬¡ã®ãšããã§ãã fun check(files: List <ScannedFile>): List <Violation> = files .filter { it.sourceSet == SourceSet.MAIN } .flatMap { file -> file.classes .filter { it.isConcreteClass && it.name.endsWith( "ViewModel" ) } .mapNotNull { scannedClass -> val problems = buildList { if ( "HiltViewModel" !in scannedClass.annotationNames) { add( "@HiltViewModelããªã" ) } when { "AndroidViewModel" in scannedClass.superTypeNames -> add( "AndroidViewModelãç¶æ¿ããŠãã" ) "ViewModel" !in scannedClass.superTypeNames -> add( "ViewModelãçŽæ¥ç¶æ¿ããŠããªã" ) } } if (problems.isEmpty()) null else Violation( baselineKey = " ${ file.relativePath } | ${ scannedClass.nestedName } " , detail = " ${ file.relativePath } ã® ${ scannedClass.nestedName } : ${ problems.joinToString( "ã" ) } " , ) } } ååã ViewModel ã§çµããå
·è±¡ã¯ã©ã¹ãåãåºããã¢ãããŒã·ã§ã³ãšç¶æ¿å
ã衚èšã§ç¢ºãããŠããŸãã baselineKey ããbaselineã®1è¡ã«ãªãå€ã§ãã ã³ãŒãäŸã®ãã¹ããã«ãŒã«ã®ä»æ§æžã«ãã åã«ãŒã«ã®ãã¹ãã¯ã©ã¹ã¯ã2ã€ã®éšåã§ã§ããŠããŸãã1ã€ç®ã¯ãéåããäŸãšéåããªãäŸãã³ãŒãã®æååã§æžãããŠããããã¹ãã§ãã @Test @DisplayName ( "@HiltViewModelç¡ãã»éæ¥ç¶æ¿ã»AndroidViewModelç¶æ¿ã»ååã ãViewModelã®ã¯ã©ã¹ãéåãšããŠæ€åºãã" ) fun detectsViolatingViewModels() { val file = SourceScanner.toScannedFile( relativePath = "feature/foo/src/main/kotlin/com/example/Foo.kt" , content = """ class NoHiltViewModel : ViewModel() @HiltViewModel class IndirectViewModel @Inject constructor() : BaseViewModel() // AndroidViewModelç¶æ¿ã»ååã ãViewModelã®ã±ãŒã¹ã¯çç¥ """ .trimIndent(), ) HiltViewModelRule.check(listOf(file)).map { it.baselineKey } shouldBe listOf( "feature/foo/src/main/kotlin/com/example/Foo.kt|NoHiltViewModel" , "feature/foo/src/main/kotlin/com/example/Foo.kt|IndirectViewModel" , ) } éåããªãäŸã®ãã¹ããåãåœ¢ã§æžããéåã0ä»¶ã«ãªãããšã確ãããŸãããã®ãã¹ãã¯ã«ãŒã«ã®ä»æ§æžãå
ŒããŠããŸããPSIãç¥ããªããŠããã©ã®ã³ãŒããéåã«ãªããã©ã®ã³ãŒããéåã«ãªããªãããèªã¿åããŸãã誀æ€ç¥ãèŠã€ãã£ããšãã¯ããŸããã®ãã¹ãã«åçŸããã³ãŒããè¶³ããŠããå€å®ãçŽããŸãã 2ã€ç®ã¯ããªããžããªå
šäœãæ€æ»ããŠbaselineãšç
§åãããã¹ãã§ãã @Test fun repositoryHasNoNewViolations() { Baselines.check( baselineName = HiltViewModelRule.BASELINE_NAME, ruleTitle = HiltViewModelRule.TITLE, fixGuide = HiltViewModelRule.FIX_GUIDE, violations = HiltViewModelRule.check(SourceScanner.allFiles), ) } SourceScanner.allFiles ã¯ããªããžããªå
šäœã®KotlinãœãŒã¹ãèªãã äžèЧã§ãããã®äžèЧã«ã«ãŒã«ãé©çšããçµæãã Baselines.check ãåã®ç« ã®åŠçã§baselineãšç
§åããŸãã ruleTitle ãš fixGuide ã¯ãç
§åã«å€±æãããšãã®ã¡ãã»ãŒãžã«äœ¿ããŸãã éåã¡ãã»ãŒãžã ãã§çŽããããã«ãã éåãèŠã€ãããšããã¹ãã¯æ¬¡ã®ãããªã¡ãã»ãŒãžã§å€±æããŸãã [R005-hilt-viewmodel] ViewModelã¯@HiltViewModelãä»ããandroidx.lifecycle.ViewModelãçŽæ¥ç¶æ¿ããŸã(AndroidViewModelã¯äœ¿ããªã) æ°èŠéå (1ä»¶): - feature/foo/src/main/kotlin/com/example/FooViewModel.kt ã® FooViewModel: @HiltViewModelããªã ä¿®æ£æ¹æ³: - @HiltViewModel ãä»äžãã@Inject constructor ã§äŸåãåãåã£ãŠãã ãã - ç¬èªåºåºã¯ã©ã¹ãæãŸã ViewModel() ãçŽæ¥ç¶æ¿ããŠãã ãã - AndroidViewModel ã¯äœ¿ãããApplicationãå¿
èŠãªå Žå㯠@ApplicationContext ã§Contextãæ³šå
¥ããŠãã ãã - androidx ViewModelã§ãªãã¯ã©ã¹ã« ViewModel ãµãã£ãã¯ã¹ã®ååãä»ããªãã§ãã ãã åç
§å®è£
: feature/template/src/main/kotlin/com/example/template/TemplateViewModel.kt æ°èŠã®éå㯠archtest/baselines/R005-hilt-viewmodel.txt ã«è¿œå ãããã³ãŒãåŽãä¿®æ£ããŠãã ããã ã¡ãã»ãŒãžã«ã¯ãéåããç®æãšçŽãæ¹ãå¿
ãæžããåç
§ã§ããå®è£
ãããã°ãã®ãã¹ãæžããŸãã人ãšAIãšãŒãžã§ã³ãã®ã©ã¡ããã¡ãã»ãŒãžãèªãã ãã§çŽããããšããã«ãŒã«ã®å®ææ¡ä»¶ã«ããŠããŸããå°å
¥åã«ã¯ãèµ·ããããªéåããããšå
¥ããŠã察å¿ããã«ãŒã«ãä¿®æ£æ¹æ³ä»ãã§å€±æããããšã確ãããŸããã å°å
¥åŸã®PRã«ã¯ãarchtestã§æ¢ãŸã£ãããšã«AIãšãŒãžã§ã³ããéåã¡ãã»ãŒãžãèªãã§ã³ãŒããçŽããã³ããããããã€ããããã³ãããã¡ãã»ãŒãžã«ã¯ã«ãŒã«åãæžãããŠããŸããäŸãã°ãXMLã®ãªã¹ãéšåãJetpack Composeã«æžãçŽããPRã§ã¯ãæ°ããéšåãå€ãAPIã®ã¢ãã«ã¯ã©ã¹ãimportããŠæ¢ãŸããŸãããAIãšãŒãžã§ã³ãã¯éšåçšã®ããŒã¿ã¯ã©ã¹ãäœããå€ãã¢ãã«ããã®å€æãåŒã³åºãåŽã«ç§»ããŠãéšåããå€ãã¢ãã«ãžã®äŸåããªãããŸãããã»ãã«ãããã¹ããã¡ã€ã«ã®åœåèŠçŽããçŽJVMã®ãã¹ãã«Androidã®äŸåãæã¡èŸŒãŸãªãèŠçŽã§æ¢ãŸããã¡ãã»ãŒãžã®ãä¿®æ£æ¹æ³ãã®ãšããã«çŽããã³ãããããããŸãã éçš CIã§ãŠããããã¹ãããå
ã«å®è¡ãã archtestã¯ãPRãäœæã»æŽæ°ããããã³ã«GitHub Actionsã§å®è¡ããŠããŸããåããžã§ãã®äžã§ãŠããããã¹ãããåã®ç¬ç«ããã¹ããããšããŠåããéåãããã°ãã®æç¹ã§ãžã§ãã倱æãããŸããæéã®ããããŠããããã¹ãã®å®äºãåŸ
ãããè»œãæ€æ»ã®å€±æãå
ã«è¿ãããã§ããã¹ãããå
šäœã®æèŠæéã¯ãGradleã®ãã£ãã·ã¥ã®ç¶æ
ã«ãã£ãŠ30ç§ã2ååã»ã©ã§ãã ã«ãŒã«ã远å ãã ã«ãŒã«ã远å ããç®å®ã¯ã次ã®3ã€ãšããŠããŸãã ã³ãŒãã¬ãã¥ãŒã§åãææã2å以äžãããšã æ°ããèŠçŽãç§»è¡æ¹éãæ±ºãããšã éåã0ä»¶ã®è¯ãç¶æ
ã«æ°ã¥ãããšã æ°ããèŠçŽã¯ãææžåããåã«ããŸãã«ãŒã«åã§ããªãããèããŸãã ã«ãŒã«ã®å®è£
ã¯ãAIãšãŒãžã§ã³ãã«é Œãããšãå€ãã§ããPSIããèªã¿åããæ
å ±ã§å€å®ã§ããã«ãŒã«ãªãããããããã«ãŒã«ãæžãããããšé ŒããšããããŠãæžãäžããŸãã å°å
¥åŸãã«ãŒã«ã¯å¢ããŠããŠãå°å
¥æã®13åããçŸåšã¯18åã§ããäŸãã°ãComposeã«FragmentãèŒãããšãã«å
±éã®éšåã䜿ãã«ãŒã«ã¯ãã¯ã©ãã·ã¥ãä¿®æ£ããã¡ã³ããŒã远å ããŸãããä¿®æ£ã®åŸç¶ã®äœæ¥ã§å
±éã®éšåãäœããåãPRã§ããã®éšåãå
šå¡ã«äœ¿ãããã«ãŒã«ãå
¥ããŠããŸãã ã€ãŸãããšéç ã«ãŒã«ãèªåèªèº«ãéåãšããŠåçµããŠãã ãã¹ãçšã®Fakeã®åœåãæ€æ»ããã«ãŒã«ã¯ãåœåã Fake ã§å§ãŸãååããæ€æ»å¯Ÿè±¡ã«ããŠããŸããããã®ãããã«ãŒã«èªèº«ã®ã¯ã©ã¹åïŒ FakesConvention... ïŒãéåãšããŠæ€åºãããã®ãŸãŸbaselineã«åçµããŠããŸãããå°å
¥PRã®AIã¬ãã¥ãŒã®ææã§æ°ã¥ããå€å®ãã Fake ã®çŽåŸã倧æåã§å§ãŸãååãã«çŽããŠããŸãã baselineã¯æ¢åã®éåãæ©æ¢°çã«æžãåºãã®ã§ã誀æ€ç¥ããã®ãŸãŸåçµããŠããŸããŸããbaselineãçæãããšãã¯ãä»¶æ°ã ãã§ãªãäžèº«ã確èªããå¿
èŠããããŸãã Kotlinã®æŽæ°ã«ã¯ã³ã³ãã€ã©APIãžã®è¿œåŸãèŠã å°å
¥ãã1é±éã»ã©ãã£ããããKotlinã2.4.20ã«äžããRenovateã®PRã§ãarchtestã®ãã¹ãã³ãŒããã³ã³ãã€ã«ã§ããªããªããŸãããåå ã¯ãæ§æè§£æçšã®ç°å¢ãäœãã®ã«äœ¿ã£ãŠãã KotlinCoreEnvironment ã§ãã2.4.20ã§ã¯ããã®APIã䜿ãããã«å¿
èŠãªopt-inã®çš®é¡ãšèšå®ã®äœãæ¹ããšãã«å€ãããåŸæ¥ã®æžãæ¹ã§ã¯ã³ã³ãã€ã«ãšã©ãŒãå®è¡æãšã©ãŒã«ãªããŸããã 察å¿ã¯ãopt-inã®è¿œå ãšãèšå®ãå
¬åŒã®ãã¡ã¯ããªé¢æ°ã§äœã圢ãžã®æžãæãã§ã倿Žã¯10è¡ã»ã©ã§ããããã®Renovateã®PRã«ä¿®æ£ã®ã³ãããã远å ããç¿æ¥ã«ããŒãžããŠããŸãã KonsistãèŠéã£ãçç±ã®1ã€ã¯ãããŒãµãKotlinã®æŽæ°ã«è¿œãã€ããªããããã§ãããarchtestã䜿ãKotlinã³ã³ãã€ã©ã®ã©ã€ãã©ãªã¯ãã¢ããªæ¬äœãšåãKotlinã®ããŒãžã§ã³ãåç
§ããŠãããããããŒãµã ããå€ããªãããšã¯ãããŸããããã®ä»£ããã«ãKotlinãäžãããšãã«ã³ã³ãã€ã©ã®å
éšåãã®APIãå€ãã£ãŠããã°ãèªåãã¡ã§è¿œåŸããå¿
èŠããããŸãããªããç¶ã2.4.21ãžã®æŽæ°ã§ã¯ãarchtestã®å€æŽã¯èŠããŸããã§ããã åæšè«ã§importãæ¶ãããšæ€åºã§ããªã æ°ããæžãããã¹ããå€ãAPIã®ã¢ãã«ã¯ã©ã¹ãimportããarchtestã§æ¢ãŸã£ãããšããããŸããããã®ãã¹ãã¯ãéåã§æ¢ãŸã£ãããšãã»ãã®UiStateã®ãã¹ããšåããååŒæ°ãçãåœ¢ãžæžãæããããarchtestãééããŸããã // æžãæãåïŒimportæã«å€ãAPIã®ã¢ãã«ãçŸããã®ã§æ€åºã§ãã import com.example.legacy.ItemDetailList // ... itemDetailListFlow = MutableStateFlow<ItemDetailList?>( null ), // æžãæãåŸïŒåã¯æž¡ãå
ã®åŒæ°ã®åããæšè«ãããã®ã§ãimportæãæ¶ããŠæ€åºã§ããªã itemDetailListFlow = MutableStateFlow( null ), å€ãAPIã®ã¢ãã«ã¯ã©ã¹ãžã®äŸåã¯æ®ã£ããŸãŸãimportã ããæ¶ããŠããŸãããã ãããã®äŸåã¯ãã¹ãã®åŽã ãã§ã¯ãªãããŸããããã¹ã察象ã®UiStateãå€ãã¢ãã«ãåŒæ°ã«åã£ãŠããŠããã®ãã¡ã€ã«èªäœãbaselineã«èŒã£ãŠããããã§ããäŸåããªããã«ã¯ããã¹ã察象ã®ã³ãŒããç§»è¡ããå¿
èŠããããŸããããã§ãã衚èšãšimportæã ãã§å€å®ããå²ãåãã®ä»£åãšããŠãarchtestããã®çš®ã®äŸåãèŠèœãšãããšã«å€ããã¯ãããŸããã baselineã®ããŒã®ç²åºŠã§æ€åºç¯å²ãå€ãã å€ãAPIãRxJavaã®importãçŠæ¢ããã«ãŒã«ã§ã¯ãbaselineã®ããŒã çžå¯Ÿãã¹|ã°ã«ãŒãå ã«ããŠããŸããã°ã«ãŒãåã¯ã rxjava ã®ããã«ãçŠæ¢å¯Ÿè±¡ã®çš®é¡ããŸãšããååã§ããbaselineã«èŒã£ãŠãããã¡ã€ã«ã¯ãå€ãAPIããã®ç§»è¡ã®éã«ãã¡ã€ã«åäœã§ãŸãšããŠè§£æ¶ããåæã§ãããã®ãããã¯ã©ã¹ããšã§ã¯ãªããã¡ã€ã«ãšã°ã«ãŒãã®åäœã§é²æã管çããŠããŸãã baselineã«èŒã£ãŠããªããã¡ã€ã«ãžã®importã«ããæã¡èŸŒã¿ã¯ããã¹ãŠæ€åºã§ããŸãããã ããbaselineã«èŒã£ãŠãããã¡ã€ã«ã§ã¯ãåãã°ã«ãŒãã®å€ãAPIãæ°ããimportããŠãæ€åºã§ããŸãããããŒã现ããããã°æ€åºã§ããç¯å²ã¯åºãããŸãããbaselineã®è¡æ°ãå¢ããçŽãããšãã«æ¶ãè¡ãå¢ããŸããã©ã®ç²åºŠã«ãããã¯ãã«ãŒã«ããšã«æ±ºããå¿
èŠããããŸãã å°å
¥ããŠã¿ãŠ archtestã¯2026幎8ææ«ããCIã§åããŠããŸããå°å
¥ããŠå€ãã£ãã®ã¯ãã«ãŒã«ã§æ€åºã§ããæ°ããéåãå
¥ããšãã«ãCIã§å¿
ãæ°ã¥ããããã«ãªã£ãããšã§ããæ°ã¥ããããã§ãçŽãããåæããŠbaselineã«è¿œå ããããã¬ãã¥ãŒã§æ±ºããŠããŸããbaselineã«è¿œå ããå Žåãããã®çç±ãã¬ãã¥ãŒã«æ®ããŸãã å°å
¥ãã2ãæããŸãïŒ2026幎11æ10æ¥æç¹ïŒã®æ°åã¯æ¬¡ã®ãšããã§ãã é
ç® å€ ã«ãŒã«æ° 13å â 18å å°å
¥æã®13ã«ãŒã«ã®baseline 386ä»¶ â 341ä»¶ å°å
¥åŸã«è¿œå ããã«ãŒã«ã®baseline 161ä»¶ CIãarchtestã®ã¹ãããã§å€±æããåæ° 31å æ°ããéåã§æ¢ãŸã£ãPR 10ä»¶ çŽããéåãbaselineã«æ®ã£ãŠããŠæ¢ãŸã£ãPR 9ä»¶ CIãarchtestã®ã¹ãããã§å€±æãã31åã®ãã¡ã12åã¯æ°ããéåã§æ¢ãŸã£ããã®ã§ãããã®ã»ãã¯ãçŽããéåã®è¡ãæ®ã£ãŠããŠæ¢ãŸã£ããã®ã10åãKotlinã®æŽæ°ã§ã³ã³ãã€ã«ã§ããªãã£ããã®ã5åãã«ãŒã«ãšé¢ä¿ã®ãªããã«ãããããã¯ãŒã¯ã®å€±æã4åã§ããããçŽããéåãbaselineã«æ®ã£ãŠãããã§æ¢ãŸã£ãPRã¯9ä»¶ãããŸããããã®ãã¡5ä»¶ã¯ãå€ãAPIã®çœ®ãæããäžå¿ã«ãçŽãã人ããã®PRã®äžã§baselineã®è¡ãæ¶ããŠããŸããæ®ã4ä»¶ã®ãã¡3ä»¶ã¯ãåãéåãå¥ã®PRãå
ã«çŽããŠè¡ãæ¶ããŠããããããã®å€æŽãåã蟌ãã§è§£æ¶ããŸãããæ®ãã®1ä»¶ã¯ãããŒãžããã«éããPRã§ãã å°å
¥æã®13ã«ãŒã«ã®baselineã¯ã386ä»¶ãã341ä»¶ã«æžããŸãããæžã£ã45ä»¶ã¯ãå€ãAPIãæ°ããAPIã«çœ®ãæããäœæ¥ãªã©ãå¥ã®äœæ¥ã®äžã§ã€ãã§ã«æ¶ãããã®ã§ããbaselineãæžããããã®äœæ¥ã¯ãç»é¢äžèЧã®Markdownã®èšèŒä¿®æ£ããåœåèŠçŽã«åããããã¹ããã¡ã€ã«ã®ãªããŒã ã®ããã«ãã¢ããªã®åäœã«åœ±é¿ããªããã®ããå°ããé²ããŠããæ³å®ã§ãã å°å
¥åŸã«è¿œå ãã5ã€ã®ã«ãŒã«ã®ãã¡2ã€ã¯ã远å ããæç¹ã®æ¢åã®éåãåãããŠ161ä»¶ãbaselineã«åçµããŠå§ããŠããŸããéåãæ±ããã³ãŒãã«ããæ°ããã«ãŒã«ãåãæé ã§åŸããè¶³ããŸãã ãŸãšã æ¬èšäºã§ã¯ãWEAR Androidã«èŠçŽã®ãã§ãã¯ãåŸããå
¥ããæ¹æ³ã玹ä»ããŸããã æ¢åã®éåã¯baselineã«æžãåºããŠåçµããæ°ããéåã ããCIã§æ¢ãã çŽããéåãbaselineã«æ®ã£ãŠããã°å€±æã«ããŠãbaselineãæžãäžæ¹ã«ãã Kotlinã®ãœãŒã¹ã¯å解決ãããã«PSIã§æ§ææšã«ããŠããã«ããåŸ
ããã«æ€æ»ãã ã«ãŒã«ããšã«ãéåããäŸãšéåããªãäŸã®ãã¹ãã仿§æžãšããŠæžããéåã¡ãã»ãŒãžã«ã¯çŽãæ¹ãæžã å解決ãããªãããã衚èšã«çŸããªãäŸåã¯æ€åºã§ããŸãããããã§ãããã«ããåŸ
ããã«å
šãã¡ã€ã«ãæ€æ»ã§ããã«ãŒã«ãæè»œã«è¿œå ã§ããããšã¯ããããžã§ã¯ãåºæã®èŠçŽãå®ãããã§å€§ããªå©ç¹ã§ãããéåãæ±ããã³ãŒãããŒã¹ã«èŠçŽã®ãã§ãã¯ãå
¥ããããšããŠããæ¹ã®åèã«ãªãã°å¹žãã§ãã æåŸã« ZOZOã§ã¯ãäžç·ã«ãµãŒãã¹ãäœãäžããŠãããæ¹ãåéäžã§ãããèå³ã®ããæ¹ã¯ã以äžã®ãªã³ã¯ãããã²ãå¿åãã ããã corp.zozo.com ãã®åŸãKonsistã¯2026幎10æã«Kotlin 2.4ç³»ã«å¯Ÿå¿ããv0.18.0ãå
¬éãããªãªãŒã¹ãåéããŸãããçŸåšã¯ãKotlin 2.4ç³»ã®ãããžã§ã¯ãã§ã䜿ããŸãã ↩
æ¬èšäºã¯ 2026 幎 11 æ 12 æ¥ã« Kiro ããã°ã§å
¬éãããã Introducing Kiro for Android ãã翻蚳ãããã®ã§ãã Kiro for Android ã Google Play ã§æäŸéå§ããŸããã ãšã³ãžãã¢ãªã³ã°ã®äœæ¥ãé²ããããã«ãããŒã PC ã®åã«æ»ãå¿
èŠã¯ãããŸãããå€åºäžã«ã¢ã€ãã¢ãã²ãããããšãããã°ãéå€äžã«ã»ãã·ã§ã³ã倿Žãçµããããšããé²è¡äžã®äœæ¥ãããªãã®å
¥åãåŸ
ã£ãŠæ¢ãŸã£ãŠããããšããããŸããAndroid ã®ãŠãŒã¶ãŒã¯ãã¹ããŒããã©ã³ããæ°ããäœæ¥ãå§ãããã§ã«åããŠããã¯ã©ãŠãã®äœæ¥ãåŒãç¶ãããã®ãŸãŸé²ããããããã«ãªããŸããã å³ 1: Kiro for Android ã®æ°ããã»ãã·ã§ã³ã®ç»é¢ ã©ãã«ããŠãäœæ¥ãé²ãããã ã¯ã©ãŠãã»ãã·ã§ã³ ã䜿ããšãåãäœæ¥ã Kiro CLIãWebãIDEãAndroid ã®ã©ãããã§ãæ±ããŸããäŒè©±ãšã»ãã·ã§ã³ã®å±¥æŽãããã£ãç¶æ
ã§ Android ããã¯ã©ãŠãã»ãã·ã§ã³ãéãããšããAndroid ã§å§ããŠãããšã§å¥ã®å Žæããåéããããšãã§ããŸãã Kiro ã®èšå®ãåæ ããŠããã°ããã®èšå®ãã¯ã©ãŠãã»ãã·ã§ã³ã§äœ¿ããŸãã 䜿ãã¯ã©ã€ã¢ã³ããåãæ¿ããŠããã¹ããŒããã©ã³ãããŸã£ãŠããã»ãã·ã§ã³ã¯ã¯ã©ãŠãã®ãµã³ãããã¯ã¹ã§åãç¶ããŸããAndroid ã§ã¯ããŸã åããŠããã»ãã·ã§ã³ãçµãã£ãã»ãã·ã§ã³ãããªãã®å¯Ÿå¿ãå¿
èŠãªã»ãã·ã§ã³ã確èªã§ããŸãã ã¢ã€ãã¢ãã²ãããããšãã«å§ãã ããã«å§ããã»ããããã¢ã€ãã¢ããããŸããç§»åäžã«æ©èœãæãã€ãããšããæ¬çªç°å¢ã®ãã°ã«æ°ã¥ãããšãããã¹ã¯ã«æ»ãåã«å§ãããã調æ»ããããšæ°ã¥ãããšããªã©ã§ãã Android ããæ°ããã»ãã·ã§ã³ãå§ããå¿
èŠãªãªããžããªãæ¥ç¶ããäœãäœãããããäœãçŽãããããäœã調ã¹ãããã Kiro ã«äŒããŸããèŠããã»ããæ©ããšãã¯ãã¹ã¯ãªãŒã³ã·ã§ãããæ·»ä»ã§ããŸããããªããã»ãã®çšäºã«ç§»ã£ãŠããéããKiro ã¯ã³ãŒãã調ã¹ãããŒã«ã䜿ãã倿Žãå ãããã¹ããå®è¡ããã¯ã©ãŠãã§äœæ¥ãç¶ããããŸãã ããªãã®å€æãå¿
èŠã«ãªã£ãã å
ã«é²ãåã«å€æãå¿
èŠãªã»ãã·ã§ã³ããããŸãããã©ã³ãã®éžæãå®è£
ã®çްéšã®ç¢ºèªãäºæ³å€ã®ããšãèŠã€ãã£ãããšã®æ¹é転æãªã©ããKiro ãããªãã«æ±ããããšããããŸããAndroid ã§ã»ãã·ã§ã³ãéãã質åã«çãããè£è¶³ãäŒããã°ãKiro ã¯ããããäœæ¥ãç¶ããŸããäœæ¥ãæ¢ããªãããã ãã«ãããŒã PC ã®åã«ããå¿
èŠã¯ãããŸããã ã¹ããŒããã©ã³ã§ã¬ãã¥ãŒããŠä»äžãã 倿Žã®æºåãã§ããããã¹ããŒããã©ã³ã§å·®åãçŽæ¥éããŸãããã¡ã€ã«ã®å€æŽã¯ã¢ãã€ã«åãã®ã«ãŒãã§è¡šç€ºãããã®ã§ãå°ããªç»é¢ã§ãã¹ã¯ãããåãã®ã¬ã€ã¢ãŠããæäœããªããŠãããã¡ã€ã«ããšã«å®è£
ãã¬ãã¥ãŒã§ããŸãã çŽããšãããããã°ãKiro ã«ããäžåºŠäœæ¥ãé Œã¿ãŸãã倿Žã«åé¡ããªããã°ãKiro ããã«ãªã¯ãšã¹ããäœæã§ããPR ã®ç¶æ
ã¯ã»ãã·ã§ã³ãšäžç·ã«è¡šç€ºãããŸãã å³ 2: 2 ã€ã®ãªããžããªã®ãã«ãªã¯ãšã¹ããšãã¹ãçµæã衚瀺ããã»ãã·ã§ã³ 䜿ãå§ãã Kiro for Android 㯠Kiro ã®ææãã©ã³ã§å©çšã§ããŸãã Google Play ãã Kiro for Android ãããŠã³ããŒãããKiro CLIãWebãIDE ã§äœ¿ã£ãŠããã®ãšåãã¢ã«ãŠã³ãã§ãµã€ã³ã€ã³ããŠãã ãããã¯ã©ãŠãã»ãã·ã§ã³ãæ¥ç¶ãããªããžããªãã¢ãã«ã®éžæãåæããèšå®ã¯èªåçã«åŒãç¶ãããŸããIAM Identity Center ã䜿ã£ãŠããäŒæ¥ã§ã¯ããŠãŒã¶ãŒã Kiro for Android ã䜿ãåã«ã管çè
ã ã¯ã©ãŠãã»ãã·ã§ã³ ãæå¹ã«ããå¿
èŠããããŸããã¯ã©ãŠãã»ãã·ã§ã³ã¯çŸåš us-east-1ïŒããŒãžãã¢åéšïŒã§å©çšã§ããŸãã Kiro for iOS ã¯åŒãç¶ããã¬ãã¥ãŒäžã§ãã æ©æã¢ã¯ã»ã¹ããªã¯ãšã¹ã ããŠããã ããã°ãå©çšã§ããããã«ãªã£ãæç¹ã§ãç¥ããããŸãã ã¹ããŒããã©ã³ã§å§ããã°ãæ»ã£ããšãã«ã¯ PR ãã§ããŠããŸãã åæã®èè
Kyle SeamanïŒProduct LeadïŒãAlex JiaïŒProduct MarketingïŒ ç¿»èš³è
ã«ã€ããŠ çš²ç° å€§éž â ããªãã AWS Japan ã§åã Kiro ããããªãæããœãªã¥ãŒã·ã§ã³ã¢ãŒããã¯ããæ®æ®µã¯è£œé æ¥ã®ã客æ§ãæ¯æŽããŠããŸãããã®æŽ»åã®åããæè¿ã¯ AI é§åéçºã©ã€ããµã€ã¯ã« (AI-DLC) ã®æ¥æ¬ã®ã客æ§ãžã®åžææŽ»åããã€ã€ã Kiro ã®ããã° ãªã©ãå·çããŠããŸãã
Kotlin Multiplatform(KMP)æ€éã®æææ±ºå®ãšåŸããããã® ã¯ããã« ãã®èšäºã§ ...



















