web-dev-qa-db-fra.com

Problème Android Gradle Multidex Build sur l'API 19

J'ai un projet dans lequel j'ai activé multidex pour éviter 65k limit et aussi productFlavors (dev API 21 et prod API 19) pour la personnalisation. Construire mon projet sur API 21 succès mais sur API 19 c'est-à-dire saveur prod, il me donne continuellement une exception dans la tâche de l'application shrink{component}MultiDexComponents

Compléter le journal des erreurs:

:app:shrinkProdDebugMultiDexComponents FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:shrinkProdDebugMultiDexComponents'.
> Java.io.IOException: Can't read [{Project Path}/app/build/intermediates/multi-dex/prod/debug/allclasses.jar] (Can't process class [com/olivephone/office/a/b/e/p.class] (Unknown verification type [17] in stack map frame))

build.gradle

apply plugin: 'com.Android.application'

Android {  
    compileSdkVersion 23  
    buildToolsVersion '23.0.0'  
    defaultConfig {  
        applicationId '{Project Name}'  
        minSdkVersion 15  
        targetSdkVersion 23  
        versionCode 1  
        versionName "1.0"  
        multiDexEnabled true  
    }  
    productFlavors {  
        dev {  
            // dev utilizes minSDKVersion = 21 to allow the Android gradle plugin  
            // to pre-dex each module and produce an APK that can be tested on  
            // Android Lollipop without time consuming dex merging processes.  
            minSdkVersion 21  
        }  
        prod {  
            // The actual minSdkVersion for the application.  
            minSdkVersion 19  
        }  
    }  
    buildTypes {  
        release {  
            minifyEnabled false  
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'  
        }  
    }  
}  

dependencies {  
    compile fileTree(include: ['*.jar'], dir: 'libs')  
    compile 'com.Android.support:appcompat-v7:23.0.1'  
    compile 'com.Android.support:recyclerview-v7:23.0.1'  
    compile 'com.Android.support:cardview-v7:23.0.1'  
    compile 'com.oguzdev:CircularFloatingActionMenu:1.0.2'  
    compile 'com.google.code.gson:gson:2.3.1'  
    compile 'com.google.Android.gms:play-services:8.1.0'  
    compile 'com.Android.support:multidex:1.0.1'  
    compile files('libs/linkedin-j-Android.jar')  
    compile files('libs/itsrts-pptviewer.jar')  
    compile files('libs/signpost-core-1.2.1.1.jar')  
    compile 'org.Twitter4j:Twitter4j-core:4.0.2'  
    compile files('libs/universal-image-loader-1.9.2-SNAPSHOT-with-sources.jar')
    compile files('libs/dropbox-Android-sdk-1.6.3.jar')  
    compile files('libs/json_simple-1.1.jar')  
    compile 'com.joanzapata.pdfview:Android-pdfview:1.0.1@jar'  
    compile 'com.facebook.Android:facebook-Android-sdk:4.1.0'  
}

Toute aide s'il vous plaît quelqu'un?

9
Sidakpreet N

Support Multidex pour Android 5.0 et supérieur

Android 5.0 et versions ultérieures utilisent un environnement d'exécution appelé ART qui, de manière native, prend en charge le chargement de plusieurs fichiers dex à partir des fichiers de l'application APK. ART Effectue une pré-compilation au moment de l'installation de l'application, qui analyse les fichiers (.. N) .dex et les compile en un seul fichier .oat pour une exécution de Par Android. dispositif. Pour plus d'informations sur l'exécution d'Android 5.0, voir Présentation de ART.

C'est la raison pour laquelle votre application fonctionne correctement au niveau 21 de l'API.

Support Multidex antérieur à Android 5.0

Les versions de la plate-forme antérieures à Android 5.0 utilisaient le runtime Dalvik Pour exécuter le code d'application. Par défaut, Dalvik limite les applications à un seul fichier de bytecode Classes.dex par APK. Afin de contourner cette limitation , Vous pouvez utiliser la bibliothèque de support multidex, qui devient Partie intégrante du fichier DEX principal de votre application, puis gère l'accès à . les fichiers et le code qu'ils contiennent.

Donc, premièrement, assurez-vous que vous avez importé la dépendance correcte, ce qui semble être le cas.

dependencies {
  compile 'com.Android.support:multidex:1.0.0'
}

Dans votre manifeste, ajoutez la classe MultiDexApplication de la bibliothèque de support multidex à l'élément application.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.example.Android.multidex.myapplication">
    <application
        ...
        Android:name="Android.support.multidex.MultiDexApplication">
        ...
    </application>
</manifest>

Alternative à cela, si votre application étend la classe Application, vous pouvez remplacer la méthode attachBaseContext() et appeler MultiDex.install(this) pour activer multidex.

public void onCreate(Bundle arguments) {
    MultiDex.install(getTargetContext());
    super.onCreate(arguments);
    ...
}

J'espère que cela vous aidera.

8
Bhavesh Patadiya

Dans l'API 21, la commande :app:shrinkProdDebugMultiDexComponents n'est pas appelée car l'API 21 utilise déjà ART au lieu de Dalvik. Ainsi, support natif multidex.

Pour l'API inférieure à 21, la commande :app:shrinkProdDebugMultiDexComponents est exécutée. En vérifiant votre build.gradle, tout semble aller bien, ce qui m'amène à ce qui suit.

Avez-vous correctement configuré le support multidex?

Avez-vous configuré votre manifeste pour prendre en charge Multidex?

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.example.Android.multidex.myapplication">
  <application
    ...
    Android:name="Android.support.multidex.MultiDexApplication">
    ...
  </application>
</manifest>

OU si vous étendez réellement la classe d'application, vous pouvez faire ceci:

public class MyApplication extends Application {
    ...
    @Override
    protected void attachBaseContext(Context base) {
       super.attachBaseContext(base);
       MultiDex.install(this);
    }
    ...     
}

ou utilisez cette version "pré-construite"

public class MyApplication extends MultiDexApplication{

 ...     

}
1
Fadils

Résolu ci-dessus problème de crash. J'ai enlevé quelques dépendances inutilisées et j'ai également enlevé la dépendance rx Java io.reactivex.rxjava. En remplacement de Rx Java, j’ai ajouté quelques classes factices dans mon paquet, qui est déjà décrit ici https://realm.io/docs/Java/latest .

// File 1
package io.reactivex;
public class Flowable {
}
// File 2
package io.reactivex;
public class Observable {
}
// File 3
package io.reactivex;
public enum BackpressureStrategy {
   LATEST;
}
1
Devganiya Hitesh

Je ne me suis pas penché sur la logique derrière cela, mais dans mon cas, cela était dû à des conflits de version de compile 'com.Android.support:appcompat-v7:25.3.1' et compile 'com.google.Android.gms:play-services:10.2.4' dans mon build.gradle fichier.

Activer uniquement multidex n'a pas fonctionné pour moi. En cherchant d'autres solutions, j'ai trouvé certaines personnes qui se plaignaient du problème étrange du conflit de versions de play-services. Alors, j'ai retracé les modifications de code et finalement changé la version play-services de 10.2.4 en 10.2.1 et cela a fonctionné pour moi.

1
Ankur

La tâche shrinkProdDebugMultiDexComponents appelle Proguard et cette erreur provient donc de Proguard code

Mon hypothèse sera que vous n'utilisez pas la dernière version de SDK d'Olive Office (qui est probablement obscurcie par une version de Proguard bugguée ou mal configurée). Si tel est le cas, procurez-vous la dernière version du développeur de SDK.

Pour contourner le problème, vérifiez this bug similaire. Bien qu'il ait été fermé avec le statut wontfix, cet article de blog décrit comment appliquer un correctif au code Proguard. 

Vérifiez également ceci et cela les réponses d'Eric Lafortune (auteur de Proguard) sur des questions similaires.

0
Alex Lipov

Veuillez changer vos dépendances comme ci-dessous:

Dépendances éditées:

compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.Android.support:appcompat-v7:23.0.1'
compile 'com.Android.support:recyclerview-v7:23.0.1'
compile 'com.Android.support:cardview-v7:23.0.1'
compile 'com.oguzdev:CircularFloatingActionMenu:1.0.2'
compile 'com.google.code.gson:gson:2.3.1'
compile 'com.google.Android.gms:play-services:8.1.0'
compile 'com.Android.support:multidex:1.0.1'
compile 'com.googlecode.linkedin-j:linkedin-j-core:1.0.416'
compile 'oauth.signpost:signpost-core:1.2.1.2'
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.4'
compile 'com.googlecode.json-simple:json-simple:1.1'
compile 'org.Twitter4j:Twitter4j-core:4.0.2'
compile files('libs/itsrts-pptviewer.jar')
compile files('libs/dropbox-Android-sdk-1.6.3.jar')
compile 'com.joanzapata.pdfview:Android-pdfview:1.0.1@jar'
compile 'com.facebook.Android:facebook-Android-sdk:4.1.0'  

La raison en est que 'compile fileTree (dir:' libs ', include: [' * .jar '])' 'inclut tous les fichiers jar à classer qui se trouvent dans le dossier libs ..

Merci.!!

0
AndiGeeky