“Application stopped working” after enabling Proguard
这是一个有效的应用程序,无论是在模拟器上还是我正在测试的设备上。
但现在,我启用了Proguard并使用
然后我将此
如果我从Eclipse运行,它可以在设备上运行。
既然,它说:
只有在导出发行版.apk文件时,Proguard才有效。我检查了一下,bin文件夹中的apk文件大小是1.8mb,其中导出后的1是1.4mb。似乎Proguard已经完成了它的工作。但该应用程序无法正常工作。可悲的是,我看不到任何日志等..,
编辑:
如果我禁用Proguard然后导出,发布apk文件现在工作正常。那么,Proguard存在一些问题?
我的文件夹结构
ProGuard的-project.txt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | # This is a configuration file for ProGuard. # http://proguard.sourceforge.net/index.html#manual/usage.html -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -verbose # Optimization is turned off by default. Dex does not like code run # through the ProGuard optimize and preverify steps (and performs some # of these optimizations on its own). -dontoptimize -dontpreverify # Note that if you want to enable optimization, you cannot just # include optimization flags in your own project configuration file; # instead you will need to point to the #"proguard-android-optimize.txt" file instead of this one from your # project.properties file. -keepattributes *Annotation* -keep public class com.google.vending.licensing.ILicensingService -keep public class com.android.vending.licensing.ILicensingService -keep public class * extends android.app.Application -keep public class * extends android.app.Activity -keep public class * extends android.app.PreferenceActivity -keep public class * extends android.view.View -keep public class * extends android.widget.BaseAdapter -keep public class * extends android.app.Service -keep public class * extends android.content.BroadcastReceiver -keep public class * implements android.view.View.OnTouchListener -keep public class * implements android.view.View.OnClickListener -keep public class * extends com.actionbarsherlock.app.SherlockActivity -keep public class * extends com.actionbarsherlock.app.SherlockFragmentActivity -keep public class * extends com.actionbarsherlock.app.SherlockMapActivity -keep public class * extends com.readystatesoftware.mapviewballoons.BalloonItemizedOverlay<OverlayItem> -keep public class * extends com.actionbarsherlock.app.SherlockFragment -libraryjars libs/android-support-v4.jar -libraryjars libs/apache-mime4j-0.6.jar -libraryjars libs/httpmime-4.0.1.jar -libraryjars libs/libGoogleAnalyticsV2.jar -assumenosideeffects class android.util.Log { public static *** v(...); public static *** i(...); public static *** d(...); public static *** w(...); public static *** e(...); } # For native methods, see http://proguard.sourceforge.net/manual/examples.html#native -keepclasseswithmembernames class * { native <methods>; } # keep setters in Views so that animations can still work. # see http://proguard.sourceforge.net/manual/examples.html#beans -keepclassmembers public class * extends android.view.View { void set*(***); *** get*(); } # We want to keep methods in Activity that could be used in the XML attribute onClick -keepclassmembers class * extends android.app.Activity { public void *(android.view.View); } # For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations -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 **.R$* { public static <fields>; } # The support library contains references to newer platform versions. # Don't warn about those in case this app is linking against an older # platform version. We know about them, and they are safe. -dontwarn android.support.** -dontwarn org.apache.** |
我今天刚开始使用它,我不确定我是否正确使用它。所以,如果我在任何地方都错了,请纠正我。
这是LogCat错误:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 01-02 13:18:54.711: E/AndroidRuntime(585): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.xApp.app/com.xApp.app.LandingActivity}: java.lang.RuntimeException: java.lang.NoSuchMethodException: a(Activity,int) 01-02 13:18:54.711: E/AndroidRuntime(585): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647) 01-02 13:18:54.711: E/AndroidRuntime(585): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 01-02 13:18:54.711: E/AndroidRuntime(585): at android.app.ActivityThread.access$1500(ActivityThread.java:117) 01-02 13:18:54.711: E/AndroidRuntime(585): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 01-02 13:18:54.711: E/AndroidRuntime(585): at android.os.Handler.dispatchMessage(Handler.java:99) 01-02 13:18:54.711: E/AndroidRuntime(585): at android.os.Looper.loop(Looper.java:130) 01-02 13:18:54.711: E/AndroidRuntime(585): at android.app.ActivityThread.main(ActivityThread.java:3683) 01-02 13:18:54.711: E/AndroidRuntime(585): at java.lang.reflect.Method.invokeNative(Native Method) 01-02 13:18:54.711: E/AndroidRuntime(585): at java.lang.reflect.Method.invoke(Method.java:507) 01-02 13:18:54.711: E/AndroidRuntime(585): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 01-02 13:18:54.711: E/AndroidRuntime(585): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 01-02 13:18:54.711: E/AndroidRuntime(585): at dalvik.system.NativeStart.main(Native Method) 01-02 13:18:54.711: E/AndroidRuntime(585): Caused by: java.lang.RuntimeException: java.lang.NoSuchMethodException: a(Activity,int) 01-02 13:18:54.711: E/AndroidRuntime(585): at com.actionbarsherlock.a.a(Unknown Source) 01-02 13:18:54.711: E/AndroidRuntime(585): at com.actionbarsherlock.app.SherlockActivity.a(Unknown Source) 01-02 13:18:54.711: E/AndroidRuntime(585): at com.actionbarsherlock.app.SherlockActivity.setContentView(Unknown Source) 01-02 13:18:54.711: E/AndroidRuntime(585): at com.xApp.app.LandingActivity.onCreate(Unknown Source) 01-02 13:18:54.711: E/AndroidRuntime(585): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 01-02 13:18:54.711: E/AndroidRuntime(585): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) 01-02 13:18:54.711: E/AndroidRuntime(585): ... 11 more 01-02 13:18:54.711: E/AndroidRuntime(585): Caused by: java.lang.NoSuchMethodException: a(Activity,int) 01-02 13:18:54.711: E/AndroidRuntime(585): at java.lang.Class.getMatchingConstructor(Class.java:643) 01-02 13:18:54.711: E/AndroidRuntime(585): at java.lang.Class.getConstructor(Class.java:472) 01-02 13:18:54.711: E/AndroidRuntime(585): ... 17 more |
谢谢
堆栈跟踪显示ActionBarSherlock无法使用反射查找构造函数"a(Activity,int)"。 它的文档确实指定ActionBarSherlock的每个扩展都应该有这样的构造函数。 ProGuard不会(不能)知道这一点并删除了构造函数,因为它在代码中似乎未使用。 因此,您必须明确告知ProGuard保留它:
1 2 3 | -keepclassmembers class * extends com.actionbarsherlock.ActionBarSherlock { <init>(android.app.Activity, int); } |
通常,如果在代码或其库中获得与反射相关的堆栈跟踪,则需要添加相应的配置。