2016-05-19 64 views
10

Desidero integrare l'SDK Android di Facebook (v4.11) nella mia app per Android e il mio apk finale viene compilato tramite Flash Builder a causa delle dipendenze flex-sdk.ClassNotFoundException per com.facebook.FacebookActivity

Sfortunatamente, ricevo uno ClassNotFoundException per com.facebook.FacebookActivity nel mio stack-trace quando la mia app tenta di creare l'attività in questione che inizializza Facebook.

Ho incluso il classes.jar nell'estensione nativa per il mio codice sorgente Android e le dipendenze. Sul decompilazione il file classes.dex nella .apk finale utilizzando dexdump da Android SDK build-tools tramite il seguente comando:

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

sono in grado di vedere

Class descriptor : 'Lcom/facebook/FacebookActivity;' 

che indica che FacebookActivity.class ha stato pacchettizzato e compilato in .apk.

Ho anche raggruppato tutte le risorse di Facebook-sdk insieme alle risorse del mio progetto nella cartella res nella mia estensione nativa (questa è la prima volta che ho dovuto includere risorse di terze parti con le mie in un'estensione nativa).

Il mio codice onCreate() che inizializza il Facebook-SDK:

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

miei AndroidManisfest.xml voci come da Facebook-documentazione:

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

mi manca qualcosa qui?

EDIT:

Sto usando la versione 4.12 ora senza alcun cambiamento nei risultati.

Inoltre, ecco la mia voce build.gradle: (Anche se questo non influisce molto sul packaging flessibile, dato che devo usare ziptree sul jd di 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 
     } 
    } 

EDIT 2:

Ecco il mio compito Gradle personalizzato che sto usando per confezionare le dipendenze compilati e le classi di origine:

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) 
+0

Che cosa è che seconda attività Android:? Name = "com.facebook.CustomTabActivity" – Chebyr

+0

Si tratta di una consuetudine Tab Chrome per gestire il caso d'uso in cui Google Chrome e Facebook applicazioni sono entrambi non presenti sul dispositivo. –

+0

Stai ricevendo "funzioni oltre il limite di 65k" quando si impacchetta come una normale app per Android (non con flash)? Flash Builder utilizza attività gradle? –

risposta

0

Dalle informazioni fornite sembra che hai usato il nome del pacchetto 'com.facebook' per la tua applicazione personalizzata. Tuttavia, questo potrebbe essere in conflitto con il pacchetto "com.facebook" utilizzato dal sdk di Facebook.

Si prega di cambiare il nome del pacchetto e provare.

+0

Le voci manifest indicate sopra sono specifiche e secondo l'SDK di Facebook [linee guida] (https://developers.facebook.com/docs/facebook-login/android). Questi non sono i nomi delle mie attività personalizzate, ho usato il mio spazio dei nomi per loro. –

0

Aggiungere la dipendenza nella vostra build.gradle file di

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

oppure è possibile utilizzare il.jar, questo è il modo per l'esportazione:

andare a Project>Properties>Java Build Path>Order and Export e fare clic su casella di vaso.

+0

Ho aggiornato la mia domanda ora per includere le mie dipendenze. Inoltre, sto usando Android Studio e quindi non riesco a trovare la navigazione Ordine ed Esporta. –

0

Probabilmente hai due librerie di Facebook duplicate, un percorso attraverso il file jar di Facebook SDK nella cartella libs e l'altro attraverso la cache di repository di gradle Facebook.

È possibile saltare il compile 'com.facebook.android:facebook-android-sdk:[4,5)' e utilizzare invece compile project(':libs:facebook').

+0

È possibile utilizzare il collegamento di modifica sotto l'altra risposta –

+0

Sì, ma questa era un'altra risposta probabile distinta dalla risposta precedente. – Chebyr

0

Una possibilità è, è necessario spostare il seguente per onResume invece di onCreate():

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

E 'risolto il mio problema prima.

EDIT

provare questo:

@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}"); 
} 

E naturalmente non dimenticate:

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

Poiché si tratta di un'eccezione ClassDefNotFound, non sono sicuro di come lo spostamento del codice su onResume possa essere d'aiuto. Puoi per favore elaborare? –

0

Aggiungere questa riga al vostro file Proguard

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

Non ho alcun problema durante la creazione dell'apk da Android Studio. Ottengo questa eccezione durante l'esportazione del mio codice sorgente compilato e delle dipendenze in un vaso tramite un'attività gradle manuale (che funziona per altre dipendenze rispetto a Facebook). Proguard ha un ruolo anche nelle attività manuali? –

0

È necessario aver superato il famigerato limite del metodo 64k, è necessario abilitare la propria app per multidex. Ecco come lo fai. https://developer.android.com/tools/building/multidex.html

+0

Non mi darebbe comunque un errore ai tempi di costruzione? Sono in grado di finire di costruire il mio file .apk al momento. –

+0

Aveva anche questo problema, oltre il limite di 64k. Non limita il tuo edificio, ma c'è solo spazio per registrare tanti metodi/classi. Quindi in fase di esecuzione va alla ricerca di cose e non riesce a trovarle. Ciao incidente. – Flummox

+0

sì kaushik, non dà errore al momento della compilazione, solo in fase di esecuzione, anche quando il metodo non viene indicizzato entro 64k. –

Problemi correlati