Android Cling/Upnp proguard

12

我使用了Cling创建了一个应用程序,它能够良好地工作。但是,在我创建发布版本时,我会收到以下消息并且渲染器上没有任何播放内容:

   11-22 16:24:53.341  20172-20172/? I/RendererCommand﹕ TrackMetadata : TrackMetadata [id=1, title=IMG-20151120-WA0007, artist=, genre=, artURI=res=http://192.168.1.4:8089/1.jpg, itemClass=object.item.imageItem]
11-22 16:24:53.345  20172-20172/? V/RendererCommand﹕ Resume
11-22 16:24:53.351  20172-20301/? W/RendererCommand﹕ Fail to stop ! Error: Current state of service prevents invoking that action. Error writing request message. Can't transform message payload: java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType. (HTTP response was: 500 Internal Server Error)
11-22 16:24:53.351  20172-20301/? I/RendererCommand﹕ Set uri to http://192.168.1.4:8089/1.jpg
11-22 16:24:53.353  20172-20386/? D/RendererCommand﹕ Update state !
11-22 16:24:53.354  20172-20264/? W/RendererCommand﹕ Fail to set URI ! Error: Current state of service prevents invoking that action. Error writing request message. Can't transform message payload: java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType. (HTTP response was: 500 Internal Server Error)
11-22 16:24:53.354  20172-20262/? W/RendererCommand﹕ Fail to get position info ! Error: Current state of service prevents invoking that action. Error writing request message. Can't transform message payload: java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType. (HTTP response was: 500 Internal Server Error)
11-22 16:24:54.354  20172-20386/? D/RendererCommand﹕ Update state !

以下是我的Proguard条目:
-dontoptimize
-dontshrink
-dontskipnonpubliclibraryclasses
-dontpreverify
-allowaccessmodification
-verbose

-dontwarn org.fourthline.cling.**
-dontwarn org.seamless.**
-dontwarn org.eclipse.jetty.**
-dontwarn android.support.v4.app.**
-dontwarn android.support.design.widget.**

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService
-keep class javax.** { *; }
-keep class org.** { *; }
-keep class org.fourthline.cling.** { *;}
-keep class org.seamless.** { *;}
-keep class org.eclipse.jetty.** { *;}
-keep class org.slf4j.** { *;}
-keep class javax.servlet.** { *;}

-keepclasseswithmembernames class * {
    native <methods>;
}

-keepclasseswithmembernames class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembernames class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}


-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

-keep class android.support.v4.app.** { *; }
-keep interface android.support.v4.app.** { *; }

-keepattributes *Annotation*

1
你收到了一个“HTTP响应为:500内部服务器错误”的错误信息,你是否检查了服务器上的错误? - LaurentY
1
是的,非常奇怪,同一台服务器在运行了Proguard之后与Chromecast正常工作,但与Upnp不兼容,我现在卡住了。 - ingsaurabh
好的,但服务器上出现了什么错误? 我确信服务器上记录了500错误。 请在服务器上检查。 - LaurentY
如果您阅读日志,它会清楚地指出问题是由服务引起的,因此适当的有效载荷不能被强制转换类型,最终在服务器上返回,因为服务器没有正确的有效载荷。 - ingsaurabh
如果这是一个反射/ProGuard问题,请尝试这个。 - Robert Rowntree
3个回答

8

在阅读了Proguard手册并进行了多次尝试后,我终于通过修改上述Proguard文件的最后一行来实现了目标:

-keepattributes Annotation, InnerClasses, Signature

现在一切都运行良好。

关于Proguard:

表示类、字段或方法的通用签名。编译器可能需要此信息才能正确编译使用已编译库中的泛型类型的类。代码可以通过反射访问此签名。

问题出在反射上。


2

Proguard正在修改Cling库中的类/接口,您需要防止这种情况发生...

您可以从这里开始,假设您遇到了Proguard触及Jetty / Http堆栈中某些与网络相关的问题,我猜测是从您的错误内容推断出来的。很可能是HTTP实体或正文无法作为实现适当接口处理... 您需要配置Proguard以避免该库中的所有接口,并且您的Proguard中没有任何“keep interface”指令...

例如,您是否告诉Proguard不要触及“org.eclipse.jetty”中的任何接口?您没有这样做,您可能想要这样做。

请参见此处

扫描Proguard手册以使用与您的库中实现服务器/ HTTP连接的Jetty包一起使用的-keepinterface。

  1. 了解围绕内部客户端-服务器和内部网络堆栈实现的“cling”包/接口更多信息,它看起来像是在某些协议上实现了Jetty用于C-S连接的功能,例如http)

  2. 构建一个包含在库的jar /存档中的包列表,以与您的Proguard配置进行比较。特别注意Jetty服务器实现正在使用的接口“jar -tf my.jar | sort | uniq”或类似命令

  3. 查看Proguard在“mapping.txt”和“seeds.txt”中混淆的内容在此处解释。将这些各自列表中的包名称与上面组装的包和列表相交,您不希望Proguard对其进行干扰。“seeds”应包含您的Jetty类/接口。“mapping”则不应该!


1
尝试了所有可能的组合,但仍然出现相同的错误消息,考虑放弃使用cling。 - ingsaurabh

0
也许你可以尝试在-keep class的基础上,为org.fourthline.cling包添加-keepclassmembers参数,像这样:
-keep class org.fourthline.cling.** { *;}
-keepclassmembers class org.fourthline.cling.** { *;}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接