3

Following codes work perfectly in debug mode:

menu_post_view.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:tools="http://schemas.android.com/tools"
      xmlns:app="http://schemas.android.com/apk/res-auto"
      tools:context="com.mydream.bgz.activities.PostViewActivity">
    <item
            android:id="@+id/action_share"
            android:title="@string/action_share"
            app:actionProviderClass="android.support.v7.widget.ShareActionProvider"
            app:showAsAction="always"/>
</menu>

PostViewActivity.java

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_post_view, menu);

    ShareActionProvider mShareActionProvider;
    MenuItem item = menu.findItem(R.id.action_share);
    mShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(item);
    // mShareActionProvider.setOnShareTargetSelectedListener(this);
    Intent sharingIntent = new Intent(Intent.ACTION_SEND);
    sharingIntent.setType("text/plain");
    sharingIntent.putExtra(Intent.EXTRA_SUBJECT, str_mPostTitle);
    sharingIntent.putExtra(Intent.EXTRA_TEXT, str_mPostUrl);
    mShareActionProvider.setShareIntent(sharingIntent);

    return super.onCreateOptionsMenu(menu);
}

Everything happens in onCreate() method. I surrounded all of my codes with try-catch and got a following printed stack trace.

06-13 20:36:41.817 689-689/? W/SupportMenuInflater: Cannot instantiate class: android.support.v7.widget.ShareActionProvider
                                                    java.lang.ClassNotFoundException: Didn't find class "android.support.v7.widget.ShareActionProvider" on path: DexPathList[[zip file "/data/app/com.mydream.bgzaz-1/base.apk"],nativeLibraryDirectories=[/data/app/com.mydream.bgzaz-1/lib/arm64, /vendor/lib64, /system/lib64]]
                                                        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
                                                        at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
                                                        at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
                                                        at android.support.v7.view.g$b.a(Unknown Source)
                                                        at android.support.v7.view.g$b.b(Unknown Source)
                                                        at android.support.v7.view.g.a(Unknown Source)
                                                        at android.support.v7.view.g.inflate(Unknown Source)
                                                        at com.mydream.bgz.activities.PostViewActivity.onCreateOptionsMenu(Unknown Source)
                                                        at android.app.Activity.onCreatePanelMenu(Activity.java:2881)
                                                        at android.support.v4.b.l.onCreatePanelMenu(Unknown Source)
                                                        at android.support.v7.view.i.onCreatePanelMenu(Unknown Source)
                                                        at android.support.v7.app.f$a.onCreatePanelMenu(Unknown Source)
                                                        at android.support.v7.view.i.onCreatePanelMenu(Unknown Source)
                                                        at android.support.v7.app.o.j(Unknown Source)
                                                        at android.support.v7.app.o$1.run(Unknown Source)
                                                        at android.os.Handler.handleCallback(Handler.java:739)
                                                        at android.os.Handler.dispatchMessage(Handler.java:95)
                                                        at android.os.Looper.loop(Looper.java:148)
                                                        at android.app.ActivityThread.main(ActivityThread.java:5525)
                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730)
                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)
                                                        Suppressed: java.lang.ClassNotFoundException: android.support.v7.widget.ShareActionProvider
                                                        at java.lang.Class.classForName(Native Method)
                                                        at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
                                                        at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
                                                        at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
                                                                ... 20 more
                                                     Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available
06-13 20:36:41.822 689-689/? D/AndroidRuntime: Shutting down VM


                                               --------- beginning of crash
06-13 20:36:41.823 689-689/? E/AndroidRuntime: FATAL EXCEPTION: main
                                               Process: com.mydream.bgzaz, PID: 689
                                               java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.bf.a(android.content.Intent)' on a null object reference
                                                   at com.mydream.bgz.activities.PostViewActivity.onCreateOptionsMenu(Unknown Source)
                                                   at android.app.Activity.onCreatePanelMenu(Activity.java:2881)
                                                   at android.support.v4.b.l.onCreatePanelMenu(Unknown Source)
                                                   at android.support.v7.view.i.onCreatePanelMenu(Unknown Source)
                                                   at android.support.v7.app.f$a.onCreatePanelMenu(Unknown Source)
                                                   at android.support.v7.view.i.onCreatePanelMenu(Unknown Source)
                                                   at android.support.v7.app.o.j(Unknown Source)
                                                   at android.support.v7.app.o$1.run(Unknown Source)
                                                   at android.os.Handler.handleCallback(Handler.java:739)
                                                   at android.os.Handler.dispatchMessage(Handler.java:95)
                                                   at android.os.Looper.loop(Looper.java:148)
                                                   at android.app.ActivityThread.main(ActivityThread.java:5525)
                                                   at java.lang.reflect.Method.invoke(Native Method)
                                                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730)
                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)
06-13 20:36:41.828 1313-3539/? W/ActivityManager:   Force finishing activity com.mydream.bgzaz/com.mydream.bgz.activities.PostViewActivity

build.gradle

compile files('libs/YouTubeAndroidPlayerApi.jar')
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support:design:25.3.1'
compile 'com.android.support:support-v4:25.3.1'
compile 'com.android.support:cardview-v7:25.3.1'
compile 'com.android.support:recyclerview-v7:25.3.1'
compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'com.android.support:support-vector-drawable:25.3.1'

I have never faced with the problem like this. So, I could not understand why some normal codes do not work in release mode but debug build version. Please note that I did not write any share action menu related code in onCreate(). Please again, help me to understand why this problem occurred and how can I fix it?

Mirjalal
  • 1,292
  • 1
  • 17
  • 40

2 Answers2

3

That's because you are obfuscating your code on release mode.

Add this to your proguard config file.

-keep class android.support.v7.internal.** { *; }
-keep class android.support.v7.** { *; }
-keep interface android.support.v7.internal.** { *; }
-keep interface android.support.v7.** { *; }
ale.m
  • 883
  • 7
  • 14
  • 1
    Sure, obfuscation makes your app smaller, faster and "safer". With these lines you are preventing obfuscation of all the v7 library. Maybe you could be more precise and define the exact package that you don't want to be obfuscated. – ale.m Jun 13 '17 at 17:18
1

You can add this in proguard config.

-keep class android.support.** { *; }
-dontwarn android.support.**
-dontnote android.support.**

you can see in you log this line java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.bf.a(android.content.Intent)' on a null object reference

because the original code is obfuscated, so we should set in proguard that we should not obfuscate this files.

Muthukrishnan Rajendran
  • 11,122
  • 3
  • 31
  • 41