2015-08-22 9 views
7

Ich muss eine signierte APK für Play Store generieren. (mit Android Studio) Wenn ich das ohne proguard (MinifyEnabled false in build.gradle) mache, funktioniert alles gut!Android unterzeichnet APK-Generation: Proguard Ausnahme für referenzierte Klasse/Methode nicht gefunden

Wenn ich es aktivieren mit Standardparametern:

buildTypes { 
     release { 
      minifyEnabled true 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 

Ich erhalte diese Warnungen

:app:proguardRelease 
Warning: com.android.volley.error.VolleyErrorHelper$1: can't find superclass or interface com.google.gson.reflect.TypeToken 
Warning: com.android.volley.error.VolleyErrorHelper: can't find referenced class com.google.gson.Gson 
Warning: com.android.volley.error.VolleyErrorHelper: can't find referenced class com.google.gson.Gson 
Warning: com.android.volley.error.VolleyErrorHelper: can't find referenced method 'java.lang.reflect.Type getType()' in program class com.android.volley.error.VolleyErrorHelper$1 
Warning: com.android.volley.error.VolleyErrorHelper: can't find referenced class com.google.gson.Gson 
Warning: com.android.volley.error.VolleyErrorHelper$1: can't find referenced class com.google.gson.reflect.TypeToken 
Warning: com.android.volley.error.VolleyErrorHelper$1: can't find referenced class com.google.gson.reflect.TypeToken 
Warning: com.android.volley.error.VolleyErrorHelper$1: can't find referenced class com.google.gson.reflect.TypeToken 
Warning: com.android.volley.request.GsonRequest: can't find referenced class com.google.gson.Gson 
Warning: com.android.volley.request.GsonRequest: can't find referenced class com.google.gson.Gson 
Warning: com.android.volley.request.GsonRequest: can't find referenced class com.google.gson.Gson 
Warning: com.android.volley.request.GsonRequest: can't find referenced class com.google.gson.JsonSyntaxException 
Warning: com.android.volley.request.GsonRequest: can't find referenced class com.google.gson.JsonSyntaxException 
Warning: com.android.volley.request.GsonRequest: can't find referenced class com.google.gson.Gson 
Warning: com.android.volley.request.GsonRequest: can't find referenced class com.google.gson.JsonSyntaxException 
Warning: com.squareup.okhttp.internal.huc.HttpsURLConnectionImpl: can't find referenced method 'long getContentLengthLong()' in program class com.squareup.okhttp.internal.huc.HttpURLConnectionImpl 
Warning: com.squareup.okhttp.internal.huc.HttpsURLConnectionImpl: can't find referenced method 'long getHeaderFieldLong(java.lang.String,long)' in program class com.squareup.okhttp.internal.huc.HttpURLConnectionImpl 
Warning: okio.DeflaterSink: can't find referenced class org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement 
Warning: okio.Okio: can't find referenced class java.nio.file.Files 
Warning: okio.Okio: can't find referenced class java.nio.file.Files 
Warning: okio.Okio: can't find referenced class java.nio.file.Files 
Warning: okio.Okio: can't find referenced class java.nio.file.Path 
Warning: okio.Okio: can't find referenced class java.nio.file.OpenOption 
Warning: okio.Okio: can't find referenced class java.nio.file.Path 
Warning: okio.Okio: can't find referenced class java.nio.file.OpenOption 
Warning: okio.Okio: can't find referenced class org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement 
Warning: okio.Okio: can't find referenced class java.nio.file.Path 
Warning: okio.Okio: can't find referenced class java.nio.file.OpenOption 
Warning: okio.Okio: can't find referenced class java.nio.file.Path 
Warning: okio.Okio: can't find referenced class java.nio.file.OpenOption 
Warning: okio.Okio: can't find referenced class org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement 
Warning: there were 28 unresolved references to classes or interfaces. 
     You may need to add missing library jars or update their versions. 
     If your code works fine without the missing classes, you can suppress 
     the warnings with '-dontwarn' options. 
     (http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedclass) 
Warning: there were 3 unresolved references to program class members. 
     Your input classes appear to be inconsistent. 
     You may need to recompile the code. 
     (http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedprogramclassmember) 
Exception while processing task 
java.io.IOException: Please correct the above warnings first. 
    at proguard.Initializer.execute(Initializer.java:473) 
    at proguard.ProGuard.initialize(ProGuard.java:233) 
    at proguard.ProGuard.execute(ProGuard.java:98) 
    at proguard.gradle.ProGuardTask.proguard(ProGuardTask.java:1074) 
    at com.android.build.gradle.tasks.AndroidProGuardTask.doMinification(AndroidProGuardTask.java:137) 
    at com.android.build.gradle.tasks.AndroidProGuardTask$1.run(AndroidProGuardTask.java:113) 
    at com.android.builder.tasks.Job.runTask(Job.java:48) 
    at com.android.build.gradle.tasks.SimpleWorkQueue$EmptyThreadContext.runTask(SimpleWorkQueue.java:41) 
    at com.android.builder.tasks.WorkQueue.run(WorkQueue.java:227) 
    at java.lang.Thread.run(Thread.java:745) 
:app:dexRelease UP-TO-DATE 
:app:validateExternalOverrideSigning 
:app:packageRelease 

Und den Build-Prozess Anschlag mit dieser Nachricht:

Error:Execution failed for task ':app:packageRelease'. 
> Unable to compute hash of ...\app\build\intermediates\classes-proguard\release\classes.jar 

Nach mehreren Ich habe einen Weg gefunden, die Warnungen zu entfernen th diese Zeilen in meinem "proguard-rules.pro":

-dontwarn com.android.volley.** 
-dontwarn com.squareup.okhttp.** 
-dontwarn okio.** 

Aber der Build-Prozess läuft immer noch falsch! Jeder hat eine Problemumgehung für dieses Problem?

Danke! Davide

Antwort

2

Sie müssen stattdessen dontwarn auf die referenzierte Klasse anwenden.

Zum Beispiel:

-dontwarn com.google.gson.** 
-dontwarn java.nio.file.** 
+0

Hallo Raymond. Du hast Recht ... das Dontwarn Shold sein, wie du schreibst. Aber das war nicht genug, um die APK mit Proguard zu generieren. Danke für deine Unterstützung! – Davide

5

Nach mehreren attemps ... hier die Lösung:

zuerst die dontwarn konfigurieren, wie Raymond vorgeschlagen (vielleicht ist dies nicht notwendig, aber ich ließ es):

-dontwarn com.google.gson.** 
-dontwarn java.nio.file.** 
-dontwarn org.codehaus.mojo.animal_sniffer.** 
-dontwarn com.squareup.okhttp.internal.huc.** 
-dontwarn com.android.volley.error.** 

Dann Proguard konfigurieren meiner Bibliothek überspringen:

-keep class com.android.volley.error.** { *; } 
-keep class com.squareup.okhttp.internal.huc.** { *; } 
-keep class okio.** { *; } 

Abgesehen davon, dass die Kompilation in Ordnung war, aber zur Laufzeit stürzte die Anwendung ab. Also, dieses Problem zu vermeiden, habe ich hinzugefügt diese Zeilen:

-keep class android.support.design.widget.** { *; } 
-keep interface android.support.design.widget.** { *; } 
-dontwarn android.support.design.** 

basierend auf ein paar Informationen aus diesem Thread gefunden:

java.lang.RuntimeException: Could not inflate Behavior subclass

Mit diesen Einstellungen ich in der Lage bin zu erzeugen APK meiner App signiert.