使用proguard-android-optimize.txt时,Google API Java客户端未传递值为0的参数

时间:2018-12-28 14:27:31

标签: android proguard android-proguard google-api-java-client

我有一个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会剥离Google API Java客户端请求中的param;如果param的值为0

请为此提出任何补救措施。

2 个答案:

答案 0 :(得分:1)

我们发现,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/*

答案 1 :(得分:1)

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

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

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

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