Java-клиент Google API не передает параметр со значением 0 при использовании proguard-android-optimize.txt - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть Google API класс модели Java-клиента как:

public final class AccountProviders extends com.google.api.client.json.GenericJson

с параметром lastSyncTime как:

  /**
   * @return value or {@code null} for none
   */
  public java.lang.Long getLastSyncTime() {
    return lastSyncTime;
  }

при использовании конфигурации proguard:

release {
    resValue "string", "app_name", "MyApp"
    minifyEnabled true
    shrinkResources false
    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}

все работает нормально для 0 или любого другого значения long в качестве значения lastSyncTime, однако, если используется следующая конфигурация proguard:

release {
    resValue "string", "app_name", "MyApp"
    minifyEnabled true
    shrinkResources false
    proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.txt'
}

API выдает 503,поскольку в запросе отсутствует параметр lastSyncTime, значение 0;он отлично работает для других значений long.

Использование оптимизированного proguard config убирает param запроса клиента Java API Google;если значение параметра равно 0

Пожалуйста, предложите любое средство для этого.

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Как выяснил Аалап, код API Google создает экземпляры маркеров некоторых типов (например, new Boolean (true)).Вы можете избежать оптимизации, которая нарушает такой код (например, Boolean.TRUE) с помощью

-optimizations !code/simplification/object

или для более локального решения, просто сохраните этот код:

-keepclassmembers,includecode class com.google.api.client.util.Data {
    void <clinit>();
}
0 голосов
/ 31 декабря 2018

Мы обнаружили, что proguard заменяет все экземпляры new Long(0) одинаковыми ссылками.(то же самое для String / Int и т. д.) Так что в этом случае, если у вас есть какой-либо параметр со значением 0.Он будет преобразован в ту же ссылку new Long(0).Из-за этой проверки на isNull в com.google.api.client.util.Data.java, в результате чего для этого поля устанавливается значение NULL.И, следовательно, он не будет передаваться в вызовах API.

Решение: добавьте следующую строку в правила proguard, чтобы отключить это упрощение proguard.

-optimizations !code/simplification/*
...