Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ClassNotFoundException for com.facebook.FacebookActivity

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)
like image 839
devanshu_kaushik Avatar asked May 19 '16 12:05

devanshu_kaushik


1 Answers

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.

like image 62
Jorgesys Avatar answered Oct 10 '22 00:10

Jorgesys