2016-08-01 9 views
10

Liczba metod mojej aplikacji jest wyższa niż limit 64 KB, więc używam Proguard, aby ją zmniejszyć.Proguard minifyEnabled prawda dla kompilacji debugowania, nie działa na pre-Lollipop

Wszystko działa dobrze dla wersji wydań.
Z kolei wersje debugowania odnoszą sukces tylko w urządzeniach Lollipop +. Podczas uruchamiania na urządzeniach wstępnie Lollipop zawsze mam niesławny błąd:

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

To co mam na poziomie ok Gradle pliku:

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' 
     } 
    } 

Próbowałem usuwania minifyEnabled true w debugowanie kompilacji, a następnie kompilacja nie powiedzie się również na Lollipop +, dlatego proguard działa! ale nie na pre-Lollipop.

Z tego, co wiem, minifyEnabled nie powinien być zależny od platformy, więc może proces budowania pominie go (nie wiem, z jakiego powodu) na urządzeniach pre-Lollipop.

Ktoś zna rozwiązanie tego problemu?

ps. Jestem świadomy możliwości multidex, ale zostawiam to jako moją ostatnią deskę ratunku.

EDIT:

Jest to pełny kod z poziomu aplikacji Gradle pliku:

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' 

poziomie projektu Gradle pliku:

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 
} 

zasady PROGUARD:

# 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

Nie masz zależności, które są tylko włączone do debugowania? Jak, LeakCanary? – EpicPandaForce

+0

nie, również sprawdzam liczbę metod kompilacji debugowania za pomocą https://github.com/KeepSafe/dexcount-gradle-plugin i wszystko jest w porządku. To około 30 tysięcy. (minifed proguard) –

+0

proszę pokazać pełny kod pliku gradle.build – Divers

Odpowiedz

1

Jeśli chcesz Aby spróbować zmniejszyć liczbę metod lub przynajmniej chcesz zrozumieć różnicę między wersją a debugowaniem, sugeruję, abyś spróbował spojrzeć na liczbę dex dostępną w AS 2.2 podgląd 5, mieli wideo na youtube (może z google IO) to ułatwiło policzenie twoich metod.

To jest tylko dla zliczania metod, jeśli nadal używasz tego samego buildToolsVersion "23.0.3" powinieneś uzyskać ten sam plik APK w obu wersjach AS (oprócz tego, że AS 2.2 jest dostarczany z własną wersją JDK, która nie jest powinien wejść ci w drogę).

Nota prawna: Nigdy nie używałem tego narzędzia poza grą, więc nie wiedziałbym, co polecić po znalezieniu tam winnego.

EDYCJA: tutaj jest wideo https://youtu.be/csaXml4xtN8?t=331 dla "Analizatora apk", który znajduje się w menu "Kompilacja". Nie próbuj opinii wcześniejszych niż 2.2 w wersji 3 lub nowszej, a niektóre z nich nie zostały wydane później.

EDIT 2: również dlaczego używasz tylko shrinkResources w momencie premiery? To linia, która ma wyeliminować nieużywane metody: "minifyEnabled" vs "shrinkResources" - what's the difference? and how to get the saved space?

+0

Już liczę moje metody przy użyciu https://github.com/KeepSafe/dexcount-gradle-plugin. Liczba metod wynosi 30k po zmniejszeniu przez proguard. Więc w porządku. –

+0

Hmm, więc spróbowałbym przeczytać coś o sztuce, czy nie było to wprowadzone w zestawie kat jako opcjonalnym i lollipop jako stabilny? Ale czy masz taki sam błąd w debugowaniu, jeśli używasz tych samych informacji co wersja? Ponieważ są to domyślne warianty, mogą one mieć ukrytą konfigurację oprócz "debuggable true". – Fabio

+0

To jest dziwne. Upewnię się, że spróbuję odtworzyć ten problem, budując i instalując apk bez AS, a przynajmniej jeśli z nim korzystasz, wyłącz natychmiastowe uruchamianie. Sprawdziłbym również liczbę metod dla twojej kompilacji debugowania z drugą wtyczką skryptu/gradle, aby się upewnić, ponieważ ten komunikat o błędzie jest bardzo konkretny przy trafieniu liczby metod 65k. – Fabio

-1

Włącza obsługę wielościeżkową true i umożliwia obsługę aplikacji jako aplikacji wielotrybowej.Kilka kroków do których należy przestrzegać to:

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

dodać tę zależność do uzależnienia listy

kompilacji 'com.android.support:multidex:1.0.0'

rozszerzyć swoją klasę poziomu aplikacji z MultiDexApplication

napisać tę metodę w swojej klasie aplikacji

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

keep minifyEnabled fałszywą nie debug materii lub zwolnić budować

Aktualizacja

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

jak powiedziałem: "ps. Jestem świadomy możliwości wielodzielnika, ale pozostawiam to jako moją ostatnią deskę ratunku". –

0

Wymień kompilacji kodu Typy z tym kodem na poziomie aplikacji Gradle pliku. podczas debugowania kodu lub uruchomiony na urządzeniu przed ostatecznym wydaniem następnie wybierz wariant zbudowany debug i kiedy masz zamiar zbudowany podpisanej apk dopuszczenia następnie wybierz zbudowany uwalnianie wariantowej

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' 
       } 
} 
Powiązane problemy