2021/05/19のRadiotalk Tech Talkの発表資料です。
https://zenn.dev/rmakiyama/articles/ed007c13e498fc
)JMU%*ΛͲ͏͍ͬͯͬͯΔͷ͔Radiotalk Tech Talk #2 Android2021/05/19 Ryo Makiyama
View Slide
w ࢁྎw 3BEJPUBMLגࣜձࣾw "OESPJEΤϯδχΞ[email protected]wSNBLJZBNBࣗݾհ
͢͜ͱ• Hiltͷ؆୯ͳઆ໌• Hiltͷੜίʔυ• Ͳ͏ͬͯDI͍ͯ͠Δ͔• جૅ෦ͷΈ• DIʹ͍ͭͯͷઆ໌• Daggerͷجຊ• HiltͷҠߦํ๏͞ͳ͍͜ͱ
🎉
💪
)JMUͷجૅ
ґଘؔΛՃ//build.gradlebuildscript {…dependencies {…classpath "com.google.dagger:hilt-android-gradle-plugin:2.35.1"}}//app/build.gradleapply plugin: 'kotlin-kapt'apply plugin: 'dagger.hilt.android.plugin'android {…}dependencies {…implementation "com.google.dagger:hilt-android:2.35.1"kapt “com.google.dagger:hilt-android-compiler:2.35.1"}
)JMUΞϓϦέʔγϣϯ@HiltAndroidAppclass SampleApp : Application() {
όΠϯσΟϯάΛΦϒδΣΫτάϥϑʹొclass Hoge @Inject constructor()interface Piyoclass PiyoImpl : Piyo@Module@InstallIn(SingletonComponent::class)object PiyoModule {@Providesfun providePiyo(): Piyo {return PiyoImpl()}}
"DUJWJUZʹґଘؔΛೖ@AndroidEntryPointclass MainActivity : AppCompatActivity() {@Inject lateinit var hoge: Hoge@Inject lateinit var piyo: Piyo…}
ͨͬͨ͜Ε͚ͩʜ🎉
)JMUҎલʢ%BHHFSʣͷ՝• ίϯϙʔωϯτ/αϒίϯϙʔωϯτͷઃܭ• ͦΕͧΕͷείʔϓͷׂΓͯ• ϓϩδΣΫτຖͷઃܭͷֶशίετ
)JMU͕ղܾͨ͜͠ͱ• ίϯϙʔωϯτ/είʔϓͷඪ४Խ• ϘΠϥʔϓϨʔτͷݮ• ઃఆͷ؆ૉԽʹΑΔֶशίετͷݮ
)JMU͕ղܾͨ͜͠ͱ• ίϯϙʔωϯτ/είʔϓͷඪ४Խ• ϘΠϥʔϓϨʔτͷݮ• ֶशίετͷݮͦͷҰํͰʜ
)JMU͕ղܾͨ͜͠ͱ• ίϯϙʔωϯτ/είʔϓͷඪ४Խ• ϘΠϥʔϓϨʔτͷݮ• ֶशίετͷݮͲ͏͍ͬͯͬͯΔͷ🤔
ੜ͞ΕͨίʔυΛݟͯΈΔ👀
ੜ͞Εͨίʔυ܈• Hilt_SampleApp• DaggerSampleApp_HiltComponents_SingletonC• SampleApp_HiltComponents• SampleApp_GeneratedInjector• Hilt_MainActivity• MainActivity_GeneratedInjector• MainActivity_MembersInjector• Hoge_Factory• PiyoModule_ProvidePiyoFactory˞લड़ͨ͠)JMUͷجૅͰॻ͍ͨίʔυʹΑΔੜΛϕʔεͱ͍ͯ͠·͢ɻ
public abstract class Hilt_SampleApp extends Application implements GeneratedComponentManagerHolder {private final ApplicationComponentManager componentManager = new ApplicationComponentManager(new ComponentSupplier() {@Overridepublic Object get() {return DaggerSampleApp_HiltComponents_SingletonC.builder().applicationContextModule(new ApplicationContextModule(Hilt_SampleApp.this)).build();}});@Overridepublic final ApplicationComponentManager componentManager() {return componentManager;}@Overridepublic final Object generatedComponent() {return this.componentManager().generatedComponent();}@CallSuper@Overridepublic void onCreate() {((SampleApp_GeneratedInjector) generatedComponent()).injectSampleApp(UnsafeCasts.unsafeCast(this));super.onCreate();}}
public abstract class Hilt_SampleApp extends Application implements GeneratedComponentManagerHolder {private final ApplicationComponentManager componentManager = new ApplicationComponentManager(new ComponentSupplier() {@Overridepublic Object get() {return DaggerSampleApp_HiltComponents_SingletonC.builder().applicationContextModule(new ApplicationContextModule(Hilt_SampleApp.this)).build();}});@Overridepublic final ApplicationComponentManager componentManager() {return componentManager;}@Overridepublic final Object generatedComponent() {return this.componentManager().generatedComponent();}@CallSuper@Overridepublic void onCreate() {((SampleApp_GeneratedInjector) generatedComponent()).injectSampleApp(UnsafeCasts.unsafeCast(this));super.onCreate();}}"QQMJDBUJPOϨϕϧͷίϯϙʔωϯτΛੜɾอ࣋
public abstract class Hilt_SampleApp extends Application implements GeneratedComponentManagerHolder {private final ApplicationComponentManager componentManager = new ApplicationComponentManager(new ComponentSupplier() {@Overridepublic Object get() {return DaggerSampleApp_HiltComponents_SingletonC.builder().applicationContextModule(new ApplicationContextModule(Hilt_SampleApp.this)).build();}});@Overridepublic final ApplicationComponentManager componentManager() {return componentManager;}@Overridepublic final Object generatedComponent() {return this.componentManager().generatedComponent();}@CallSuper@Overridepublic void onCreate() {((SampleApp_GeneratedInjector) generatedComponent()).injectSampleApp(UnsafeCasts.unsafeCast(this));super.onCreate();}})JMU͕4BNQMF"QQʹ"QQMJDBUJPOϨϕϧͷίϯϙʔωϯτͷґଘؔΛఏڙͰ͖ΔΑ͏ʹ͍ͯ͠Δ
public abstract class Hilt_SampleApp extends Application implements GeneratedComponentManagerHolder {private final ApplicationComponentManager componentManager = new ApplicationComponentManager(new ComponentSupplier() {@Overridepublic Object get() {return DaggerSampleApp_HiltComponents_SingletonC.builder().applicationContextModule(new ApplicationContextModule(Hilt_SampleApp.this)).build();}});@Overridepublic final ApplicationComponentManager componentManager() {return componentManager;}@Overridepublic final Object generatedComponent() {return this.componentManager().generatedComponent();}@CallSuper@Overridepublic void onCreate() {((SampleApp_GeneratedInjector) generatedComponent()).injectSampleApp(UnsafeCasts.unsafeCast(this));super.onCreate();}}"QQMJDBUJPOϨϕϧͷίϯϙʔωϯτ
public final class DaggerSampleApp_HiltComponents_SingletonC extends SampleApp_HiltComponents.SingletonC {…public static Builder builder() {…}@Overridepublic void injectSampleApp(SampleApp sampleApp) {…}@Overridepublic ActivityRetainedComponentBuilder retainedComponentBuilder() {…}@Overridepublic ServiceComponentBuilder serviceComponentBuilder() {…}public static final class Builder {…}private final class ActivityRetainedCBuilder implements SampleApp_HiltComponents.ActivityRetainedC.Builder {…}private final class ActivityRetainedCImpl extends SampleApp_HiltComponents.ActivityRetainedC {…}private final class ServiceCBuilder implements SampleApp_HiltComponents.ServiceC.Builder {…}private final class ServiceCImpl extends SampleApp_HiltComponents.ServiceC {…}}
public final class DaggerSampleApp_HiltComponents_SingletonC extends SampleApp_HiltComponents.SingletonC {…public static Builder builder() {…}@Overridepublic void injectSampleApp(SampleApp sampleApp) {…}@Overridepublic ActivityRetainedComponentBuilder retainedComponentBuilder() {…}@Overridepublic ServiceComponentBuilder serviceComponentBuilder() {…}public static final class Builder {…}private final class ActivityRetainedCBuilder implements SampleApp_HiltComponents.ActivityRetainedC.Builder {…}private final class ActivityRetainedCImpl extends SampleApp_HiltComponents.ActivityRetainedC {…}private final class ServiceCBuilder implements SampleApp_HiltComponents.ServiceC.Builder {…}private final class ServiceCImpl extends SampleApp_HiltComponents.ServiceC {…}}ࣗͷϏϧμʔΫϥε"DUJWJUZ3FUBJOFE$PNQPOFOUͷ࣮ͱͦͷϏϧμʔΫϥε4FSWJDF$PNQPOFOUͷ࣮ͱͦͷϏϧμʔΫϥε
public final class DaggerSampleApp_HiltComponents_SingletonC extends SampleApp_HiltComponents.SingletonC {…private final class ActivityRetainedCImpl extends SampleApp_HiltComponents.ActivityRetainedC {…@Overridepublic ActivityComponentBuilder activityComponentBuilder() {…}@Overridepublic ActivityRetainedLifecycle getActivityRetainedLifecycle() {…}private final class ActivityCBuilder implements SampleApp_HiltComponents.ActivityC.Builder {…}private final class ActivityCImpl extends SampleApp_HiltComponents.ActivityC {…}private final class ViewModelCBuilder implements SampleApp_HiltComponents.ViewModelC.Builder {…}private final class ViewModelCImpl extends SampleApp_HiltComponents.ViewModelC {…}…}
public final class DaggerSampleApp_HiltComponents_SingletonC extends SampleApp_HiltComponents.SingletonC {…private final class ActivityRetainedCImpl extends SampleApp_HiltComponents.ActivityRetainedC {…@Overridepublic ActivityComponentBuilder activityComponentBuilder() {…}@Overridepublic ActivityRetainedLifecycle getActivityRetainedLifecycle() {…}private final class ActivityCBuilder implements SampleApp_HiltComponents.ActivityC.Builder {…}private final class ActivityCImpl extends SampleApp_HiltComponents.ActivityC {…}private final class ViewModelCBuilder implements SampleApp_HiltComponents.ViewModelC.Builder {…}private final class ViewModelCImpl extends SampleApp_HiltComponents.ViewModelC {…}…}"DUJWJUZ$PNQPOFOUͷ࣮ͱͦͷϏϧμʔΫϥε7JFX.PEFM$PNQPOFOUͷ࣮ͱͦͷϏϧμʔΫϥε
public final class DaggerSampleApp_HiltComponents_SingletonC extends SampleApp_HiltComponents.SingletonC {…private final class ActivityRetainedCImpl extends SampleApp_HiltComponents.ActivityRetainedC {…@Overridepublic ActivityComponentBuilder activityComponentBuilder() {…}@Overridepublic ActivityRetainedLifecycle getActivityRetainedLifecycle() {…}private final class ActivityCBuilder implements SampleApp_HiltComponents.ActivityC.Builder {…}private final class ActivityCImpl extends SampleApp_HiltComponents.ActivityC {…}private final class ViewModelCBuilder implements SampleApp_HiltComponents.ViewModelC.Builder {…}private final class ViewModelCImpl extends SampleApp_HiltComponents.ViewModelC {…}…}IUUQTEFWFMPQFSBOESPJEDPNUSBJOJOHEFQFOEFODZJOKFDUJPOIJMUBOESPJE
public final class SampleApp_HiltComponents {…@Component(modules = {ApplicationContextModule.class,PiyoModule.class,ActivityRetainedCBuilderModule.class,ServiceCBuilderModule.class})@Singletonpublic abstract static class SingletonC implements SampleApp_GeneratedInjector,HiltWrapper_ActivityRetainedComponentManager_ActivityRetainedComponentBuilderEntryPoint,ServiceComponentManager.ServiceComponentBuilderEntryPoint,SingletonComponent,GeneratedComponent {}…}$PNQPOFOUͷఆ͕ٛ·ͱ·͍ͬͯΔΫϥε
public final class SampleApp_HiltComponents {…@Component(modules = {ApplicationContextModule.class,PiyoModule.class,ActivityRetainedCBuilderModule.class,ServiceCBuilderModule.class})@Singletonpublic abstract static class SingletonC implements SampleApp_GeneratedInjector,HiltWrapper_ActivityRetainedComponentManager_ActivityRetainedComponentBuilderEntryPoint,ServiceComponentManager.ServiceComponentBuilderEntryPoint,SingletonComponent,GeneratedComponent {}…}།Ұͷ$PNQPOFOU@Module@InstallIn(SingletonComponent::class)object PiyoModule {@Providesfun providePiyo(): Piyo {return PiyoImpl()}}
public final class SampleApp_HiltComponents {…@Subcomponent(modules = {HiltWrapper_ActivityRetainedComponentManager_LifecycleModule.class,ActivityCBuilderModule.class,ViewModelCBuilderModule.class})@ActivityRetainedScopedpublic abstract static class ActivityRetainedC implements ActivityRetainedComponent,ActivityComponentManager.ActivityComponentBuilderEntryPoint,HiltWrapper_ActivityRetainedComponentManager_ActivityRetainedLifecycleEntryPoint,GeneratedComponent {@Subcomponent.Builderabstract interface Builder extends ActivityRetainedComponentBuilder {}}…}4JOHMFUPO$Ҏ֎4VCDPNQPOFOUIUUQTEFWFMPQFSBOESPJEDPNUSBJOJOHEFQFOEFODZJOKFDUJPOIJMUBOESPJE
͜͜·ͰΛཧ🍵• Hilt_AppName͕ىʹͳΓґଘؔΛఏڙͰ͖ΔΑ͏ʹͳΔ• AppName_HiltComponentsඪ४Խ͞Εͨ DaggerͷίϯϙʔωϯτΛఆٛ• DaggerAppName_HiltComponents_SingletonC ίϯϙʔωϯτ܈ͷ࣮Ϋϥε
"DUJWJUZͷґଘؔͷೖ·Ͱ
public abstract class Hilt_MainActivity extends AppCompatActivity implements GeneratedComponentManagerHolder {private volatile ActivityComponentManager componentManager;…@Overridepublic final Object generatedComponent() {return this.componentManager().generatedComponent();}…protected void inject() {if (!injected) {injected = true;((MainActivity_GeneratedInjector) this.generatedComponent()).injectMainActivity(UnsafeCasts.unsafeCast(this));}}@Overridepublic ViewModelProvider.Factory getDefaultViewModelProviderFactory() {return DefaultViewModelFactories.getActivityFactory(this, super.getDefaultViewModelProviderFactory());}}
public abstract class Hilt_MainActivity extends AppCompatActivity implements GeneratedComponentManagerHolder {private volatile ActivityComponentManager componentManager;…@Overridepublic final Object generatedComponent() {return this.componentManager().generatedComponent();}…protected void inject() {if (!injected) {injected = true;((MainActivity_GeneratedInjector) this.generatedComponent()).injectMainActivity(UnsafeCasts.unsafeCast(this));}}@Overridepublic ViewModelProvider.Factory getDefaultViewModelProviderFactory() {return DefaultViewModelFactories.getActivityFactory(this, super.getDefaultViewModelProviderFactory());}}//package dagger.hilt.android.internal.managerspublic class ActivityComponentManager implements GeneratedComponentManager {…@Overridepublic Object generatedComponent() {if (component==null) {synchronized (componentLock) {if (component==null) {component = createComponent();}}}return component;}…}
public abstract class Hilt_MainActivity extends AppCompatActivity implements GeneratedComponentManagerHolder {private volatile ActivityComponentManager componentManager;…@Overridepublic final Object generatedComponent() {return this.componentManager().generatedComponent();}…protected void inject() {if (!injected) {injected = true;((MainActivity_GeneratedInjector) this.generatedComponent()).injectMainActivity(UnsafeCasts.unsafeCast(this));}}@Overridepublic ViewModelProvider.Factory getDefaultViewModelProviderFactory() {return DefaultViewModelFactories.getActivityFactory(this, super.getDefaultViewModelProviderFactory());}})JMU͕.BJO"DUJWJUZʹ"DUJWJUZϨϕϧͷίϯϙʔωϯτͷґଘؔΛఏڙͰ͖ΔΑ͏ʹ͍ͯ͠Δ
public final class DaggerSampleApp_HiltComponents_SingletonC extends SampleApp_HiltComponents.SingletonC {…private final class ActivityCImpl extends SampleApp_HiltComponents.ActivityC {…@Overridepublic void injectMainActivity(MainActivity mainActivity) {injectMainActivity2(mainActivity);}…private MainActivity injectMainActivity2(MainActivity instance) {MainActivity_MembersInjector.injectHoge(instance, new Hoge());MainActivity_MembersInjector.injectPiyo(instance, PiyoModule_ProvidePiyoFactory.providePiyo());return instance;}…}}
public final class DaggerSampleApp_HiltComponents_SingletonC extends SampleApp_HiltComponents.SingletonC {…private final class ActivityCImpl extends SampleApp_HiltComponents.ActivityC {…@Overridepublic void injectMainActivity(MainActivity mainActivity) {injectMainActivity2(mainActivity);}…private MainActivity injectMainActivity2(MainActivity instance) {MainActivity_MembersInjector.injectHoge(instance, new Hoge());MainActivity_MembersInjector.injectPiyo(instance, PiyoModule_ProvidePiyoFactory.providePiyo());return instance;}…}}@OriginatingElement(topLevelClass = MainActivity.class)@GeneratedEntryPoint@InstallIn(ActivityComponent.class)public interface MainActivity_GeneratedInjector {void injectMainActivity(MainActivity mainActivity);}
public final class DaggerSampleApp_HiltComponents_SingletonC extends SampleApp_HiltComponents.SingletonC {…private final class ActivityCImpl extends SampleApp_HiltComponents.ActivityC {…@Overridepublic void injectMainActivity(MainActivity mainActivity) {injectMainActivity2(mainActivity);}…private MainActivity injectMainActivity2(MainActivity instance) {MainActivity_MembersInjector.injectHoge(instance, new Hoge());MainActivity_MembersInjector.injectPiyo(instance, PiyoModule_ProvidePiyoFactory.providePiyo());return instance;}…}}public final class PiyoModule_ProvidePiyoFactory implements Factory {…public static Piyo providePiyo() {return Preconditions.checkNotNullFromProvides(PiyoModule.INSTANCE.providePiyo());}…}
public final class DaggerSampleApp_HiltComponents_SingletonC extends SampleApp_HiltComponents.SingletonC {…private final class ActivityCImpl extends SampleApp_HiltComponents.ActivityC {…@Overridepublic void injectMainActivity(MainActivity mainActivity) {injectMainActivity2(mainActivity);}…private MainActivity injectMainActivity2(MainActivity instance) {MainActivity_MembersInjector.injectHoge(instance, new Hoge());MainActivity_MembersInjector.injectPiyo(instance, PiyoModule_ProvidePiyoFactory.providePiyo());return instance;}…}}public final class PiyoModule_ProvidePiyoFactory implements Factory {…public static Piyo providePiyo() {return Preconditions.checkNotNullFromProvides(PiyoModule.INSTANCE.providePiyo());}…}@Module@InstallIn(SingletonComponent::class)object PiyoModule {@Providesfun providePiyo(): Piyo {return PiyoImpl()}}
public final class MainActivity_MembersInjector implements MembersInjector {…@InjectedFieldSignature("com.rmakiyama.daggerhiltstudy.MainActivity.hoge")public static void injectHoge(MainActivity instance, Hoge hoge) {instance.hoge = hoge;}@InjectedFieldSignature("com.rmakiyama.daggerhiltstudy.MainActivity.piyo")public static void injectPiyo(MainActivity instance, Piyo piyo) {instance.piyo = piyo;}}.BJO"DUJWJUZϑΟʔϧυΠϯδΣΫγϣϯ
"DUJWJUZʹґଘ͕ؔೖ͞Εͨ🎉@AndroidEntryPointclass MainActivity : AppCompatActivity() {@Inject lateinit var hoge: Hoge@Inject lateinit var piyo: Piyo…}
#POVTUSBDL🚀
1JZPΛ4JOHMFUPOείʔϓʹͯ͠ΈΔ@Module@InstallIn(SingletonComponent::class)object PiyoModule {@Provides@Singletonfun providePiyo(): Piyo {return PiyoImpl()}}
public final class DaggerSampleApp_HiltComponents_SingletonC extends SampleApp_HiltComponents.SingletonC {…private volatile Object piyo = new MemoizedSentinel();private Piyo piyo() {Object local = piyo;if (local instanceof MemoizedSentinel) {synchronized (local) {local = piyo;if (local instanceof MemoizedSentinel) {local = PiyoModule_ProvidePiyoFactory.providePiyo();piyo = DoubleCheck.reentrantCheck(piyo, local);}}}return (Piyo) local;}…private final class ActivityCImpl extends SampleApp_HiltComponents.ActivityC {…private MainActivity injectMainActivity2(MainActivity instance) {MainActivity_MembersInjector.injectHoge(instance, new Hoge());MainActivity_MembersInjector.injectPiyo(instance, DaggerSampleApp_HiltComponents_SingletonC.this.piyo());return instance;}…}}4JOHMFUPO$PNQPOFOUͰΠϯελϯεΛཧ
·ͱΊ• Hiltίϯϙʔωϯτ֊Λඪ४Խͨ͠• ෦ͰͷॲཧDagger2ͱ͋·ΓมΘΒͳ͍• ίϯϙʔωϯτઃܭͰ·ͳ͍ͷͰཧղ͍͢͠• ͜ΕͰ͋ͳͨੜίʔυ͕ಡΊΔʂ• Ͳ͏͍ͬͯͬͯΔ͔Λཧղ͢Δͱ҆৺
"QQFOEJY
-JOLT• https://developer.android.com/training/dependency-injection/hilt-android• https://developer.android.com/training/dependency-injection/dagger-android• https://dagger.dev/hilt/• https://zenn.dev/rmakiyama/articles/ed007c13e498fc• https://github.com/rmakiyama/DaggerHiltStudy• https://qiita.com/takahirom/items/46053e031041405e2a9e