自定义AppComponentFactory无法实例化应用程序

时间:2020-04-04 02:45:51

标签: android dependency-injection android-manifest android-application-class

我尝试使用非零arg构造函数(基于Dagger的构造函数依赖项注入)来实现自定义#include <string.h> if (memcmp ( section, current_section, sizeof(section) ) == 0) { // both arrays have the same content } AppComponentFactoryApplication实例,但是我的应用无法启动因为我的自定义Activity子类型没有零arg构造函数,并且堆栈跟踪暗示我的自定义Application没有被使用。

AppComponentFactory

更新:进一步检查后,Logcat中出现另一个错误,表明系统找不到我的自定义E/AndroidRuntime: FATAL EXCEPTION: main Process: com.domain.app, PID: 32670 java.lang.RuntimeException: Unable to instantiate application com.domain.app.CustomApplication: java.lang.InstantiationException: java.lang.Class<com.domain.app.CustomApplication> has no zero argument constructor at android.app.LoadedApk.makeApplication(LoadedApk.java:1226) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6431) at android.app.ActivityThread.access$1300(ActivityThread.java:219) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1859) at android.os.Handler.dispatchMessage(Handler.java:107) at android.os.Looper.loop(Looper.java:214) at android.app.ActivityThread.main(ActivityThread.java:7356) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) Caused by: java.lang.InstantiationException: java.lang.Class<com.domain.app.CustomApplication> has no zero argument constructor at java.lang.Class.newInstance(Native Method) at android.app.AppComponentFactory.instantiateApplication(AppComponentFactory.java:76) at android.app.Instrumentation.newApplication(Instrumentation.java:1155) at android.app.LoadedApk.makeApplication(LoadedApk.java:1218) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6431)  at android.app.ActivityThread.access$1300(ActivityThread.java:219)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1859)  at android.os.Handler.dispatchMessage(Handler.java:107)  at android.os.Looper.loop(Looper.java:214)  at android.app.ActivityThread.main(ActivityThread.java:7356)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) 

AppComponentFactory

1 个答案:

答案 0 :(得分:0)

在我的情况下,这是由于未在清单中使用完全限定的类名引起的。看来,当对E/LoadedApk: Unable to instantiate appComponentFactory java.lang.ClassNotFoundException: Didn't find class "com.domain.app.appname.CustomAppComponentFactory" on path: DexPathList[[zip file "/data/app/com.domain.app.appname-8VLkpKFTUtW8k-xEHX-oMQ==/base.apk"],nativeLibraryDirectories=[/data/app/com.domain.app.appname-8VLkpKFTUtW8k-xEHX-oMQ==/lib/arm64, /system/lib64, /system/product/lib64]] at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:196) at java.lang.ClassLoader.loadClass(ClassLoader.java:379) at java.lang.ClassLoader.loadClass(ClassLoader.java:312) at android.app.LoadedApk.createAppFactory(LoadedApk.java:256) at android.app.LoadedApk.createOrUpdateClassLoaderLocked(LoadedApk.java:855) at android.app.LoadedApk.getClassLoader(LoadedApk.java:950) at android.app.LoadedApk.getResources(LoadedApk.java:1188) at android.app.ContextImpl.createAppContext(ContextImpl.java:2462) at android.app.ContextImpl.createAppContext(ContextImpl.java:2454) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6343) at android.app.ActivityThread.access$1300(ActivityThread.java:219) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1859) at android.os.Handler.dispatchMessage(Handler.java:107) at android.os.Looper.loop(Looper.java:214) at android.app.ActivityThread.main(ActivityThread.java:7356) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) 属性使用简写.ClassName语法时,系统会预先加上applicationId而不是清单元素中声明的包。为了使系统能够识别我的android:appComponentFactory,我必须更改清单:

CustomAppComponentFactory

对此:

<application
    android:appComponentFactory=".CustomAppComponentFactory"
    ....
    >

请注意,我还必须在清单中的<application android:appComponentFactory="com.domain.app.CustomAppComponentFactory" .... > 元素中添加tools:replace="appComponentFactory"才能完成所有这些工作,但是对于与application的清单合并错误有明确的错误消息建议添加replace属性。