17

警告:質問をよりわかりやすくするために、多くの「古いテキスト」を削除しました。必要に応じて履歴を確認してください。

facebook sdk 3.0proguardを使用するアプリの縮小と難読化の両方に使用しています(sdk-version-3.0.2.bタグを使用しています)。JARファイルを使用していません。代わりに、ドキュメントで説明されているように、ワークスペース内にSDKをインポートしました。

実行の特定の時点で、アプリはPlacePickerFragmentをロードして、ユーザーが自分のいる場所を選択できるようにします。これをコーディングするために、私はScrumptiousチュートリアルに正確に従います。すべてを使用せずにデバッグapkを生成すると、期待どおりに機能します。proguardしかし、を使用して署名付きapkを生成するとproguard、PlacePickerFragmentが次のトレースで近くの場所をロードするとクラッシュします。

E/AndroidRuntime(27472): FATAL EXCEPTION: main
E/AndroidRuntime(27472): com.facebook.FacebookGraphObjectException: can't infer generic type of: interface com.facebook.model.GraphObjectList
E/AndroidRuntime(27472):    at com.facebook.model.GraphObject$Factory.coerceValueToExpectedType(Unknown Source)
E/AndroidRuntime(27472):    at com.facebook.model.GraphObject$Factory$GraphObjectProxy.proxyGraphObjectGettersAndSetters(Unknown Source)
E/AndroidRuntime(27472):    at com.facebook.model.GraphObject$Factory$GraphObjectProxy.invoke(Unknown Source)
E/AndroidRuntime(27472):    at com.facebook.widget.$Proxy2.getData(Native Method)
E/AndroidRuntime(27472):    at com.facebook.widget.GraphObjectPagingLoader.addResults(Unknown Source)
E/AndroidRuntime(27472):    at com.facebook.widget.GraphObjectPagingLoader.requestCompleted(Unknown Source)
E/AndroidRuntime(27472):    at com.facebook.widget.GraphObjectPagingLoader.access$1(Unknown Source)
E/AndroidRuntime(27472):    at com.facebook.widget.GraphObjectPagingLoader$2.onCompleted(Unknown Source)
E/AndroidRuntime(27472):    at com.facebook.Request$4.run(Unknown Source)
E/AndroidRuntime(27472):    at android.os.Handler.handleCallback(Handler.java:587)
E/AndroidRuntime(27472):    at android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime(27472):    at android.os.Looper.loop(Looper.java:130)
E/AndroidRuntime(27472):    at android.app.ActivityThread.main(ActivityThread.java:3687)
E/AndroidRuntime(27472):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(27472):    at java.lang.reflect.Method.invoke(Method.java:507)
E/AndroidRuntime(27472):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
E/AndroidRuntime(27472):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
E/AndroidRuntime(27472):    at dalvik.system.NativeStart.main(Native Method)

このエラーを回避するために、すべてのFacebookクラスをそのままにしましたが、機能しませんでした。私の現在のproguard-project.txtファイル:

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

私の現在のprojet.propertiesファイル(抜粋):

proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt

ご覧のとおり、私の構成はこのファイルproguardの「特殊化」です。

ファイルに入れれば動作-dontobfuscateします。proguard-project.txtしかし、私が理解していないのは、keep class com.facebook.**Facebookに関連するクラスが難読化されるのをすでに防ぐ必要があるということです。これは、問題がFacebookクラスに直接関係していないことを示唆しています。

スローするコードの抜粋com.facebook.FacebookGraphObjectExceptionは次のとおりです。

static <U> U coerceValueToExpectedType(Object value, Class<U> expectedType, 
        ParameterizedType expectedTypeAsParameterizedType) {

    // [...]

    } else if (Iterable.class.equals(expectedType) || Collection.class.equals(expectedType)
        || List.class.equals(expectedType) || GraphObjectList.class.equals(expectedType)) {
        if (expectedTypeAsParameterizedType == null) {
            throw new FacebookGraphObjectException("can't infer generic type of: " + expectedType.toString());
        }
    // [...]
}

明らかに、expectedTypeAsParameterizedTypeリリースnullビルドにあります。ただし、どちらのビルド(デバッグとリリース)expectedTypeでもcom.facebook.model.GraphObjectListインターフェイスです。残念ながら、私はJavaリフレクションの概念についてほとんど何も理解していません。

この問題を解決するにはどうすればよいですか?

4

4 に答える 4

30

これはあなたの問題を解決するでしょう、私は願っています:

そして勝者は .....

-keepattributes Signature

Proguardホームページから:

「Signature」属性は、JDK5.0以降でコンパイルするときにジェネリック型にアクセスできるようにするために必要です。

于 2012-11-26T19:10:46.527 に答える
15

Facebookを保護したい場合は、以下の構成が機能しています

#modify for Facebook
-keepattributes Signature
-keep class com.facebook.model.** { *; }

-keepnames class * implements java.io.Serializable
-keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    !static !transient <fields>;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
}
于 2013-04-22T06:39:03.743 に答える
0

これはうまくいくかもしれません(テストされていません)

-keep class com.facebook.** { *; }
于 2012-11-24T03:57:54.263 に答える
0

試す

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

その理由は、private、public、protectedを指定する場合でも、デフォルト(パッケージプライベート)アクセスを難読化に開放しているためです。

于 2012-11-24T03:58:24.910 に答える