14

It was a working app, both on emulator and the device i am testing on.

But now, i enabled Proguard and Exported the signed app using Android-Tools > Export signed application

Then i copied this .apk on to the SD card and tried to install on the Device. But the application stopped working, asking for force close if i try to open it.

It works on the device if i run from Eclipse.

Since, its said:

Proguard has effect only when you export a release .apk file. I checked it, and the apk file size in the bin folder is 1.8mb where as the 1 i got after exporting is 1.4mb. Seems like Proguard has done its job. But the application is not working. And sadly i cannot see any logs etc..,

EDIT:

If i disabled Proguard and then Exported, the release apk file works fine now. So, some problem with Proguard?

My Folder structure

enter image description here

proguard-project.txt

# 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.**

I just started using it today, and i am not sure if i am using it the right way. So, please correct me if i am wrong anywhere.

This is the LogCat error:

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

Thank You

Archie.bpgc
  • 23,812
  • 38
  • 150
  • 226
  • 1
    Yeah i have been doing that, for 3-4 times. Nothing worked out. Actually disabling the **Proguard** works. So, **i believe the problem is with Proguard, not Exporting** – Archie.bpgc Jan 01 '13 at 14:22
  • As with most any unexplained crash / force close, people cannot help you unless you post the logcat errors from the crash. This will provide critical clues as to what was broken in the proguard operation, and thus what needs to change in the proguard configuration. – Chris Stratton Jan 01 '13 at 14:52
  • did you read this tutorial http://developer.android.com/tools/help/proguard.html – Tomer Mor Jan 01 '13 at 15:13
  • 1
    @ChrisStratton but how can i get logs? Should i remove the **Logs related code** from the config file and install the apk on Emulator? – Archie.bpgc Jan 01 '13 at 18:57
  • @TomerMor yeah i read that doc thoroughly, But i had few issues, like i cannot find the **proguard.cfg** file in my project, so i followed this answer http://stackoverflow.com/questions/10209404/obfuscated-code#answers. Where he says the docs are outdated, and **Basically they split what used to be proguard.cfg into two files (and also simply made them .txt files): proguard-android.txt and proguard-project.txt.** – Archie.bpgc Jan 01 '13 at 19:02
  • And also i posted my **folder structure, proguard-project.txt and the generated proguard folder with 4 files**. Which seems fine. – Archie.bpgc Jan 01 '13 at 19:04
  • i don't see any -libraryjars entry in your file, i remember that i need to insert them too, try add them like this -libraryjars libs/android-support-v4.jar – Tomer Mor Jan 01 '13 at 19:06
  • add only libraries which are in the project's libs folder? or referenced libraries also? – Archie.bpgc Jan 01 '13 at 19:16
  • am not sure so try also referenced first – Tomer Mor Jan 01 '13 at 19:36
  • @Archie.bpgc How did you get Logcat log? When I export signed APK and install in handest then I get the same error when run but not getting the error when installing the app to another test handset under developer option keeping proguard enabled. – Ajay Jan 21 '15 at 08:35
  • @ajay even if you enable Proguard, it will not work unless the app is signed. So, I signed the app and installed the signed.apk on an emulator. http://stackoverflow.com/questions/3480201/how-do-you-install-an-apk-file-in-the-android-emulator – Archie.bpgc Jan 21 '15 at 11:00

1 Answers1

31

The stack trace shows that ActionBarSherlock is failing to find a constructor "a(Activity,int)" using reflection. Its documentation indeed specifies that each extension of ActionBarSherlock should have such a constructor. ProGuard doesn't (can't) know this and has removed the constructor, because it appears unused in the code. You therefore have to explicitly tell ProGuard to keep it:

-keepclassmembers class * extends com.actionbarsherlock.ActionBarSherlock {
    <init>(android.app.Activity, int);
}

In general, if you get such stack traces related to reflection in your code or its libraries, you need to add corresponding configuration.

Eric Lafortune
  • 45,150
  • 8
  • 114
  • 106