2015-09-01 17 views
6

Il problema che sto affrontando è che la mia applicazione Android funziona bene su dispositivi con API 5.0 e successive ma si blocca su dispositivi con Kitkat (4.4) e le corrispondenti versioni inferiori. che è in qualche modo correlato agli strumenti di compilazione nel mio file gradle, ma non è ancora in grado di capire il problema. Qualcuno potrebbe aiutarmi con questo.App in arresto anomalo su API Android inferiore a 5.0 (lollipop)

Questo è il mio file Gradle,

 buildscript { 
    repositories { 
     maven { url 'https://maven.fabric.io/public' } 
    } 

    dependencies { 
     classpath 'io.fabric.tools:gradle:1.+' 
    } 
} 
apply plugin: 'com.android.application' 
apply plugin: 'io.fabric' 
apply plugin: 'android' 

repositories { 
    maven { url 'https://maven.fabric.io/public' } 
    maven { url 'http://clinker.47deg.com/nexus/content/groups/public' } 
} 


android { 
    compileSdkVersion 22 
    buildToolsVersion '22.0.1' 

    defaultConfig { 
     applicationId "com.abc.example" 
     minSdkVersion 10 
     targetSdkVersion 22 
     multiDexEnabled true 
     versionCode 12 
     versionName "1.0" 
    } 
    buildTypes { 
     release { 
      multiDexEnabled true 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
    android { 
     packagingOptions { 
      exclude 'META-INF/LICENSE' 
     } 
    } 
    android { 
     packagingOptions { 
      exclude 'META-INF/NOTICE' 
     } 
    } 
} 



dependencies { 
    compile fileTree(include: ['*.jar'], dir: 'libs') 
    compile 'com.android.support:appcompat-v7:22.2.0' 
    compile('com.fortysevendeg.swipelistview:swipelistview:[email protected]') { 
     transitive = true 
     exclude module: 'httpclient' 
     exclude group: 'httpclient' 
    } 

    compile 'com.squareup.retrofit:retrofit:1.9.0' 
    compile 'com.squareup.okhttp:mockwebserver:2.3.0' 
    compile 'de.hdodenhof:circleimageview:1.2.2' 
    compile 'com.android.support:multidex:1.0.1' 
    compile 'com.google.android.gms:play-services-maps:7.5.0' 
    compile files('libs/bitlyj-2.0.0.jar') 

} 

ottenere questo errore quando il progetto è costruito Inoltre,

Caused by: java.lang.NoClassDefFoundError: com.package.R$styleable 
      at com.package.widgets.StyleableTextView.<init>(StyleableTextView.java:23) 

Questa è classe StyleableTextView,

public class StyleableTextView extends TextView { 

    public StyleableTextView(Context context) { 
     super(context); 
    } 

    public StyleableTextView(Context context, AttributeSet attrs) { 
     super(context.getApplicationContext(), attrs); 
     UiUtil.setCustomFont(StyleableTextView.this, context, attrs, 
       R.styleable.com_eywa_wonk_widgets_StyleableTextView, 
       R.styleable.com_eywa_wonk_widgets_StyleableTextView_font); 
    } 

    public StyleableTextView(Context context, AttributeSet attrs, int defStyle) { 
     super(context.getApplicationContext(), attrs, defStyle); 
     UiUtil.setCustomFont(StyleableTextView.this, context, attrs, 
       R.styleable.com_eywa_wonk_widgets_StyleableTextView, 
       R.styleable.com_eywa_wonk_widgets_StyleableTextView_font); 
    } 

} 

Questa è la styleable in attrs,

<resources> 

    <attr name="font" format="string" /> 

<declare-styleable name="com.package.widgets.StyleableTextView"> 
     <attr name="font" /> 

    </declare-styleable> 

</resources> 
+0

Puoi essere più specifico sull'errore? Pubblica la traccia dello stack – forcewill

+0

Sì, certo. Ho creato uno stile personalizzato per una visualizzazione testo personalizzata nel mio file attrs nella cartella "values". Lo styleable viene rilevato in dispositivi con 5.0 ma in dispositivi con API 4.4 e meno, dice che non è possibile trovare il TextView personalizzato nella tua app insieme con l'errore e sono abbastanza sicuro di averlo usato come "com.package.CustomTextView" –

+0

La cartella dei valori ha un contatore di versione ? Come/values-v22? In tal caso, dovrai creare qualcosa per altre versioni o aggiungere lo stylable personalizzato solo per i dispositivi Lollipop. – Knossos

risposta

24

Quando si utilizza , quindi provare a estendere la classe di applicazione con MultiDexAppication invece di Application e sovrascrivere sotto metodo di questo richiesto per Android inferiore a 5.0 (perché 5.0 e sopra supporto per il multidex)

e in dipendenza encies aggiungere questo

compilazione 'com.android.support:multidex:1.0.1'

+1

Uomo, questo post è un risparmiatore di vita. Stavo cercando una soluzione per 2 giorni. Neanche io ero sicuro del problema. – drulabs

0

Un problema che si può affrontare è questa, come explained in the documentation:

multiDexEnabled true 

Applications that use multidex may not start on devices that run versions of the platform earlier than Android 4.0 (API level 14) due to a Dalvik linearAlloc bug (Issue 22586). If you are targeting API levels earlier than 14, make sure to perform testing with these versions of the platform as your application can have issues at startup or when particular groups of classes are loaded. Code shrinking can reduce or possibly eliminate these potential issues.

+0

Ohh..potrebbe questo essere il motivo? .. fammi controllare e ti faccio sapere .. –

+0

quando multiDexEnabled rimosso poi costruire incontri un errore come "Errore: esecuzione non riuscita per l'attività": app: dexDebug ". > com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: processo 'comando'/usr/lib/jvm/java-7-openjdk-amd64/bin/java '' terminato con valore di uscita diverso da zero 2 " –

3

ho avuto questo problema e risolto aggiungendo la seguente linea alle applicazioni AndroidManifest.xml come un attributo application tag:

android:name="android.support.multidex.MultiDexApplication" 

Ho due app che condividono le stesse risorse e le stesse librerie. L'unica differenza è nell'interfaccia esposta. Ho aggiunto multidex a entrambi, ma ho dimenticato di mettere l'attributo sopra nel manifest per uno. Il NoClassDefFoundError non ha aiutato molto.

È inoltre possibile controllare il seguente: http://developer.android.com/tools/building/multidex.html

0

questo potrebbe non essere rilevante per il particolare scenario, ma come il titolo della questione riguarda il problema che ho incontrato e la ragione mi sono imbattuto in questa domanda. Quindi sto rispondendo qui. Ho riscontrato un problema simile a questo, ma nel mio caso l'estensione dell'applicazione multidex e l'attivazione di multidex non stavano facendo il lavoro. Ho finito per utilizzare un plugin per il conteggio dei metodi nel mio progetto. Usandolo ho capito che non sono vicino al limite di 65K e che il bug è legato a qualcos'altro. Ho trovato la pagina this in cui qualcuno aveva parlato di disabilitare l'esecuzione istantanea da Impostazioni, che in realtà ha funzionato per me. Ora non sto usando la libreria multi-dex e anche le build sono più veloci. Se riscontro nuovamente il problema, aggiornerò la risposta di conseguenza.