【问题标题】:ClassNotFoundException: config_inputEventCompatProcessorOverrideClassName androidx, running on andoridx crashesClassNotFoundException:config_inputEventCompatProcessorOverrideClassName androidx,在andoridx上运行崩溃
【发布时间】:2020-03-16 20:18:16
【问题描述】:

迁移到在 AndroidX 设备上运行的 AndroidX(29) 后崩溃显示

ClassNotFoundException: config_inputEventCompatProcessorOverrideClassName

项目编译运行在andorid10.0启动时崩溃 单击editText时出现此错误,请在此处输入代码

NullPointerException: Attempt to invoke virtual method 'java.util.List android.view.InputEventCompatProcessor.processInputEventForCompatibility(android.view.InputEvent)' on a null object reference

项目/build.gradle

buildscript {
    repositories {
        jcenter()
        maven { url 'https://maven.fabric.io/public' }
        maven { url 'https://jitpack.io' }
        google()
    }
    dependencies {
//        classpath 'com.android.tools.build:gradle:2.3.3'
        classpath 'com.android.tools.build:gradle:3.5.0'
        classpath 'com.google.gms:google-services:3.0.0'
//        classpath 'io.fabric.tools:gradle:1.+'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
        mavenCentral()
        maven { url 'https://maven.google.com' }
        maven { url 'https://jitpack.io' }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}
ext {
    // Sdk and tools
    minSdkVersion = 16
    targetSdkVersion = 26
    compileSdkVersion = 26
    buildToolsVersion = '26.0.0'

    // App dependencies
    supportLibraryVersion = '25.4.0'
    gsonVersion = '2.8.0'
    calligraphyVersion = '2.2.0'
    glideVersion = '3.7.0'
    roomDatabase = '1.0.0-alpha3'
    rx2FastAndroidNetworking = '1.0.0'

    dagger2Version = '2.16'
    rxjava2Version = '2.0.6'
    rxandroidVersion = '2.0.1'
    placeholderviewVersion = '0.6.1'
    debugDBVersion = '1.0.0'
    timberVersion = '4.5.1'
    lifecycle = '1.0.0-alpha3'

    retrofitVersion='2.3.0'
    GsonVersion='2.7'
    okhttpVersion= '3.8.0'
    googleplus= '11.0.0'//'10.2.0'//'11.0.4'
    glideversion= '4.1.1'

    //Test dependencies
    junitVersion = '4.12'
    espressoVersion = '2.2.2'
    mockitoVersion = '2.7.1'
}

app/build.gradle

apply plugin: 'com.android.application'
apply plugin: 'io.fabric'

repositories {
    maven { url 'https://maven.fabric.io/public' }
}
buildscript {
    repositories {
        maven { url 'https://maven.fabric.io/public' }
    }

    dependencies {
        classpath 'io.fabric.tools:gradle:1.27.1'
    }
}
android {
    compileSdkVersion 28
    signingConfigs {
        ReleaseConfig {
            keyAlias 'xxxxx'
            keyPassword 'xxxxx'
            storeFile file('../KeyStore/xxxxx.jks')
            storePassword 'xxxxx'
        }
    }
    defaultConfig {
        applicationId "bz.pei.driver"
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
        vectorDrawables.useSupportLibrary = true
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        signingConfig signingConfigs.ReleaseConfig
        setProperty("archivesBaseName", "PEI Taxi_Driver_v$versionName")

    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }

    List<String> dirs = [
            'main',     // main sample code; look here for the interesting stuff.
            'common',   // components that are reused by multiple samples
            'template'] // boilerplate code that is generated by the sample template process
    sourceSets {
        main {
            dirs.each { dir ->
                java.srcDirs "src/${dir}/java"
                res.srcDirs "src/${dir}/res"
            }
        }
        androidTest.setRoot('tests')
        androidTest.java.srcDirs = ['tests/src']

    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    lintOptions {
        checkReleaseBuilds false
        abortOnError false
    }
    dataBinding.enabled = true
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    androidTestImplementation('androidx.test.espresso:espresso-core:3.1.0', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    //Crashlytics
    implementation('com.crashlytics.sdk.android:crashlytics:2.8.0@aar') {
        transitive = true;
    }
    // dependency injection
    implementation "com.google.dagger:dagger:$rootProject.dagger2Version"
    annotationProcessor "com.google.dagger:dagger-compiler:$rootProject.dagger2Version"
    annotationProcessor "com.google.dagger:dagger-android-processor:$rootProject.dagger2Version"
    implementation "com.google.dagger:dagger-android-support:$rootProject.dagger2Version"
    //Viewmodel
    implementation "com.squareup.retrofit2:retrofit:$rootProject.retrofitVersion"
    implementation "com.squareup.retrofit2:converter-gson:$rootProject.retrofitVersion"
    implementation "com.squareup.okhttp3:logging-interceptor:$rootProject.okhttpVersion"
    implementation "com.google.android.gms:play-services-auth:$rootProject.googleplus"
    implementation "com.google.android.gms:play-services-maps:$rootProject.googleplus"
    implementation "com.google.android.gms:play-services-location:11.0.0"
    implementation 'com.google.maps.android:android-maps-utils:0.5+'
    implementation 'com.github.javiersantos:AppUpdater:2.7'
    implementation 'com.google.firebase:firebase-core:11.0.0'
    implementation 'com.google.firebase:firebase-messaging:11.0.0'
    implementation "com.github.bumptech.glide:glide:$rootProject.glideversion"
    implementation('io.socket:socket.io-client:1.0.0') {//0.8.3') {
        exclude group: 'org.json', module: 'json'
    }
    implementation 'androidx.cardview:cardview:1.0.0'
    implementation 'androidx.appcompat:appcompat:1.0.0'
    implementation 'com.google.android.material:material:1.0.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation 'com.intuit.sdp:sdp-android:1.0.4'
    implementation "com.google.android.gms:play-services-maps:$rootProject.googleplus"
    implementation 'fr.avianey.com.viewpagerindicator:library:2.4.1.1@aar'
    testImplementation 'junit:junit:4.12'

}
apply plugin: 'com.google.gms.google-services'
configurations.all {
    resolutionStrategy.force "com.android.support:support-annotations:$supportLibraryVersion"
    resolutionStrategy.force 'com.google.code.findbugs:jsr305:1.3.9'
}

gradle-wrapper.properties

#Wed Nov 20 00:37:33 IST 2019
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip

# Project-wide Gradle settings.

# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.

# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html

# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
android.enableJetifier=true
android.useAndroidX=true
org.gradle.jvmargs=-Xmx1536m

# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
java.lang.ClassNotFoundException: config_inputEventCompatProcessorOverrideClassName
    at java.lang.Class.classForName(Native Method)
    at java.lang.Class.forName(Class.java:454)
    at java.lang.Class.forName(Class.java:379)
    at android.view.ViewRootImpl.<init>(ViewRootImpl.java:635)
    at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:377)
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:95)
    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4296)
    at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:52)
    at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
    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.ClassNotFoundException: config_inputEventCompatProcessorOverrideClassName
    at java.lang.Class.classForName(Native Method)
    at java.lang.BootClassLoader.findClass(ClassLoader.java:1358)
    at java.lang.BootClassLoader.loadClass(ClassLoader.java:1418)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
    at java.lang.Class.classForName(Native Method) 
    at java.lang.Class.forName(Class.java:454) 
    at java.lang.Class.forName(Class.java:379) 
    at android.view.ViewRootImpl.<init>(ViewRootImpl.java:635) 
    at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:377) 
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:95) 
    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4296) 
    at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:52) 
    at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176) 
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) 
    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.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available
java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.List android.view.InputEventCompatProcessor.processInputEventForCompatibility(android.view.InputEvent)' on a null object reference
    at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:7614)
    at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:188)
    at android.os.MessageQueue.nativePollOnce(Native Method)
    at android.os.MessageQueue.next(MessageQueue.java:336)
    at android.os.Looper.loop(Looper.java:174)
    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)

2019-11-21 06:41:59.007 27692-27692/bz.pei.driver E/AndroidRuntime: 致命异常: main 进程:bz.pei.driver,PID:27692 java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.util.List android.view.InputEventCompatProcessor.processInputEventForCompatibility(android.view.InputEvent)” 在 android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:7614) 在 android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:188) 在 android.os.MessageQueue.nativePollOnce(本机方法) 在 android.os.MessageQueue.next(MessageQueue.java:336) 在 android.os.Looper.loop(Looper.java:174) 在 android.app.ActivityThread.main(ActivityThread.java:7356) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

【问题讨论】:

    标签: java android dagger-2 classnotfoundexception androidx


    【解决方案1】:

    我在 Android 10 上遇到了同样的问题。我使用了 Restring 库,它通过 attachBaseContext(newBase: Context) 注入了自定义的 Resource 实现。这里大家都提到Resource的构造函数被标记为deprecated,但这并没有真正造成问题。

    我在挖掘 Android 源代码,我找到了可以抛出 NPE 的真正原因。

    来自ViewRootImpl.java的受影响线路:

    String processorOverrideName = context.getResources().getString(
                                        R.string.config_inputEventCompatProcessorOverrideClassName);
            if (processorOverrideName.isEmpty()) {
                // No compatibility processor override, using default.
                mInputCompatProcessor = new InputEventCompatProcessor(context);
            } else {
                InputEventCompatProcessor compatProcessor = null;
                try {
                    final Class<? extends InputEventCompatProcessor> klass =
                            (Class<? extends InputEventCompatProcessor>) Class.forName(
                                    processorOverrideName);
                    compatProcessor = klass.getConstructor(Context.class).newInstance(context);
                } catch (Exception e) {
                    Log.e(TAG, "Unable to create the InputEventCompatProcessor. ", e);
                } finally {
                    mInputCompatProcessor = compatProcessor;
                }
            }
    

    在我的例子中,我使用 Restring 库定义了一种新方法来解析字符串键并返回文本。如果密钥在我的字符串存储库(简单的 HashMap)中或作为字符串资源不可用,它会与密钥本身一起返回。所以永远不会是空的,但根据代码它会尝试加载自定义InputEventCompatProcessor,这将失败,mInputCompatProcessor 将是null

    确保您的自定义Resource 中的所有getText() 版本都尊重原始行为,并且不会导致NPE 崩溃。例如,确保R.string.config_inputEventCompatProcessorOverrideClassName 资源在不可用时将被解析为空字符串。

    这将解决真正的问题,您仍然可以使用已弃用的 Resource 构造函数。

    【讨论】:

    • 我想强调一下“确保自定义资源中的 getText() 的所有版本都尊重原始行为并且不会导致 NPE 崩溃”。这就是给我带来问题的原因。
    【解决方案2】:

    回答您的问题需要做一些澄清

    1. 在您迁移到 androidx 之前,该应用运行良好吗?

    2. 该应用是否在其他设备上正常运行而不会崩溃,但仅在 android 10.0 上崩溃?

    3. 您是否正确重构了包名称?如果清单或生成的代码中的文件名具有以大写字母开头的包名,则可能会导致“找不到类异常”

    您可以尝试将 Github 链接粘贴(如果可能)到整个项目以进行正确调试。

    但是,根据您粘贴的代码,您的项目 build.gradle ext 块中的 minsdkversion= 16 与您的应用程序 build.gradle 文件中的 minsdkversion= 15 不同。两个文件的targetsdkversion也不同

    【讨论】:

    • 感谢@Segun Wahaab,并且 1- 是的应用程序在迁移到 AndroidX 之前运行良好 2- 是的应用程序在其他设备中运行而不会崩溃,并且在 andoirdX 中崩溃 3- 是的,我修改了代码和所有包都是小写的source file for the project could you help
    • 我刚刚 fork 你的 repo 并将你的代码下载到 android studio 并即将开始调试。
    • 同时,我注意到您在上一个问题的另一个答案中添加了绿色复选框:stackoverflow.com/questions/58915112/…。将复选框添加到不是您问题的直接答案的答案可能会使未来的用户感到困惑
    • 你的项目有很多错误。其中一些与在旧版本的 android 上调用新方法有关。您需要一个接一个地修复所有这些错误,以防止在用户端崩溃。要查看这些错误,请右键单击应用目录,单击“分析”,然后单击“检查代码”。
    • 在旧版本的android上调用新方法至少有9个错误。在调用这些方法之前,您需要首先检查 android 的版本是否高于或等于最低支持版本。除非您的代码会在较低版本的 android 上崩溃
    【解决方案3】:

    感谢所有支持我解决了问题,这是由于使用了已弃用的方法,这与迁移无关

    @Override
    public Resources getResources() {
        return new CustomResources(sharedPrefence, getAssets(), super.getResources().getDisplayMetrics(), super.getResources().getConfiguration());
    }
    

    自定义资源类不能在androidX中以这种方式使用,通过从Baseactivity.java中删除这个方法解决了这个问题,感谢大家的支持

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-09
      • 1970-01-01
      • 2013-02-15
      • 2013-01-20
      • 2011-03-21
      • 2021-07-06
      • 1970-01-01
      相关资源
      最近更新 更多