Home » Android » android – ClassNotFoundException for com.facebook.FacebookActivity

android – ClassNotFoundException for com.facebook.FacebookActivity

Posted by: admin May 14, 2020 Leave a comment

Questions:

I want to integrate Facebook’s Android SDK (v4.11) into my Android app and my final apk is compiled via Flash Builder because of flex-sdk dependencies.

Unfortunately, I am getting a ClassNotFoundException for com.facebook.FacebookActivity in my stack-trace when my app tries to create the concerned Activity that initialises Facebook.

I have included the classes.jar in the Native Extension for my Android source code and dependencies. On decompiling the classes.dex file in the final .apk using dexdump from Android SDK build-tools via the following command:

./dexdump classes.dex | grep 'Class descriptor'

I am able to see

Class descriptor  : 'Lcom/facebook/FacebookActivity;'

which indicates that FacebookActivity.class has been packaged and compiled in the .apk.

I also bundled all Facebook-sdk resources along with my project’s resources in the res folder in my native extension (this is the first time I had to include third-party resources with my own in a native extension).

My onCreate() code which initialises the Facebook-SDK:

FacebookSdk.sdkInitialize(getApplicationContext()); //throws the ClassNotFoundException
 AppEventsLogger.activateApp(this);

My AndroidManisfest.xml entries as per Facebook-documentation:

<meta-data android:name="com.facebook.sdk.ApplicationId"
                   android:value="@string/facebook_app_id"/>
    <activity android:name="com.facebook.FacebookActivity"
                  android:configChanges=
                      "keyboard|keyboardHidden|screenLayout|screenSize|orientation"
                  android:theme="@android:style/Theme.Translucent.NoTitleBar"
                  android:label="@string/app_name" />
    <activity
            android:name="com.facebook.CustomTabActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="@string/fb_login_protocol_scheme" />
            </intent-filter>
        </activity>

Am I missing something here?

EDIT:

I am using version 4.12 now with no change in results.

Also, here is my build.gradle entry: (Although that does not effect flex packaging much, as I have to use ziptree on the facebook sdk JAR).

dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        compile "com.android.support:support-v4:23.0.+"
        compile 'com.facebook.android:facebook-android-sdk:[4,5)'
        /**
         * newer cardview has compatibility issues with android-sdk default styles.
        **/
        compile('com.android.support:cardview-v7:23.2.0') {
            force = true
        }
    }

EDIT 2:

Here’s my custom gradle task which I am using to package the compiled dependencies and source classes:

task fatJar(type: Jar) {
        //external libariries - their jars containing compiled classes obtained from the .idea -> libraries -> <libName>.xml file
        from (zipTree("build/intermediates/exploded-aar/com.android.support/support-v4/23.2.0/jars/classes.jar"))
        from (zipTree("build/intermediates/exploded-aar/com.android.support/cardview-v7/23.2.0/jars/classes.jar"))
        from ("build/intermediates/exploded-aar/com.android.support/cardview-v7/23.2.0/res")
        from (zipTree("build/intermediates/exploded-aar/com.android.support/customtabs/23.4.0/jars/classes.jar"))
        from ("build/intermediates/exploded-aar/com.android.support/customtabs/23.4.0/res")
        from (zipTree("build/intermediates/exploded-aar/com.facebook.android/facebook-android-sdk/4.12.1/jars/classes.jar"))
//        from ("build/intermediates/exploded-aar/com.facebook.android/facebook-android-sdk/4.12.0/res")
        from(zipTree("/$USER_HOME/.gradle/caches/modules-2/files-2.1/com.parse.bolts/bolts-android/1.4.0/cc174c559b5177982887bf6e1b76003aebad9516/bolts-android-1.4.0.jar"))
        from(zipTree("/$USER_HOME/.gradle/caches/modules-2/files-2.1/com.parse.bolts/bolts-applinks/1.4.0/8ad21bf21784dacce5f2043afb97218cc377e835/bolts-applinks-1.4.0.jar"))
        from(zipTree("/$USER_HOME/.gradle/caches/modules-2/files-2.1/com.parse.bolts/bolts-tasks/1.4.0/d85884acf6810a3bbbecb587f239005cbc846dc4/bolts-tasks-1.4.0.jar"))
        //soucre code
        from ('build/intermediates/classes/release/') {
            exclude '**/BuildConfig.class'
            exclude '**/R$*.class'
            exclude '**/R.class'
        }
        //jar name and destination directory
        archiveName = "src_and_dependencies.jar"
        destinationDir = file("/$USER_HOME/Ane/build/ane/Android-ARM")
    }

    //before running fatJar task, the old jar should be deleted and the project should be re-built
    fatJar.dependsOn(clearJar, build)
How to&Answers:

From the information provided it appears that you have used the package name ‘com.facebook’ for your custom application. However, this might conflict with the ‘com.facebook’ package used by the facebook sdk.

Please change your package name and try.

Answer:

Add the dependency into your build.gradle file

dependencies {
    compile 'com.facebook.android:facebook-android-sdk:4.12.0'
}

or you can use the .jar, this is the way for exporting:

go to Project > Properties > Java Build Path > Order and Export and click on jar’s checkbox.

Answer:

Probably you are having duplicate Facebook libraries, one path through Facebook SDK jar file in libs folder and the other through the gradle Facebook reprository cache.

You can skip the compile 'com.facebook.android:facebook-android-sdk:[4,5)' altogether and use compile project(':libs:facebook') instead.

Answer:

Add this line to your proguard file

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

Answer:

It must have exceded the infamous 64k method limit, you need to enable your app for multidex. Here is how you do it. https://developer.android.com/tools/building/multidex.html

Answer:

One possibility is, you will need to move the following to onresume instead of onCreate() :

FacebookSdk. sdkinitialize     
(getApplicationContext();
Apparentlyogger.activateApp(this);

It solved my problem before.

EDIT

try this:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    FacebookSdk.sdkInitialize(getApplicationContext());
    setContentView(R.layout.activity_main);
    callbackManager = CallbackManager.Factory.create();
    loginManager = LoginManager.getInstance();
    List<String> permissionNeeds = Arrays.asList("publish_actions");

}

@Override
protected void onResume() {
    super.onResume();

    AppEventsLogger.activateApp(this,"{your facebook app id}");
}

And of course do not forget:

  private FacebookCallback<Sharer.Result> shareCallback = new FacebookCallback<Sharer.Result>() {
    @Override
    public void onCancel() {
        Log.d("HelloFacebook", "Canceled");
    }

    @Override
    public void onError(FacebookException error) {
        Log.d("HelloFacebook", String.format("Error: %s", error.toString()));
        String title = "error";
        String alertMessage = error.getMessage();
        showResult(title, alertMessage);
    }

    @Override
    public void onSuccess(Sharer.Result result) {
        Log.d("HelloFacebook", "Success!");
        if (result.getPostId() != null) {
            String title ="success";
            String id = result.getPostId();
            String alertMessage ="successfully_posted_post, id";
            showResult(title, alertMessage);
        }
    }

    private void showResult(String title, String alertMessage) {
        new AlertDialog.Builder(MainActivity.this)
                .setTitle(title)
                .setMessage(alertMessage)
                .setPositiveButton("ok", null)
                .show();
    }
};