2016-08-01 4 views
10

Die Anzahl der Methoden meiner App ist höher als die 64k Grenze, also verwende ich Proguard, um es zu reduzieren.Proguard minifyEnabled true für Debug-Build, funktioniert nicht auf Pre-Lollipop

Alles funktioniert gut für Release-Builds.
Debug-Builds sind dagegen nur für Lollipop + -Geräte erfolgreich. Wenn auf Pre-Lollipop-Geräten starte Ich habe immer den berüchtigten Fehler:

com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536

Dies ist, was ich in der App-Ebene gradle Datei:

buildTypes { 
     debug { 
      minifyEnabled true 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
     release { 
      shrinkResources true 
      minifyEnabled true 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 

Ich habe versucht, zu entfernen habe minifyEnabled true in der debuggen Build, und dann schlägt der Build auch auf Lollipop + fehl, daher funktioniert proguard! aber nicht auf Pre-Lollipop.

Für was ich weiß minifyEnabled sollte nicht plattformabhängig sein, so vielleicht überspringt der Build-Prozess es (für Ich weiß nicht, welchen Grund) auf Pre-Lollipop-Geräten.

Weiß jemand eine Lösung für dieses Problem?

ps. Ich bin mir der Möglichkeit von multiidex bewusst, aber ich verlasse es als meinen letzten Ausweg.

EDIT:

Dies ist der vollständige Code der App-Ebene gradle Datei:

apply plugin: 'com.android.application' 
apply plugin: 'android-apt' 
apply plugin: 'me.tatarka.retrolambda' 

buildscript { 
    repositories { 
     mavenCentral() 
    } 

    dependencies { 
     classpath 'me.tatarka:gradle-retrolambda:3.2.5' 
     classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.5.5' 
    } 
} 

android { 
    compileSdkVersion 24 
    buildToolsVersion "23.0.3" 
    defaultConfig { 
     applicationId "com.pierfrancescosoffritti.shuffly" 
     minSdkVersion 16 
     targetSdkVersion 24 
     versionCode 30 
     versionName "0.13" 
    } 
    buildTypes { 
     debug { 
      minifyEnabled true 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
     release { 
      shrinkResources true 
      minifyEnabled true 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
    compileOptions { 
     sourceCompatibility JavaVersion.VERSION_1_8 
     targetCompatibility JavaVersion.VERSION_1_8 
    } 
} 

def dbflow_version = "3.1.1" 

dependencies { 
    compile fileTree(include: ['*.jar'], dir: 'libs') 
    testCompile 'junit:junit:4.12' 
    apt 'com.jakewharton:butterknife-compiler:8.2.1' 
    apt "com.github.Raizlabs.DBFlow:dbflow-processor:${dbflow_version}" 
    compile "com.github.Raizlabs.DBFlow:dbflow-core:${dbflow_version}" 
    compile "com.github.Raizlabs.DBFlow:dbflow:${dbflow_version}" 

    compile 'com.android.support:support-v4:24.1.1' 
    compile 'com.android.support:design:24.1.1' 
    compile 'com.android.support:recyclerview-v7:24.1.1' 
    compile 'com.android.support:cardview-v7:24.1.1' 
    compile 'com.android.support:palette-v7:24.1.1' 
    compile 'com.jakewharton:butterknife:8.2.1' 
    compile 'com.github.PierfrancescoSoffritti:AndroidUtils:0.5' 
    compile 'com.github.PierfrancescoSoffritti:SlidingDrawer:0.10' 
    compile 'com.github.PierfrancescoSoffritti:WebBasedOAuth:0.7' 
    compile 'com.github.PierfrancescoSoffritti:ShrinkingImageLayout:0.4' 
    compile 'com.github.PierfrancescoSoffritti:ExpandableLayout:0.1' 
    compile 'com.google.apis:google-api-services-youtube:v3-rev177-1.22.0' 
    compile 'com.google.api-client:google-api-client-android:1.20.0' 
    compile 'io.reactivex:rxandroid:1.2.1' 
    compile 'io.reactivex:rxjava:1.1.8' 
    compile 'com.squareup.picasso:picasso:2.5.2' 
    compile 'com.github.Commit451:ElasticDragDismissLayout:1.0.4' 
    compile 'com.google.firebase:firebase-core:9.2.1' 
    compile 'com.google.firebase:firebase-crash:9.2.1' 
    compile 'com.google.firebase:firebase-ads:9.2.1' 
    compile 'com.artemzin.rxjava:proguard-rules:1.1.8.0' 
} 

apply plugin: 'com.google.gms.google-services' 
apply plugin: 'com.getkeepsafe.dexcount' 

Projektebene gradle Datei:

buildscript { 
    repositories { 
     jcenter() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:2.1.2' 
     classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' 
     classpath 'com.google.gms:google-services:3.0.0' 
     classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.5.5' 
    } 
} 

allprojects { 
    repositories { 
     jcenter() 
     maven { url "https://jitpack.io" } 
    } 
} 

task clean(type: Delete) { 
    delete rootProject.buildDir 
} 

proguard Regeln:

# retrolambda 
-dontwarn java.lang.invoke.* 

# picasso 
-dontwarn com.squareup.okhttp.** 

# adMob 
-keep public class com.google.android.gms.ads.** { 
    public *; 
} 
-keep public class com.google.ads.** { 
    public *; 
} 

# GoogleApiClient 
# Needed to keep generic types and @Key annotations accessed via reflection 
-keepattributes Signature,RuntimeVisibleAnnotations,AnnotationDefault 
-keepclassmembers class * { 
    @com.google.api.client.util.Key <fields>; 
} 
# Needed by google-http-client-android when linking against an older platform version 
-dontwarn com.google.api.client.extensions.android.** 
# Needed by google-api-client-android when linking against an older platform version 
-dontwarn com.google.api.client.googleapis.extensions.android.** 
# Needed by google-play-services when linking against an older platform version 
-dontwarn com.google.android.gms.** 
# com.google.client.util.IOUtils references java.nio.file.Files when on Java 7+ 
-dontnote java.nio.file.Files, java.nio.file.Path 
# Suppress notes on LicensingServices 
-dontnote **.ILicensingService 
# Suppress warnings on sun.misc.Unsafe 
-dontnote sun.misc.Unsafe 
-dontwarn sun.misc.Unsafe 

# DBFlow 
-keep class * extends com.raizlabs.android.dbflow.config.DatabaseHolder { *; } 
+0

wählen Sie nicht, Abhängigkeiten, die nur lokal zum debug mitgeliefert? Wie, LeakCanary? – EpicPandaForce

+0

Nein, ich überprüfe auch die Methodenanzahl des Debug-Builds mit https://github.com/KeepSafe/dexcount-gradle-plugin und es ist in Ordnung. Es ist ungefähr 30k. (Minifed mit Proguard) –

+0

Bitte zeigen Sie den vollen Code Ihrer gradle.build Datei – Divers

Antwort

1

Wenn Sie wa Um zu versuchen, die Anzahl der Methoden zu reduzieren, oder zumindest den Unterschied von Release zu Debug zu verstehen, schlage ich vor, dass Sie versuchen, die in AS 2.2 Preview 5 verfügbare Dex-Anzahl zu sehen. Sie hatten ein YouTube-Video (vielleicht von Google IO) das machte es ziemlich einfach, deine Methoden zu zählen.

Dies ist nur für Methoden zählen, wenn Sie immer noch die gleichen buildToolsVersion "23.0.3" verwenden, sollten Sie genau die gleiche apk-Datei in beiden Versionen von AS (abgesehen von der Tatsache, dass AS 2.2 Schiffe mit einer eigenen Version von JDK bekommen, ist das nicht sollte dir in den Weg kommen).

Haftungsausschluss: Ich habe dieses Tool nie benutzt, abgesehen davon, damit zu spielen, also würde ich nicht wissen, was ich empfehlen soll, nachdem Sie tatsächlich einen Täter dort finden.

BEARBEITEN: Hier ist das Video https://youtu.be/csaXml4xtN8?t=331 für den "Apk Analyzer", der im "Build" -Menü lebt. Versuchen Sie nicht, Bewertungen früher als 2.2 Vorschau 3 oder später, sie previewed einige Dinge, die erst später veröffentlicht wurden.

EDIT 2: auch warum verwenden Sie nur shrinkResources bei Freigabe? Dies ist die Zeile, die zur Beseitigung unnötiger Methoden verwendet wird: "minifyEnabled" vs "shrinkResources" - what's the difference? and how to get the saved space?

+0

Ich zähle bereits meine Methoden mit https://github.com/KeepSafe/dexcount-gradle-plugin. Die Anzahl der Methoden liegt bei 30k nachdem sie von proguard geschrumpft wurde. Also ist es in Ordnung. –

+0

Hmm, ich würde versuchen, etwas über Kunst zu lesen, wurde das nicht in Kit kat als Option und Lollipop als stabil eingeführt? Aber haben Sie den gleichen Fehler in Debug, wenn Sie die gleichen Informationen als Release verwenden? Da dies Standard-Varianten sind, können sie abgesehen von "debuggable true" eine versteckte Konfiguration haben. – Fabio

+0

Ja, das ist seltsam. Ich würde versuchen, dieses Problem zu reproduzieren, indem ich die APK ohne AS herstelle und installiere, oder zumindest wenn du damit machst, stelle sicher, dass du den Instant Run deaktivierst. Und ich würde auch überprüfen, die Anzahl der Methoden für Ihre Debug-Build mit einem zweiten Skript/Gradle-Plugin, nur um sicherzustellen, dass, weil diese Fehlermeldung sehr spezifisch auf die 65k-Methode Anzahl trifft. – Fabio

-1

Aktivieren Sie multidex aktiviert True und ermöglichen die Unterstützung Ihrer Anwendung als Multidex-Anwendung.Nur wenige Schritte befolgt werden, sind:

defaultConfig { 
     minSdkVersion 15 
     targetSdkVersion 23 
     versionCode 3 
     versionName "1.0.1" 
     **multiDexEnabled true** 
    } 

diese Abhängigkeit

zur Abhängigkeitsliste hinzufügen Kompilierung ‚com.android.support:multidex:1.0.0‘

erweitern Anwendungsebene Klasse mit MultiDexApplication

schreiben diese Methode in Ihrer Anwendungsklasse

protected void attachBaseContext(Context base) 
    { 
     super.attachBaseContext(base); 
     MultiDex.install(this); 
    } 

keep minifyEnabled falsch keine Debug-Angelegenheit oder Freigabe mit diesem Code in App-Ebene gradle Datei

Update

dexOptions { 
     jumboMode = true 
     javaMaxHeapSize "4g" //specify the heap size for the dex process 
     preDexLibraries = false 
    } 
+1

wie gesagt: "PS. Ich bin mir der Möglichkeit von Multidex bewusst, aber ich verlasse es als meinen letzten Ausweg." –

0

Ersetzen Sie Ihren Build-Typen Code bauen. , wenn Sie Variante gebaut Debug-debuggen oder wählen Sie vor der endgültigen Freigabe auf Ihrem Gerät Code läuft dann und wann Sie gebaut unterzeichnet apk für die Freigabe werden dann gebaut Variante Release

buildTypes { 
       debug { 
        minifyEnabled false 
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
       } 
       release { 
        shrinkResources true 
        minifyEnabled true 
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
       } 
} 
Verwandte Themen