Android Cling/Upnp proguard

Posted

技术标签:

【中文标题】Android Cling/Upnp proguard【英文标题】: 【发布时间】:2016-02-24 13:28:47 【问题描述】:

我已经使用 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 enteries:

-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*

【问题讨论】:

你有一个“HTTP 响应是:500 内部服务器错误”你检查你的服务器上的错误吗? 是的,在运行 proguard Iam 后,同一台服务器在 chromecast 上运行良好但在 Upnp 上运行良好,这很奇怪我只是卡住了 好的,但是服务器上的错误是什么?我确定错误 500 已登录服务器。请在服务器上检查这个 如果您阅读日志,它清楚地指出问题是由于服务造成的,因此不能将适当的有效负载进行类转换,最终在服务器中返回,因为服务器没有正确的有效负载 ***.com/questions/4447145/… 如果是反射/保护问题,请尝试 【参考方案1】:

好的,在阅读了 proguard 手册,并经过多次尝试和试验后,我终于通过将上述 prguard 文件的最后一行修改为

-keepattributes 注解、InnerClasses、签名

一切正常

来自proguard

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

问题在于反思

【讨论】:

【参考方案2】:

proguard 正在破坏,即接触 Cling 库中的类/接口,您需要防止这种情况发生......

您可以开始 here 假设您在 Proguard 接触到 Jetty/Http 堆栈中的一些相关网络时遇到问题,我从您的错误内容中猜测。疯狂的猜测是,好像无法将 http 实体或主体处理为实现正确的接口......您想要配置 proguard 以避免该库中的所有接口,并且您的 proguard 中没有任何“保留接口”指令。 .

例如,您是否告诉 proguard 不要触摸 'org.eclipse.jetty' 中的任何接口。你没有这样做,你可能想这样做。

见here

扫描 -keepinterface 的 proguard 手册,以便与在你的 lib 中实现 server/http 连接的码头包一起使用。

    了解更多关于您的库中内部客户端-服务器和内部网络堆栈实现的“cling”包/接口(看起来它在某些协议(如 http)上实现了 CS 连接的码头)

    在 lib 的 jar/archive 上构建一个包列表,以与您的 proguard 配置进行比较。特别注意码头的服务器实现“jar -tf my.jar | sort | uniq”或类似的接口使用的接口

    查看在“mapping.txt”和“seeds.txt”explain here 中被 proguard 混淆的内容。将这些相应列表中的那些包名称与上面组装的包和列表相交,你不想让 proguard 搞砸。 “种子”应包含您的码头类/接口。 “映射”不应该!

【讨论】:

尝试了所有可能的组合,但仍然出现相同的错误消息,正在考虑摆脱紧贴【参考方案3】:

也许您可以尝试在 -keep class 之外添加 -keepclassmembers 以用于包 org.fourthline.cling,如下所示:

-keep class org.fourthline.cling.**  *;
-keepclassmembers class org.fourthline.cling.**  *;

【讨论】:

以上是关于Android Cling/Upnp proguard的主要内容,如果未能解决你的问题,请参考以下文章

Android项目Git提交仓库的忽略文件

关于Android混淆文件统一管理

启用 PROGUARD - Xamarin.Android

Android之代码混淆

Proguard 查询,正在使用哪一个

Android Kotlin firebase.database.DatabaseException:在类上找不到要序列化的属性