8

我在我的应用程序上运行了 proguard 工具来进行混淆。我确实知道,当混淆发生时,proguard 会缩小并优化应用程序,因为它认为合适。因此,在混淆应用程序正确打开之后,当我尝试登录时它会崩溃。我能得到的最好的就是这个日志,因为我连接了设备。

10-03 11:12:47.384: E/AndroidRuntime(15058): FATAL EXCEPTION: AsyncTask #1
10-03 11:12:47.384: E/AndroidRuntime(15058): java.lang.RuntimeException: An error     occured while executing doInBackground()
10-03 11:12:47.384: E/AndroidRuntime(15058):    at     android.os.AsyncTask$3.done(AsyncTask.java:299)
10-03 11:12:47.384: E/AndroidRuntime(15058):    at     java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
10-03 11:12:47.384: E/AndroidRuntime(15058):    at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
10-03 11:12:47.384: E/AndroidRuntime(15058):    at java.util.concurrent.FutureTask.run(FutureTask.java:239)
10-03 11:12:47.384: E/AndroidRuntime(15058):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
10-03 11:12:47.384: E/AndroidRuntime(15058):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
10-03 11:12:47.384: E/AndroidRuntime(15058):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
10-03 11:12:47.384: E/AndroidRuntime(15058):    at java.lang.Thread.run(Thread.java:856)
10-03 11:12:47.384: E/AndroidRuntime(15058): Caused by: java.lang.ExceptionInInitializerError
10-03 11:12:47.384: E/AndroidRuntime(15058):    at com.winwin.a.d.c.doInBackground(Unknown Source)
10-03 11:12:47.384: E/AndroidRuntime(15058):    at com.winwin.a.d.c.doInBackground(Unknown Source)
10-03 11:12:47.384: E/AndroidRuntime(15058):    at android.os.AsyncTask$2.call(AsyncTask.java:287)
10-03 11:12:47.384: E/AndroidRuntime(15058):    at java.util.concurrent.FutureTask.run(FutureTask.java:234)
10-03 11:12:47.384: E/AndroidRuntime(15058):    ... 4 more
10-03 11:12:47.384: E/AndroidRuntime(15058): Caused by: java.lang.ExceptionInInitializerError
10-03 11:12:47.384: E/AndroidRuntime(15058):    at com.winwin.a.c.d.<clinit>(Unknown Source)
10-03 11:12:47.384: E/AndroidRuntime(15058):    ... 8 more
10-03 11:12:47.384: E/AndroidRuntime(15058): Caused by: java.lang.ExceptionInInitializerError
10-03 11:12:47.384: E/AndroidRuntime(15058):    at com.b.a.c.ad.<clinit>(Unknown Source)
10-03 11:12:47.384: E/AndroidRuntime(15058):    ... 9 more
10-03 11:12:47.384: E/AndroidRuntime(15058): Caused by: java.lang.NoSuchFieldError: ANY
10-03 11:12:47.384: E/AndroidRuntime(15058):    at java.lang.Class.getDeclaredAnnotation(Native Method)
10-03 11:12:47.384: E/AndroidRuntime(15058):    at java.lang.Class.getAnnotation(Class.java:260)
10-03 11:12:47.384: E/AndroidRuntime(15058):    at com.b.a.c.f.ag.<clinit>(Unknown Source)

我原以为这是因为 proguard 删除了一些它认为不必要的类或方法,因此导致崩溃。我所做的是这次我再次运行了proguard,包括

-dontobfuscate

所以我希望该工具能够缩小和优化,但不要混淆,这样我就可以正确阅读缺失的内容。但是,当我这次使用该工具生成 apk 时,它运行良好。问题是它没有被混淆。

所以我不知道现在该怎么办。

有没有人有任何想法?

*编辑*

这是我的配置文件

To enable ProGuard in your project, edit project.properties
to define the proguard.config property as described in that file.

Add project specific ProGuard rules here.
By default, the flags in this file are appended to flags specified
in ${sdk.dir}/tools/proguard/proguard-android.txt
You can edit the include path and order by changing the ProGuard
include property in project.properties.

For more details, see
http://developer.android.com/guide/developing/tools/proguard.html

Add any project specific keep options here:

-libraryjars libs/crashlytics.jar

-keep class com.facebook.** {
*;
}


-keepattributes Signature

-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

keep all classes that might be used in XML layouts
-keep public class * extends android.view.View
-keep public class * extends android.app.Fragment
-keep public class * extends android.support.v4.Fragment

-keepattributes *Annotation*, EnclosingMethod

-keep class com.winwin.** { *; }
-keepnames class org.codehaus.jackson.** { *; }


-dontoptimize
-dontshrink

keep all public and protected methods that could be used by java reflection
-keepclassmembernames class * {
 public protected <methods>;
}

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

 -dontwarn **CompatHoneycomb
 -dontwarn org.htmlcleaner.*

 -dontwarn com.fasterxml.jackson.databind.ext.**

 If your project uses WebView with JS, uncomment the following
 and specify the fully qualified class name to the JavaScript interface
 class:
-keepclassmembers class fqcn.of.javascript.interface.for.webview {
public *;
}

===========================

这是我的项目资源管理器窗格


android-support-v7-appcompat / ConverserSdk / facebook / google-play-services_lib / library / Main / MainWs / SlidingMenu


所以我的主要依赖于其他每个包。

4

2 回答 2

4

您需要保存一些类以免被混淆。Android 项目的典型 proguard 配置文件如下所示。这个链接应该很有用:Proguard for Android

-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
-keep public class * implements java.io.Serializable
-keep public class * extends android.support.v4.app.Fragment
-keep public class * extends android.support.v4.app.ListFragment



-keep public class org.spongycastle.** {
  <fields>;
  <methods>;
}

-keep public class org.apache.** {
  <fields>;
  <methods>;
}

-ignorewarnings

-keepclasseswithmembernames class * {
    native <methods>;
}

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

-keepclassmembers class * extends android.app.Activity {
   public void *(android.view.View);
}


-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

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

-keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
}
于 2013-10-03T10:42:11.103 回答
1

快速工作解决方案

-keep  class com.fasterxml.jackson.annotation.** {*;}
-keep  class com.fasterxml.jackson.core.** {*;}
-keep  class com.fasterxml.jackson.databind.** {*;}
于 2015-12-15T11:26:23.057 回答