DroidKaigi 2018発表資料 2018/02/08 16:50~17:20 Room5
スライド内のリンク・補足はこちらから http://kazakago.hatenablog.jp/entry/2018/02/07/152011
Annotation ProcessingΛۦͨ͠ίʔυੜͰϘΠϥʔϓϨʔτίʔυΛۦஞ͠Α͏ʂ@KazaKagoDroidKaigi 20182018/02/08 Thu. (Day 1) 16:50-17:20 Room5
View Slide
Self-Introduction• ాଜ ݠհʢ@KazaKagoʣ• גࣜձࣾΠάχεॴଐ• ࿀Ѫ࿀׆ΞϓϦʮwithʯ։ൃϝϯόʔ• AndroidΞϓϦ։ൃྺ6~7͘Β͍
Self-IntroductionϝϯλϦετDaiGoम ࿀Ѫɾ࿀׆ϚονϯάαʔϏεʮwithʯ
0. લஔ͖طଘίʔυΛோΊΔɺ͘͝ҰൠతͳΤϯδχΞͷྫ
0. લஔ͖ಉ͡ίʔυ͕2ճॻ͔Ε͍ͯͨ࣌
0. લஔ͖ಉ͡ίʔυ͕3ճॻ͔Ε͍ͯͨ࣌
0. લஔ͖ಉ͡ίʔυ͕4ճҎ্ॻ͔Ε͍ͯͨ࣌
ಉ͡ίʔυΛԿॻ͘ͷͭΒ͍0. લஔ͖
ॲཧΛ·ͱΊͯ ڞ௨Խ͠Α͏ʂ0. લஔ͖
0. લஔ͖ॲཧಉ͚ͩ͡Ͳ ͢ύϥϝʔλ͕ҟͳͬͯͯ ͏·͘ڞ௨ԽͰ͖ͳ͍ɾɾɾͳΜͯ͜ͱ
Annotation ProcessingʹΑΔίʔυੜͰ ͰղܾͰ͖Δ͔ʁ0. લஔ͖
࣍1. Annotation Processingͬͯʁ2. Annotationͱίʔυੜ3. JavaPoetͱKotlinPoet4. Android։ൃʹ͓͍ͯͲͷΑ͏ʹ׆༻Ͱ͖Δͷ͔5. Kotlin͔Β͏߹ͷҙ
1. Annotation ProcessingͬͯʁProcessingAnnotation
1. Annotation Processingͬͯʁ• Java5 SE͔Βొ• @͔Β࢝·Δɺίʔυʹରͯ͠ऍΛೖΕΔػೳ• @Override@DeprecatedҰݟͨ͜ͱ͋Δͣ←ίϨʂࣗ࡞AnnotationͷྫΑ͘ݟΔAnnotationͷྫ
1. Annotation Processingͬͯʁ• ਖ਼֬ʹPluggableAnnotationProcessing API• Java6 SE͔Βొ• Ϗϧυ࣌ʹAnnotationʹରͯ͠ಛఆͷॲཧΛߦ͏ΈϏϧυ։࢝ίϯύΠϧ࣮ߦAnnotation Processing࣮ߦͳΜ͔ΜͷޙϏϧυऴྃ※͍Ζ͍Ζંͬͯ·͢
1. Annotation Processingͬͯʁ༗໊Ͳ͜ΖͷϥΠϒϥϦʹΑ͘׆༻͞Ε͍ͯ·͢ɻ
࣮ࡍԿͬͯΔͷ͔ ݟͨ͜ͱ͋Δʁ1. Annotation Processingͬͯʁ
1. Annotation Processingͬͯʁ• JakeWharton / Butterknifehttp://jakewharton.github.io/butterknife/
1. Annotation Processingͬͯʁ• Butterknifeͷ߹
1. Annotation Processingͬͯʁ3ͭͷ Annotationɹ→
1. Annotation Processingͬͯʁ3ͭͷ Annotationɹ42ߦͷΫϥε͕ ੜ͞ΕͯΔʂ→
1. Annotation Processingͬͯʁ• maskarade / Android-Ormahttps://github.com/maskarade/Android-Orma
1. Annotation Processingͬͯʁ• Android-Ormaͷ߹
1. Annotation Processingͬͯʁ4ΧϥϜͷ 1ςʔϒϧʢΫϥεʣ→
1. Annotation Processingͬͯʁ4ΧϥϜͷ 1ςʔϒϧʢΫϥεʣ→ܭ1175ߦʢʂʁʣ ͷίʔυੜ
1. Annotation Processingͬͯʁ͜Ε͚ͩͷίʔυΛॻ͘ख͕ؒল͚Δʂ
ͭ·Γ…1. Annotation Processingͬͯʁ
ͦͷͷ࣌ؒΛ ༗ҙٛʹ͑Δʂ1. Annotation Processingͬͯʁ
1. Annotation Processingͬͯʁੜ͞ΕͨιʔείʔυҎԼஔ͞Εͯ·͢ {MODULE}/build/generated/source/apt/
Annotation ProcessingΛͬͯίʔυੜ ͢Δʹʁ2. Annotationͱίʔυੜ
2. AnnotationͱίʔυੜProcessingΛߦ͏ʹɺAbstractProcessorΛܧঝͨ͠ProcessorΫϥεΛ࡞Γ·͢processϝιουAnnotationΛ͚ͭͨର͕Πϕϯτͱͯ͠ίϯύΠϧલʹྲྀΕ͖ͯ·͢
2. Annotationͱίʔυੜ͜ͷAbstractProcessorΫϥεɺAndroid ApplicationAndroid LibraryͩͱΫϥεࣗମ͕ଘࡏ͠ͳ͍ͷͰ Java LibraryͰಋೖͯ͠Լ͍͞
Google / AutoService2. Annotationͱίʔυੜhttps://github.com/google/auto/tree/master/service
ProcessorΫϥεʹରͯ͠@AutoServiceΞϊςʔγϣϯΛ༩͢Δ͜ͱͰϏϧυ࣌ʹࣗಈతʹProcessingͤ͞Δ͜ͱ͕ՄೳͰ͢2. Annotationͱίʔυੜ
ίʔυੜΛߦ͏ʹɺProcessorΫϥεͰऔಘͰ͖ΔprocessingEnvม͔ΒwriterΫϥεΛऔಘͯ͠ιʔείʔυͷ༰Λྲྀ͠ࠐΈ·͢2. Annotationͱίʔυੜ
2. Annotationͱίʔυੜprocess()ϝιουͰ͞ΕΔRoundEnvironmentҾΛ͏ͱɺAnnotationΛ༩͞ΕͨରΛElementͱ͍͏୯ҐͰऔಘ͢Δ͜ͱ͕ग़དྷ·͢ɻ ElementΫϥε͔Βܕύοέʔδ໊ɺΫϥε໊ͳͲιʔείʔυʹؔΘΔͷ͍͍ͩͨऔಘͰ͖·͢MyAnnotation͕༩͞ΕͨҰཡͷऔಘྫ
2. AnnotationͱίʔυੜQ. Ͳ͏ͬͯίʔυॻ͘ͷʁ
2. AnnotationͱίʔυੜA. JavaPoetΛ͏ͷ͕͓͢͢Ίʂ
Square / JavaPoet3. JavaPoetͱKotlinPoethttps://github.com/square/javapoet
Square / KotlinPoet3. JavaPoetͱKotlinPoethttps://github.com/square/kotlinpoet
3. JavaPoetͱKotlinPoetͲͪΒJavaݴޠ༷Ͱαϙʔτ͞Ε͍ͯͳ͍Java(Kotlin)ιʔείʔυΛಈతʹੜ͢ΔͨΊͷϥΠϒϥϦɻ• JavaPoet• Javaίʔυੜ → Java&Kotlin݉༻• KotlinPoet• Kotlinίʔυੜ → Kotlinʢ͕ϏϧυͰ͖Δڥʣઐ༻
3. JavaPoetͱKotlinPoet࡞͍ͨ͠Ϋϥε໊ύοέʔδΛTypeSpecΫϥεࢦఆ͢Δ͜ͱͰιʔείʔυΛੜͰ͖·͢·ͨɺwriteToϝιουprocessingEnv.getFiler()ΛҾͱͯ͠ࢦఆ͢Δ͜ͱͰίϯύΠϧରͱؚͯ͠ΊΔ͜ͱ͕ՄೳͰ͢
3. JavaPoetͱKotlinPoetTypeSpecʹιʔείʔυΛಈతʹ هड़͢ΔͨΊʹ༷ʑͳใΛࢦఆͰ͖·͢
3. JavaPoetͱKotlinPoet• جఈͱͳΔSuperΫϥεͷࢦఆ• ίϯετϥΫλͷఆٛ• privatepublicͳͲͷम০ࢠͷ༩• ϝιουͷఆٛ• ϑΟʔϧυมɺϩʔΧϧมͷఆٛ• ͦͷଞҙͷίʔυͷૠೖTypeSpecʹιʔείʔυΛಈతʹ هड़͢ΔͨΊʹ༷ʑͳใΛࢦఆͰ͖·͢
4. Android։ൃʹ͓͍ͯͲͷΑ͏ʹ׆༻Ͱ͖Δͷ͔• Android Frameworkͷݹ͍APIಛʹࣗಈԽͷ༨͕͋Δͱࢥ͍·͢• ଞʹۀ্ɺಛ༗ͷ͓·͡ͳ͍తͳίʔυΛॻ͔ͳ͚ΕͳΒͳ͍߹ʹޮՌΛൃش͢ΔͱࢥΘΕ·͢
4. Android։ൃʹ͓͍ͯͲͷΑ͏ʹ׆༻Ͱ͖Δͷ͔• Android Frameworkͷݹ͍APIಛʹࣗಈԽͷ༨͕͋Δͱࢥ͍·͢• ଞʹۀ্ɺಛ༗ͷ͓·͡ͳ͍తͳίʔυΛॻ͔ͳ͚ΕͳΒͳ͍߹ʹޮՌΛൃش͢ΔͱࢥΘΕ·͢OrmaRealmIcePickPermissionsDispatcherAndroidAnnotationsDaggerButterKnife
ၟӽͳ͕Β ࢲ͕ࣗ࡞ͨ͠ϥΠϒϥϦΛ ྫʹͯ͠Έ·͢4. Android։ൃʹ͓͍ͯͲͷΑ͏ʹ׆༻Ͱ͖Δͷ͔
ྫ14. Android։ൃʹ͓͍ͯͲͷΑ͏ʹ׆༻Ͱ͖Δͷ͔
4. Android։ൃʹ͓͍ͯͲͷΑ͏ʹ׆༻Ͱ͖Δͷ͔SharedPreferencesKey-ValueͰอଘ͢ΔͨΊɺΞϓϦ͝ͱʹ͍͘͢ϥοϓͨ͠ΫϥεΛॻ͘͜ͱ͕Α͋͘Δͱࢥ͍·͢ɻ
4. Android։ൃʹ͓͍ͯͲͷΑ͏ʹ׆༻Ͱ͖Δͷ͔
อଘ͍ͨ͠ର͑͞ Θ͔ΕࣗಈతʹΊͦ͏4. Android։ൃʹ͓͍ͯͲͷΑ͏ʹ׆༻Ͱ͖Δͷ͔
4. Android։ൃʹ͓͍ͯͲͷΑ͏ʹ׆༻Ͱ͖Δͷ͔KazaKago / Preferhythmhttps://github.com/KazaKago/Preferhythm
4. Android։ൃʹ͓͍ͯͲͷΑ͏ʹ׆༻Ͱ͖Δͷ͔ϥούʔΫϥεΛҎԼͷίʔυ͔ΒੜͰ͖ΔΑ͏ʹʂ
4. Android։ൃʹ͓͍ͯͲͷΑ͏ʹ׆༻Ͱ͖Δͷ͔7ߦˠ65ߦKey໊ ϝιου໊ͳͲ typo͍͢͠ ෦Λࣗಈੜ
4. Android։ൃʹ͓͍ͯͲͷΑ͏ʹ׆༻Ͱ͖Δͷ͔☺
ྫ24. Android։ൃʹ͓͍ͯͲͷΑ͏ʹ׆༻Ͱ͖Δͷ͔
4. Android։ൃʹ͓͍ͯͲͷΑ͏ʹ׆༻Ͱ͖Δͷ͔AndroidͰը໘ؒͰΛ͢߹ɺKey-ValueͰ͢ͷͰཧ͕ࡶ͔ͭtypoͷཁҼʹͳΓ͍͢෦Ͱ͢
4. Android։ൃʹ͓͍ͯͲͷΑ͏ʹ׆༻Ͱ͖Δͷ͔ܕͱϑΟʔϧυ໊͑͞ Θ͔ΕBundleʹ٧ΊΔͷ ػցతʹΊΔΑͶ
4. Android։ൃʹ͓͍ͯͲͷΑ͏ʹ׆༻Ͱ͖Δͷ͔KazaKago / Factolizehttps://github.com/KazaKago/Factolize
4. Android։ൃʹ͓͍ͯͲͷΑ͏ʹ׆༻Ͱ͖Δͷ͔͞ΕΔଆͷActivityͱมʹAnnotationΛ͚͓ͭͯ͘͜ͱͰProcessor͕அͰ͖ΔΑ͏ʹ͠·͢
4. Android։ൃʹ͓͍ͯͲͷΑ͏ʹ׆༻Ͱ͖Δͷ͔AnnotationΛݩʹϑΝΫτϦʔϝιουΛࣗಈੜͯ͠ɺ దʹBundle٧ΊͯऔΓग़͢ΈΛ࣮ݱ͍ͯ͠·ࣗ͢ಈੜΫϥε
4. Android։ൃʹ͓͍ͯͲͷΑ͏ʹ׆༻Ͱ͖Δͷ͔Activity༩ͨ͠ 2ՕॴͷAnnotation→
4. Android։ൃʹ͓͍ͯͲͷΑ͏ʹ׆༻Ͱ͖Δͷ͔Activity༩ͨ͠ 2ՕॴͷAnnotation→ 38ߦͷΫϥε
4. Android։ൃʹ͓͍ͯͲͷΑ͏ʹ׆༻Ͱ͖Δͷ͔AndroidϓϩδΣΫτ্Ͱ ࣮͢Δʹ͋ͨͬͯ
4. Android։ൃʹ͓͍ͯͲͷΑ͏ʹ׆༻Ͱ͖Δͷ͔AbstractProcessorJava Libraryʹ͔͠ଘࡏ͠ͳ͍ͷͰɺAndroidϓϩδΣΫτͰAnnotation ProcessingΛ͏߹ɺϞδϡʔϧΛ͋Δఔࡉ͔͚ͨ͘΄͏͕औΓճ͍͢͠Ͱ͢
4. Android։ൃʹ͓͍ͯͲͷΑ͏ʹ׆༻Ͱ͖Δͷ͔Android LibraryϞδϡʔϧɺProcessor࣮ϞδϡʔϧɺAnnotationఆٛϞδϡʔϧͷ3ߏΛΑ͘ݟ·͢
4. Android։ൃʹ͓͍ͯͲͷΑ͏ʹ׆༻Ͱ͖Δͷ͔Application ModuleProcessor Module Library ModuleAnnotation ModuleΞϓϦϥΠϒϥϦJava Library Android LibraryJava LibraryannotationProcessor (kapt) implementationimplementation apiAndroid Application
5. Kotlin͔Β͏߹ͷҙKotlin JavaϓϩύςΟ ϑΟʔϧυGetterΛͬͯऔಘ ϑΟʔϧυʹΞΫηεAnnotationΛ༩͢Δର͕Java͔Kotlin͔ʹΑͬͯɺ ΞΫηοαʔͷํ๏͕ҟͳΔ߹͕͋Δ͜ͱʹҙͰ͢
5. Kotlin͔Β͏߹ͷҙProcessor܅JavaιʔείʔυKotlinιʔείʔυʁJavaͱKotlinͷΞΫηοαʔͷҧ͍ʹΑͬͯɺϑΟʔϧυͷΛऔಘͰ͖ͳ͍͜ͱ͕͋ΔͷͰProcessorΫϥεͰKotlinΛߟྀ͢Δඞཁ͕͋Γ·͢
5. Kotlin͔Β͏߹ͷҙ• ରࡦ1. ϦϑϨΫγϣϯͰΞΫηε͢ΔίʔυΛੜ͢Δ• ϝϦοτɿJava͔Kotlin͔Λ΄΅ҙࣝͤͣ͏͜ͱ͕Ͱ͖Δ• σϝϦοτɿ࣮ߦ͕͘ɺProguardΛ༻͍ͨಡԽΛߦ͏ͱ߹ʹΑͬͯআ֎ઃఆ͕ඞཁʹͳΔ
5. Kotlin͔Β͏߹ͷҙ• ରࡦ2. ʢඞཁʹԠͯ͡ʣGetterΛܦ༝͢Δ• ϝϦοτɿϦϑϨΫγϣϯͷσϝϦοτ͕ൃੜ͠ͳ͍• σϝϦοτɿΞΫηε͢ΔϑΟʔϧυมϝιουΛprivateʹͰ͖ͳ͍ɻΧελϚΠζ͞ΕͨGetterɺSetter͕ࣗ࡞͞Ε͍ͯͨ߹ͦΕΛࢀরͯ͠͠·͏
5. Kotlin͔Β͏߹ͷҙ• ଞʹKotlinಛ༗ͷڍಈ͕Өڹ͢Δ͜ͱ͋ΔͨΊඞͣJavaͱKotlinͰಈ࡞͢Δ͔֬ೝ͢Δ͜ͱΛ͓͢͢Ί͠·͢• JavaKotlinͷݴޠόʔδϣϯʹΑͬͯɺαϙʔτ͍ͯ͠ͳ͍ίʔυΛੜͯ͠વಈ࡞ͤ͞Δ͜ͱ͕ग़དྷͳ͍ͷͰҙͯ͠ωˑ
࣍1. Annotation Processingͬͯʁ2. Annotationͱίʔυੜ3. JavaPoetͱKotlinPoet4. Android։ൃʹ͓͍ͯͲͷΑ͏ʹ׆༻Ͱ͖Δͷ͔5. Kotlin͔Β͏߹ͷҙ·ͱΊ
·ͱΊDon't Repeat Yourself,Generate Your Code!
αϯϓϧίʔυhttps://github.com/KazaKago/AnnotationProcessingSampleAnnotation ProcessingΛ༻͍ͯ τʔετΛදࣔ͢ΔαϯϓϧͰ͢
࠷ޙʹגࣜձࣾIGNISͰΤϯδχΞΛେืू͍ͯ͠·͢ʂhttps://recruit.1923.co.jp/
࠷ޙʹ͋Γ͕ͱ͏͍͟͝·ͨ͠https://github.com/KazaKago/AnnotationProcessingSampleαϯϓϧίʔυhttps://github.com/KazaKago/PreferhythmPreferhythmFactolizehttps://github.com/KazaKago/Factolize