КлассNotFoundException для com.facebook.FacebookActivity

Я хочу интегрировать Android Android SDK (v4.11) в свое приложение для Android, и мой последний apk скомпилирован с помощью Flash Builder из-за зависимостей flex-sdk.

К сожалению, я получаю ClassNotFoundException для com.facebook.FacebookActivity в моей трассе стека, когда мое приложение пытается создать соответствующее действие, которое инициализирует Facebook.

Я включил class.jar в Native Extension для моего исходного кода и зависимостей Android. При декомпиляции файла classes.dex в финальном .apk с помощью dexdump из инструментов SDK для Android SDK с помощью следующей команды:

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

Я могу видеть

Class descriptor  : 'Lcom/facebook/FacebookActivity;'

который указывает, что FacebookActivity.class был упакован и скомпилирован в .apk.

Я также связал все ресурсы Facebook-sdk вместе со своими ресурсами проекта в папке res в моем родном расширении (это первый раз, когда мне пришлось включать сторонние ресурсы с моим собственным в родном расширении).

Мой onCreate() код, который инициализирует Facebook-SDK:

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

Мои AndroidManisfest.xml записи в соответствии с Facebook-документацией:

<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>

Я что-то пропустил?

EDIT:

Теперь я использую версию 4.12 без изменений в результатах.

Кроме того, вот моя запись build.gradle: (Хотя это не очень сильно влияет на гибкую упаковку, так как я должен использовать ziptree для jpg facebook sdk).

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
        }
    }

ИЗМЕНИТЬ 2:

Здесь моя пользовательская задача gradle, которую я использую для упаковки скомпилированных зависимостей и исходных классов:

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)

Ответ 1

Из предоставленной информации представляется, что вы использовали имя пакета com.facebook для своего пользовательского приложения. Однако это может привести к конфликту с пакетом com.facebook, который используется в facebook sdk.

Измените имя своего пакета и попробуйте.

Ответ 2

Добавьте зависимость в свой build.gradle файл

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

или вы можете использовать .jar, это способ экспорта:

перейдите к Project > Properties > Java Build Path > Order and Export и установите флажок jar.

Ответ 3

Возможно, у вас есть дубликаты библиотек Facebook, один путь через jar файл в формате Facebook SDK в папке libs, а другой через кеш-репозиторий gradle Facebook.

Вы можете полностью пропустить compile 'com.facebook.android:facebook-android-sdk:[4,5)' и использовать compile project(':libs:facebook').

Ответ 4

Одна из возможностей: вам нужно будет переместить следующее в onresume вместо onCreate():

FacebookSdk. sdkinitialize     
(getApplicationContext();
Apparentlyogger.activateApp(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}");
}

И, конечно же, не забывайте:

  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();
    }
};

Ответ 5

Добавьте эту строку в файл proguard

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

Ответ 6

Возможно, он превзошел пресловутый предел метода 64k, вам нужно включить ваше приложение для мультидекса. Вот как вы это делаете. https://developer.android.com/tools/building/multidex.html