Класс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