2017-09-16 2 views
0

Je sais que cette question a été posée un million de fois et pourtant, je n'ai pas trouvé la réponse à ma situation spécifique. J'ai une bibliothèque qui contient tout le code, et quelques autres modules qui importent la bibliothèque.java.lang.RuntimeException: impossible d'instancier l'application. ClassNotFoundException: n'a pas trouvé la classe

-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 

Et les deux manifestes utilisent l'application de base comme ceci.

<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"> 

Et les dépendances de construction ressemblent à ceci:

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

méthode de mon application de base pour initialiser multidex:

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

Certains de mes règles ProGuard, que je l'ai ajouté à la fois emplacements (bibliothèque et application). Ceux-ci n'incluent pas certaines règles pour les bibliothèques tierces et certaines de mes propres classes.

-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.**{ *; } 

Ainsi, l'application fonctionne très bien sur mon s8, mais ne pas sur certains téléphones comme le moto G. Ils seraient également fonctionner très bien si Proguard est activé et que ses ressources de rétrécissement, comme pour la libération construit. Un autre comportement étrange que j'ai remarqué est que, quand je place mon point d'arrêt sur certaines parties de mon code et que j'exécute les builds de release (avec debuggable réglé sur true), ça casse sur le s8, mais pas sur la moto.

Pourquoi ce comportement étrange? Une autre question que j'ai trouvé super similaire est unable to instantiate application - ClassNotFoundException. Mais toujours pas de résolution.

Ceci est le journal complet de l'erreur. Ignorez les noms de package. Exception log

Modifier

Après avoir changé la façon dont je compile la bibliothèque sur ma demande, sur la base de suggestiongs @Mostafa Anter:

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

Il a commencé à me donner cette erreur. J'ai ma course instantanée désactivée.

Class not found exception on Firebase.initProvider

+0

pouvez-vous afficher les détails logcat de ClassNotFoundException? – JRG

Répondre

0

extension font classe de base Application puis à l'intérieur appel de méthode onCreate cette ligne MultiDex.install(this);

Modifier le fichier build.gradle au niveau du module pour permettre multidex et ajouter la bibliothèque multidex comme une dépendance, comme le montre ici:

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

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

Faire cela déjà. – user2130331

+0

utilisez-vous proguard? si oui, fournissez-nous les règles –

+0

essayez d'ajouter cette ligne à progaurd -keep public class your_missing_class_full_name –

0

si vous utilisez JavaVersion.VERSION_1_8 s'il vous plaît assurez-vous que vous utilisez dans tous les modules

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