Can't shrink flurry with proguard
Asked Answered
K

5

20

Here is my proguard config (I copied it from android tools folder and added some lines).

-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*
-optimizationpasses 5
-allowaccessmodification
-dontpreverify
    
# The remainder of this file is identical to the non-optimized version
# of the Proguard configuration file (except that the other file has
# flags to turn off optimization).

-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose

-keepattributes *Annotation*
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService

# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native
-keepclasseswithmembernames class * {
    native <methods>;
}

# keep setters in Views so that animations can still work.
# see http://proguard.sourceforge.net/manual/examples.html#beans
-keepclassmembers public class * extends android.view.View {
   void set*(***);
   *** get*();
}

# We want to keep methods in Activity that could be used in the XML attribute onClick
-keepclassmembers class * extends android.app.Activity {
   public void *(android.view.View);
}

# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

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

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

# The support library contains references to newer platform versions.
# Don't warn about those in case this app is linking against an older
# platform version.  We know about them, and they are safe.
-dontwarn android.support.**

######################
# added by me
########################
# guava
-keepclasseswithmembers class com.google.common.base.internal.Finalizer{
    <methods>;
}

-dontwarn sun.misc.Unsafe
-dontwarn com.google.common.collect.MinMaxPriorityQueue

#
#Action Bar Sherlock
-keep class android.support.v4.app.** { *; }
-keep interface android.support.v4.app.** { *; }
-keep class com.actionbarsherlock.** { *; }
-keep interface com.actionbarsherlock.** { *; }


#-dontobfuscate    
#-libraryjars libs/FlurryAgent.jar

I would like to use Flurry in my app, but when I try to obfuscate my app with FlurryAgen.jar the proguard fails saying a dozens of errors like this:

Warning: com.flurry.android.ay: can't find referenced class com.google.ads.AdListener

Also proguard fails when I try not to obfuscate the sources.

How to use flurry with proguard? And how to make proguard not to obfuscate my sources?

UPDATE Also I mentioned that the FlurryAgent.jar seems already obfuscated - http://korniltsev.ru/p/jBU0f1c.png . Maybe we can ignore shrinking the whole jar?

Kingmaker answered 30/8, 2012 at 14:18 Comment(0)
K
46

Finally I managed to do that like this:

-keep class com.flurry.** { *; }
-dontwarn com.flurry.**
Kingmaker answered 31/8, 2012 at 10:22 Comment(2)
have you been able to verify that Flurry is still collecting statistics correctly in practice, given the -dontwarn com.flurry.**? I'm in the same situation trying to use Proguard on an application that makes uses of Flurry, but am a little cautious when it comes to using dontwarn given that I don't really understand what's going on.Gentility
Follow up: just to add a little authority to your answer, I have just re-downloaded the Flurry Android SDK and in the file FlurryAds-READMEv3.0.5.pdf, at the very end, there is a very brief section which reads: 7. Using ProGuard (Optional) If you plan to run ProGuard on your APK before releasing your app, you will need to add the following to your "proguard.cfg" file: -keep class com.flurry.* { ; } -dontwarn com.flurry.* * So I guess I'll use this method, even though ignoring this many warnings makes me somewhat uncomfortable.Gentility
W
10

Korniltsev's answer works for me, however the new flurry SDK (3.2.2) suggests to add the following:

-keep class com.flurry.** { *; }
-dontwarn com.flurry.**
-keepattributes *Annotation*,EnclosingMethod
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}

There may be some corner cases where the new lines are required, so I ended up going with their README.

Willena answered 16/10, 2013 at 0:19 Comment(1)
This answer is valid for Flurry 4.2.0Carmellacarmelle
M
5

I'm not sure how Flurry is specifically interacting with the AdListener, but the name of Google's class is what's being obfuscated.

Try adding the line -keep public class com.google.ads.AdListener to the proguard file. You may need to add a few more class exceptions if Flurry uses other com.google.ads classes, but that line should solve your immediate warning.

UPDATE: The problem is that the public class method names are being obfuscated for the various ad libraries. So, you may need to include additional proguard settings to include these methods:

-keep public class com.google.ads.** { public protected *; } 
-keep public class com.inmobi.androidsdk.** { public protected *; }
-keep public class com.millenialmedia.android.** { public protected *; }
-keep public class com.mobclix.android.sdk.** { public protected *; }
-keep public class com.jumptap.adtag.** { public protected *; }

Having worked with Flurry and proguard myself, do be sure to test the apk thoroughly before uploading to your app market(s) of choice.

Masseter answered 30/8, 2012 at 14:30 Comment(5)
Thank you for reply! I have a lot of warnings (korniltsev.ru/p/jBU05Go.png), so in my opinion ignoring them is not he solution. Also i mentioned that the FlurryAgent.jar seems already obfuscated - korniltsev.ru/p/jBU0f1c.png . May be we can ignore shrinking the whole jar?Kingmaker
Yeah, I've used Flurry without any specific exceptions in proguard and it works just fine so long as it's in the build path. With that many exceptions, you need to preserve the names of a good many classes. Perhaps something along the lines of -keep public class com.google.ads.** { public protected *; } would work?Masseter
And yes, I'd go ahead and ignore shrinking the FlurryAgent.jar :-)Masseter
do you know how to ignore the wfole jar?Kingmaker
Well, at the moment your Proguard configuration isn't doing anything to FlurryAgent.jar, so you are ignoring it. I suspect that the issue is that Proguard is changing the method calls that Flurry is trying to call in the above classes.Masseter
P
3

The official recommended proguard file from Flurry (now owned by Yahoo) is available here:

https://developer.yahoo.com/flurry/docs/publisher/code/android/

-­keep class com.flurry.** { *; }
-­dontwarn com.flurry.**
-­keepattributes *Annotation*,EnclosingMethod,Signature
-­keepclasseswithmembers class * {
  public <init>(android.content.Context, android.util.AttributeSet, int); 
}



# Google Play Services library
-­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;
}
#If you are using the Google Mobile Ads SDK, add the following:
# Preserve GMS ads classes
-­keep class com.google.android.gms.ads.** { *;
} 
-­dontwarn com.google.android.gms.ads.**


#If you are using the InMobi SDK, add the following:
# Preserve InMobi Ads classes 
-­keep class com.inmobi.** { *;
} 
-­dontwarn com.inmobi.**
#If you are using the Millennial Media SDK, add the following:
# Preserve Millennial Ads classes
-­keep class com.millennialmedia.** { *;
} 
-­dontwarn com.millennialmedia.**
Playlet answered 2/3, 2015 at 17:28 Comment(0)
W
0

Flurry no longer needs you to modify your proguard config, see https://developer.yahoo.com/flurry/docs/integrateflurry/android/

Note: If you are adding the AAR format of the Flurry dependencies, you do not need to modify your AndroidManifest files or ProGuard configuration.

Whacky answered 29/6, 2018 at 14:1 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.