如何关闭除混淆之外的所有Android ProGuard功能?

时间:2010-10-01 21:15:32

标签: android obfuscation proguard

谷歌建议开发人员可能想要混淆字节代码:

http://android-developers.blogspot.com/2010/09/proguard-android-and-licensing-server.html

我按照谷歌的指示获得了一个混淆的Android应用程序,乍一看似乎有效。但是引入了一些奇怪的错误,这些错误不在未混淆的应用程序中。我一直关闭ProGuard选项以进入此配置:

-dontoptimize -dontshrink -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -dontpreverify -verbose

还有错误。还有什么我可以关闭才能获得纯粹的混淆吗?混淆会很好,但我愿意关闭ProGuard的其他功能。

1 个答案:

答案 0 :(得分:8)

这就是我使用的:

-libraryjars ${android.jar}
-injars      temp.jar
-outjars    proguard.jar

#-printseeds: Prints the un-obfuscated filenames
-printseeds
-printmapping mapping-used-to-retrace-exceptions.txt
-verbose

#-dontusemixedcaseclassnames: Necessary when building on windows where x.class and X.class is the same file
-dontusemixedcaseclassnames

#-repackageclasses: Adds further obfuscation, Counter-indication: classes that look for resource files in their package directories will no longer work properly if they are moved elsewhere. When in doubt, just leave the packaging untouched by not using this option.
-repackageclasses ''

#-dontskipnonpubliclibraryclasses: Counter-indication: you probably shouldn't use this option when processing code that is to be used as a library, since classes and class members that weren't designed to be public in the API may become public.
-dontskipnonpubliclibraryclasses

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep class * extends android.view.View { 
  public <init>(android.content.Context); 
  public <init>(android.content.Context, android.util.AttributeSet); 
  public <init>(android.content.Context, android.util.AttributeSet, int); 
  public void set*(...); 
}
-keep class * extends android.preference.Preference { 
  public <init>(android.content.Context); 
  public <init>(android.content.Context, android.util.AttributeSet); 
  public <init>(android.content.Context, android.util.AttributeSet, int); 
  public void set*(...); 
}    
# LVL License binder class
-keep class com.android.vending.licensing.ILicensingService    
# This is necessary for LVL among others. According to proguard doc java accesses enum fields by introspection.
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}
#Optimization settings
-dontoptimize

它混淆了但是公开了Android所需的类的公共方法和类名。正如您所要求的那样,它不会进行优化 - 由于删除了方法和构造函数,优化更有可能破坏您的程序。

如果您想尝试包含优化,请执行以下操作(请记住删除上面的-dontoptimize选项)

#Optimization settings    
# Keep (ie. don't remove) all public constructors of all public classes, but still obfuscate+optimize their content. This is necessary because optimization removes constructors which I use through reflection.
-keepclassmembers class * {
    <init>(...);
}

-optimizationpasses 7
-allowaccessmodification
# The -optimizations option disables some arithmetic simplifications that Dalvik 1.0 and 1.5 can't handle. 
-optimizations !code/simplification/arithmetic 

我使用的是proguard 4.5,但其他版本也可以使用。