4

Android アプリで smack ライブラリ (4.1.2) を使用して XMPP サーバーに接続しています。コードが縮小されていない場合 (つまり、proguard を使用している場合) は、完全に正常に動作します。しかし、proguard が有効なリリース モードでは、アプリはサーバーに接続するとすぐにクラッシュします。

ここで提案されているように、関連するすべての smack クラスを縮小しないようにしています: What are the recommended ProGuard rules for Smack 4.1?

-keep class org.jivesoftware.smack.** { *; }
-keep class org.jivesoftware.smackx.** { *; }

しかし、私にとってこれはうまくいきません。以下は、クラッシュ スタック トレースです。

 java.lang.ExceptionInInitializerError
  at org.jivesoftware.smackx.privacy.PrivacyListManager.<init>(PrivacyListManager.java:126)
  at org.jivesoftware.smackx.privacy.PrivacyListManager.getInstanceFor(PrivacyListManager.java:210)
  at org.jivesoftware.smackx.privacy.PrivacyListManager$1.connectionCreated(PrivacyListManager.java:81)
  at org.jivesoftware.smack.tcp.XMPPTCPConnection.initConnection(XMPPTCPConnection.java:636)
  at org.jivesoftware.smack.tcp.XMPPTCPConnection.connectInternal(XMPPTCPConnection.java:834)
  at org.jivesoftware.smack.AbstractXMPPConnection.connect(AbstractXMPPConnection.java:365)
  ...
 Caused by: java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
  at org.jivesoftware.smack.filter.FlexibleStanzaTypeFilter.<init>(FlexibleStanzaTypeFilter.java:40)
  at org.jivesoftware.smackx.privacy.filter.SetActiveListFilter.<init>(SetActiveListFilter.java:27)
  at org.jivesoftware.smackx.privacy.filter.SetActiveListFilter.<clinit>(SetActiveListFilter.java:25)

これを修正するプロガード構成に関するアイデアはありますか?

更新: レポートの他の問題については既に言及しており、提案された解決策はこの場合の修正ではないことを説明しました。

更新 2: 行番号を有効にしてスタック トレースを再生成しました。

4

2 に答える 2

8

だから、私は解決策を見つけました。この問題に丸一日費やすなんて信じられない!これにより、他の誰かが同じ問題を解決できることを願っています:

問題を引き起こしている行(スマックライブラリ内)は

stanzaType = (Class<S>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];

キャストに注目。クラスに「-keep」を指定した場合でも、デフォルトでプロガードが型に関するいくつかの情報を失うことが問題のようです。重要な役立つ情報は次のとおりです。 Field.getGenericType() は、Type ではなく java.lang.Class のインスタンスを返します。

したがって、私の質問に対する答えは、次の proguard 構成が必要であるということです。

-keepattributes Signature
-keep class org.jivesoftware.smack.** { *; }
-keep class org.jivesoftware.smackx.** { *; }
于 2015-07-02T15:11:34.933 に答える