Java Proguard google play服务jar

Java Proguard google play服务jar,java,android,jar,proguard,Java,Android,Jar,Proguard,我试图用proguard混淆google play services jar。 我尝试了两个版本的proguard配置文件 第一个包含 -keep class ** { public protected *; } -keep class com.** { public protected *; } 罐子也不会变得模糊不清。看起来不错 第二个包含 -keep class ** { public protected *; } -keep class com.** {

我试图用proguard混淆google play services jar。 我尝试了两个版本的proguard配置文件

  • 第一个包含

    -keep class ** {
        public protected *;
    }
    
    -keep class com.** {
        public protected *;
    }
    
  • 罐子也不会变得模糊不清。看起来不错

  • 第二个包含

    -keep class ** {
        public protected *;
    }
    
    -keep class com.** {
        public protected *;
    }
    
  • proguard会删除所有内容。我得到一个错误:

        Error: The output jar is empty. Did you specify the proper '-keep' options?
    

    为什么它是空的,因为主要的google play服务包是com.google.android.gms?

    以下ProGuard配置缩小了google play服务jar,没有优化或混淆,只保留与广告相关的API:

    -injars  android-sdk/extras/google/google_play_services/libproject/google-play-services_lib/libs/google-play-services.jar
    -outjars google-play-services-ads.jar
    
    -libraryjars android-sdk/extras/android/support/v4/android-support-v4.jar
    -libraryjars android-sdk/platforms/android-20/android.jar
    
    -verbose
    -forceprocessing
    -dontoptimize
    -dontobfuscate
    -dontwarn com.google.**.R
    -dontwarn com.google.**.R$*
    -dontnote
    
    -keep public class com.google.ads.** {
        public protected *;
    }
    
    -keep public class com.google.android.gms.ads.** {
        public protected *;
    }
    
    -keep class com.google.android.gms.common.internal.safeparcel.SafeParcelable {
        java.lang.String NULL;
    }
    

    它将原来的jar从2819个类减少到409个类(270万到476K)。我还没有测试结果。如果通过反射访问任何删除的类,它们也需要保留在配置中。

    据我所知,Google Play Services已经使用Proguard进行模糊处理。我主要感兴趣的是收缩阶段,因为我只需要ads包中的一种方法。据我所知,当您提供外部库时,proguard无法缩小它们。否则,您将不得不进行太多的配置。在一次会议上,我向proguard的创建者提出了同样的问题,他回答我说,使用proguard非常困难。在不了解代码内部结构的情况下,找到最佳配置可能很困难,但通常可以找到保守的解决方案。在这种情况下,即使是保守的配置也可以大大减少大小,因为有太多明显不必要的类。