如何在Android上使用Proguard并保护应用程序的功能完整性?

时间:2011-02-15 15:42:30

标签: java android obfuscation proguard

我使用下面的Proguard配置进行了Ant构建,这是由“android”命令行工具生成的,看起来相当直接。但是当我使用这个脚本构建应用程序时,应用程序会在设备上执行时爆炸,并带有一系列空指针异常(混淆过程会以某种方式向代码添加错误)。要修复应用程序,我只需重建它而不通过Proguard运行它。

对于使用Proguard和Android应用程序的人,您有什么建议,以便a)应用程序在合理程度上进行优化和混淆,但b)没有功能完整性被损坏?

-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

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

2 个答案:

答案 0 :(得分:5)

我找到了我遇到的具体案例的解决方案。我会记录解决方案,因为我怀疑其他人可能觉得它很有用。

我有两个专门用于将有效负载保存到JSON API调用或来自JSON API调用的类。我没有从混淆中排除这些类,因此GSON解析器无法正确创建对象,因为类成员名称与JSON参数名称不匹配。

因此,如果将JSON数据反序列化以使用GSON或其他将JSON参数名称与类成员名称匹配的工具创建对象时,请确保Proguard不重命名它们。我看到的空引用异常是因为所有deseralised对象都是空白的。

我应该说我没有遇到ClassNotFoundException,这是一个不同的问题,最初看起来非常难以理解的运行时错误,只是一个有趣的假设组合。

答案 1 :(得分:4)

只需遵循Configuring Pro-guard section中列出的规则即可。关键是可能对xml中的类的任何引用。因此,如果您的清单中有任何未在代码中明确使用的接收器或服务,它们可能会被Proguard删除。这还包括布局中的类,如自定义视图等。