2013-10-03 107 views
8

我在我的应用程序上运行了proguard工具来混淆。我知道当发生混淆时,proguard会缩小并优化应用程序,因为它认为合适。所以混淆后,应用程序打开正确,然后当我尝试登录它崩溃。我能得到的最好的结果就是这个日志,因为我连接了设备。Android应用程序在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 *; 
} 

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

这里是我的Project Explorer面板


Android的支持-V7-程序兼容性/ ConverserSdk/ 的Facebook/ 的Google Play-services_lib/ 库/ 主要/ MainWs/ SlidingMenu


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

+0

你有你的doInBackground方法的getter setter方法? – GrIsHu

+0

@GrIsHu我在doInBackground()中没有getter或setter方法,但是在这个方法中有错误检查,如果有错误,我调用具有setter方法的方法..这可能是一个因素吗? –

+0

您有一些代码(猜测:某些JSON对象映射程序库)依赖反射来访问注释,并且在使用反射访问时破坏混淆器。你需要添加'-keepattributes * Annotation *,EnclosingMethod -keep class reflection.using.package.name。** {*; }' – laalto

回答

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(); 
} 
+0

感谢您的回复,我已经去过那里了,并且关注了这个网站。 –

0

快速有效的解决方案

-keep class com.fasterxml.jackson.annotation.** {*;} 
-keep class com.fasterxml.jackson.core.** {*;} 
-keep class com.fasterxml.jackson.databind.** {*;} 
相关问题