2017幎ã®ã¢ãã€ã«éçºåŠæ ¡ã®è³æã¯åŒãç¶ãå
¬éãããŸãã 次ã«ãYandex.MailããŒã ã®Androidéçºè
Dmitry Nikitinã«ãã倧èŠæš¡ãªè¬çŸ©ã§ãã Dmitryã¯ãå€ãã®ã©ã€ãã©ãªã§è¿·åã«ãªããªãããã«ãŒããããããžã§ã¯ãã®äœæã«ã¢ãããŒãããæ¹æ³ãšã1ã€ãŸãã¯å¥ã®ãœãªã¥ãŒã·ã§ã³ãéžæãããšãã«äœãæ¢ãã¹ãããæ瀺ããŸãã
-ã¿ãªããã¯ãå°ãªããšã2ã3ãæã¯Androidãããã°ã©ãã³ã°ããŠããŸãã ããããã誰ããæ°å¹Žåããããã°ã©ãã³ã°ãããŠããŠãdeveloper.android.comãæåããæåŸãŸã§èªãã§ããã®ã§ãããã ãŸãã¯ããã§ãªããããããŸããã ããããå°ãªããšã1ã€ã®æ¹æ³ã§å€ãã®ããšãå®è¡ããæ¹æ³ããåç¥ã§ãããã ãããããããã®æ¹æ³ã®å€ãããããåããŒã ãç¬èªã®æ¹æ³ãæã€ããšãã§ããããšã¯ç§å¯ã§ã¯ãããŸãããå€ãã®å Žåããã®æ¹æ³ãŸãã¯ãã®æ¹æ³ã¯æŽå²çãªçç±ã ãã§éžæãããŸãã
ä»æ¥ã¯ãã©ã®ãããªéžæè¢ãšéçºããŒã«ããããã©ã€ãã©ãªãéžæããéã«äœã匷調ãã¹ããã«ã€ããŠç°¡åã«èª¬æããããšæããŸãã
ä»æ¥ã¯ã©ã®ããŒã«ã«ã€ããŠã話ããŸããïŒ ãŸã第äžã«ãã¢ããªã±ãŒã·ã§ã³ã®å³ææ©èœãå®è£
ããã®ã«åœ¹ç«ã€ãã®ã«ã€ããŠïŒããã¯ããããžã§ã¯ããããŒãžã£ãŒãéåžžç§ãã¡ã«éåžžèŠæ±ãããã®ã§ãã
第äºã«ãããã¯ã³ãŒãã®å質ãå¶åŸ¡ããããæè»ã§æ¡åŒµå¯èœã«ããã®ã«åœ¹ç«ã¡ãŸãã ãããŠãéçºã«ãé¢é£ããŠãããã®ã®ãåã®2ã€ã®ãã€ã³ãã«çŽæ¥é¢é£ããŠããªããã®ãæ€èšããŸãã
ãã®ããŒã«ã¯ãé床ãšæ¶è²»ãããRAMãšãã£ã¹ã¯ã¡ã¢ãªã®ç¹ã§ã©ãã»ã©å¹æçã§ããã
ã©ã¡ããè¯ãããã©ããæªãããã©ã®ããã«éžæããŸããïŒ ãŸãã䜿ããããããã®ããŒã«ã䜿çšããŠç¹å®ã®åé¡ã解決ããã®ãã©ãã»ã©ç°¡åããèŠãŠãããŸãã
ååãšããŠãããç¥ãããŠããã©ã€ãã©ãªã¯ãã§ã«ãã¹ãã§ã«ããŒãããŠãããçµ±åããããšãã°ãããé »ç¹ã«çºçãããããã¯ã©ã€ã¢ã³ãã³ãŒããç°¡æœã§åçŽã§ããã°ããã»ã©ããã¹ãããå¯èœæ§ã¯äœããªããŸãã
äžæ¹ãæãçŽæ¥çãªããžãã¹ããžãã¯ã§ã¯ãªãå Žåããããããç¹å®ã®äœããå¿
èŠã«ãªãå ŽåããããŸããããã§ãéžæããããŒã«ãæŸèæãªãã§ãããå®è¡ã§ããã»ã©æè»æ§ãããå Žåãããã¯å€§ããªãã©ã¹ã«ãªããŸãã
以äžã®åºæºã¯å€éšã©ã€ãã©ãªã®ã¿ã«é©çšãããŸã-ããã¯ã©ã€ã»ã³ã¹ã§ãã å€ãã®å Žåãåçšã³ãŒããèšè¿°ãããããã©ã€ã»ã³ã¹ã¯ãœãããŠã§ã¢ã®äœ¿çšãèš±å¯ããã ãã§ãªãããœãŒã¹ã®é瀺ã匷å¶ãããã®ã§ããããŸããã
æã人æ°ã®ããã©ã€ã»ã³ã¹ã¯Apache 2.0ãšMITã§ãã ååãšããŠããããã¯æŠããŠãç§ãã¡ã«å¶éã課ããŸããã ä»ã®ã©ã€ã»ã³ã¹ã¯æ³šæããŠäœ¿çšããå¿
èŠããããŸãã
ããã«ãæ¥ç¶ããããã«å¿
èŠãªãã®ã¯ãã¹ãŠãAndroid SDKãšå
±ã«ã§ã¯ãªããJCenterãŸãã¯Mavenã»ã³ãã©ã«ã®ã©ããã«çœ®ããŠããå Žåã¯ãæ¢ã«ã³ã³ãã€ã«ããã³é
åžãããŠããããšãæãŸããã§ãã
äžæãªç¹ãããå Žåã¯ãããã¥ã¡ã³ããåç
§ãããããã®è£œåããµããŒãããŠãã人ã«è³ªåããããšãã§ããŸãã
ãããŠãæåŸã®é
ç®ã¯é çªã«äžŠãã§ããŸãããéèŠåºŠã«ã¯é¢ä¿ãããŸãã-ããã¯ããã®ããŒã«ãå€ãã®ã¡ãœãããã©ã®çšåºŠãããããã§ãã
ãªããããéèŠãªã®ã§ããïŒ ã¢ããªã±ãŒã·ã§ã³ãLollypopæªæºã®APIããµããŒãããŠããå ŽåïŒãããã¢ããªã±ãŒã·ã§ã³ã®å€§éšåã§ãïŒããããã®ããã€ã¹ã§ã¯ã³ãŒããDalvikä»®æ³ãã·ã³ã§å®è¡ãããAPKã®ãã«ãæã«Javaãã¡ã€ã«ããã€ãã³ãŒãã«ã³ã³ãã€ã«ãããŠããDalvikå®è¡å¯èœãã¡ã€ã«ã«ããã¯ãããŸãã ãã®ãããªãã¡ã€ã«ã«ã¯ãããã65,000ãè¶
ããã¡ãœãããå«ããããšã¯ã§ããŸããããã®å¶éã«éãããšãã¢ã»ã³ããªäžã«ãã®ãããªãšã©ãŒãçºçããŸãã
åæã«ããæ¹æ³ã¯ïŒ è¯ãæ¹æ³ã§ã¯ãã©ã®ã¯ã©ã¹ãå æãããŠãããã远跡ããäžå¿
èŠãªããšãé¿ããããã«ããå¿
èŠããããŸãã ã€ãŸãããããããããã¡ãœããã®æ°ã«é¢ããŠããã®äŸåæ§ãŸãã¯ãã®äŸåæ§ãã©ã®ãããªè¯å®çãªè²¢ç®ãããããããåžžã«è©äŸ¡ããå¿
èŠããããŸãã
ããšãã°ãã«ãŒãœã«ãå®å
šã«éããããã ãã«Guavaã䜿çšããå ŽåããŠãŒãã£ãªãã£ã¡ãœãããèšè¿°ãããã®ãããªå€§ããªäŸåé¢ä¿ãæŸæ£ããå¿
èŠããããŸãã
ãã¹ãã§ã»ãšãã©ã®éšåã«äœãã䜿çšãããŠããå Žåããããžã§ã¯ãã«çŽæ¥å«ãŸããªãããã«ããã®äŸåé¢ä¿ããã¹ãã³ã³ãã€ã«ã«è¿œå ã§ããŸãã
ãŸããã©ã ãåŒãåç
§ã¡ãœãããªã©ãããŸããŸãªæ§æç³ã®ã³ã¹ããé«ãããšã«ã泚æããå¿
èŠããããŸãã ãã®ãããã¯ã®è©³çŽ°ã«ã€ããŠã¯ãJake Wharton ã®ã¯ã©ã¹ã¬ããŒããExploring Hidden Java Costsãã芧ãã ããã
ã©ã ãã«å ããŠãä»ã®çæãããã³ãŒããèŠãããšãéèŠã§ãã ããšãã°ã1ã€ã®ããŒãžã§ã³ããå§ãŸããã¿ãŒãã€ãã§ã¯ãã¡ãœããã®çæã40ïŒ
å°ãªããªããŸããã
ãããžã§ã¯ããå ããã¯ã©ã¹ã®æ°ã远跡ããã«ã¯ã©ãããã°ããã§ããïŒ ããã«ã¯ãDexcountãã©ã°ã€ã³ãé©ããŠããŸãã 誰ãããã€ã®ã¡ãœãããæã¡èŸŒãã ã®ãããããããã«ããã®ãããªçŸãããã£ãŒããçæãããŸãã
äžæ¯ãè¿œå ããåã«ã methodscount.comãµã€ãã®è²»çšãã©ãããããããããè©äŸ¡ã§ããŸãã ãŸããæšç§»çãªäŸåé¢ä¿ãããããã¡ãœããã®æ°ã確èªã§ããŸãã
ä»ã®ãã¹ãŠã倱æããå Žåã§ããããã€ãã®dexãã¡ã€ã«ã䜿çšã§ããŸãããè¿œå ã®åé¡ãçºçããŸãã ãã®ãããªã¢ããªã±ãŒã·ã§ã³ã¯éåžžãèµ·åæéãé·ããªããããå€ãã®ã¡ã¢ãªãæ¶è²»ãããšããäºå®ã«å ããŠãå Žåã«ãã£ãŠã¯ã¯ã©ãã·ã¥ããããšããããŸãã MultiDexã䜿çšããŠæ§ç¯ããå Žåãã¢ããªã±ãŒã·ã§ã³ãæ£åžžã«èµ·åããŠãã©ã€ããªdexãã¡ã€ã«ã«é
眮ããããã«å¿
èŠãªã¯ã©ã¹ã®åæãå®è¡ãããŸãã
ããšãã°ããã€ãã£ãã³ãŒãããåŒã³åºããè¡ããããªã©ãäŸåé¢ä¿ãè€éãªå Žåããã®ãããªã¯ã©ã¹ã¯ä»ã®dexãã¡ã€ã«ã«åé¡ãããèµ·åæã«NoClassDefFoundErrorãçºçããŸãã ãããåé¿ããããã«ãå¥ã®æ§æã§ãã®ãããªã¯ã©ã¹ãæå®ããå¿
èŠããããŸãã
ããã«ããã®åæã«ãããã«ãã®é床ã倧å¹
ã«äœäžããŸããLollypopããŒãžã§ã³ãããDalvikã¯Androidã©ã³ã¿ã€ã ã«çœ®ãæããããŸãããAndroidã©ã³ã¿ã€ã ã¯æ¢ã«MultiDexããµããŒãããŠãããSDK 21ã®ãã«ãã¯ã¯ããã«é«éã§ãã
ãããã£ãŠãããã¯ãšããŠãSDKã®å®éã®æå°ããŒãžã§ã³ãã¯ããã«å°ãããšããäºå®ã«ãããããããããŒã«ã«ã¢ã»ã³ããªã«å¯ŸããŠ21ã®ããŒãžã§ã³ãæå®ãããšããäºå®ãå©çšã§ããŸãã
ã¹ã¿ãžãªã®ã³ãã³ãã©ã€ã³ãã©ã¡ãŒã¿ãããã®å€ãååŸããŸããããã«ãããããŒã«ã«ã§ããéãåéããæ©äŒãåŸãããŸãã åæã«ãã¹ã¿ãžãªå
ã®APIã¬ãã«ã®ããŒããã§ãã¯ã¯å£ããŸããã
ãŸãšãããšã ã¡ãœããã®æ°ã§äœãããå¿
èŠããããŸããïŒ å¥åº·ãªäººã®æ¹æ³ã¯ãããããèªç¶ã«æ°ããæžããããšã§ãã ãŸããproguardã䜿çšããŠãæ¥ç¶ããã䜿çšããŠããªããã®ãåé€ããããšãã§ããŸãã ãªãªãŒã¹ã³ã¬ã¯ã·ã§ã³ã«ã¯ããã§ã«proguardãå«ãŸããŠããããããããã°ã§ã®ã¿MultiDexãæå¹ã«ããå¿
èŠãããå Žåã¯ãéåžžã®æ¹æ³ã§ãã ããããä»ã®ãã¹ãŠã倱æããå ŽåãMultiDexããªã³ã«ããã ãã§ãè¿
éãªããŒã«ã«ã¢ã»ã³ããªã§ããªãã®äººçããããã«æããããŸãã
ã¢ããªã±ãŒã·ã§ã³ã§éåžžè¡ãå¿
èŠãããã¿ã¹ã¯ã¯äœã§ããïŒ å€ãã®å ŽåããµãŒããŒããããŒã¿ãåä¿¡ããç¹å®ã®æ¹æ³ã§åŠçããç»é¢ã«è¡šç€ºããŸããããšãã°ããªãã©ã€ã³ã§äœæ¥ããå¿
èŠãããå Žåã¯ãç¹å®ã®æ¹æ³ã§ä¿åããå¿
èŠããããŸãã ããšãã°ãããŒã¿ããŒã¹ãå
±æèšå®ãŸãã¯ãã¡ã€ã«ã
GitHubããã®ãŠãŒã¶ãŒããŒã¿ã衚瀺ãããµã³ãã«ã¢ããªã±ãŒã·ã§ã³ã䜿çšããŠãããããã¹ãŠã®ã¹ããããèŠãŠã¿ãŸãããã
ãŠãŒã¶ãŒããŒã¿èªäœã¯ãµãŒããŒäžã«ãããããããååŸããå¿
èŠããããŸãã ã©ãããã°ãããã§ããŸããïŒ ããšãã°ãHttpUrlConnectionããããŸãã
StackOverflowã«ç§»åããget-requestã®äŸãåãäžããŠãURLã眮ãæããŸãã æ¥ç¶ãéããŸãã InputStreamãååŸããŸãã ããã§å¿
èŠãªããŒã¿ãæååãšããŠèªã¿åããŸãã æ¥ç¶ãéããããšãå¿ããªãã§ãã ããã ãã®ãªã¯ãšã¹ãã§ã¯ããã¹ãŠãç°¡åã§ãã ããšãã°ããã¡ã€ã«ãReadMeã§ãµãŒããŒã«ã¢ããããŒããããªã©ãããããªããšãããå¿
èŠãããå Žåã¯ãåé¡ãå§ãŸããŸãã ãããè¡ãã«ã¯ãç¬èªã®ã©ãããŒãäœæããå¿
èŠããããŸãã
ãããŠããã§ã«ãã®ãµã€ãºã§ãããã¿ã¹ã¯ã¯ããã»ã©çãããªãããã«æããŸãã
ãŸãããã®ããã®ãã¹ããäœæããå¿
èŠããããŸãããå®éã«ã¯ãä»ã®èª°ãã®ã³ãŒãã«å¯ŸããŠã¯è¡ããããããŸããã
HttpUrlConnectionã®äžã§åäœããå€ãã®ã©ã€ãã©ãªããããŸãããã®å Žåãéä¿¡ãã¡ã€ã«ã¯åçŽåãããéåæåŒã³åºããªã©ã®ä»ã®æ©èœãè¿œå ãããŸãã
ããšãã°ãKevin Savinskiã®HttpClientã©ã€ãã©ãªããããŸãã ããããç®±ããåºããŠããã«ããããã¹ãŠã®æ¬ ç¹ããªã代æ¿ããããŸã-ããã¯OkHttpã§ãã
OkHttpã䜿çšããåããã¡ã€ã«ã¢ããããŒãã¯æ¬¡ã®ããã«ãªããŸãã URLãæäŸããã ãã§ãã RequestBodyãäœæããŸãã ãããŠãç§ãã¡ã¯èŠæ±ãæºãããŸãã
Kitkat以éããããã¯ãŒã¯ã¬ãã«ã®HttpUrlConnectionèªäœã¯OkHttpã䜿çšããŸãã ãããã£ãŠããã®ãªãã·ã§ã³ãéžæããå ŽåãAndroidã®ç°ãªãããŒãžã§ã³ã§ã¯ã©ã€ãã©ãªã®åäœãç°ãªããšããäºå®ããä¿è·ãããŸãã
ãããŠããªã¯ãšã¹ãã®äžéšã«useragentãè¿œå ãããããªãã€ã¬ã¯ãã®å Žåã®åäœãå€æŽãããããå Žåãæ³åããŠãã ããã ãŸããOkHttpã€ã³ã¿ãŒã»ãã¿ãŒã䜿çšããŠãããããªãè¿
éã«è¡ãããšãã§ããŸãã
ã€ã³ã¿ãŒã»ããã¡ãœãããåå®çŸ©ããŸãã å
ã®ãªã¯ãšã¹ããååŸããŸãã äœããã®æ¹æ³ã§ãããå€æŽãããã§ãŒã³ã®ããã«äžã«æž¡ãããšãã§ããŸãã ãããŠããã®ã€ã³ã¿ãŒã»ãã¿ãŒãã¯ã©ã€ã¢ã³ãã«è¿œå ããŸãã åæã«ããªãã€ã¬ã¯ãã®å Žåã«ãªã¯ãšã¹ããç¹°ãè¿ãã€ã³ã¿ãŒã»ããããå ŽåãaddInterceptorã§ã¯ãªãaddNetworkInterceptorãåŒã³åºãããšãã§ããŸãã
ããã«ãOkHttpã¯èŠæ±ãéåæçã«å®è¡ããWebãœã±ãããæäœããä»ã®å€ãã®åªããæ©èœãå®è¡ã§ããŸãã
ãã ããæ¬ ç¹ã1ã€ãããŸãã ããã«ãããããããããã¯ãµãŒãããŒãã£ã®ã©ã€ãã©ãªã§ããã2,500ã®ã¡ãœãããæç»ããŸãã ããããç§ãã¡ãæãçµã¿èŸŒã¿ãœãªã¥ãŒã·ã§ã³ã¯ãããŸããïŒ
Androidã®å€æãã«ã¯ApacheHttpClientãããã以åã®ããŒãžã§ã³ã§ã¯ããå®å®ããŠããŸããããGoogleããŒã ã¯APIãä»åŸã®éçºã«ã¯å€§ãããããšå€æããå»æ¢ãããããšã宣èšããŸããã
useLibraryâ org.apache.http.legacyâãæ瀺çã«æå®ããŠããããžã§ã¯ãã§äœ¿çšããããšã¯ã§ããŸãããAPKã«æ¢ã«ããã±ãŒãžåãããŠãããããç®æšãéæã§ããŸããã
æ€èšãããŠãããªãã·ã§ã³ã«å ããŠãGoogleããµããŒãããVoleyã©ã€ãã©ãªããããŸãã 以åã®éžæè¢ãããé«ãã¬ãã«ã§ãã OkHttpããªã¯ãšã¹ããéåæã«å®è¡ã§ããããã«ã 圌女ã¯åªããå
éšãã£ãã·ã¥ãåããŠãããç»åã®ã¢ããããŒãæ¹æ³ãç¥ã£ãŠããŸããããã ãã®ããã«ãimageviewã¯ãããã¯ãŒã¯imageviewãç¶æ¿ããå¿
èŠããããŸãããããã¯éåžžã«åŒ·ãå¶éã§ãã
æ®å¿µãªãããVoleyã¯JCenterããã³Maven Centralã«ãããé
眮ããããœãŒã¹ã³ãŒããšå
±ã«ãããžã§ã¯ãã«ã€ã³ããŒããããŸããéãæªããã°ããã®ãœãŒã¹ã³ãŒããåãã³ãããã§å€æŽãããŸãããããã¯éåžžã«æªãããšã§ãã
Voleyã¯ãåãOkHttpãšã¯ç°ãªããåªããããã¥ã¡ã³ããèªæ
¢ã§ããŸããã
ããã§ãç§ãã¡ã¯äœãåãã¹ãã§ããïŒ ã¡ãœããã®æ°ã«å³å¯ãªå¶éãããå ŽåããŸãã¯ãããã¯ãŒã¯ã§ã®äœæ¥ãããã»ã©è€éã§ã¯ãªããããããã€ãã®éèŠãªããšãå¿
èŠãªå Žåã¯ãHttpUrlConnectionãŸãã¯ãã®ã©ãããŒã䜿çšã§ããŸãã ãã以å€ã®å ŽåãOkHttpãæé©ãªãªãã·ã§ã³ã®ããã§ãã ïŒè³ªåãšåçã«ã€ããŠã¯ããããªãåç
§ããŠãã ãã-çŽãšããïŒ
ããŒã¿ãããŠã³ããŒãããããšã«ãªããŸããã ããã¯JSONæååã§ãã ãããŠä»ãJavaã®èŠ³ç¹ããã©ã®ããã«äŸ¿å©ãªãã¥ãŒãååŸã§ããŸããïŒ
ååãªããŒã¿ããªãå Žåã¯ãçµã¿èŸŒã¿ã®JSONObjectã䜿çšããŠå¿
èŠãªå€ãååŸã§ããŸãã èå³ã®ããåéã«åºäŒããŸã§ãæ§é å
šäœãé çªã«åããŸãã å€ãèªã¿åãã次ã«é²ã¿ãŸãã
倧éã®ããŒã¿ãããå Žåããã®ã«ãŒãã³äœæ¥ãç¶æããã®ãé£ãããªããç¹å®ã®ã©ã€ãã©ãªã䜿çšããã®ãçã«ããªã£ãŠããŸãã
ããšãã°ãå
ã
Androidçšã«äœæãããSquareã®MoshiããããŸããããã«ãããã¡ã¢ãªæ¶è²»ãããçµæžçã«ãªããŸãã ãããã圌ã¯ããªãé
ãã§ãã
Googleã®GsonããããŸãããé«éã§ãããRAMãããå€ãæ¶è²»ããŸãããã¡ãœããã®æ°ã®ç¹ã§ã¯å€å°é
åçã§ãã
ãããŠããžã£ã¯ãœã³ãããŸããããã¯ããªãã¬ã¯ã·ã§ã³ã®ã«ãŠã³ã¿ãŒããŒãã®äžã§æéã§ãã 圌ã¯ãã¹ããªãŒãã³ã°ããŒããšçŽæ¥ãããã³ã°çšã®Databingãå¥ã
ã«æã£ãŠããŸãã ããããåæã«åœŒã¯å€ªã£ãŠããã
ããã«ãã³ã³ãã€ã«æã«è§£æããããã®ã¢ããã¿ãŒãçæããLoganSquareïŒ GitHubãžã®ãªã³ã¯ ïŒããããŸãã Jacksonã¹ããªãŒãã³ã°APIã䜿çšããã³ã³ãã€ã«æéã®çæã«ããã競åä»ç€Ÿã®é床ã倧å¹
ã«äžåããŸãã
æ¯èŒã¯ãäœæè
ã®ãã³ãããŒã¯ã§ç¢ºèªã§ããŸãã æ瀺ããããªãã·ã§ã³ã®LoganSquareãæéã§ããããšãããããŸãã
ãã ããã³ã³ãã€ã«æã®çæã§ã¯ãæ§é ã«ç¹å®ã®å¶éã課ãããŸãã ãšã³ãã£ãã£èªäœã¯äœãç¶æ¿ã§ããŸããã ãžã§ããªãã¯ã«ãåé¡ããããŸãã
Instagramããã®ãªãã¬ã¯ã·ã§ã³ã®ãªãå¥ã®ããŒãµãŒãIgJsonParcerããããŸãã 圌ã¯ãã¹ãŠã®ãã£ãŒã«ãã«çŽæ¥æ³šéãä»ããããšã矩åä»ããŠããããããåŠçããå¿
èŠããããŸãã ãã®ã©ã€ãã©ãªã«ã¯ãŸã å®å®ããããŒãžã§ã³ããããŸããããŸããGuavaãšApache Commonsã®äž¡æ¹ã«äŸåããŠãããããã¡ãœããã®æ°ã«åé¡ããããŸãã
ãããã£ãŠãæ瀺ããããœãªã¥ãŒã·ã§ã³ã®äžã§ãæéã¯LoganSquareã§ãããé床ãéåžžã«éèŠãªå Žåã¯ãããã䜿çšã§ããŸãã ãã以å€ã®å Žåã¯ãé床ãã¡ã¢ãªæ¶è²»ããŸãã¯ã¡ãœããã®æ°ãããã«å¿
èŠã§ãããšããäºå®ã«åºã¥ããŠã以åã®ãªãã·ã§ã³ããéžæããŸãã
ææžçãéžæããŸããã ãã¹ãããããšãå¿ããªãã§ãã ããã解æã¯ãã¹ãé§åéçºã«éåžžã«é©ããŠããŸãã ããã¥ã¡ã³ãããJSONãã³ããŒãããã¹ããäœæããŠããããã¹ããç·è²ã«ãªããŸã§è§£æèªäœãäœæããŸãã
å€ãã®å Žåãè¿œå ã®ãã£ãŒã«ããAPIã«è¿œå ã§ããŸãã
解æã倱æããã®ãé²ãããã«ãäºåã«ãã¹ãã§äžæãªãã£ãŒã«ããè¿œå ã§ããŸãã ãããã£ãŠãç§ãã¡ã¯ãã®ãããªå€æŽã®æºåãã§ããŠããããšãä¿èšŒãããŠããŸãã
å察ã«ãããŒã¿ããµãŒããŒã«éä¿¡ããããæååãšããŠä¿åããå Žåã¯ãéã®ããã»ã¹-ã·ãªã¢ã«åãå¿
èŠã§ãããã¹ãã¯ãã®æ£ç¢ºæ§ãæ€èšŒããã®ã«ã圹ç«ã¡ãŸãã
ããšãã°ãããã§ã¯JsonUnitã©ã€ãã©ãªãŒã䜿çšãããŸãã ãã®ãããªæ¯èŒã¯é åºãã€ã³ãã³ããªã©ã«å¯ŸããŠäžå®å®ã§ããããã裞ç·ãæ¯èŒããªãããã«äœ¿çšãããŸããããããŠãååŸããå€ãçŽæ¥æ¯èŒããŸãã
ãã®ãããRetrofitã©ã€ãã©ãªïŒ GitHubãžã®ãªã³ã¯ ïŒã䜿çšããŠããªã³ã©ã€ã³ã«ããæ¹æ³ã解æããæ¹æ³ããããçµã¿åãããæ¹æ³ãéžæããŸããã
ãããã£ãŠãããŒã¹URLãèšå®ããåäžã®ã¢ã¯ã»ã¹ãã€ã³ãããããŸãã ãã®å Žåãããšãã°QAç°å¢ã®å Žåãããã§ãã°ããå€æŽã§ããŸãã MoshiãGsonãJacksonããŸãã¯Protobufããã³ã³ããŒã¿ãŒãéžæã§ããŸãã ãããŠãç§ãã¡ãé»è©±ããããæ¹æ³ã ããã¯åæçã«å®è¡ã§ããŸãã
ãŸãã¯éåæã§ã
ãŸãã¯ãRxã䜿çšããŸãã ãããè¡ãã«ã¯ãAPIã¡ãœãããåäžã®å®äºå¯èœãŸãã¯ç£èŠå¯èœãè¿ãããšã瀺ãå¿
èŠããããŸãã ãããŠãé©åãªCallFactoryãéžæããŸãã
ãŠãŒã¶ãŒããŒã¿ã®éã·ãªã¢ã«åã«åãçµã¿ãŸããã Javaã§ããããã©ã®ããã«çŽ¹ä»ããŸããïŒ
ãã®ããã«ããããšãã§ããŸãã ããããäœãæªãã®ã§ããããïŒ å°æ¥ããã°ã€ã³ãã£ãŒã«ããã³ãŒã«äžã«çŽæ¥èšç®ãããããããããã¹ãŠã®ã³ãŒã«ãèšé²ãããšããŸãã
ãããã£ãŠãå¯èŠæ§ããã©ã€ããŒãã«å€æŽããã²ãã¿ãŒãšã»ãã¿ãŒãè¿œå ããŸãã
HashMapã«è¿œå ããå Žåã¯ãequalsãšhashCodeãå¿
èŠã§ãã
ããã«æååã«çŸãããè¿œå ããŸãã ãŸããæå³ããŠå¥ã®ã¢ã¯ãã£ããã£ã«è»¢éããããç»é¢ãå転ãããšãã«ãã³ãã«ã§ä¿åãããããå Žåã¯ããã®ãªããžã§ã¯ããParcelableã«ããå¿
èŠããããŸãã
ãããŠãæ°ãããã£ãŒã«ããã¯ã©ã¹ã«è¿œå ãããŠããããšãç¥ããšããããã®åãç¹°ãè¿ããäœãå¿ããªãããã«ããå¿
èŠããããŸãã 幞ããªããšã«ããã®åé¡ã解決ã§ããã©ã€ãã©ãªããããŸãã
ããšãã°ãAutoValueïŒ GitHubãžã®ãªã³ã¯ ïŒã AutoValueã¢ãããŒã·ã§ã³ãšæœè±¡ãã£ãŒã«ãã¢ã¯ã»ã¹ã¡ãœãããäœæããŠããŸãã ãã£ãŒã«ãèªäœã¯ãã¢ã»ã³ããªäžã«ã©ã€ãã©ãªã«ãã£ãŠçæãããŸãã ãŸããåã«ãªã¹ãããããããã¹ãŠã®ã¡ãœãããçæããŸãã
AutoValueã®ãã©ãŒæ©èœã¯ãæ¡åŒµæ©èœã䜿çšããã®ã«ååç°¡åã§ããããšã§ãã ããšãã°ãã³ã³ãã€ã«æã¢ããã¿ãŒãçæã§ããGsonããã³Jacksonæ¡åŒµæ©èœããããããã«ãããåãLoganSquareã®é床ããã£ããã§ããŸãã ãããã£ãŠã1ã€ã®ç³ã§2矜ã®é³¥ã殺ããŸãã解æãšã¢ãã«ã®å
éšè¡šçŸã®äž¡æ¹ã®åé¡ã解決ããŸãã
AutoValue Parcelæ¡åŒµæ©èœããããŸãã æ¥ç¶ãããšãParcelableã®å®è£
ãèšè¿°ããã ãã§ã解æããµããŒãããã¡ãœãããçæãããŸãã ããã«ãã¯ã©ã¹ã®ãã£ãŒã«ãã®1ã€ãã·ãªã¢ã«åå¯èœã§ãªãå Žåãã³ã³ãã€ã«äžã«ãšã©ãŒãçºçããŸãã
å¥ã®AutoValueæ¡åŒµæ©èœããããŸã-Auto-Parcelã解æããŸãããAutoValue Parcelãšã¯ç°ãªãããªããžã§ã¯ããã©ã³ã¿ã€ã ã§æä»çã«ã·ãªã¢ã«åãããããšããã§ãã¯ããããŸã人æ°ã®ãªãEPL 1.0ã©ã€ã»ã³ã¹ãæã£ãŠããŸãã
AutoValueã«ä»£ãããã®ããããŸã-ããã¯äžå€ã§ãã Moshiããã³Gsonçšã®ã¢ããã¿ãŒããããŸãããParcelableçšã®æ¡åŒµæ©èœã¯ãããŸããã
ãããŠãä»ãšã¯ç°ãªããçžç¶äººãçæãããå
ã®ã¯ã©ã¹ã眮ãæããLombokããããŸãã
ãã®ãã¹ãŠã®éæ³ããµããŒãããã«ã¯ãIDEãã©ã°ã€ã³ãšå¿èãå¿
èŠã§ããããã¯ãã¹ãŠéåžžã«ãã°ãå€ãããã§ãã
ãããã£ãŠãèæ
®ããããªãã·ã§ã³ã®äžã§ãAutoValueãšãã®Auto-Parcelæ¡åŒµæ©èœãæãæçã«èŠããŸãã ïŒè³ªåãšåçã«ã€ããŠã¯ããããªãåç
§ããŠãã ãã-çŽãšããïŒ
ãŠãŒã¶ãŒã®å¹Žéœ¢ã«å¿ããŠããŸããŸãªçš®é¡ã®ãããŒã衚瀺ããå¿
èŠããããšããŸãã ãã¹ãŠãã·ã³ãã«ãªããã§ãã çŸåšã®æ¥ä»ãååŸããç幎ææ¥ãèšç®ããŠå¹Žéœ¢ãååŸããŸãã
ããããJavaã®æ¥ä»ãšã«ã¬ã³ããŒãæšæºãšããŠäœ¿çšããå Žåãé©ããæåŸ
ããå¿
èŠããããŸãã ããšãã°ãgetYearãåŒã³åºããšäœãåŸãããŸããïŒ æ£è§£ã¯117幎ã§ãã1幎ã§ã¯ãªãããã§ãã
ããã¯ã¡ããã©1幎ã§ã¯ãªãããã§ãã
ãŸããJava.docãããããããã«ãããã¯1900幎ãã1幎åŸã§ããJava.docãäºåã«èªãã§ããªãããšãéé£ããããšãäžéšãããŸãã
ãŸãã¯ãããšãã°ãGetInstanceã«ã¬ã³ããŒã®æãæåãªã¡ãœãããå®éã«æ¯åæ°ããã«ã¬ã³ããŒãäœæããããšã¯ãæãæçœãªãã€ã³ãã§ã¯ãããŸããã
æã人æ°ã®ããJavaã©ã€ãã©ãªã®1ã€ã¯JodaTimeïŒ GitHubãžã®ãªã³ã¯ ïŒã§ãã ããã䜿çšãããšããŠãŒã¶ãŒã®åé¡ãç°¡åã«è§£æ±ºã§ããŸãã ããšãã°ãæ°å¹ŽãŸã§ã®æ¥æ°ãèšç®ããããšãã§ããŸãã
ããã«ãJodaTimeã«ã¯Tzdataãã¡ã€ã«ã®ææ°ããŒãžã§ã³ãå«ãŸããŠããŸãã ãã®ãã¡ã€ã«ã«ã¯ãããŸããŸãªå°åã®ã¿ã€ã ãŸãŒã³ãæéãšãšãã«ã©ã®ããã«å€åããããããã³UTCã«åºã¥ããŠçŸå°æéãååŸããæ¹æ³ã®å±¥æŽãå«ãŸããŠããŸãã
ãã®ãã¡ã€ã«ã¯ãããããå±±å
šäœã®ãœãªã¥ãŒã·ã§ã³ãã«ãã»ã«åããŸãã ãã ã»ã¹ã³ããã®ãããªãããããã«ã€ããŠããã«åŠã¶ããšãã§ããŸãã Tzdataãã¡ã€ã«ãã·ã¹ãã èªäœã«ãããŸãããAPKã«åã蟌ãå Žåããã³ããŒãå€ãããã€ã¹ã®æŽæ°ããªãªãŒã¹ããªãå Žåãåé¡ãã身ãå®ããŸãã 代ããã«ãããšãã°ããã³ããŒã¯ãHTCãããè¡ãããã«ãæ°ãã顧客åãã«çŸãã3次å
ã¿ã€ã ãŸãŒã³éžæã¢ãã«ãäœæã§ããŸãã
ããããAPKã«Tzdataãã¡ã€ã«ãå«ããããšã¯ç¡é§ã§ã¯ãããŸããããµã€ãºãå¢å ããŠãããšããäºå®ã«å ããŠãæ倧5 MBã®RAMã倧éã«æ¶è²»ãå§ããŠããŸãããã³ã«ãŒã¯ 4幎åã«ããã«æ°ä»ããŸãããã©ã€ãã©ãªã¯Javaå°çšã§ããããã®ãã¡ã€ã«ã«ã¢ã¯ã»ã¹ãããšãã«ClassLoader.getResourceAsStreamã䜿çšãããšããã®ãããªå€§éã®ããŒã¿ããã£ãã·ã¥ããã ãã§ããã
圌ã¯ãã®åŒã³åºããAssetManagerã®äœ¿çšã«çœ®ãæããJoda Time AndroidãšåŒã°ããã©ã€ãã©ãªããªãªãŒã¹ããŸããã
JDK , Java - , , Joda Time JSR 310. API Android , back-port ThreeTenBP, , ThreeTenABP, « » Tzdata.
ãŸãšãããšã ? APK, API. ThreeTenABP , Joda Time - Android , , .
, .
UI- , AsyncTask. ? , , - .
Picasso. , placeholders, , .
, , , , URL, . Picasso .
Glide, Picasso , , .
Fetcher, URL, .
, Glide . StreamModelLoader, .
Loader Module, Module Manifest, , . , , . proguard.
, Glide, .
, activity , Glide , , .
, Glide , , ImageView . Picasso, , .
Glide .
Universal ImageLoader, , , deprecated.
Fresco, ashmem, , .
gif. , Glide.
, ? , , , , Picasso. - gif, Glide. Picasso Glide , API. ( . â . .)
? , dependency injection, MVP, MVVM . .
dependency injection, reflection-based RoboGuice, , , , . . Java , , , , reflection , Android , , .
RoboGuice deprecated. - Dagger1, , reflection , , . Dagger2. , .
, , . , - scope, . Toothpick, , , , . reflection free, scope. , , .
Dagger, . ( GitHub .)
, RoboGuice .
, , . , , , API, TootPick . â , .
MVP MVVM , , , , , , , , . , . , - .
. , , , . , GreenDAO, ORMLite NoSQL Realm.
, â .
, , . , , - , .
, SQLDelight, Java- SQL-. , , , , Rx, , StorIO SQLBrite.
Room, , , , , .
, ? , , -, . , â .
â checkstyle ( SourceForge ). , , . Override , , , , . . .
checkstyle, . , , .
, , , , , , .
. Java-.
Lint, Android- , , , .
. , nullability, , , , , , .
. baseline. Lint . , , .
Lint. .
XML.
â PMD ( SourceForge ). Java. .
.
.
, PMD, Java-, -. FindBugs ( SourceForge ). , , .
, , . , hashCode, , . ?
FindBugs , hashCode int, - abs , IndexOutOfBounds.
, , FindBugs .
FindBugs. , XML, HTML-, , , .
- , Findbugs:annotations.
, FindBugs , SpotBugs, , , Android, .
, , , , , dashboard. dashboard .
.
, -.
ãŸãšãããšã ? â . , , , . ( GitHub .)
, , , ? JitPack, , - fork, .
â Kotlin. Google , , . NullPointerException ClassCastException. data-, , , AutoValue, , . â , Parcelable.
pattern matching, . , , Kotlin , , proguard .
, final everywhere, final, . Mockito â , . â â Mockito 2.
any. , matcher, null Mockito. Kotlin- null, . Mockito Kotlin. , Spek â JetBrains. , , Roboelectric. â Detekt SonarQube. ããã§ç§ã¯ãã¹ãŠãæã£ãŠããŸãã ãæž
èŽããããšãããããŸããã
èè
ã®é£çµ¡å
ïŒã¡ãŒã«ãé»å ±