【问题标题】:How to use Proguard with Android and protect the app's functional integrity?如何在 Android 中使用 Proguard 并保护应用程序的功能完整性?
【发布时间】:2011-02-15 15:42:30
【问题描述】:

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

对于在 Android 应用中使用 Proguard 的人,您会提供什么建议,以便 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 *;
}

【问题讨论】:

  • 确切的错误是什么?

标签: java android obfuscation proguard


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 感谢提示“自定义视图”。我注意到,自从我添加了一个自定义视图后,我的发布版本在应用启动后立即崩溃。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-05
    相关资源
    最近更新 更多