2014-06-20 17 views
6

Ho aggiunto la raccolta di Google Play Services alla mia applicazione. Tutto funziona bene ma la dimensione del mio apk aumenta in 4 (!) Volte da 350KB a 1,6MB. Per rimuovere le classi non utilizzate dalla libreria di Google Play Services, decido di utilizzare ProGuard. Ma ora non posso eseguire il progetto o esportarlo in apk perché ProGuard ha restituito un errore. Quando non uso GPS lib non ho problemi con l'esportazione ma non riesco a creare apk con questa libreria. Ho letto molto su questo problema, ma qualsiasi soluzione che ho trovato non mi ha aiutato.Proguard ha restituito l'errore con la libreria dei servizi di Google Play

Ecco il mio Proguard-project.txt (come consigliato here)

-keep class * extends java.util.ListResourceBundle { 
    protected Object[][] getContents(); 
} 

-keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable { 
    public static final *** NULL; 
} 

-keepnames @com.google.android.gms.common.annotation.KeepName class * 
-keepclassmembernames class * { 
    @com.google.android.gms.common.annotation.KeepName *; 
} 

-keepnames class * implements android.os.Parcelable { 
    public static final ** CREATOR; 
} 

Ecco il mio proguard.cng

-optimizationpasses 5 
-dontusemixedcaseclassnames 
-dontskipnonpubliclibraryclasses 
-dontpreverify 
-verbose 
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 

-keep public class * extends android.app.Activity 
-keep public class * extends android.app.Application 
-keep public class * extends android.app.Service 
-keep public class * extends android.content.BroadcastReceiver 
-keep public class * extends android.content.ContentProvider 
-keep public class * extends android.app.backup.BackupAgentHelper 
-keep public class * extends android.preference.Preference 
-keep public class com.android.vending.licensing.ILicensingService 

#keep all classes that might be used in XML layouts 
-keep public class * extends android.view.View 
-keep public class * extends android.app.Fragment 
-keep public class * extends android.support.v4.Fragment 


#keep all public and protected methods that could be used by java reflection 
-keepclassmembernames class * { 
    public protected <methods>; 
} 

-keepclasseswithmembernames class * { 
    native <methods>; 
} 

-keepclasseswithmembernames class * { 
    public <init>(android.content.Context, android.util.AttributeSet); 
} 

-keepclasseswithmembernames class * { 
    public <init>(android.content.Context, android.util.AttributeSet, int); 
} 


-keepclassmembers enum * { 
    public static **[] values(); 
    public static ** valueOf(java.lang.String); 
} 

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

-dontwarn **CompatHoneycomb 
-dontwarn org.htmlcleaner.* 
-dontwarn com.google.android.gms.** 
-keep class com.google.android.gms.common.GooglePlayServicesUtil {*;} 
-keep class com.google.ads.** { *;} 

e qui un errore che ho ottenuto dopo l'esportazione di apk:

[2014-06-20 23:11:38 - Dictionary] Proguard returned with error code 1. See console 
[2014-06-20 23:11:38 - Dictionary]  You should check if you need to specify additional program jars. 
[2014-06-20 23:11:38 - Dictionary] Unexpected error while performing partial evaluation: 
[2014-06-20 23:11:38 - Dictionary] Class  = [com/google/android/gms/common/GooglePlayServicesUtil] 
[2014-06-20 23:11:38 - Dictionary] Method  = [showErrorDialogFragment(ILandroid/app/Activity;ILandroid/content/DialogInterface$OnCancelListener;)Z] 
[2014-06-20 23:11:38 - Dictionary] Exception = [java.lang.IllegalArgumentException] (Can't find any super classes of [com/google/android/gms/common/SupportErrorDialogFragment] (not even immediate super class [android/support/v4/app/DialogFragment])) 
[2014-06-20 23:11:38 - Dictionary] java.lang.IllegalArgumentException: Can't find any super classes of [com/google/android/gms/common/SupportErrorDialogFragment] (not even immediate super class [android/support/v4/app/DialogFragment]) 
[2014-06-20 23:11:38 - Dictionary] at proguard.evaluation.value.ReferenceValue.generalize(ReferenceValue.java:299) 
[2014-06-20 23:11:38 - Dictionary] at proguard.evaluation.value.IdentifiedReferenceValue.generalize(IdentifiedReferenceValue.java:65) 
[2014-06-20 23:11:38 - Dictionary] at proguard.evaluation.value.ReferenceValue.generalize(ReferenceValue.java:481) 
[2014-06-20 23:11:38 - Dictionary] at proguard.evaluation.Variables.generalize(Variables.java:136) 
[2014-06-20 23:11:38 - Dictionary] at proguard.evaluation.TracedVariables.generalize(TracedVariables.java:118) 
[2014-06-20 23:11:38 - Dictionary] at proguard.optimize.evaluation.PartialEvaluator.evaluateSingleInstructionBlock(PartialEvaluator.java:682) 
[2014-06-20 23:11:38 - Dictionary] at proguard.optimize.evaluation.PartialEvaluator.evaluateInstructionBlock(PartialEvaluator.java:602) 
[2014-06-20 23:11:38 - Dictionary] at proguard.optimize.evaluation.PartialEvaluator.evaluateInstructionBlockAndExceptionHandlers(PartialEvaluator.java:560) 
[2014-06-20 23:11:38 - Dictionary] at proguard.optimize.evaluation.PartialEvaluator.visitCodeAttribute0(PartialEvaluator.java:264) 
[2014-06-20 23:11:38 - Dictionary] at proguard.optimize.evaluation.PartialEvaluator.visitCodeAttribute(PartialEvaluator.java:181) 
[2014-06-20 23:11:38 - Dictionary] at proguard.classfile.attribute.CodeAttribute.accept(CodeAttribute.java:101) 
[2014-06-20 23:11:38 - Dictionary] at proguard.classfile.ProgramMethod.attributesAccept(ProgramMethod.java:79) 
[2014-06-20 23:11:38 - Dictionary] at proguard.classfile.attribute.visitor.AllAttributeVisitor.visitProgramMember(AllAttributeVisitor.java:95) 
[2014-06-20 23:11:38 - Dictionary] at proguard.classfile.util.SimplifiedVisitor.visitProgramMethod(SimplifiedVisitor.java:91) 
[2014-06-20 23:11:38 - Dictionary] at proguard.classfile.ProgramMethod.accept(ProgramMethod.java:71) 
[2014-06-20 23:11:38 - Dictionary] at proguard.classfile.ProgramClass.methodsAccept(ProgramClass.java:504) 
[2014-06-20 23:11:38 - Dictionary] at proguard.classfile.visitor.AllMethodVisitor.visitProgramClass(AllMethodVisitor.java:47) 
[2014-06-20 23:11:38 - Dictionary] at proguard.classfile.ProgramClass.accept(ProgramClass.java:346) 
[2014-06-20 23:11:38 - Dictionary] at proguard.classfile.ClassPool.classesAccept(ClassPool.java:116) 
[2014-06-20 23:11:38 - Dictionary] at proguard.optimize.Optimizer.execute(Optimizer.java:372) 
[2014-06-20 23:11:38 - Dictionary] at proguard.ProGuard.optimize(ProGuard.java:306) 
[2014-06-20 23:11:38 - Dictionary] at proguard.ProGuard.execute(ProGuard.java:115) 
[2014-06-20 23:11:38 - Dictionary] at proguard.ProGuard.main(ProGuard.java:492) 

forse qualcosa di sbagliato con le mie configurazioni locali ... I tr Ied to -keep e -dontwarn classi diverse, ma ora nulla ha aiutato ...

Please help me!

risposta

4

Aggiungere android-supporto-v4.jar al progetto

0

anche se avevo Google Play Services come una libreria ho avuto ancora aggiungere manualmente Android-support-v4.jar a cartella librerie e fare clic destro e aggiungi al percorso di creazione in eclissi.

mio file Proguard si presentava così:

-optimizationpasses 5 
-dontusemixedcaseclassnames 
-dontskipnonpubliclibraryclasses 
-dontwarn com.google.** 
-dontpreverify 
-dontwarn android.support.v4.** 
-dontwarn org.apache.commons.codec.binary.Base64 
-verbose 
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 





-keep class !mycode.** { *; } 

l'ultima riga fanno in modo che solo il mio codice è offuscato. È più pulito.

1

Ho riscontrato problemi simili e pochi altri con Prograud durante la generazione di build firmati. Dopo molte ricerche, finalmente sono in grado di risolvere il mio problema. Sono sicuro che le persone hanno una soluzione migliore di quella inferiore.

  1. Conserva l'ultimo SDK e le librerie supportate.
  2. Creare una cartella "libs" in "/ sdk/tools/progaurd /".
  3. Copia i file .jar ad esempio "android-support-v13.jar", "google-play-services.jar" necessari per l'applicazione nella cartella "/ sdk/tools/progaurd/libs /".
  4. Copia .jar nella cartella "lib" dell'applicazione. Rimuovere anche "android-support-v4.jar" poiché non è necessario, qui v13 supporta già v4
  5. Aggiungi il file .jar al percorso di creazione. Rimuovere anche "android-support-v4.jar" dal percorso di compilazione poiché non è necessario, in questo caso v13 supporta già v4.
  6. Aggiungi righe sottostanti nel file project.properties dell'applicazione. Si prega di mantenere l'obiettivo come "solo Android-22".
proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt 
# Project target. 
target=android-22 
android.library.reference.1=../../dev/sdk/extras/google/google_play_services/libproject/google-play-services_lib 
  1. Il mio file Progaurd "Proguard-android.txt". Si prega di cambiare secondo le vostre esigenze.
-optimizationpasses 2 
-dontusemixedcaseclassnames 
-dontskipnonpubliclibraryclasses 
-dontskipnonpubliclibraryclassmembers 
-dontpreverify 
-dontshrink 
-verbose 

-dontwarn org.apache.** 
-dontwarn org.slf4j.** 
-dontwarn org.json.* 
-dontwarn org.mortbay.** 
-dontwarn org.apache.log4j.** 
-dontwarn org.apache.commons.logging.** 
-dontwarn org.apache.commons.logging.** 
-dontwarn org.apache.commons.codec.binary.** 
-dontwarn javax.xml.** 
-dontwarn javax.management.** 
-dontwarn java.lang.management.** 

-libraryjars libs/android-support-v13.jar 
-libraryjars libs/google-play-services.jar 


-dontwarn android.support.v13.**  
-keep class android.support.v13.** { *; } 
-keep interface android.support.v13.app.** { *; } 
-keep public class * extends android.support.v13.** 
-keep public class * extends android.app.Fragment 

-dontwarn com.google.android.gms.** 
-keep class com.google.android.gms.** { *; } 


-dontwarn com.google.code.** 
-dontwarn oauth.signpost.** 
-dontwarn twitter4j.** 
-dontwarn com.google.ads.** 
-dontwarn org.acra.** 


-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 
-allowaccessmodification 
-keepattributes *Annotation* 
-renamesourcefileattribute SourceFile 
-keepattributes SourceFile,LineNumberTable 
-repackageclasses '' 

-keep public class * extends android.app.Activity 
-keep public class * extends android.app.Application 
-keep public class * extends android.app.Service 
-keep public class * extends android.content.BroadcastReceiver 
-keep public class * extends android.content.ContentProvider 
-keep public class * extends android.app.backup.BackupAgentHelper 
-keep public class * extends android.preference.Preference 
-keep public class com.android.vending.licensing.ILicensingService 
-keep public class com.google.code.linkedinapi.** 
-keep public class android.content.** { *; } 



-keep class javax.** { *; } 
-keep class org.** { *; } 
-keep class twitter4j.** { *; } 
-keep class java.lang.management.** { *; } 
-keep class com.google.code.** { *; } 
-keep class oauth.signpost.** { *; } 


-keep class org.acra.** { *; } 



-keepclassmembers public class com.google.code.linkedinapi.client.impl.LinkedInApiXppClient { 
    public <init>(java.lang.String, java.lang.String); 
} 


-keepclasseswithmembernames class * { 
    native <methods>; 
} 

-keepclasseswithmembernames class * { 
    public <init>(android.content.Context, android.util.AttributeSet); 
} 

-keepclasseswithmembernames class * { 
    public <init>(android.content.Context, android.util.AttributeSet, int); 
} 


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


-keepclassmembers enum * { 
    public static **[] values(); 
    public static ** valueOf(java.lang.String); 
} 

-keep public class * { 
    public protected *; 
} 

-keep class * implements android.os.Parcelable { 
    public static final ** CREATOR; 
} 

migliori saluti, Vik

2

Se si utilizza Eclipse ADT: Si dovrebbe essere riferimento a un copia della libreria di Google Play Services che si copiati al vostro sviluppo di lavoro, si dovrebbe non fare riferimento alla libreria direttamente dalla directory di Android SDK.

https://developers.google.com/android/guides/setup

Problemi correlati