web-dev-qa-db-fra.com

Android Build avec Gradle et ProGuard: "Le pot de sortie doit être spécifié après un pot d'entrée, sinon il sera vide"

Je crée un build avec différentes saveurs avec Gradle. Il fonctionnait assez bien jusqu'à présent, jusqu'à ce que je veuille activer Proguard. J'ai activé minifyEnabled pour ma version Release et maintenant j'ai une exception disant:

"Caused by: org.gradle.internal.UncheckedException: Java.io.IOException: The output jar [.../app/build/intermediates/multi-dex/dev/release/componentClasses.jar] must be specified after an input jar, or it will be empty. "

Quelqu'un sait-il ce qui cause cette exception? Je souhaite essentiellement activer ProGuard avant de publier mon application. Voici mon fichier Gradle ci-dessous.

lintOptions {
    abortOnError false
}

dexOptions{
    incremental true
    javaMaxHeapSize "4g"
}

defaultConfig {
        applicationId "..."
        minSdkVersion 14
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
    }

buildTypes {

    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.release
    }

    debug {
        minifyEnabled false
        shrinkResources false
        proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.debug
    }
}

Fichier de règles ProGuard.

# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in /Users/osayilgan/Development/Android/sdk/tools/proguard/proguard-Android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
#   http://developer.Android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}

-keepnames public class * extends io.realm.RealmObject
-keep class io.realm.** { *; }
-dontwarn javax.**
-dontwarn io.realm.**

Et voici le fichier proguard-Android. Il s'agit de celui par défaut de Android SDK.

# This is a configuration file for ProGuard.
# http://proguard.sourceforge.net/index.html#manual/usage.html

-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose

# Optimization is turned off by default. Dex does not like code run
# through the ProGuard optimize and preverify steps (and performs some
# of these optimizations on its own).
-dontoptimize
-dontpreverify
# Note that if you want to enable optimization, you cannot just
# include optimization flags in your own project configuration file;
# instead you will need to point to the
# "proguard-Android-optimize.txt" file instead of this one from your
# project.properties file.

-keepattributes *Annotation*
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.Android.vending.licensing.ILicensingService

# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native
-keepclasseswithmembernames class * {
    native <methods>;
}

# keep setters in Views so that animations can still work.
# see http://proguard.sourceforge.net/manual/examples.html#beans
-keepclassmembers public class * extends Android.view.View {
   void set*(***);
   *** get*();
}

# We want to keep methods in Activity that could be used in the XML attribute onClick
-keepclassmembers class * extends Android.app.Activity {
   public void *(Android.view.View);
}

# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(Java.lang.String);
}

-keep class * implements Android.os.Parcelable {
  public static final Android.os.Parcelable$Creator *;
}

-keepclassmembers class **.R$* {
    public static <fields>;
}

# The support library contains references to newer platform versions.
# Don't warn about those in case this app is linking against an older
# platform version.  We know about them, and they are safe.
-dontwarn Android.support.**
26
osayilgan

Il m'a fallu un certain temps pour le comprendre, mais, comme je l'avais deviné, il s'agissait de la configuration de Proguard.

J'ai commencé à fouiller dans les avertissements de la console et j'ai réalisé que certaines références ne pouvaient pas être trouvées par Proguard. Donc, en les ajoutant comme -dontwarn pour programmer le fichier de configuration a résolu le problème.

Dans mon cas, j'ai dû ignorer les packages ci-dessous;

-dontwarn Java.lang.invoke**
-dontwarn org.Apache.lang.**
-dontwarn org.Apache.commons.**
-dontwarn com.nhaarman.**
-dontwarn se.emilsjolander.**
22
osayilgan