2015-12-03 1 views
5

J'utilise productFlavours dans mon application. J'utilise aussi multi dex.java.lang.LinkageError: MainActivity

defaultConfig { 
     multiDexEnabled true 
     minSdkVersion 17 
     targetSdkVersion 22 
     ... 
} 

productFlavors { 
    prodFlavor1{...} 
    prodFlavor2{...} 
} 

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

Dans la classe d'application:

@Override 
    public void onCreate() { 
     MultiDex.install(getApplicationContext()); 
     super.onCreate(); 
} 

J'ai ajouté le code ci-dessus pour les versions Android ci-dessous 5 support.

Ensuite, la structure suivante, avec 2 versions légèrement différentes de MainActivity (MainActivity extends AppCompatActivity) démarre à un certain moment dans l'application, sur un appui sur un bouton.

app/src/prodFlavor1/.../MainActivity 
app/src/prodFlavor2/.../MainActivity 

En prodFlavor1, MainActivity commence immédiatement après SplashActivity. En prodFlavor2, MainActivity.

Cela a fonctionné pendant une longue période avant et même après que j'ai ajouté cette partie avec , mais soudainement voûté travailler sans explication. Même si je supprime le code référençant multidex, j'obtiens la même chose.

Lorsque je passe à prodVersion2 tout fonctionne. Mais quand je passe à prodVersion1 je reçois:

startActivity(new Intent(TutorialActivity.this,MainActivity.class));

Nexus 5 avec Android 6:

Process: com.mpackage, PID: 30807 
                  java.lang.LinkageError: com.mpackage.activities.MainActivity 
                   at dalvik.system.DexFile.defineClassNative(Native Method) 
                   at dalvik.system.DexFile.defineClass(DexFile.java:226) 
                   at dalvik.system.DexFile.loadClassBinaryName(DexFile.java:219) 
                   at dalvik.system.DexPathList.findClass(DexPathList.java:338) 
                   at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:54) 
                   at java.lang.ClassLoader.loadClass(ClassLoader.java:511) 
                   at java.lang.ClassLoader.loadClass(ClassLoader.java:469) 
                   at com.gossip.activities.TutorialActivity$1.handleMessage(TutorialActivity.java:52) 
                   at android.os.Handler.dispatchMessage(Handler.java:102) 
                   at android.os.Looper.loop(Looper.java:148) 
                   at android.app.ActivityThread.main(ActivityThread.java:5417) 
                   at java.lang.reflect.Method.invoke(Native Method) 
                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

sur Nexus4 Emulator avec Android 4.4:

java.lang.NoClassDefFoundError: com.mpackage.activities.MainActivity 
                   at com.gossip.activities.TutorialActivity$1.handleMessage(TutorialActivity.java:52) 
                   at android.os.Handler.dispatchMessage(Handler.java:102) 
                   at android.os.Looper.loop(Looper.java:136) 
                   at android.app.ActivityThread.main(ActivityThread.java:5017) 
                   at java.lang.reflect.Method.invokeNative(Native Method) 
                   at java.lang.reflect.Method.invoke(Method.java:515) 
                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
                   at dalvik.system.NativeStart.main(Native Method) 

MISE À JOUR:

Il semble que l'erreur a été provoquée par le fait que je l'ai ajouté une méthode appelée isResumed() dans MainActivity, c'est pourquoi erreur (Native Method), différent sur 6,0 de 4,4.

Répondre

19

Enfin résolu après trouvé this fil utile:

J'ai créé une méthode isResumed() dans ma classe.

public boolean isResumed(){ 
    return isResumed; 
} 

Immédiatement après l'avoir supprimé/édité, tout est passé à la normale. Je n'ai pas trouvé cette méthode dans Activity ou AppCompatActivity dans la documentation.

+3

Il est caché dans la documentation, oui (voir @hide). Mais vous pouvez le trouver dans le code source: https://github.com/android/platform_frameworks_base/blob/master/core/java/android/app/Activity.java#L6432 – xip

0

Nom de fonction conflictuel avec l'une des classes de base. Renommez votre fonction en quelque chose de personnalisé, c'est-à-dire isBaseResumed()