私はようやく、リリース用にビルドされたアプリがクラッシュする理由を見つけました。 ProGuardは確かに私のアプリケーションからコードを取り除いていましたが、prod-Android.txt(sdkにあります)のkeepコマンドを使用してクラスを手動で追加することでこれを防ぎました。
私が使用したFacebookの場合:
-keep class com.facebook.Android.*
-keep class Android.webkit.WebViewClient
-keep class * extends Android.webkit.WebViewClient
-keepclassmembers class * extends Android.webkit.WebViewClient {
<methods>;
}
しかし、私はまだ何かが足りないと思います。アプリはクラッシュフリーですが、FacebookにログインしてOpen Graphを使用できません。私がデバッグモードでビルドしたとき、これはすべてうまくいきます。
FacebookとFacebookのOpen Graphを使用するためのプロガード設定は何ですか?
[〜#〜]編集[〜#〜]
これは、手動で追加したProGuardのコマンドです。
-dontwarn Android.support.**
# ActionBarSherlock
-keep class Android.support.** { *; }
-keep interface Android.support.** { *; }
-keep class com.actionbarsherlock.** { *; }
-keep interface com.actionbarsherlock.** { *; }
# Keep line numbers to alleviate debugging stack traces
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable
-keepclassmembers class * implements Java.io.Serializable
{
private static final Java.io.ObjectStreamField[] serialPersistentFields;
private void writeObject(Java.io.ObjectOutputStream);
private void readObject(Java.io.ObjectInputStream);
Java.lang.Object writeReplace();
Java.lang.Object readResolve();
}
-keep class com.facebook.Android.*
-keep class Android.webkit.WebViewClient
-keep class * extends Android.webkit.WebViewClient
-keepclassmembers class * extends Android.webkit.WebViewClient {
<methods>;
}
編集2したがって、ログインしない場合の問題は、リリースハッシュキーの代わりにデバッグハッシュキーを使用したことです。私のアプリ設定(developers.facebook.com)でそれを変更し、私のアプリがようやくログインしましたが、ログイン後にクラッシュすることがわかりました。
これがまだProGuardの問題かどうかはわかりませんが、次のエラーが返されます。
04-02 11:47:31.815: E/AndroidRuntime(9093): FATAL EXCEPTION: main
04-02 11:47:31.815: E/AndroidRuntime(9093): com.facebook.ab: com.facebook.b.e got an unexpected method signature: public abstract com.facebook.b.b com.facebook.b.b.a(Java.lang.Class)
04-02 11:47:31.815: E/AndroidRuntime(9093): at com.facebook.b.f.a(SourceFile:400)
04-02 11:47:31.815: E/AndroidRuntime(9093): at com.facebook.b.e.b(SourceFile:546)
04-02 11:47:31.815: E/AndroidRuntime(9093): at com.facebook.b.e.invoke(SourceFile:470)
04-02 11:47:31.815: E/AndroidRuntime(9093): at $Proxy1.a(Native Method)
04-02 11:47:31.815: E/AndroidRuntime(9093): at com.facebook.bb.a(SourceFile:124)
04-02 11:47:31.815: E/AndroidRuntime(9093): at com.facebook.ar.a(SourceFile:264)
04-02 11:47:31.815: E/AndroidRuntime(9093): at com.facebook.as.run(SourceFile:1240)
04-02 11:47:31.815: E/AndroidRuntime(9093): at Android.os.Handler.handleCallback(Handler.Java:615)
04-02 11:47:31.815: E/AndroidRuntime(9093): at Android.os.Handler.dispatchMessage(Handler.Java:92)
04-02 11:47:31.815: E/AndroidRuntime(9093): at Android.os.Looper.loop(Looper.Java:137)
04-02 11:47:31.815: E/AndroidRuntime(9093): at Android.app.ActivityThread.main(ActivityThread.Java:4931)
04-02 11:47:31.815: E/AndroidRuntime(9093): at Java.lang.reflect.Method.invokeNative(Native Method)
04-02 11:47:31.815: E/AndroidRuntime(9093): at Java.lang.reflect.Method.invoke(Method.Java:511)
04-02 11:47:31.815: E/AndroidRuntime(9093): at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:791)
04-02 11:47:31.815: E/AndroidRuntime(9093): at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:558)
04-02 11:47:31.815: E/AndroidRuntime(9093): at dalvik.system.NativeStart.main(Native Method)
04-02 11:47:31.820: W/ActivityManager(2130): Force finishing activity com.xxxxx.xxxx/com.xxxxx.views.MainActivity
04-02 11:47:32.360: W/ActivityManager(2130): Activity pause timeout for ActivityRecord{4289ca58 com.xxxxx.xxxxx/com.xxxxx.xxxxx.MainActivity}
修繕:
-keep class com.facebook.** {
*;
}
の代わりに:
-keepattributes Signature
-keep class com.facebook.Android.*
-keep class Android.webkit.WebViewClient
-keep class * extends Android.webkit.WebViewClient
-keepclassmembers class * extends Android.webkit.WebViewClient {
<methods>;
}
また、Facebookアプリの設定でハッシュキーを確認してください。
私の場合、あなたの解決策
-keep class com.facebook.** {
*;
}
動作しますが、私は維持しなければなりませんでした
-keepattributes Signature
すべてを機能させるために。