2016-05-19 6 views
10

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

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

Я включил class.jar в Native Extension для моего исходного кода и зависимостей Android. На декомпиляции файл classes.dex в конечном .apk с использованием dexdump из 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 на 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:

Вот моя задача выполняется 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) 
+0

Что это за второе действие? Android: name = "com.facebook.CustomTabActivity" – Chebyr

+0

Это обычная операция с хромированными вкладками для обработки прецедента, когда приложения Google Chrome и Facebook оба не присутствуют на устройстве. –

+0

Получаете ли вы «функции над пределом 65k», когда вы упаковываете как обычное приложение для Android (не со вспышкой)? Создает ли Flash-строитель задачи градиента? –

ответ

0

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

Пожалуйста, измените название своего номера и попробуйте использовать его.

+0

Представленные выше манифестные записи относятся к SDK (руководящим принципам) для Facebook (https://developers.facebook.com/docs/facebook-login/android). Это не имена моих пользовательских действий, я использовал для них свое собственное пространство имен. –

0

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

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

или вы можете использовать.баночка, это путь для экспорта:

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

+0

Я обновил свой вопрос, чтобы включить мои зависимости. Кроме того, я использую Android Studio - и поэтому не могу найти навигацию «Заказать» и «Экспорт». –

0

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

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

+0

Вы можете использовать ссылку для редактирования под своим другим ответом –

+0

Да, но это был еще один вероятный ответ, отличный от предыдущего ответа. – Chebyr

0

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

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

Это решило мою проблему прежде.

EDIT

попробовать это:

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

Поскольку это исключение ClassDefNotFound, я не уверен, как сменять код на onResume поможет. Не могли бы вы рассказать? –

0

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

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

У меня нет никаких проблем при создании apk из Android Studio. Я получаю это исключение при экспорте моего скомпилированного исходного кода и зависимостей в банке с помощью задачи ручной градации (которая работает для других зависимостей, чем facebook). Играет ли proguard роль в ручных задачах градации? –

0

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

+0

Не могли бы вы дать мне ошибку во время сборки? Я могу завершить мой файл .apk на данный момент. –

+0

Если бы эта проблема также была выше предела 64k. Это не ограничивает ваше здание, но есть только место, где можно зарегистрировать так много методов/классов. Поэтому во время работы он ищет вещи и не может их найти. Привет, краш. – Flummox

+0

Да kaushik, он не дает ошибки во время сборки, только во время выполнения, это тоже, когда метод не индексируется в пределах 64k. –

 Смежные вопросы

  • Нет связанных вопросов^_^