2015-06-03 20 views
24

Tworzę kompilację o różnych smakach z Gradle. Do tej pory działało całkiem dobrze, dopóki nie chciałem włączyć Proguard. Włączyłem minifyEnabled dla mojej produkcji o prawach i teraz mam takie powiedzenie wyjątek:Android Build z Gradle i ProGuard: "Słoik wyjściowy musi zostać określony za słojem wejściowym lub będzie pusty"

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.

Czy ktoś wie, co jest przyczyną tego wyjątku? Zasadniczo chcę włączyć ProGuard przed wydaniem mojej aplikacji. Oto mój plik Gradle poniżej.

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

Plik reguł 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.** 

A oto plik proguard-android. Jest to domyślny zestaw SDK Androida.

# 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.** 
+0

Czy możesz podać swój plik proguard? – VicVu

+0

@VicVu Zaktualizowałem swoje pytanie z plikami ProGuard. – osayilgan

Odpowiedz

21

Zajęło mi to sporo czasu, ale jak już się domyślałem, wszystko zależało od konfiguracji Proguard.

Zacząłem przeglądać Ostrzeżenia w Konsoli i zdałem sobie sprawę, że niektóre z referencji nie mogą zostać znalezione przez Proguard. Dodanie ich jako -dontwarn do proguard pliku konfiguracyjnego rozwiązało problem.

W moim przypadku musiałem zignorować pakiety poniżej;

-dontwarn java.lang.invoke** 
-dontwarn org.apache.lang.** 
-dontwarn org.apache.commons.** 
-dontwarn com.nhaarman.** 
-dontwarn se.emilsjolander.** 
+0

Witam @osayilgan Mam ten sam problem. i to nie działa dla mnie, umieszczam to w moim progurad rules pro file. powinienem umieścić gdziekolwiek indziej –

+0

@shivpaljodha Te zasady proguard są tylko przykładem. Musisz dowiedzieć się, które zależności sprawiają ci kłopoty. Zwróć uwagę na ostrzeżenia i błędy w LogCat, abyś mógł dowiedzieć się. – osayilgan