我在Android应用程序中使用smack库(4.1.2)连接到XMPP服务器。当代码未缩小时(即使用proguard),它运行得非常好。但是在发布模式下,启用proguard后,应用程序会在连接到服务器后立即崩溃。
我正在尝试按照此处的建议保持所有相关的smack类:What are the recommended ProGuard rules for Smack 4.1?
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2"
android:background="#FFFFFF"
android:orientation="horizontal">
<RelativeLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:src="@drawable/ic_launcher" />
</RelativeLayout>
<RelativeLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:text="Some Text"
android:textColor="@android:color/black"
android:textSize="20sp" />
</RelativeLayout>
</LinearLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="#C0C0C0">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="Some Text"
android:textColor="@android:color/black"
android:textSize="20sp" />
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="#00FF00"></RelativeLayout>
</LinearLayout>
但对我来说这不起作用。下面是崩溃堆栈跟踪。
-keep class org.jivesoftware.smack.** { *; }
-keep class org.jivesoftware.smackx.** { *; }
有关proguard配置的任何想法都可以解决这个问题吗?
更新:我已经在报告中提到了另一个问题,并解释了在这种情况下提议的解决方案不是解决方法。
更新2:我已经使用行号重新生成了堆栈跟踪。
答案 0 :(得分:5)
所以,我找到了解决方案。我不相信我在这个问题上花了一整天的时间!希望这能为其他人节省同样的麻烦:
造成问题的线(在smack库中)是
stanzaType = (Class<S>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
注意演员。问题似乎是默认情况下,如果你已经指定了&#34; -keep&#34;为你的课程。有用信息的关键点在这里: Field.getGenericType() returns instance of java.lang.Class instead of Type
因此,我的问题的答案是需要以下proguard配置:
-keepattributes Signature
-keep class org.jivesoftware.smack.** { *; }
-keep class org.jivesoftware.smackx.** { *; }
答案 1 :(得分:0)
xpp3,也需要进行保护
configurations {
all*.exclude group: 'xpp3', module: 'xpp3'
}