Как исправить проблему Proguard с REST API Google Диска

Я использую Google Rest API v3 для подключения своего приложения для Android к Google Диску. Когда я запускаю без Proguard (minifyEnabled=false), все хорошо. Однако, когда я включаю proguard, вызываются неправильные методы REST API. Когда я вызываю Drive.Files.get().execute для корневого псевдонима диска «root», я получаю результат для Drive.Files.list().execute. Когда я отключаю «minifyEnabled», я вижу правильный результат. Вот раздел build.gradle, который управляет запуском Proguard:

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    debug {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

Файл Proguard по умолчанию — это немодифицированный файл, который распространяется с Android Studio 2.2 (не оптимизированная версия).

А это содержимое моего файла proguard-rules.pro

-keepattributes EnclosingMethod
-keepattributes InnerClasses
-dontoptimize

-keep class com.google.**
-keep class com.fasterxml.**
-dontwarn com.google.**

Когда я проверяю сгенерированный файл mapping.txt, я все еще вижу переименованные члены в классах, которые imo shoudl были «сохранены». Например:

com.google.api.client.auth.oauth.OAuthParameters -> com.google.api.client.auth.oauth.OAuthParameters: java.security.SecureRandom RANDOM -> l com.google.api.client.auth.oauth. Подписывающая сторона OAuthSigner -> обратный вызов java.lang.String -> b java.lang.String ConsumerKey -> c одноразовый номер java.lang.String -> d область java.lang.String -> e

Я бы подумал, что "-keep class com.google.**" избежал бы этого?

Есть идеи, как это исправить?

Заранее спасибо,


person Gerrit Beuze    schedule 02.11.2016    source источник
comment
ты исправила? я сталкиваюсь с той же проблемой. Пожалуйста, помогите, если вы знаете. Спасибо   -  person SimpleCoder    schedule 22.06.2017
comment
Да, см. мой последний комментарий от 2 ноября 2016 г., я смог сузить круг....   -  person Gerrit Beuze    schedule 23.06.2017


Ответы (3)


Тебе нужно

-keep class com.google.** { *;} 

а также

-keep class com.fasterxml.** { *;}

Также вы можете попытаться сохранить меньше от SDK. Эти правила очень широки.

Изменить: широкие правила означают, что в вашем проекте, вероятно, будет больше неиспользуемых классов, поэтому размер apk и количество методов будут больше.

person Alex    schedule 02.11.2016
comment
К сожалению, это не помогает. Вызовы Drive API по-прежнему путаются, и в файле mapping.txt я все еще вижу переименование в членах класса com.google. - person Gerrit Beuze; 02.11.2016
comment
Когда я добавил это в proguard-rules.pro основного модуля, это все равно не удалось, однако, когда я также добавил это в модуль, от которого зависит основной модуль (модуль, который фактически использует Drive API), он работает! Большое спасибо. - person Gerrit Beuze; 02.11.2016
comment
Мне удалось сузить список до следующих: -keep,allowshrinking class com.google.api.services.drive.model.** { ;} . { *;} - person Gerrit Beuze; 02.11.2016
comment
Работал как шарм. После 5 часов попыток выяснить, что происходит, этот пост спас жизнь. В моем случае у меня возникли проблемы с загрузкой файлов на Google Диск после создания моего подписанного APK. В режиме отладки проблему воспроизвести не удалось. Каким-то образом обработка ProGuard устраняла влияние setName на метаданные. Чистый эффект заключался в том, что все файлы были загружены с именем файла NULL. Еще раз спасибо за пост! - person BluJ IT; 06.08.2019
comment
привет, Алекс, твое решение может сработать. Я проголосовал только против, потому что исправление Евгения Ройтбурга точно указывает на проблему. Как вы сказали, это общее исправление, чем меньше мы сохраняем исходный код, тем безопаснее он будет. Хорошая работа, пожалуйста, продолжайте в том же духе. Если возможно, улучшите свой ответ, чтобы разработчики знали, что означает это широкое правило. - person MG Developer; 12.07.2020

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

-keepclassmembers class * {
  @com.google.api.client.util.Key <fields>;
}

Как видно из официального образца Google:

https://github.com/google/google-api-java-client-samples/blob/master/tasks-android-sample/proguard-google-api-client.txt

person Evgeni Roitburg    schedule 26.08.2019
comment
Проверено и работает очень хорошо. Я считаю это наиболее эффективным исправлением, поскольку это исправление сохраняет исходный код только для абсолютно необходимых членов класса, а не полностью сохраняет. Я призываю других разработчиков проверить и проголосовать за наиболее эффективный ответ. - person MG Developer; 12.07.2020
comment
отличное решение для этого - person Eren Tüfekçi; 14.12.2020
comment
Этот сработал, потратив 2-3 часа на исследования. Большое спасибо. - person Mayank Sharma; 18.06.2021

В моем случае я должен был поставить вот эти опоры:

-keep class br.project.pine.** { *;}
-keep class com.google.api.services.drive.** { *;}

Совет: при включении минимизации в режиме отладки обратите внимание на файл LogCat. Это может помочь вам узнать реальный отсутствующий пакет/класс/атрибут.

person Cícero Moura    schedule 09.02.2019