2015-09-28 17 views
7

Ho un progetto in cui ho abilitato per evitare 65k limit e anche productFlavors (dev API 21 e prod API 19) per la personalizzazione. Costruire il mio progetto su API 21 cioè dev sapore è successo, ma sul API 19 cioè sapore prod, viene continuamente mi dà eccezione nel compito app shrink{component}MultiDexComponentsProblema di Android Gradle Multidex Build su API 19

Completa log di errore:

: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:[email protected]' 
    compile 'com.facebook.android:facebook-android-sdk:4.1.0' 
} 

Qualsiasi aiuto per favore qualcuno ??

+1

provare a costruire pulito. – QAMAR

+1

Già fatto !!Non c'è fortuna lì –

+0

Stai usando Proguard? –

risposta

0

favore cambia le dipendenze, come di seguito:

dipendenze Modificato:

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:[email protected]' 
compile 'com.facebook.android:facebook-android-sdk:4.1.0' 

Il motivo è che 'compilare FileTree (dir: 'librerie', includono: [' * .jar '])' comprende tutto il file jar a gradle che si trova nella cartella libs ..

Grazie. !!

+0

Ancora non risolvendo il problema. Qualche altra soluzione? –

8

supporto Multidex per Android 5.0 e versioni successive

Android 5.0 e versioni successive utilizza un runtime ART chiamata che nativamente supporta il caricamento di più file DEX da file APK dell'applicazione. ART esegue la pre-compilazione al momento dell'installazione dell'applicazione che esegue la scansione delle classi (.. N) .dex e le compila in un singolo file .oat per l'esecuzione di dal dispositivo Android. Per ulteriori informazioni sul runtime Android 5.0, vedere Introduzione a ART.

Questo è il motivo per cui la vostra applicazione sta lavorando bene a livello di API 21.

sostegno Multidex prima di Android 5,0

versioni della piattaforma prima di Android 5.0 utilizzare la Dalvik runtime per l'esecuzione del codice dell'app. Per impostazione predefinita, Dalvik limita le app a un singolo file bytecode classes.dex per APK. Per ovviare a questa limitazione di , è possibile utilizzare la libreria di supporto multidex, che diventa parte del file DEX principale della propria app e quindi gestisce l'accesso a i file DEX aggiuntivi e il codice che contengono.

Quindi, in primo luogo assicurandosi di aver importato la dipendenza corretta, che a quanto pare l'hai fatta.

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

Nel suo manifesto aggiungere la classe MultiDexApplication dalla libreria di supporto multidex all'elemento applicazione.

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

alternativa a ciò, se la vostra applicazione estende la classe Application, è possibile eseguire l'override del metodo attachBaseContext() e chiamare MultiDex.install(this) per consentire .

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

Spero che ti possa aiutare.

+1

Ho provato questo, ma lo stesso errore –

+0

Grazie .. Bhuvesh Ho appena aggiunto il codice seguente nel mio file di applicazione che fa il trucco, nessun BUNDLE in oncreate nessun attachBaseContext() in quello e prima che stavo usando solo MULTIDEX JAR nella mia build ma la mia app stava precipitando sotto api 21 in fase di esecuzione .. ora il suo funzionamento non ne conosce la ragione. public void onCreate() { \t \t MultiDex.install (questo); \t \t super.onCreate(); \t \t // initialize the singleton \t \t sInstance = this; \t} – Ancee

1

In API 21, il comando :app:shrinkProdDebugMultiDexComponents non viene chiamato poiché l'API 21 utilizza già ART anziché Dalvik. Quindi, supporta nativamente il multidex.

Per API inferiore a 21, viene eseguito il comando :app:shrinkProdDebugMultiDexComponents. Controllare il tuo build.gradle tutto sembra a posto, il che mi porta a quanto segue.

Avete impostato correttamente il supporto multidex?

Avete impostato il manifest per supportare 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> 

O se effettivamente estendere la classe di applicazione, si può fare questo:

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

o utilizzare questo "pre-costruito" versione

public class MyApplication extends MultiDexApplication{ 

...  

} 
+2

Già fatto. Nessuna fortuna –

+0

Usato lo stesso ma non funzionante. –

0

Il compito shrinkProdDebugMultiDexComponents invokes Proguard, così questo errore proviene da Proguard code.

La mia ipotesi sarà che non si sta utilizzando l'ultima versione di Olive Office SDK (che è probabilmente offuscata con buggy o versione Proguard mal configurata). In questo caso, scarica l'ultima versione dallo sviluppatore SDK.

Per risolvere il problema, controllare il bug this simile. Sebbene sia stato chiuso con lo stato di wontfix, this blogpost descrive come applicare la patch al codice Proguard.

Controllare anche this e that risposte di Eric Lafortune (autore Proguard) su problemi simili.

1

non ho fatto capolino nella logica alla base di questo, ma nel mio caso, è stato a causa di conflitti di versione di compile 'com.android.support:appcompat-v7:25.3.1' e compile 'com.google.android.gms:play-services:10.2.4' nella mia build.gradle file.

Solo abilitando non ha funzionato per me. Durante la ricerca delle altre soluzioni, ho trovato alcune persone che si lamentavano del problema di conflitto di versione di play-services. Quindi, ho fatto il backtracking delle modifiche al codice e alla fine ho cambiato la versione da 10.2.4 a 10.2.1 e ha funzionato per me.

0

Risolto problema di crash sopra. Ho rimosso alcune dipendenze inutilizzate e rimosso anche la dipendenza da rx java io.reactivex.rxjava. In sostituzione di Rx java ho aggiunto alcune classi fittizie nel mio pacchetto che è già descritto qui 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; 
} 
Problemi correlati