2015-08-22 24 views
7

Devo generare un APK firmato per Play Store. (usando Android Studio) Se lo faccio senza proguard (minifyEnabled false in build.gradle) tutto funziona perfettamente!Generazione APK firmata Android: eccezione Proguard per classe/metodo di riferimento non trovata

Se ho attivarlo con parametri di default:

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

ricevo questi avvertimenti

: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 

e la fermata processo di compilazione con questo messaggio:

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

Dopo diversi tentative Ho trovato un modo per rimuovere gli avvertimenti con questo è il mio "proguard-rules.pro":

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

Ma il processo di compilazione va ancora in errore! Qualcuno ha una soluzione alternativa per questo problema?

Grazie! Davide

risposta

2

È necessario applicare dontwarn alla classe di riferimento.

Ad esempio:

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

Ciao Raymond. Hai ragione ... il diavolo deve essere come scrivi tu. Ma questo non era abbastanza per generare l'APK con Proguard. Grazie per il vostro sostegno! – Davide

5

Dopo vari tentativi ... ecco la soluzione:

configurare prima le dontwarn come suggerito da Raymond (forse questo non è necessario, ma l'ho lasciato):

-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.** 

Quindi configurare Proguard di saltare la mia libreria:

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

A parte che la compilazione era ok ma in runtime l'applicazione si è bloccata. Quindi, per evitare questo problema, ho aggiunto queste righe:

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

sulla base di alcune informazioni trovato da questa discussione:

java.lang.RuntimeException: Could not inflate Behavior subclass

Con questa impostazione sono in grado di generare un APK firmato della mia app.

Problemi correlati