2014-06-20 12 views
6

Dodałem bibliotekę Usług Google Play do mojej aplikacji. Wszystko działa dobrze, ale rozmiar mojej apk zwiększa się w 4 (!) Razy od 350KB do 1.6MB. Aby usunąć nieużywane zajęcia z biblioteki Usług Google Play, postanawiam użyć ProGuard. Ale teraz nie mogę uruchomić projektu lub wyeksportować go do pliku APK, ponieważ ProGuard zwrócił błąd. Kiedy nie używam biblioteki GPS, nie mam problemów z eksportem, ale nie mogę utworzyć apk z tą biblioteką. Dużo czytam na ten temat, ale rozwiązanie, które znalazłem, nie pomogło mi.Proguard zwrócił błąd w bibliotece Usług Google Play

Oto moja PROGUARD-project.txt (jak zalecane 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; 
} 

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

a tu błąd, że uzyskane po eksporcie do 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) 

może coś nie tak z moimi lokalnymi konfiguracjami ... I tr ied do -keep i -dontwarn różnych klas, ale teraz nic nie pomogło ...

Proszę mi pomóc!

Odpowiedz

0

chociaż miałem usługi Google Play jako biblioteka miałem jeszcze ręcznie dodać android-support-v4.jar do folderu Moje libs i kliknij prawym przyciskiem i dodaj do ścieżki budowania w czasie zaćmienia.

mój plik PROGUARD wyglądał następująco:

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

ostatnia linia sprawiają, że to tylko mój kod jest ukrywane. Jest bardziej czystszy.

1

Mam do czynienia z podobnym problemem i kilka innych z Prograud podczas generowania podpisanej kompilacji. Po wielu poszukiwaniach wreszcie jestem w stanie rozwiązać mój problem. Jestem pewien, że ludzie mają lepsze rozwiązanie niż pod jednym.

  1. Zachowaj najnowszy pakiet SDK i obsługiwane biblioteki.
  2. Utwórz folder "libs" wewnątrz "/ sdk/tools/progaurd /".
  3. Skopiuj pliki .jar na przykład "android-support-v13.jar", "google-play-services.jar", które są potrzebne aplikacji w folderze "/ sdk/tools/progaurd/libs /".
  4. Skopiuj plik .jar w folderze "libs" aplikacji. Usuń również "android-support-v4.jar", ponieważ nie jest to wymagane, tutaj v13 już obsługuje v4
  5. Dodaj plik .jar do swojej ścieżki budowania. Usuń również "android-support-v4.jar" ze ścieżki budowania, ponieważ nie jest to wymagane, tutaj v13 już obsługuje v4.
  6. Dodaj poniżej wierszy w pliku application.properties aplikacji. Proszę zachować cel tylko jako "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. mój plik Progaurd "PROGUARD-android.txt". Zmień go zgodnie z wymaganiami.
-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; 
} 

Pozdrawiam, Vik