the methods count of app higher 64k limit, i'm using proguard reduce it.
everything works fine release builds.
debug builds, on other hand, successful lollipop+ devices. when launching on pre-lollipop devices have infamous error:
com.android.dex.dexindexoverflowexception: method id not in [0, 0xffff]: 65536
this have in app level gradle file:
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' } }
i've tried removing minifyenabled true
in debug build, , build fails on lollipop+, therefore proguard working! not on pre-lollipop.
for know minifyenabled
should not platform dependent, maybe build process skips (for don't know reason) on pre-lollipop devices.
anyone knows solution issue?
ps. i'm aware of multidex possibility, i'm leaving last resort.
edit:
this full code of app level gradle file:
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'
project level gradle file:
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 rules:
# 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 keep generic types , @key annotations accessed via reflection -keepattributes signature,runtimevisibleannotations,annotationdefault -keepclassmembers class * { @com.google.api.client.util.key <fields>; } # needed google-http-client-android when linking against older platform version -dontwarn com.google.api.client.extensions.android.** # needed google-api-client-android when linking against older platform version -dontwarn com.google.api.client.googleapis.extensions.android.** # needed google-play-services when linking against 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 { *; }
if want try reduce method count, or @ least want understand difference release debug, suggest try looking @ dex count available in 2.2 preview 5, had youtube video (maybe google io) made pretty easy count methods.
this counting methods, if still use same buildtoolsversion "23.0.3"
should exact same apk file in both versions of (apart fact 2.2 ships own version of jdk, not supposed in way).
disclaimer: have never used tool apart playing it, wouldn't know recommend after find culprit there.
edit: here's video https://youtu.be/csaxml4xtn8?t=331 "apk analyzer", lives inside "build" menu. don't try reviews earlier 2.2 preview 3 or later, previewd things not released until later.
edit 2: why using shrinkresources
on release? that's line suppposed eliminate unneded methods: "minifyenabled" vs "shrinkresources" - what's difference? , how saved space?
Comments
Post a Comment