Proguard minifyEnabled true для сборки отладки, не работающей на pre-Lollipop
Количество методов моего приложения выше предела 64k, поэтому я использую Proguard для его уменьшения.
Все работает отлично для релизов.
С другой стороны, отладочные сборки успешны только для устройств Lollipop+. При запуске на устройствах до Lollipop у меня всегда есть печально известная ошибка:
com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
Это то, что у меня есть на уровне приложения gradle:
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'
}
}
Я попытался удалить minifyEnabled true
в сборке отладки, а затем сборка не работает и на Lollipop +, поэтому proguard работает! но не на пред-Lollipop.
То, что я знаю, minifyEnabled
не должно быть зависимым от платформы, поэтому, возможно, процесс сборки пропускает его (поскольку я не знаю, какая причина) на устройствах pre-Lollipop.
Кто-нибудь знает решение этой проблемы?
пс. Я знаю о возможности мультидекса, но я оставляю его в качестве своего последнего средства.
EDIT:
Это полный код файла уровня приложения gradle:
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'
уровень проекта gradle файл:
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:
# 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 { *; }
Ответы
Ответ 1
Если вы хотите попытаться уменьшить количество меток или, по крайней мере, хотите понять разницу между выпуском и отладкой, я предлагаю вам попробовать посмотреть количество dex, доступное в предварительном просмотре AS 2.2, у них было видео с YouTube (например, возможно, из google IO), что довольно легко подсчитать ваши методы.
Это только для методов подсчета, если вы все еще используете один и тот же buildToolsVersion "23.0.3"
, вы должны получить тот же самый файл apk в обеих версиях AS (кроме того, что AS 2.2 поставляется со своей версией JDK, которая не должен мешать вам.)
Отказ от ответственности: я никогда не использовал этот инструмент, кроме игры с ним, поэтому я не знал бы, что рекомендовать после того, как вы действительно найдете там преступника.
EDIT: здесь видео https://youtu.be/csaXml4xtN8?t=331 для "Apk Analyzer", который находится внутри меню "Build". Не пробуйте обзоры раньше, чем 2.2 Preview 3 или более поздней версии, они просматривают некоторые вещи, которые не были выпущены до конца.
EDIT 2: почему вы используете только shrinkResources
при выпуске? Это строка, которая должна устранить неиспользуемые методы: "minifyEnabled" vs "shrinkResources" - какая разница? и как получить сохраненное пространство?
Ответ 2
Замените код типа сборки этим кодом на уровне приложения gradle.
когда вы отлаживаете или запускаете код на своем устройстве перед окончательной версией, затем выберите встроенный вариант отладки и когда вы собираетесь создать подписанный apk для выпуска, затем выберите построенный вариант выпуска
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'
}
}
Ответ 3
Включить multidex enabled true и разрешить поддержку вашего приложения в виде приложения с несколькими приложениями. Ниже перечислены следующие шаги:
defaultConfig {
minSdkVersion 15
targetSdkVersion 23
versionCode 3
versionName "1.0.1"
**multiDexEnabled true**
}
добавить эту зависимость в список зависимостей
compile 'com.android.support:multidex:1.0.0'
расширить класс уровня приложения с помощью MultiDexApplication
напишите этот метод в своем классе приложения
protected void attachBaseContext(Context base)
{
super.attachBaseContext(base);
MultiDex.install(this);
}
сохранить minifyEnabled false независимо от отладки или выпуска
update
dexOptions {
jumboMode = true
javaMaxHeapSize "4g" //specify the heap size for the dex process
preDexLibraries = false
}