google api java 使用 proguard-android-optimize.txt 时客户端未传递值为 0 的参数

google api java client not passing parameter with value 0 when using proguard-android-optimize.txt

我有一个 Google API java 客户端模型 class 作为:

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;
  }

使用混淆器配置时:

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 正在剥离 google API java 客户端请求的 param;如果参数的值为 0

请提出任何补救措施。

我们发现混淆器用相同的引用替换了 new Long(0) 的所有实例。 (与 String/Int 等相同)因此在这种情况下,如果您有任何值为 0 的参数。它将转换为 new Long(0) 的相同引用。由于 com.google.api.client.util.Data.javaisNull 的检查导致该字段被设置为空。因此它不会在您的 API 调用中传递。

解决方案: 将以下行添加到 proguard 规则以禁用此 proguard 简化。

-optimizations !code/simplification/*

Aalap 发现,Google API 代码创建了某些类型的标记实例(例如 new Boolean(true))。您可以使用

避免破坏此类代码的优化(例如 Boolean.TRUE)
-optimizations !code/simplification/object

或者对于更本地的解决方案,只需保留此代码:

-keepclassmembers,includecode class com.google.api.client.util.Data {
    void <clinit>();
}