2014-09-19 3 views
1

Если я создаю приложение в отладке, он отлично работает. Однако, когда я создаю для выпуска с помощью proguard, я получаю несколько ошибок, а затем сборка выходит из строя. Сводка ошибок:Релиз версии с проблемами с proguard - GSON

Warning:there were 445 unresolved references to classes or interfaces. 
Warning:there were 13 instances of library classes depending on program classes. 

Я изменил файл proguard-rules.txt, как показано ниже. Это позволило построить для успеха, но когда я устанавливаю приложение, загрузка Amazon не работает (работает в отладочной версии).

-keep class org.xmlpull.v1.** 
-keep class org.apache.http.** 
-keep class org.ietf.jgss.** 
-keep class com.amazonaws.services.** 
-keep class org.w3c.dom.bootstrap.** 

-dontwarn org.xmlpull.v1.** 
-dontwarn org.apache.http.** 
-dontwarn org.ietf.jgss.** 
-dontwarn com.amazonaws.services.** 
-dontwarn org.w3c.dom.bootstrap.** 

Любые предложения относительно того, как я могу исправить это, пожалуйста?

Update:

свели к вопросу GSON/JSONPARSER. Для версии выпуска JSONPARSER не конвертирует скачанный json в класс, как он есть, в debug. Также были добавлены правила защиты GSON (см. Обновление 2), но проблема не устранена.

-keep class org.apache.commons.logging.**    { *; } 
-keep class com.amazonaws.services.sqs.QueueUrlHandler { *; } 
-keep class com.amazonaws.javax.xml.transform.sax.*  { public *; } 
-keep class com.amazonaws.javax.xml.stream.**   { *; } 
-keep class com.amazonaws.services.**.model.*Exception* { *; } 
-keep class com.amazonaws.internal.**     { *; } 
-keep class org.codehaus.**        { *; } 
-keep class org.joda.convert.*       { *; } 
-keepattributes Signature,*Annotation*,EnclosingMethod 
-keepnames class com.fasterxml.jackson.** { *; } 
-keepnames class com.amazonaws.** { *; } 
-dontwarn com.amazonaws.auth.policy.conditions.S3ConditionFactory 
-dontwarn org.joda.time.** 
-dontwarn com.fasterxml.jackson.databind.** 
-dontwarn javax.xml.stream.events.** 
-dontwarn org.codehaus.jackson.** 
-dontwarn org.apache.commons.logging.impl.** 
-dontwarn org.apache.http.conn.scheme.** 
-dontwarn org.apache.http.annotation.** 
-dontwarn org.ietf.jgss.** 
-dontwarn org.w3c.dom.bootstrap.** 

-dontwarn org.xmlpull.v1.** 
-dontwarn com.amazonaws.services.** 

-libraryjars libs/aws-android-sdk-1.7.1.1-core.jar 
-libraryjars libs/aws-android-sdk-1.7.1.1-s3.jar 
-libraryjars libs/gson-2.2.4.jar 
-libraryjars libs/ksoap2-android-assembly-3.3.0-jar-with-dependencies.jar 

Обновление 2

# Gson uses generic type information stored in a class file when working with fields. Proguard 
# removes such information by default, so configure it to keep all of it. 
-keepattributes Signature 

# For using GSON @Expose annotation 
-keepattributes *Annotation* 

# Gson specific classes 
-keep class sun.misc.Unsafe { *; } 
-keep class com.google.gson.stream.** { *; } 

# Application classes that will be serialized/deserialized over Gson 
-keep class com.google.gson.examples.android.model.** { *; } 
+1

Попробуйте проверить файл https://github.com/aws/aws-sdk-android-v2/blob/master/Proguard.html. Он содержит предложенные строки для proguard. – bogumil

+0

Также, если у вас есть файлы jar в папке libs, следующая строка может помочь: '-libraryjars ./libs/ [filename] .jar' – bogumil

+0

@bogumil thanks. попробовал то, что вы предложили, но проблема сохраняется. См. Обновление моего вопроса. – RunLoop

ответ

4

Наконец решена. GSON не смог преобразовать мой JSON в класс, используя метод fromJson, поскольку proguard обфускали поля моего класса. Я должен был добавить для каждого из моих классов, используемых во время JSon десериализации:

-keepclassmembers class fully.qualified.path.to.class$innerclass { 
     private <fields>; 
} 

Как обычно, нет упоминания об этом в документации GSON. Это был проект, который я взял на себя - я лично никогда не использовал GSON и не буду делать этого в будущем.

Несколько замечаний к тем, кто испытывает аналогичные вопросы:

  • Всегда убедитесь, что когда вы используете библиотеку, чтобы включить все рекомендуемые (в библиотеке - видеть их веб-страниц) записи в ProGuard Файл -rules.text.
+0

Они упомянули в последней строке вашего обновления2, чтобы дать полный путь вашего класса, который будет сериализован/десериализован над классами Gson # Application, которые будут сериализованы/десериализованы над Gson -keep class com.google.gson.examples .android.model. ** {*; }. Вы должны указать * ваш фактический путь к классу * здесь –

0

Они упомянули в комментариях во второй последней строке обновления2.

# Application classes that will be serialized/deserialized over Gson 
-keep class com.google.gson.examples.android.model.** { *; } 

Измените последнюю строку на ваш фактический путь внутри кода на классы, которые будут сериализованы. Не копируйте пасту, как есть. Пример:

-keep класс com.myclass.model. ** {*; }

Это сработало для меня.