Android Cling/Upnp Proguard

Я создал приложение, используя 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 !

Ниже мои прогуливые кишки:

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

3 ответа

Решение

Хорошо, после прочтения руководства Proguard и многочисленных попыток, я наконец сделал это, изменив последнюю строку файла prguard выше

-keepattributes Аннотация, InnerClasses, Подпись

и все работает нормально

от гвардии

Определяет общую подпись класса, поля или метода. Компиляторам может понадобиться эта информация для правильной компиляции классов, которые используют универсальные типы из скомпилированных библиотек. Код может получить доступ к этой подписи путем отражения.

и вопрос размышлений

proguard портит, т. е. касается классов / интерфейсов в библиотеке Cling, и вам нужно это предотвратить...

Вы могли бы начать здесь, предполагая, что у вас есть проблема с тем, что Proguard касается какой-то сети, связанной со стеком Jetty/Http, которую я предполагаю из содержания вашей ошибки. Неожиданное предположение состоит в том, что объект http или тело не могут быть обработаны как реализующие надлежащие интерфейсы... Вы хотите настроить proguard, чтобы избежать всех интерфейсов в этой библиотеке, и у вас нет никаких директив "keep interface" в вашем proguard...,

Например, вы говорите proguard не трогать какие-либо интерфейсы в 'org.eclipse.jetty'. Вы не делаете этого, и вы можете захотеть.

смотрите здесь

отсканируйте руководства proguard на наличие -keepinterface для использования с пакетами Jetty, реализующими соединения server / http в вашей lib.

  1. узнать больше о "цепляющихся" пакетах / интерфейсах вокруг реализаций внутреннего клиента-сервера и внутреннего сетевого стека в вашей библиотеке (похоже, она реализует Jetty для CS-соединений по какому-либо протоколу, например http)

  2. создайте список пакетов в jar / архиве библиотеки lib для сравнения с вашим конфигом proguard. обратите особое внимание на интерфейсы, используемые реализацией сервера Jetty "jar -tf my.jar | sort | uniq" или что-то подобное

  3. посмотрите, что было запутано proguard в 'mapping.txt' и в 'seed.txt', объясните здесь. пересекайте имена пакетов из соответствующих списков с пакетами и списками, собранными выше, с которыми вы не хотите, чтобы proguard связывался. 'seed' должен содержать ваши классы / интерфейсы. "отображение" не должно!

Может быть, вы могли бы попытаться добавить -keepclassmembers в дополнение к -keep class для упаковки org.fourthline.cling как это:

-keep class org.fourthline.cling.** { *;}
-keepclassmembers class org.fourthline.cling.** { *;}
Другие вопросы по тегам