web-dev-qa-db-ja.com

Proguard minifyEnabledはデバッグビルドに対してtrueであり、Lollipop以前では機能しません

アプリのメソッド数が64kの制限を超えているため、Proguardを使用して削減しています。

リリースビルドではすべて正常に機能します。
一方、デバッグビルドは、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が機能しています。しかし、ロリポップ以前ではありません。

私が知っていることでは、minifyEnabledはプラットフォームに依存するべきではないので、ロリポップ以前のデバイスでは、ビルドプロセスがそれをスキップする可能性があります(理由はわかりません)。

誰かがこの問題の解決策を知っていますか?

ps。マルチデックスの可能性は承知していますが、最後の手段として残しておきます。

編集:

これは、アプリレベルの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
}

プロガードルール:

# 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 { *; }

メソッド数を減らしたい場合、または少なくともリリースごとの違いを理解したい場合は、AS 2.2プレビュー5で利用可能なdex数を確認することをお勧めします(おそらくグーグルから) IO)それはあなたのメソッドを数えることを非常に簡単にしました。

これはカウント方法専用です。同じbuildToolsVersion "23.0.3"を使用する場合は、両方のバージョンのASでまったく同じapkファイルを取得する必要があります(AS 2.2には独自のバージョンのJDKが付属していますが、そうではありません)。あなたの邪魔になるはずです)。

免責事項:私はそれで遊ぶ以外にそのツールを使用したことがないので、実際に犯人を見つけた後、私は何をお勧めするのかわかりません。

編集:ここにビデオがあります https://youtu.be/csaXml4xtN8?t=331 「ビルド」メニュー内にある「APKアナライザー」用。 2.2プレビュー3以降より前のレビューは試さないでください。彼らはそれ以降までリリースされなかったものをプレビューしました。

編集2:また、リリース時にshrinkResourcesのみを使用しているのはなぜですか?これは、不要なメソッドを排除するために想定されている行です: "minifyEnabled" vs "shrinkResources"-違いは何ですか?そして節約されたスペースを取得する方法は?

1
Fabio

アプリレベルの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'
                }
}
1
Amit Desale