【问题标题】:Parcelable Issues When Obfuscating With Proguard使用 Proguard 混淆时的 Parcelable 问题
【发布时间】:2013-05-03 15:40:54
【问题描述】:

我的应用在混淆之前运行良好,但是当我启用 proguard 时,我收到以下错误:

2013-05-02 13:43:58.772 E 30138/AndroidRuntime: FATAL EXCEPTION: main java.lang.NumberFormatException: Invalid long: "0.20"
    at java.lang.Long.invalidLong(Long.java:125)
    at java.lang.Long.parse(Long.java:362)
    at java.lang.Long.parseLong(Long.java:353)
    at java.lang.Long.parseLong(Long.java:319)
    at com.sourcetone.data.model.Station.long getId()(SourceFile:195)
    at com.sourcetone.STStationListFragment.void deleteStation(com.sourcetone.data.model.Station)(SourceFile:298)
    at com.sourcetone.STStationListFragment.void access$4(com.sourcetone.STStationListFragment,com.sourcetone.data.model.Station)(SourceFile:293)
    at com.sourcetone.STStationListFragment$ArrayListAdapter$1.void onClick(android.view.View)(SourceFile:274)
    at android.view.View.performClick(View.java:3528)
    at android.view.View$PerformClick.run(View.java:14217)
    at android.os.Handler.handleCallback(Handler.java:605)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4482)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:561)
    at dalvik.system.NativeStart.main(Native Method)

2013-05-02 13:43:58.803 W 472/ActivityManager:   Force finishing activity com.sourcetone/.STMainActivity

我的 proguard 配置如下:

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

所以 Parcelable 应该保持正确吗?它抛出的 Invalid Long 实际上是我请求的另一部分,因此它读取了错误的数字。我是否也必须保留我的 HttpResponse 类?还能是什么?

【问题讨论】:

  • 这取决于你如何解析你的请求。您正在使用哪些反射库?格森,杰克逊?

标签: java android obfuscation proguard parcelable


【解决方案1】:
-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

不会保留类的所有内容,它只是保留类名和 CREATOR 方法。

尝试将这些字段也保留在 Parcelable 类中,添加如下内容:

-keepclassmembers class * implements android.os.Parcelable {
 public <fields>;
}

【讨论】:

    【解决方案2】:
    -keep class * implements android.os.Parcelable {
      public static final android.os.Parcelable$Creator *;
    }
    

    它将只保留类名和创建者。

    你应该把它改成

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

    默认的 android 规则包括上述指令,如果您保留默认生成的 gradle 定义,也将应用于您的项目:

    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-25
      • 1970-01-01
      • 1970-01-01
      • 2012-06-24
      相关资源
      最近更新 更多