ã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã®ãªãªãŒã¹ããŒãžã§ã³ããã«ããããšããdebug = falseãèšå®ããŠapkãã¡ã€ã«ããšã¯ã¹ããŒãããããšã«ãªã£ãã®ãæãåºããŸãã IDEãããããã®ã«2åããããå®äºã§ãã ãã¹ãŠã®åªåã¯ã眲å蚌ææžã®ããŒã¿ãæå®ããå¿ èŠæ§ã«çŠç¹ãåãããŸããã ã€ãæè¿ã§ããã ä»ã§ã¯ããã®ã¢ããªã±ãŒã·ã§ã³ã®ã¢ã»ã³ããªããã»ã¹ãéåžžã«å€§ãããªã£ãããããã¹ãŠã®æäœãèªåã§çªç¶å®è¡ããå¿ èŠãããããã¹ãŠãèŠããŠæ£ããå®è¡ããŠãïŒä¿¡ããããªãïŒã1æéã¯ããããŸããããããŠããããã1æ¥åŸãã»ã©ãã¹ãã¯ç²åŽã®ããã«2é±éã®ç æ°äŒæãåŠæ¹ããå¿ èŠããããŸãã
ã ãããã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã»ã¹ã ç¹å®ã®ã¢ãã€ã«ããŒã ã®CIïŒããŒã«ãŒã人éããã®ä»ã®å¿ é å±æ§ãå«ãïŒã«é¢ããæçš¿ãæè¿æµè¡ããŠããããã§ã¯ãªãããããç§ãåŸãçŽ æŽãããçµéšã ããã§ãã Androidçšã®Mail.Ru Mailã§äœæ¥ããŠããéããããŠãã®å¯èœæ§ã¯ã»ãšãã©ååšããªããããç§ã¯å¥ã®ããŒã ãå¥ã®ãããžã§ã¯ãããŸãã¯å¥ã®äŒç€Ÿã§åããŸãã
ã©ã®ããã»ã¹ã§ããéèŠãªæ±ºå®ã¯ãã¢ã»ã³ããªå šäœã®æ§ç¯ã«åºã¥ããŠã·ã¹ãã ãéžæããããšã§ãã ãã«ãã¯ãã«ããµãŒããŒã§åŠçããå¿ èŠããããŸãã ããã¯è«ççã§ãã ããããã©ã¡ããéžæããã®ã§ããïŒ
質åã¯ææ§ã§ãã誰ããèªåã®çµéšãã·ã¹ãã ãçŽé¢ããŠããã¿ã¹ã¯ãããã³ææããŠãããªãœãŒã¹ã«åºã¥ããŠ1ã€ãŸãã¯å¥ã®ãœãªã¥ãŒã·ã§ã³ãéžæããŸãã ç¡æã®ãœãªã¥ãŒã·ã§ã³ã奜ããªäººã¯ããããŒãžã£ãŒã«å¹ŽéN000ãã«ãå¿ èŠã ã£ãããšãšããããªãã§ã¯ã§ããªãçç±ããããŒãžã£ãŒã«èª¬æããå¿ èŠããªãããã§ãã ã³ãã¥ããã£ã®ååšãããããã®æ±ºå®ããã§ã«æŽ»çšããçµæã«æºè¶³ããŠããèšå€§ãªæ°ã®ããŒã ã®çµéšã«åºæ¿ãããŠããŸãã èŠç¹ã®æ°ã¯ããã®è³ªåããã人ã®æ°ãšåãåŸåããããŸãã 誰ãã®è°è«ãçå®ã§ããããŸãã¯èª°ãã®å察ãç¡é¢ä¿ã§ãããšèšãããšã¯ã§ããŸããã ãããããã®ãããªåé¡ã«çŽé¢ããéçºè ã®æèŠãã©ãã§ãããåžå Žã§äººæ°ã®ãããã¹ãŠã®ãœãªã¥ãŒã·ã§ã³ã¯æŠããŠãã»ããã¢ããã®å®¹æããé¢é£ã·ã¹ãã ãšã®çµ±åãæ¡åŒµãªãã·ã§ã³ãããã³ã³ãã¥ããã£ãŸãã¯ã·ã¹ãã éçºè ããã®ãµããŒãã®ã¿ãç°ãªãããšã«åæããŸãã
äžè¬ã«ããã«ããµãŒããŒã®éžæã¯ãåå¥ã®holivarã®ãããã¯ã§ãã Atlassianã®Bamboo Build Serverãœãªã¥ãŒã·ã§ã³ãéžæãããšããèšããŸããã äž»ãªçç±ã¯ããã€ããããŸããããã®ãã¡ã®1ã€ã¯ããããžã§ã¯ãã§äœ¿çšãã課é¡è¿œè·¡ã·ã¹ãã ãšã®çµ±åã®å®¹æããããã³ã³ãŒãã¬ãã¥ãŒã·ã¹ãã ãšãªããžããªãã¹ãã£ã³ã°ã§ãã ã¿ããªçŽ æŽãããã§ãããã¹ãŠã䟿å©ã§ããã¹ãŠæå ã«ãããæãéèŠãªã®ã¯ãæäŸãããã»ãšãã©ãã¹ãŠã®ãœãªã¥ãŒã·ã§ã³ãšãªãã·ã§ã³ããããŒã ã®éçºããã»ã¹ã«å®å šã«é©åããããšã§ãã
竹
Bambooã¯éåžžã«äžè¬çãªãœãªã¥ãŒã·ã§ã³ã§ãããäžçäžã®èšå€§ãªæ°ã®ããŒã ã§äœ¿çšãããŠããŸãã ãã®CI / CDããŒã«ã®äœæ¥ã¹ããŒã ã®è©³çŽ°ã¯å ¬åŒããã¥ã¡ã³ãWebãµã€ãã§èŠã€ããããšãã§ããŸãããçšèªã®éããé¿ããããã«ããã®ããã¥ã¡ã³ãã®äžéšãç¡æã§ç¿»èš³ã§ããããã«ããŸãã
Continuous IntegrationãµãŒããŒã®ã¿ã¹ã¯ã¯ããããžã§ã¯ãã®ãã¹ãç°å¢ãžã®ã¢ã»ã³ãã«ããã¹ãããããã€ã®ãã¹ãŠã®äœæ¥ãè¡ãããšã§ãã CIãµãŒããŒã¯ãªããžããªãšéä¿¡ãããããžã§ã¯ãã®ç¹å®ã®ãªããžã§ã³ãåãåããå¿ èŠãªãã¹ãŠã®ã¢ã¯ã·ã§ã³ãå®è¡ããå®æããã¢ã»ã³ããªçµæããããžã§ã¯ãããŒã ã«æäŸããŸãã
ãããžã§ã¯ã |
|
ãã«ããã©ã³
ïŒèšç»ïŒ |
|
ã¹ããŒãž
ïŒã¹ããŒãžïŒ |
|
ä»äº
ïŒä»äºïŒ |
|
ææŠãã
ïŒã¿ã¹ã¯ïŒ |
|
å€ããå°ãªããåæ§ã®åé¢ã¯ãããããã¢ã»ã³ããªã·ã¹ãã ã§å©çšã§ããããã»ã¹å šäœã®æ§ç¯ã«å¿ èŠãªæè»æ§ãæäŸããŸãã äžèŠãããã¯é床ã®è€éãã®ããã§ãã Bambooã䜿ãå§ããã°ããã®ãããžã§ã¯ãã§ããããåŸã ã«ãã¹ãŠãèœã¡çããã¢ã»ã³ããªããã»ã¹å šäœã®ã©ã®éšåãã¹ã±ãŒãªã³ã°ããå¿ èŠãããã®ãââãå€ç«ãããŸãŸã«ããå¿ èŠããããããããŠææ¡ãããã³ã³ã»ããã®æ çµã¿å ã§ããªã調åã®ãšããæ§é ãæããã«ãªããŸããã
äžè¬ã«ããã«ããµãŒããŒãŸãã¯CIãµãŒããŒã¯ãœãããŠã§ã¢éçºããã»ã¹ã®èªååã®éèŠãªéšåã§ããããšãããç解ããå¿ èŠããããŸãã ãã®ã¢ãžã¥ãŒã«ã«ãåžå Žã«ãªãªãŒã¹ããããã®ã¢ããªã±ãŒã·ã§ã³ãæºåããããŸããŸãªæ®µéãšã¬ãã«ã§å®è¡ããå¿ èŠããããã¹ãŠã®ã¿ã¹ã¯ãšäœæ¥ãå²ãåœãŠããšãäžçš®ã®ã¢ããªã±ãŒã·ã§ã³ãªãªãŒã¹ãã€ãã©ã€ã³ãåŸãããŸãã ãŸããç¹å®ã®ãã«ãã«å«ãŸããã¿ã¹ã¯ãçŸåšã®ãªãªãŒã¹ã®æ®µéãæ°ããæ©èœãçµ±åããéã«çºçããåé¡ãä¿®æ£ããã°ã©ã ã®æºåã®æ®µéãªã©ãç°¡åã«å€æã§ããŸãã
ãã®ãããããŒã ã§ãããã©ã®ããã«è¡ããããã®èª¬æã«ã¹ã ãŒãºã«ã¢ãããŒãããŸããã
ã¿ã¹ã¯
ã¢ã»ã³ããªãããžã§ã¯ãã¯ããã€ãã®æ®µéã«åãããŠãããçŸåšã®äž»ãªã¿ã¹ã¯ãåæ ããŠããŸãã
- ãã«ã-ãªãªãŒã¹ãã€ãã©ã€ã³ã§å¿ èŠã«ãªãå¯èœæ§ã®ãããã¹ãŠã®ãã«ããªãã·ã§ã³ïŒã¢ã«ãã¡ãããŒã¿ããªãªãŒã¹ïŒãå«ãŸããŸãã ã¯ããã¯ãããããžã§ã¯ãã¢ã»ã³ããªã¯ç§ãã¡ã®éã§ç°ãªãããã®ã¹ããŒã¿ã¹ã ãã§ã¯ãããŸããã 補åã®éãïŒããŸããŸãªãªãœãŒã¹ãèšå®ã®æç¡ãªã©ã
- æ€èšŒã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã¢ã»ã³ããªãã§ãŒãºå šäœã®äžã§æã容éã倧ãããæè¡çã«è€éãªéšåã§ãïŒéçã³ãŒãåæãåäœãã¹ããæ©èœUIãã¹ããããŒã«ãªãŒãŒã·ã§ã³æ€èšŒã
- ãããã€ããŸãã çŸåšãã¢ã»ã³ããªå šäœããæœè±¡åãããŠããã暪ã«ããããã§ãã ãããã£ãŠãå¿ èŠã«å¿ããŠãããããç°å¢ïŒã¢ã«ãã¡çãããŒã¿çããªãªãŒã¹çïŒã®ãããããªããžã§ã³/ãã©ã³ã/ã¢ããªã±ãŒã·ã§ã³ã®ã¿ã€ãã«ãããã€ã§ããŸãã
ããã§ãååãšããŠãããªãã¯ç©èªãçµããããšãã§ããŸãããç§ã¯ããããããéèŠæ§ã瀺ãã詳现ãæäŸããŸãã
çµç«
çŸåšã1ã€ã®ã³ãŒãããŒã¹ã§3ã€ã®ãããžã§ã¯ããäžåºŠã«éçºããŠããŸãããããžã§ã¯ã1ããããžã§ã¯ã2ããããžã§ã¯ã3ãšåŒã³ãŸãããããã¡ããã3ã€ã®è£œåã¯ãã¹ãŠã¡ãŒã«ã¯ã©ã€ã¢ã³ãã®ã«ããŽãªã«å±ããŠããããããã§ã¹ãšãããªãã¬ãŒã€ãŒã®éãã»ã©æ ¹æ¬çãªéãã¯ãããŸããã ãã ããèšèšãç°ãªããæ©èœã«éãããããããŸããŸãªæ¹æ³ã§ãµãŒããŒãšå¯Ÿè©±ããŸãã ããããã¹ãŠããã¢ã»ã³ããªããã¹ããããã³è£œåéçºã®èŠä»¶ã決å®ããŸãã
æ©èœãã©ã³ãã®ã¯ãŒã¯ãããŒ
ã¢ã»ã³ããªã¯ãããŒãžã§ã³ç®¡çã·ã¹ãã ããã®ãããžã§ã¯ããªããžã§ã³ã®ãã§ãã¯ã¢ãŠãããå§ãŸããŸãã ãªãããã«æ³šæãåããã®ã-çµå±ã誰ãããã§ãã¯ã¢ãŠãã§ããã®ã§ããããïŒ æ¬åœã«ã ããããã©ã®ãã©ã³ããã䟡å€ããããŸããïŒ
補åã§äœæ¥ããããã«æ©èœãã©ã³ãã¯ãŒã¯ãããŒã䜿çšããŸãã ãã®ã¢ãããŒãã«ã€ããŠã¯ãåå¥ã«èªãããšãã§ããŸã ã ç§ã«ãšã£ãŠã®äž»ãªå©ç¹ã¯ãå€æŽã®åé¢ã§ãã ãã®ã¢ãããŒãã§ã¯ãåéçºè ã¯ã¿ã¹ã¯ã®äžéšãšããŠå°ãªããšããããžã§ã¯ãå šäœãåŒãç¶ãã§ãã¹ãã«æäŸã§ããQAãã¢ããªãæäŸããå Žåããã¹ãæžã¿ã®æ©èœã³ãŒãã¯äžè¬çãªãã©ã³ãã«åé¡ãããŸãã ãã®ã¢ãããŒãã¯ãäžé£ã®ã¢ã¯ã·ã§ã³ãå®çŸ©ãããŠãããšããäºå®ã«ããããªãªãŒã¹ã«å ¥ãæ¬ é¥ã®ãªã¹ã¯ãæå°éã«æããŸããæåã«ãã§ãã¯ãã次ã«ãããžã§ã¯ãã®ã¡ã€ã³ãã©ã³ãã«ããŒãžããŸãã
ãããã®åé¢ãããå€æŽãæ€èšŒããã«ã¯ãèªåãã¹ããå®è¡ã§ããã¢ã»ã³ããªãå¿ èŠã§ãããQAããŒã ã®æ¿èªãåŸãããã«æåãã¹ãã«åŒãæž¡ããŸãã Bambooã¯ãããã«å¿ èŠãªãœãªã¥ãŒã·ã§ã³ãæäŸããŸãã ããã¯ãã©ã³ããã©ã³ãšåŒã°ãããã«ãã§ã¡ã€ã³ãã©ã³ãïŒããšãã°ãalphaïŒãå®çŸ©ãããæå®ããããã³ãã¬ãŒãã«åŸã£ãŠäžèŽãããã¹ãŠã®ãã©ã³ããæ©èœãã©ã³ããšèŠãªãããããšã«ãããŸãã ãã«ããã©ã³ã®ã¯ããŒã³ãäœæãããŸããããã§ãã¯ã¢ãŠãã¯ãã«ããã©ã³ã®ã¡ã€ã³ãã«ãããã§ã¯ãªãããã®ãã©ã³ãããè¡ããããšããéãããããŸãã ãããªæãã§ãã
ãã«ããã©ã³ã衚瀺ãããšãã«ãã¡ã€ã³ãã©ã³ããšæ¢åã®ãã©ã³ããåãæ¿ããŠããã¹ãŠã®ããŒã«ã«ã¹ããŒã¿ã¹ã®çµæã衚瀺ã§ããŸãã
åå²èšç»èªäœã¯ãã¿ã¹ã¯ãžã®ãªã³ã¯ãããããšãé€ããŠåãããã«èŠããŸãã
ãã®ãããªãããŒã§ã¯ããã©ã³ãã¯äœæãããç¬éããå¿ ç¶çã«å»æ¢ããå§ããŸãã ã¡ã€ã³ãã©ã³ããšã®ç«¶åãæ©æã«æ€åºããæŽæ°ãããã³ãŒãããã¹ãããã«ã¯ãéçºäžã«ãã©ã³ããåžžã«æŽæ°ããå¿ èŠããããŸãã Bambooã¯ããããžã§ã¯ãã®æ§ç¯ãéå§ããåã«ããããèªåçã«è¡ãæ¹æ³ãç¥ã£ãŠããŸãã 競åãçºçããå Žåãã¢ã»ã³ããªã¯ãã€ã¯åŠçããããéçºè ã¯æåã«ãã©ã³ããã¢ããã°ã¬ãŒãããŠããããããã®å€æŽãããã·ã¥ããå¿ èŠããããŸãã ãã®åŸãã¢ã»ã³ããªã®åã«ç«¶åã¯çºçããããã¹ãŠãéåžžã©ããç¶è¡ãããŸãã
補åãã¬ãŒããŒ
ããã€ãã®ããªãšãŒã·ã§ã³ãå€æŽãããªãœãŒã¹ãã³ãŒããæ§æã§çµã¿ç«ãŠãå¿ èŠããããããžã§ã¯ãããããšããŸãããã ãããå®è£ ããæ¹æ³ã«ã¯ããã€ãã®ãªãã·ã§ã³ããããŸãã ç§ãã¡ã¯ãã¢ã»ã³ããªã®ãã¹ãŠã®æ¡ä»¶ããã¹ãŠã®æ§æãããã³ãã®ä»ã®èª¬æçãªéšåããã«ãã¹ã¯ãªããã«å«ããå¿ èŠããããšããäºå®ã«å°ãããŸããã ç§ãã¡ã®å Žåã Gradleã¯ãã®åé¡ã解決ããã®ã«çæ³çã§ãã åªããAndroidãã©ã°ã€ã³ããããè€éãªãããžã§ã¯ããæ§ç¯ããããã®æšæºããã³éæšæºãã©ã¡ãŒã¿ãŒã®ã»ãšãã©ãæè»ã«æ§æã§ããŸãã
ç©æ¥µçã«äœ¿çšããã³ãµããŒããããã«ããªãã·ã§ã³ã®æ°ãèŠãŠã¿ãŸãããã
ãŸãã3ã€ã®äž»èŠãªè£œåãã¬ãŒããŒããããžã§ã¯ã1ããããžã§ã¯ã2ãããã³ãããžã§ã¯ã3ããããŸãã
補åãã¬ãŒããŒã¯ã補åãã©ã³ããè¡šããŠããŸãã ã»ãšãã©ã®å Žåããããã¯ç°ãªãããã±ãŒãžãç°ãªã眲å蚌ææžãç°ãªããœãŒã¹ããã³ãªãœãŒã¹ãæã€ç°ãªãã¢ããªã±ãŒã·ã§ã³ã§ãã ã¢ããªã±ãŒã·ã§ã³ããšã«ãããã€ãã®ãã«ããªãã·ã§ã³ããããŸãã
- debug-ãããã°ããŒã§çœ²åããé£èªåããã«ãããã°ã§ããŸãã
- ã¢ã«ãã¡/ãã©ã³ãã¢ã«ãã¡ -é£èªåãããã¢ã»ã³ããªãåæã®æ§æããã£ãã·ã¥ã®ã¢ã»ã³ããªããªãœãŒã¹ãã¢ããªã±ãŒã·ã§ã³ã§å©çšå¯èœãªãããã°èšå®ã«ãã£ãŠåºå¥ãããŸãã
- beta corp-ãã°ãæå¹ã«ãªã£ãŠããããããã°ã¢ãŒããå©çšå¯èœãªããŒã¿çã
- beta-ãªãªãŒã¹ã«å¯èœãªéãè¿ãã¢ã»ã³ããªãåæãã¯ã©ãã·ã¥ã®ã¢ã»ã³ããªããã°ãªãããããã°ã¢ãŒããç°ãªãããããã°èšå®ã¯ãããŸããã
- release-ã¢ããªã±ãŒã·ã§ã³ã®è£œåçãã»ãšãã©ãã¹ãŠã®è¿œå ãªãã·ã§ã³ããªãã«ãªãããããã®ã·ã¹ãã ã®æŠéãããžã§ã¯ãçšã«åæããã³çµ±èšåéãæ§æãããŸãã
- ãŠããã/ UIãã¹ã -ãããã§ã¹ããäžæžããããã¢ã»ã³ããªãããšãã°ãSMSã³ãŒãã䜿çšããèªåå ¥åãã¹ãïŒæ¿èªãç»é²ã2èŠçŽ æ¿èªïŒã«å¿ èŠãªSMSã®èªã¿åããèš±å¯ã§ããŸãã
åèšïŒ
8ãã«ãã¿ã€ã* 3補åãã¬ãŒããŒ= 24ã¢ããªã±ãŒã·ã§ã³ããªã¢ã³ã
ãªããããªã«ïŒ çããããšããŸãã ç°ãªãç°å¢ã§å ¬éãããŠãã3ã€ã®ç°ãªã補åã§è§£æ±ºããå¿ èŠãããäžè¬çãªã¿ã¹ã¯ã®1ã€ã¯ãåæãå ±æããããšã§ãã ãŸãããããè¡ãå¿ èŠããããŸããããããªããšãã¢ããªã±ãŒã·ã§ã³ã®ã¢ã«ãã¡çã®çµ±èšæ å ±ãããããã¯ã·ã§ã³ã«ååšããç»åãæªããŸãã ã¯ã©ãã·ã¥ã«é¢ããçµ±èšãåéããã«ã¯ã HockeyAppã䜿çšããŸã ã ãã®äžã«ã¯ãç°ãªãã¢ã»ã³ããªãªãã·ã§ã³çšã®åå¥ã®ãããžã§ã¯ãããããŸãã ããã«ãããããšãã°ãProject 1ã®ã¯ã©ãã·ã¥ãšProject 2ã®ã¯ã©ãã·ã¥ãããŒã¿çã®ãªãªãŒã¹ããŒãžã§ã³ãªã©ãç°¡åã«åé¢ã§ããŸãã
ãããžã§ã¯ãã®build.gradleã§ã¯ããã®æ§æã¯æ¬¡ã®ãšããã§ãã
productFlavors { project1 { ... android.buildTypes { alpha { hockeyApp { [appId: 'b45-------1b', note: project.issues, releaseType: '2'] } } beta { hockeyApp { [appId: 'c9d-------86', note: {''}, releaseType: '0'] } } publicBeta { ... } release { ... } } } project2 { ... android.buildTypes { alpha { hockeyApp { [appId: '1ac-------73', note: project.issues, releaseType: '2'] } } ... } } project3 { ... android.buildTypes { alpha { hockeyApp { [appId: 'dcd-------3c', note: project.issues, releaseType: '2'] } } ... } }
ãããã£ãŠãã¢ã»ã³ããªãªãã·ã§ã³ã«ããŸããŸãªå€ãèšå®ã§ããŸãã ãªãœãŒã¹ãšãœãŒã¹ã³ãŒãã«é¢ããŠã¯ã1ã€ã®æ©èœãé€ããŠãã»ãŒåãååãããã§äœ¿çšãããŸããç°ãªããªãã·ã§ã³ã®ãªãœãŒã¹ãããŒãžããããšãå¯èœã§ãã ç§ãã¡ã®ãããžã§ã¯ãã«ã¯ããã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ã§åããªãœãŒã¹ããããŸã-ããšãã°ãæçŽãæžãããã«ç»é¢ãããŒã¯ããŸãã ãã®ãããªãã¡ã€ã«ãåãªãœãŒã¹ããã±ãŒãžã«ã³ããŒããŠåå¥ã«ä¿æããå¿ èŠãããå Žåãæžã蟌ã¿ç»é¢ã®ã¬ã€ã¢ãŠããå€æŽããå Žåã3ã€ã®ãã¡ã€ã«ãå€æŽããå¿ èŠããããŸãã 幞ããªããšã«ãgradle + androidãã©ã°ã€ã³ã¯ãªãœãŒã¹ãããŒãžã§ããŸãã
ãããã©ã®ããã«çºçãããã«ã€ããŠè©³ãã説æããŸãã誰ããåãã¢ãããŒãã䜿çšããŠæ¥åžžã®ã¿ã¹ã¯ã解決ã§ããå¯èœæ§ããããŸãã
ãªãœãŒã¹ãæã€ãã©ã«ããŒãããã€ãç¹å®ããŸããïŒãããã¯ãã¹ãŠãããžã§ã¯ãã®ã«ãŒãã«ãããŸãïŒã
- res-ã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãŠã®ããªã¢ã³ãã«å ±éã®ãªãœãŒã¹ïŒå ±éã®ã»ã¬ã¯ã¿ãŒãããŒã¯ã¢ãããããŒããã¹ã¿ã€ã«ãªã©ã
- res_project1-ãããžã§ã¯ã1ã«åºæã®ãªãœãŒã¹ïŒããã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšãããã»ãŒãã¹ãŠã®ã°ã©ãã£ãã¯ããããžã§ã¯ãã®ååãå«ãè¡ãç¹å®ã®ããŽãŸãã¯ããŒã¯ã¢ãããå«ãŸããŸããäžè¬ã«ããããžã§ã¯ã1ã«ã®ã¿é©çšããããã¹ãŠã
- res_project23-ããã¯å°ãç°ãªããŸãããããžã§ã¯ããšäº€å·®ããªããããããžã§ã¯ã2ãšãããžã§ã¯ã3ã§åããªãœãŒã¹ã¯ãã¹ãŠres _ project23ããã±ãŒãžã«åé¡ãããŸãããã®ãããªãªãœãŒã¹ã®ã°ã«ãŒãåã¯ãçç£æ§ã®é«ããããžã§ã¯ã2ãšããã¯ããããžã§ã¯ã1ãšã¯ãŸã£ããç°ãªããŸãããã以å€ã®å ŽåãåããªãœãŒã¹ããã©ã«ããŒres_project2ããã³res_project3ã«ã³ããŒããå¿ èŠããããŸãã
- res_ project2 -Project 2ã«åºæã®ãªãœãŒã¹ïŒçŸæç¹ã§ã¯ããããã¯è²ãã°ã©ãã£ãã¯ãããã¹ãã§ãã ãã®ä»ã¯ãã¹ãŠå ±éã®ããã±ãŒãžã«å«ãŸããŠããŸãã
- res_ project3 -Project 3ã®å Žåãšåæ§ã«ããã®ã¢ããªã±ãŒã·ã§ã³ã«åºæã®ãªãœãŒã¹ã®éžæã®ã¿ããã®ããã±ãŒãžã«æ®ããŸãã
ãã®çµæãåãã«ããªãã·ã§ã³ã«ã€ããŠãããã€ãã®ããã±ãŒãžãããŒãžããŠãã¢ããªã±ãŒã·ã§ã³ã®ãªãœãŒã¹ã®å ±éã»ãããååŸããŸãã
- ãããžã§ã¯ã1 = res + res_project1;
- ãããžã§ã¯ã2 = res + res_project23 + res_ project2;
- ãããžã§ã¯ã3 = res + res_project23 + res_ project3ã
ãããåºæ¬ã§ãã ãã詳现ãªã«ã¹ã¿ãã€ãºãè¡ãã«ã¯ãããšãã°ãç¹å®ã®ãªãœãŒã¹ããã¹ããã«ãã®ã³ãŒããªã©ãè¿œå ããŸãã ãœãŒã¹ã³ãŒããå«ãã¯ããŒãžã£å šäœã¯æ¬¡ã®ããã«ãªããŸãã
sourceSets { main { manifest.srcFile 'AndroidManifest.xml' java { srcDir 'src' exclude '**/instrumentTest/**' } resources.srcDirs = ['src'] aidl.srcDirs = ['src'] renderscript.srcDirs = ['src'] res.srcDirs = ['res'] assets.srcDirs = ['assets'] } androidTest { manifest.srcFile 'src/instrumentTest/AndroidManifest.xml' java.srcDir 'src/instrumentTest/Java' } project2 { res.srcDirs = ['res_project2', 'res_project23'] java.srcDirs = ['src_common'] assets.srcDirs=['assets_ project2] manifest.srcFile 'res_ project23/AndroidManifest.xml' } project3 { res.srcDirs = ['res_project3', 'res_ project23] assets.srcDirs=['assets_project3'] java.srcDirs = ['src_project3'] manifest.srcFile 'res_ project23/AndroidManifest.xml' } project1 { res.srcDirs = ['res_project1'] java.srcDirs = ['src_common'] assets.srcDirs=['assets_project1'] manifest.srcFile 'res_project1/AndroidManifest.xml' } testingUi { manifest.srcFile 'ui_testing/AndroidManifest.xml' } }
å°èŠæš¡ã®å Žåã¯ãã®ãŸãŸã§ãã ãã«ããããžã§ã¯ãã®æ§æã§ãç®çã®.apkãååŸããããã«æ£ããã¿ã¹ã¯ãå®è¡ããå¿ èŠããããŸãïŒããšãã°ãgradle assembleProject1PublicBetaïŒã åœç¶ã®ããšãªããããã®ãããªå€æ°ã®ã¢ã»ã³ããªãªãã·ã§ã³ãããå Žåããããããã¹ãŠé çªã«åéããã®ã§ã¯ãªãããã®ããã»ã¹ã䞊ååããããšã«ããŸããã åèšã§ãã¢ã»ã³ããªãã§ãŒãºã®äžéšãšããŠå®è¡ããã6ã€ã®äžŠè¡äœæ¥ãåãåããŸããã åäœåã¯ã補åããšã«3ã€ã®ææç©ãå ¬éããŠããŸãã
ãããŸã§èªãã 人ã«ã¯è³ªåããããšæããŸãïŒãããžã§ã¯ãããã«ããããã³ã«ããŒã¿çãåéããŠãªãªãŒã¹ããã®ã¯ãªãã§ããïŒ è³ªåã¯æ¬åœã«ãšãŠãèå³æ·±ãã§ãã ç§ãã¡ã¯ããã«ã§ã¯ãªããé·ãæéããããŠãã®æ±ºå®ã«è³ããŸããã æŽå²çã«ã¯ãããŒã¿ãã«ããšãªãªãŒã¹ãã«ãã¯ãã³ãŒããåããªããžã§ã³ãŸãã¯ã³ã³ãã©ã¯ãã䜿çšããŠå¥ã ã«ãã«ããããŠããŸããã ãããŠããã®ã¢ãããŒãã«ã¯å€ãã®åé¡ããããæãäžæå¿«ãªã®ã¯ãããŒã¿çã®å ¬éã決ããåŸã«ã¢ã»ã³ããªã®ã¹ããŒã¿ã¹ãç¥ãããšã§ãã ããŒãã£ãŒã®æ³åã«ããã°ããã¡ããããã«ãã¯èµ€ããªããŸãã äœããã®çç±ã§ã å€æŽãå€ãã»ã©ãã¢ã»ã³ããªã«æªåœ±é¿ãäžããå¯èœæ§ãé«ããªããŸãããããã«ã€ããŠã¯äœãã§ããŸããã ãšã©ãŒãçºçããŠããæ€åºããããŸã§ã®æéééã®ã¿ãççž®ã§ããŸãã ãŸããçæ³çãªã±ãŒã¹ã§ã¯ãå ±éã®ãã©ã³ãããåãé¢ããŠå®è¡ããŸãã ãããžã§ã¯ããç¡èŠããŠãããŒã¿çãŸãã¯ãªãªãŒã¹çã®ã¿ããã«ãããèªååããã»ã¹ãèŠããšãããã»ã¹èªååãæ§ç¯ããããã®ã¢ãããŒãå šäœã®äž»èŠãªå質ææšã®1ã€ããããããã§ããã ãæ©ãåé¡ãçºèŠããæ©äŒããããŠæãéèŠãªããšãšããŠãåŠã¶åã«ãããã®å€æŽãã©ã®ããã«äžè¬çãªãã©ã³ãã«å ¥ã£ããã
確èªãã
ãã¡ãããã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã§ã®èªåå質管çã¯ãæšå¹Žã®åŸåã§ãã ç§ã®çµéšã§ã¯ãå€ãã®äººã«ãšã£ãŠãããã¯éçŸå®çãªãã®ã§ãã 誰ããããã«ã€ããŠè©±ããŠããããã»ãšãã©èª°ãèŠãããšããªãã ç§ãã¡ã¯2幎éãããžã§ã¯ãå ã§ãã®ãããªã¿ã¹ã¯ã«åãçµãã§ããŸãããããã®éãéçºè ã察åŠããªããã°ãªããªã埮åŠãªç¹ã®ã»ãšãã©ãããªãæ確ã«ç解ããŠããŸããã ãããã®åé¡ãšè§£æ±ºçã¯ãã¹ãŠãã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠã¯ããªãæ°ããäžå®å®ãªã»ã°ã¡ã³ãã§ããããŠã§ãã¯é·ãéãã®ããã«ãªã£ãŠãããååãªæ°ã®æšæºåããã解決çããããŸãã
ã»ãšãã©ã®äººãæåã«æã£ãŠãã質åã¯ãäœãèªååãããã§ãã éçºè ãçããŸãïŒã³ãŒãããã¹ããããããŒãžã£ãŒã¯æ©èœããã¹ãããå¿ èŠããããšããã«äž»åŒµãå§ããŸãã ç§ã¯ãã¹ããäž¡æ¹ã§ãããšä¿¡ããŠããŸãã
äžè¬ã«ãã¢ããªã±ãŒã·ã§ã³ã«ã€ããŠèª¬æãããšããã¹ãŠã®ãã§ãã¯ã¯ããã€ãã®ã«ããŽãªã«åé¡ãããŸãã
- éçåæ ïŒãã®ã¢ãããŒãã«ããŸã泚æãæãããŠããªãçç±ã¯ããããŸããããåã ã®ã¯ã©ã¹ã§ã¯ãªãããããžã§ã¯ãå šäœã«æ£åŒãªã«ãŒã«ãé©çšã§ããéåžžã«åŒ·åãªããŒã«ã§ãã
- UnitTesting ïŒãã®ã¯ã©ã¹ã®éçºè ãŸãã¯ãŠãŒã¶ãŒãæåŸ ãããšããã«ã¯ã©ã¹ãæ£ç¢ºã«æ©èœããããšã確èªããå€ãè¯ããŠããããã¹ãã
- UiTesting ïŒæçµçµæã確èªããæ©èœç/ãšã³ãããŒãšã³ããã¹ãïŒãŠãŒã¶ãŒã«è¡šç€ºãããå 容ãšããŠãŒã¶ãŒããããã©ã®ããã«äœ¿çšãããã
éç解æ
éçã¢ãã©ã€ã¶ãŒãšããŠãæ¢è£œã®ãœãªã¥ãŒã·ã§ã³ã䜿çšããŸãã Androidã®å Žåãããã¯Lintã§ãããæè¿ã§ã¯Androidåºæã®ã³ãŒããããŒã¯ã¢ãããªãœãŒã¹ãã°ã©ãã£ãã¯ã¹ãªã©ã®å質ãç£èŠã§ããéåžžã«å¹æçãªããŒã«ã«ãªããŸããã ãšãããããããžã§ã¯ãå ã®å¥çŽã«åºæã®ç¬èªã®ãã§ãã¯ãè¿œå ã§ããŸãã ãããã®å¥çŽã®1ã€ã¯ãã¬ã€ã¢ãŠãé¢é£ã®ãã©ã¡ãŒã¿ãŒãã¹ã¿ã€ã«ã«å«ããªãããšã§ãã ããšãã°ãããããã£layout_margin \ layout_alignParentTopãŸãã¯ãã®ãããªãã®ã æ§æã®èŠ³ç¹ããã¯ããããã®ããããã£ãã¹ã¿ã€ã«ã«å ¥ããããšãçŠæ¢ãã人ã¯ããŸãããããã®å Žåãã¹ã¿ã€ã«èªäœã¯UIã³ã³ããŒãã³ãã®ããžã¥ã¢ã«ã³ã³ããŒãã³ãã決å®ããããã«äœ¿çšããããããŒã¯ã¢ãããã¡ã€ã«ã«æžã蟌ãããšãã§ããªãå€ãæ ŒçŽããããã«äœ¿çšãããŸãã ã€ãŸããã¹ã¿ã€ã«ã¯å±æ§ã³ã³ãããšããŠäœ¿çšãããŸãã 第äžã«ãLayoutParamsã¯ãŸã ããŒã¯ã¢ããã«é¢é£ãã第äºã«ããããã®å±æ§ãæžã蟌ãŸããŠããã¿ã°ã®ã³ã³ãããŒã«ã§ã¯ãªãããã®èŠªã«é¢é£ããŠããããããããã¯åé¢ãããã¹ãç°ãªããã®ã§ãããšå€æããŸãã圌ã暪ããã£ãŠããŸãã
ãããèŠããšãã³ãŒããæžãããã®ã¬ã€ããããŒã¯ã¢ãããªãœãŒã¹ããããå€ããå°ãªããæåããŠãããããžã§ã¯ãã«ã¯ããã®ã¢ããªã±ãŒã·ã§ã³ã«å žåçãªã¿ã¹ã¯ã解決ããããã®ãã³ãã¬ãŒããããããã®ãããªãã®ããããããããŸãã ãããã¯ã³ãŒãã¬ãã¥ãŒã®æ®µéã§è¿œè·¡ãããææžåãããå¶æ¥æ¥ã®åãã«æ¯åæãåºãããŸãããŸãã¯ããããã®é¡ãã«æ £ããããå°æ¥ã誰ãããããå®çŸã§ãããšæåŸ ã§ããŸãã 圌ããèšãããã«ãä¿¡ãã人ã¯ç¥çŠãããŸãããéå±ãªä»äºãããã«çµããããããã«æ¥ãã§ãç§èªèº«ã¯ãããå¿ãããäœãèŠéããªãããšãç¥ã£ãŠãç§ã¯å人çã«ã¯ããã«å¿«é©ã«åããŸãã ãã®ãããªãã§ãã¯ã圢åŒåãã䟿å©ãªã¬ããŒãã䜿çšããŠã¢ã»ã³ããªããã»ã¹ã«è¿œå ããå¿ èŠããããæ°ããã¿ã¹ã¯ãå®è¡ããå¿é ã¯ãããŸãããçªç¶ããã¹ãŠã®ãã§ãã¯ãã¹ãããããã³ãŒããèŠã€ãããŸãã
å°åæãæžãã®ã¯ç°¡åã§ã楜ãããããããŸãã éçãã§ãã¯ãè¿œå ããããã»ã¹ã§ã¯ãä»ã®åé¡ãéçã«ç¹å®ããæ¹æ³ã«é¢ããå€ãã®ã¢ã€ãã¢ãããã«çŸããŸãã ã¬ã€ããšå ¬åŒããã¥ã¡ã³ãã¯Lintã«åœ¹ç«ã¡ãŸãã Android Studioã§ã«ãŒã«ãçŽæ¥éçºã§ããŸãã
tools.android.com/tips/lint-custom-rules
tools.android.com/tips/lint/writing-a-lint-check
Javaã³ãŒãã®å Žåãé·ãéçºæãããéçã¢ãã©ã€ã¶ãŒããããŸãã ãã¹ãŠããªã¹ãããã®ã§ã¯ãªããFindBugsã䜿çšããŠããããšãäŒããŸãã ããŒã«ãéžæãããšãã䟿å©ãªåœ¢åŒããã§ãã¯ããããã®ååãªéã®ã«ãŒã«ãããã³ç¬èªã®ã«ãŒã«ãè¿œå ããæ©èœãååŸãããã£ãã®ã§ãã çŸæç¹ã§ã¯ãéããã«ãŒãœã«ã®ç¢ºèªãã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ãã§AccountManagerã€ã³ã¹ã¿ã³ã¹ãåžžã«ååŸãããããšã®ç¢ºèªãã€ãã³ãã¯ã©ã¹ãã³ãã¬ãŒãã®äœ¿çšæã«åŒã³åºãããå¿ èŠãããonEventCompleteã¡ãœããã®åŒã³åºããªã©ã®å¿ èŠãªç¢ºèªãèšè¿°ããŸããã å éšããŒã ã®é 眮ã決å®ããç¬èªã®ã«ãŒã«ãè¿œå ããäžæ³šæã«ããäžè¬çãªãã¹ãé²ãããšã¯ãã³ãŒãã®ã¬ãã¥ãŒãšãã¹ãã®æéãççž®ãããã®ãããªãšã©ãŒãå°ãªããšãå°æ¥çã«ã¢ããªã±ãŒã·ã§ã³ã®å®çšŒåããŒãžã§ã³ã«å ¥ããªãããã«ããçŽ æŽããããã©ã¯ãã£ã¹ã§ãã å°åæãæžãããã®ã¬ã€ããšããŠã FindBugsãããŒã2ïŒã«ã¹ã¿ã æ€åºåšã®èšè¿°ã䜿çšããŸããã ç¬èªã®ãã©ã°ã€ã³ãäœæããæ€åºåšãè¿œå ããæ€èšŒããã»ã¹ã§ããã䜿çšããæ¹æ³ãæ確ã«ç€ºããŠããŸãã ã¬ããŒãã¯ããã©ãŒããããããHTMLããã¥ã¡ã³ããŸãã¯XMLã¬ããŒãã®åœ¢åŒã§æäŸãããŸããXMLã¬ããŒãã®åœ¢åŒã§ã¯ãç°¡æœã«ãå Žåã«ãã£ãŠã¯ããšã©ãŒãèŠã€ãã£ãã¯ã©ã¹/ã¡ãœããããšã©ãŒã³ãŒããæååãªã©ãèšè¿°ãããŸãã ããã¯éåžžãèªåã§ã¯ãªãŒã³ã¢ããããªãã£ãå Žæãç解ããã®ã«ååã§ã:-)ã
ãããã§ããã èšå€§ãªã«ãŒã«ãšããããééããæ¢ã«çšæãããŠããŸãããããè£ãæ©äŒããããŸããåæ°ãèŠã€ããŠäœ¿ãå§ããã ãã§ãã
ãããžã§ã¯ãã§SNAPSHOTããŒãžã§ã³ã®ã©ã€ãã©ãªã䜿çšããŠããããšã«æ°ã¥ãããšãã æããã«ãããã¯ã䜿çšããã©ã€ãã©ãªã«ãããã®å€æŽãå ãããããšãã«ãã¿ã¹ã¯ã®ãã©ã³ãã§ã®ã¿èš±å¯ãããŸãã ã³ãŒããã¡ã€ã³ãã©ã³ãã«æ³šãããåŸããããžã§ã¯ãã«ã¯ã¹ãããã·ã§ããã衚瀺ãããªãã¯ãã§ãã ãã®å Žåãçç±ã¯éåžžã«æ£çºçã§ããããããã®ãšã©ãŒã®ã»ãšãã©ãç¹åŸŽã¥ããŠããŸãã ã¿ã¹ã¯ããã¹ãããããã®ããŒãžã§ã³ãå®äºã®ãã¹ãŠã®å®çŸ©ã«éãããšå€æãããåŸãéçºè ã¯ã©ã€ãã©ãªãã¡ã€ã³ãã©ã³ãã«ããŒãžãããã®ã©ã€ãã©ãªã®æ°ããããŒãžã§ã³ã決å®ããã¡ã€ã³ãããžã§ã¯ãã®ããŒãžã§ã³ãå€æŽããã®ãå¿ããã®ã§éåžžã«æºè¶³ããŠããŸããã åé¡ã¯ãLintãFindBugsããã«ãã¹ã¯ãªããããã¹ãã§ããªãããšã§ãã ããã«ããããã®ãã§ãã¯ãbuild.gradleèªäœã«è¿œå ãããå Žåã§ãããããã©ãã§æå¹ã§ãã©ãã§æå¹ã§ãªãããç¥ãå¿ èŠããããŸãã æããã«ãããã¯ãã©ã³ãã§ã¯èš±å¯ãããŠããŸãããã©ã³ãã§ã¯ã©ã€ãã©ãªãå€æŽãããŠããŸãããäžè¬çãªãã©ã³ãã«å ¥ã£ãåŸã¯åãå ¥ããããŸããã ããããgit pre-receiveããã¯ã䜿çšããŠããªããžããªã¬ãã«ã§ãããžã§ã¯ãã§äœãèµ·ãã£ãŠãããã远跡ããæ¹æ³ã§ãã
å€ãã®ããŒã ããããŒãžã§ã³ç®¡çã·ã¹ãã ã®ã¬ãã«ã§ãããžã§ã¯ãã«é©ããã«ãŒã«ãèšå®ããã®ã«æéãè²»ããå¿ èŠããªããšèããŠããããšãç¥ã£ãŠããŸãããæãè ã¯ããŸããã誰ããªããžããªã®ãã¹ãŠã®ãã©ã³ããåé€ããŸãããçç±ã¯ãäŸãã°ãæéäžè¶³ã«ãããã®ã§ãã ç§ãã¡ã«ãšã£ãŠãããã¯åæ Œæ®µéã§ããããå°ãæéããããæ¹ãè¯ããšãã決å®ã«è³ããŸãããã補åã®å®å šæ§ãšå質ã«ã¯èªä¿¡ãæã£ãŠããŸãã ãããã®ç®çã®ããã«ãäºååä¿¡ããã¯ã¯éåžžã«ããŸãæ©èœããŸããå€æŽãäžè¬çãªãã©ã³ãã«è¿œå ãããŠããããšã確èªãããã®äžè¬çãªãã©ã³ãã®HEADã«äžèŠãªã³ãŒããå«ãŸããŠããªãããšã確èªã§ããŸãã æè¯ã®å Žåããã®ãããªãã§ãã¯ã®ååšã誰ãç¥ãããšã¯ãããŸããããå®è·µã瀺ãããã«ãã©ã³ãã ãªãšã©ãŒã¯æ æã«çªãåºãããšãå¯èœã«ããã®ã«ååã§ãã Pre-receiveããã¯ã¯ãéçºè ãåãã§é 眮ãããã¹ãŠã®ä¿®æ£æžã¿TODOããã³FIXMEããã§ãã¯ããã®ã«æé©ã§ãããä¿®æ£ããã®ãå¿ããŠããŸãã ãŸããå€ãã®è©³çŽ°ãå¿ èŠãšããéåžžã«è€éãªãã°ããã©ã³ãã§èŠã€ãã£ããããéçºè ãé¢å¿ã®ãããã¹ãŠã®æ©èœã«æ°ããThrowableïŒïŒã®åºåãè¿œå ããããšã§ãå žåçãªãã®ã³ã°ã®åé¡ã«å®å šã«å¯ŸåŠããŸãã ç§ãã¡ã«ãšã£ãŠããã¹ã远跡ããèœåã¯ãåãã¬ãŒããåã³èžãŸãªãããšãç解ããããã«èªåçã«éèŠã§ãã 誰ããééããç¯ããŸããããã¯ããªãããã®åŸã©ã®ãããªçµè«ãåºããã ããéèŠã§ãã ç§ãã¡ã®çµè«ã¯ãä¿®æ£ã«å ããŠããããã®ãšã©ãŒãåŒãç¶ãã³ããããããªãããã«ããããã®åªåãå¿ èŠã§ãããšããããšã§ãã
åäœãã¹ã
ããã§ã¯ãæŠããŠããã¹ãŠãåœããåã§ãã ã¯ã©ã¹ã«ãã£ãŠã¯ãã¯ã©ã¹ãæå³ãããšããã«æ©èœããããšã確èªããããã®ãã§ãã¯ãèšè¿°ãããŠãããåæã«ã¯ã©ã¹ã®ã¯ã©ã€ã¢ã³ãã«äœ¿çšæ¹æ³ã®äŸã瀺ããŠããŸãã çŸæç¹ã§ã¯ãåäœãã¹ãã¯å®éã®ããã€ã¹ã§å®è¡ãããŸãããå¿ èŠã«å¿ããŠå®éã®æ¥ç¶ã¯ç¢ºç«ãããŸããã ãšããã§ãæ¥ç¶ã確ç«ããå¿ èŠæ§ã«ã€ããŠïŒéçºè ãç¹å®ã®ã¢ãžã¥ãŒã«ããã¹ãããæ¹æ³ãèãããšããã»ãšãã©ã®å ŽåããŸããçŸåšã®ç°å¢ãããã¹ããåé¢ããããã«ã¯ã©ã¹ã®äŸåé¢ä¿ã眮ãæããæ¹æ³ãèããŸãã ãããã¯ãŒã¯æ¥ç¶ã®å Žåãããã¯å°é£ãªã¿ã¹ã¯ã®ããã«æãããããããŸããããããã¯ãŒã¯ã®çžäºäœçšã¯åäžã®ã¡ãœããåŒã³åºãã«çœ®ãæããããªããããæ¿¡ããã«ã¯ããžãã¯ã®å±€ãå¿ èŠã§ãã ãã°ããã®éãã¢ããªã±ãŒã·ã§ã³ã³ãŒãã§ããã¯ã䜿çšããŠãµãŒããŒã®å¿çã眮ãæããããã䜿çšããŠåŸç¶ã®ãã¹ãŠã®ã¢ã¯ã·ã§ã³ãå®è¡ããããšã«æµæããŸããã å®éããã®ã¢ãããŒãã¯æŠéã¢ããªã±ãŒã·ã§ã³ã§åäœããã³ãŒãããã¹ããããªããšãããªã¹ã¯ãå¢å ããããšããããšã§ãã åé¡ãçºçãããã³ã«ãå©äŸ¿æ§ããã¹ãããããã«ã¯ã©ã¹ã€ã³ã¿ãŒãã§ã€ã¹ãå€æŽãã䟡å€ãããããããã€ãã®äŸåé¢ä¿ããããã¯ã¢ãããããããã«é¢æ°å®è¡ããã»ã¹ã«è¿œå æ¡ä»¶ãè¿œå ãã䟡å€ãããããç§ã¯æ¬¡ã®äœçœ®ãåºå®ããããšããŸãïŒãŸãããã¹ãŠã®ã³ãŒãã¯å®å šã§ããã¢ããªã±ãŒã·ã§ã³æ©èœã®é¢ã§ã ã³ãŒãã«è¿œå ãããè¿œå æ¡ä»¶ãåå¥ã®ãã§ãã¯ãå¿ èŠãšããå Žåãããã¯ãã¹ãã«ã¯å¿ èŠãããŸããã ããããéåžžã®ã»ãã¿ãŒã«æºè¶³ããªãã£ãäž»ãªçç±ã§ããã»ãã¿ãŒã¯åã«çãã眮ãæããå¥ã®ãœãŒã¹ãããããååŸããŸãã
ãã®çµæãç§ã®æèŠã§ã¯ãããæ£çŽã«å¥ã®æ±ºå®ã«è³ããŸããã ããã¯ããã¹ãã®1ã€ãã©ã®ããã«èŠãããã§ãããç¹å®ã®åçã§ã³ãã³ããã¹ããŒã¿ã¹ãerror_folder_not_existããäžããããšã確èªããŸãã
@AcquireCookie @LargeTest public void testDeleteNonExistingFolder() { DeleteFolder delete = runDeleteFolder(999); assertERROR_FOLDER_NOT_EXIST(delete); }
ãã®ãã¹ãã§ã¯ããµãŒããŒã«å¯ŸããŠæ£çŽãªèŠæ±ãè¡ããŸããã€ãŸããããŒã ã¯ã¢ããªã±ãŒã·ã§ã³ãšãŸã£ããåãããã«åäœããŸãã åé¡ã¯ãåäœãã¹ãããå®è¡äžã®ããã€ã¹ã§ãããã¯ãŒã¯ãã©ã®ããã«æ§æãããŠãããã«äŸåããããšã§ãã 次ã«ã2çªç®ã®ãã¹ãã瀺ããŸããããã¯ããŸã£ããåãããšã確èªããŸãããå®éã®èŠæ±ãå®è¡ãããããµãŒããŒãšå¯Ÿè©±ãããããããšãªããæ¢ã«ç®çã®åçã眮ãæããŠããŸãã
@MockMethod(response = RESPONSE_NOT_EXISTS) public void testDeleteNonExistingFolderMock() { testDeleteNonExistingFolder(); }
ãããã£ãŠããã¹ãã®å®è¡ãå¶åŸ¡ããããšãã§ããŸã-ããã¯ãããšãã°ããã«ãã®ã¹ããŒã¿ã¹ããµãŒããŒã®å¿çãèæ ®ããªãããã«ããããã«å¿ èŠã§ãã èšè¿°ããã察話ãããã³ã«ã«äŸåããèŠæ±ãæ£ãã圢æãããããšã確èªããïŒãã¡ãããåäœãã¹ãã䜿çšããŠïŒããšã§ããµãŒããŒãæ£ããçããè¿ãããšã確èªã§ããŸãã ãããŠãæ£ããçããããã°ãã¢ããªã±ãŒã·ã§ã³ãããã«å¿ããŠè§£éããããšã確èªããããã ãã«æ®ããŸãã ãã ããããšãã°ããã€ããªãŒãã«ãã®å ŽåããµãŒããŒãšå¯Ÿè©±ããããã®å¥çŽãç Žãããªãããã«ããããšããå§ãããŸãã ãã®ããã«ãå®éã«çžäºäœçšãããã¹ããå«ããã¹ãŠã®ãã¹ããéå§ãããŸãã ããã«ãããäœããã®ãã°ãåå ã§ãµãŒããŒãšã®å¯Ÿè©±ã®å¥çŽãââç Žãããå Žåã«åããŠãè¿œå ã®ãšã¢ããã°ãæäŸãããŸãã ããã«ã€ããŠã¯ãåžå Žã®ãŠãŒã¶ãŒã¬ãã¥ãŒããã§ã¯ãªãããã¹ãçµæããåŠç¿ããŸãã æ©èœãæåããæåŸãŸã§ç¢ºèªããããšãéåžžã«éèŠãªå Žåã¯ããããã®ãã¹ããåºæ¬ã«ããŠãã¢ããªã±ãŒã·ã§ã³ã®ãã«ãããšã«å®è¡ã§ããŸãã
å®éãç§ãã¡ã¯åžžã«ãµãŒãã¹ã«äŸåããããããŸããããåæã«ç¶æ³ãç£èŠãããã¹ãŠãæ£åžžã§ããããã¢ããªã±ãŒã·ã§ã³ã®äžéšãæ£åžžã§ã¯ãªããšããæ¯æ¥ã®ã¬ããŒãã®åœ¢ã§æ¯æ¥ã®æ å ±ãåä¿¡ããå¿ èŠããããŸãã ããã§ã¯ãå®å šãªéçšã«äžå¯æ¬ ãªã¢ããªã±ãŒã·ã§ã³ãšãµãŒãããŒãã£ãµãŒãã¹ãåé¢ããããšã奜ã¿ãŸãããç§ãã¡ã®è²¬ä»»ç¯å²ã§ã¯ãããŸããã ãµãŒãããŒãã£ã®ãµãŒãã¹ã®æäœã«é¢é£ããã¢ããªã±ãŒã·ã§ã³ã®åé¡ãæ€åºã§ããŸãããä¿®æ£ããããšã¯ã§ããŸããã ç§ãã¡ã®ã¿ã¹ã¯ã¯ãåé¡ãå ±åããä¿®æ£ãåŸ ã¡ããã®ãµãŒãã¹ãæäœããããã®ãã¹ããå®è¡ããŠãåé¡ãä¿®æ£ãããããšã確èªããããšã§ãã
UIãã¹ã
ãŠãŒã¶ãŒã®èŠ³ç¹ããèŠããšããããã¯æãæ£çŽãªãã¹ãã§ãã éçºè ã®èŠ³ç¹ãã-æãè€éã æãæ£çŽãªã®ã¯ã圌ããæçµè£œåããã¹ãããŠããããã®äžéšã§ã¯ãªãããã§ãã ä»ã®äººã«éé£ããããšã¯ã§ããŸããããã°ã¯ã¢ããªã±ãŒã·ã§ã³ã®ãã°ã§ããããã®åå ãäœã§ãããã¯é¢ä¿ãããŸãããAndroidã®äžå®å šæ§ã¯ãå¥ã®éçºè ãªã©ã®äžæ£ãªæã«ãããã®ã§ãã ãããã«ããããšã©ãŒãä¿®æ£ããå¿ èŠããããŸãã ãã®ãããªãã©ãã¯ããã¯ã¹ãã¹ãã®å©ç¹ã«ã¯ãå®éã«ã¯ãæ©èœã®å®è£ æ¹æ³ãã¢ããªã±ãŒã·ã§ã³ã®ã¢ãŒããã¯ãã£ãªã©ã«éãã¯ãªããšããäºå®ãå«ãŸããŸããã¢ããªã±ãŒã·ã§ã³ã®2ã€ã®ãã°ãéè€ãããã®çµæããŠãŒã¶ãŒãæ£ããçµæ-ããã¯ç§ãã¡ã«åã£ãŠããŸãã â .
- , , , UI- , .
. , , â . , . ( , - , - ) , . , , , . . , , , . , , , .
, , . : , . , , , , - , 99% . , , , , , , , , . , , , . , Android iOS. , , , . , , , , , , .
Robotium. , , . , . , , . , , . Espresso! , . . , . Robotium 2 , , , . . Robotium, , Sleep Pattern'. , , sleep(N * 1000) , . : , (UI Thread). , , Sleep(), . : 10 , . Instrumentation-based , , UI Thread , . android.app.Instrumentation :
/** * Synchronously wait for the application to be idle. Can not be called * from the main application thread -- use {@link #start} to execute * instrumentation in its own thread. */ public void waitForIdleSync() { validateNotAppThread(); Idler idler = new Idler(null); mMessageQueue.addIdleHandler(idler); mThread.getHandler().post(new EmptyRunnable()); idler.waitForIdle(); }
, , , View , , , , View , ..
, , Espresso , . ; Google , , Espresso . Lead developer' , Robotium Espresso TestRunner. , . , , Espresso. . .
Espresso , . ~26 , . 4%. , . , , waitForIdleSync : , â , , . CustomIdlingResource Espresso Robotium. , , â idle , custom idling resource . , , , idle , , .
, Espresso â . , , , .
, , , â , . , , Sharing ( ) - . , . Robotium/Espresso- , . , , cross-app functional UI tests, UI Automator. , , Testing Support Library, Google I/O 2015, , . , , , :
- , .
- , , , .
- push- .
- , .
- back-., , .
, , , .., 3 4 uiAutomator framework, , , , . API Espresso, . , .
, . â , .
, , , product flavors , , - .. adb, usb, VirtualBox . , , , .
PS Android- . 空宀ã«èå³ãããå Žåã¯ããæ°è»œã«Maryã«ãé£çµ¡ãã ãã ã