日志简述
- 1. BroadcastReceiver作为内部类时,如要通过静态注册的方式在清单文件中注册,必须要声明为public static,否则会报错:
- 2. Dagger2 Component报错:
- 3.Android resource linking failed
- 4. `InputDispatcher: channel '817b677 xxxxxx.MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed!`
- 5. Dagger does not support injection into private fields
- 6. ActivityScope may not reference bindings with different scopes:
- 7. ActivityScope may not reference bindings with different scopes:
1. BroadcastReceiver作为内部类时,如要通过静态注册的方式在清单文件中注册,必须要声明为public static,否则会报错:
Caused by: java.lang.RuntimeException: Unable to instantiate receiver com.hp.kimilauncher.MainActivity$LauncherControlerReceiver: java.lang.InstantiationException: java.lang.Class<com.hp.kimilauncher.MainActivity$LauncherControlerReceiver> has no zero argument constructor
at android.app.ActivityThread.handleReceiver(ActivityThread.java:3103)
at android.app.ActivityThread.-wrap18(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1628)
at android.os.Handler.dispatchMessage(Handler.java:110)
at android.os.Looper.loop(Looper.java:203)
at android.app.ActivityThread.main(ActivityThread.java:6293)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1084)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:945)
Caused by: java.lang.InstantiationException: java.lang.Class<com.hp.kimilauncher.MainActivity$LauncherControlerReceiver> has no zero argument constructor
at java.lang.Class.newInstance(Native Method)
at android.app.ActivityThread.handleReceiver(ActivityThread.java:3098)
at android.app.ActivityThread.-wrap18(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1628)
at android.os.Handler.dispatchMessage(Handler.java:110)
at android.os.Looper.loop(Looper.java:203)
at android.app.ActivityThread.main(ActivityThread.java:6293)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1084)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:945)
总结:
- BroadcastReceiver作为内部类时,如要通过静态注册的方式在清单文件中注册,必须要声明为public static,否则会报错
解决方案:
- 声明为public static
- 在代码中动态注册
2. Dagger2 Component报错:
E:\ASWorkSpace\IntelligentXiaoK\daggerdemo\build\tmp\kapt3\stubs\debug\com\tdk\daggerdemo\AppComponent.java:26: 错误: @Component.Builder is missing setters for required modules or components: [com.tdk.daggerdemo.AppModule]
public static abstract interface Builder {
错误代码:
@Singleton
@Component(modules = [AppModule::class])
interface AppComponent {
fun sharedPreferences(): SharedPreferences
fun myApplication(): Context
fun inject(application: MyApplication)
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: MyApplication): Builder
fun build(): AppComponent
}
}
解释
@Component.Builder
中缺乏需要配置的modules
或 components
,以下是@Component.Builder
源码中提供的案例,我们对比一下,就会发现错误代码没有配置modules
,只要配置一下modules
问题就解决了
* @Component(modules = {BackendModule.class, FrontendModule.class})
* interface MyComponent {
* MyWidget myWidget();
*
* @Component.Builder
* interface Builder {
* MyComponent build();
* Builder backendModule(BackendModule bm);
* Builder frontendModule(FrontendModule fm);
* }
}
那我们将修改代码如下
@Singleton
@Component(modules = [AppModule::class])
interface AppComponent {
fun sharedPreferences(): SharedPreferences
fun myApplication(): Context
fun inject(application: MyApplication)
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: MyApplication): Builder
fun build(): AppComponent
fun appModule(appModule: AppModule): Builder
}
}
但是很不幸,上面的问题解决了,但是有派生出了新的问题
E:\ASWorkSpace\IntelligentXiaoK\daggerdemo\build\tmp\kapt3\stubs\debug\com\tdk\daggerdemo\AppComponent.java:21: 错误: java.util.Map<java.lang.Class<? extends android.app.Activity>,javax.inject.Provider<dagger.android.AndroidInjector.Factory<? extends android.app.Activity>>> cannot be provided without an @Provides-annotated method.
public abstract void inject(@org.jetbrains.annotations.NotNull()
^
java.util.Map<java.lang.Class<? extends android.app.Activity>,javax.inject.Provider<dagger.android.AndroidInjector.Factory<? extends android.app.Activity>>> is injected at
dagger.android.DispatchingAndroidInjector.<init>(injectorFactories)
dagger.android.DispatchingAndroidInjector<android.app.Activity> is injected at
com.hp.baseres.base.BaseApplication.mActivityInjector
com.tdk.daggerdemo.MyApplication is injected at
com.tdk.daggerdemo.AppComponent.inject(application)
解释:
就是inject
报错,
java.lang.RuntimeException: Unable to create application com.tdk.daggerdemo.MyApplication: java.lang.IllegalStateException: com.tdk.daggerdemo.MyApplication must be set
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5548)
at android.app.ActivityThread.-wrap2(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1612)
at android.os.Handler.dispatchMessage(Handler.java:110)
at android.os.Looper.loop(Looper.java:203)
at android.app.ActivityThread.main(ActivityThread.java:6293)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1084)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:945)
Caused by: java.lang.IllegalStateException: com.tdk.daggerdemo.MyApplication must be set
at com.tdk.daggerdemo.DaggerAppComponent$Builder.build(DaggerAppComponent.java:55)
at com.tdk.daggerdemo.MyApplication.inject(MyApplication.kt:29)
at com.tdk.daggerdemo.MyApplication.onCreate(MyApplication.kt:21)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1024)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5545)
Process: com.tdk.daggerdemo, PID: 15300
java.lang.RuntimeException: Unable to create application com.tdk.daggerdemo.MyApplication: kotlin.UninitializedPropertyAccessException: lateinit property mSharedPreferencesEditor has not been initialized
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5548)
at android.app.ActivityThread.-wrap2(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1612)
at android.os.Handler.dispatchMessage(Handler.java:110)
at android.os.Looper.loop(Looper.java:203)
at android.app.ActivityThread.main(ActivityThread.java:6293)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1084)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:945)
Caused by: kotlin.UninitializedPropertyAccessException: lateinit property mSharedPreferencesEditor has not been initialized
at com.tdk.daggerdemo.MyApplication.onCreate(MyApplication.kt:55)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1024)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5545)
3.Android resource linking failed
Caused by: com.android.builder.internal.aapt.v2.Aapt2Exception: Android resource linking failed
N:\ASWorkSpace\JetPackFrame\daggerdemo\src\main\res\layout\activity_main.xml:9: AAPT: error: attribute layout_constraintBottom_toBottomOf (aka com.tdk.daggerdemo:layout_constraintBottom_toBottomOf) not found.
N:\ASWorkSpace\JetPackFrame\daggerdemo\src\main\res\layout\activity_main.xml:9: AAPT: error: attribute layout_constraintEnd_toEndOf (aka com.tdk.daggerdemo:layout_constraintEnd_toEndOf) not found.
解决方案:
由日志可以看出是ConstraintLayout
布局的问题,本项目中是因为整个工程的某个Moude
引入了ConstraintLayout
,但是当前Moude
没有直接或间接模式调用,所以就报错了。只要在本Module
引入ConstraintLayout
就好
4. InputDispatcher: channel '817b677 xxxxxx.MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
分析:
本人是通过startActivity()
打开一个Unity 游戏,第一次打开会报错(错误日志如下),无法进入游戏;第二次可以正常打开。在多个Unity游戏中,有部分正常,经过分析是Unity打包版本不同,切换到对应Unity版本重新打包,问题解决。
E/InputDispatcher: channel '817b677 com.mathtrain.daban5.rotatingshape/com.kimi.hqg_mathlogic.MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
解决方案:
unity5.6.6版本bug:第一次打开需要打开两次。
unity5.3.6在安卓7以下会出现防近视后没声音
将版本unity5.6.6改为unity5.3.6
5. Dagger does not support injection into private fields
Dagger does not support injection into private fields
private iammert.com.dagger_android_injection.ui.detail.DetailPresenter detailPresenter;
原因和解决方案:
- 方案一
Kotlin 生成.java文件时属性默认为 private,给属性添加@JvmField声明可以转成 public
- 方案二
把@inject
用于注解属性的set
方法
var x: MyDependency?=null
@inject set