使用proguard时,smack for android失败了

时间:2015-07-01 09:31:59

标签: android xmpp proguard smack android-proguard

我在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:我已经使用行号重新生成了堆栈跟踪。

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'
}