java.lang.RuntimeException:无法实例化应用程序。 ClassNotFoundException:未找到类

时间:2017-09-16 20:51:14

标签: android firebase gradle multidex

我知道这个问题已被问了一百万次然而,我找不到我的具体情况的答案。我有一个包含所有代码的库,以及一些导入库的其他模块。

-project
--mylibrary
---sr/main/java
----co/android/mylibrary
----BaseApp (extends MultidexApp)
--Application1
---sr/main/java
----co/android/app2
-----Android Manifest
--Application2
---sr/main/java
----co/android/app2
-----Android Manifest

两个清单都使用这样的基础应用程序。

<application
    android:name="co.android.mylibrary.BaseApp"
    android:allowBackup="false"
    android:fullBackupContent="false"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:theme="@style/AppTheme"
    tools:replace="android:icon,android:theme, android:allowBackup">

构建依赖关系如下所示:

dependencies {
  releaseCompile project(path: ':mylibrary', configuration: 'release')
  debugCompile project(path: ':mylibrary', configuration: 'debug')
}

我的基本应用程序初始化multidex的方法:

protected void attachBaseContext(Context base) {   
    super.attachBaseContext(base);
    try {
      MultiDex.install(this);
    }catch (RuntimeException e){}
}

我的一些规则,我已在两个位置(库和应用程序)添加。这些不包括第三方库和我自己的一些类的一些规则。

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.view.View 
-keep public class co.android.mylibrary.data.greendao.**{ *; }

所以应用程序在我的s8上运行正常,但在某些手机上没有像moto G那样。如果启用Proguard及其缩减的资源(例如发布版本),它们也会正常运行。我注意到的另一个奇怪的行为是,当我在代码的某些部分设置断点并运行发布版本(将debuggable设置为true)时,它会在s8上中断,但不会在moto上中断。

为什么这种奇怪的行为?我发现超级相似的另一个问题是unable to instantiate application - ClassNotFoundException。但仍然没有解决方案。

这是错误的完整日志。忽略包名称。 Exception log

修改

根据@Mostafa Anter的建议改变我在应用程序上编译库的方式后:

compile project(path: ':mylibrary', configuration: 'debug')

它开始给我这个错误。我关掉了我的即时运行。

Class not found exception on Firebase.initProvider

2 个答案:

答案 0 :(得分:0)

make base class extend Application 然后在onCreate方法中调用此行MultiDex.install(this);

修改模块级build.gradle文件以启用multidex并将multidex库添加为依赖项,如下所示:

android {
defaultConfig {
    ...
    minSdkVersion 15 
    targetSdkVersion 26
    multiDexEnabled true
}
...
}

dependencies {
    compile 'com.android.support:multidex:1.0.1'
}

答案 1 :(得分:0)

如果您使用JavaVersion.VERSION_1_8,请确保在所有模块中使用它

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}