2014-06-20 1 views
6

J'ai ajouté la bibliothèque Google Play Services à mon application. Tout fonctionne bien mais la taille de mon apk augmente de 4 (!) Fois de 350KB à 1.6MB. Pour supprimer les classes inutilisées de la bibliothèque Google Play Services, je décide d'utiliser ProGuard. Mais maintenant je ne peux pas exécuter le projet ou l'exporter vers apk car ProGuard a renvoyé une erreur. Quand je n'utilise pas la librairie GPS, je n'ai pas de problèmes avec l'export mais je n'arrive pas à créer apk avec cette librairie. J'ai beaucoup lu à propos de ce problème mais toute solution que j'ai trouvée ne m'a pas aidé.Proguard a renvoyé une erreur dans la bibliothèque Google Play Services

Voici mon proguard-project.txt (comme recommandé 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; 
} 

Voici mon 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.** { *;} 

et ici une erreur que j'ai obtenu après l'exportation à 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) 

peut-être quelque chose ne va pas avec mes configurations locales ... I tr ied à -keep et -dontwarn différentes classes mais maintenant rien n'a aidé ...

S'il vous plaît aidez-moi!

Répondre

4

Ajouter android-soutien-v4.jar à votre projet

0

même si je devais google jouer des services comme une bibliothèque que je devais encore ajouter manuellement android-support-v4.jar à mes libs dossier et un clic droit et ajouter au chemin de compilation dans Eclipse.

mon fichier proguard ressemblait à ceci:

-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.** { *; } 

la dernière ligne faire en sorte que mon code est obscurcie. C'est plus propre.

1

J'ai été confronté à un problème similaire et peu d'autres avec Prograud lors de la génération de construction signée. Après beaucoup de recherche, enfin je suis capable de résoudre mon problème. Je suis sûr que les gens ont une meilleure solution que celle ci-dessous.

  1. Conservez le dernier SDK et les bibliothèques prises en charge.
  2. Créez un dossier "libs" dans "/ sdk/tools/progaurd /". Copiez les fichiers .jar par exemple "android-support-v13.jar", "google-play-services.jar" dont votre application a besoin dans le dossier "/ sdk/tools/progaurd/libs /". Copier .jar dans votre dossier "libs" de l'application. Supprimer également "android-support-v4.jar" car il n'est pas nécessaire, ici v13 prend déjà en charge v4
  3. Ajoutez le fichier .jar à votre chemin de compilation. Supprimez également "android-support-v4.jar" du chemin de construction car il n'est pas nécessaire, ici v13 prend déjà en charge v4.
  4. Ajoutez les lignes ci-dessous dans le fichier project.properties de votre application. S'il vous plaît garder la cible comme "android-22" seulement.
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. Mon fichier Progaurd "proguard-android.txt". S'il vous plaît changer selon votre condition.
-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; 
} 

Cordialement, Vik

2

Si vous utilisez Eclipse ADT: Vous devriez être référence à une copie de la bibliothèque Google Play services que vous avez copié sur votre développement espace de travail, vous devriez ne référencez pas la bibliothèque directement à partir du répertoire Android SDK.

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

Questions connexes