【问题标题】:google api java client not passing parameter with value 0 when using proguard-android-optimize.txtgoogle api java客户端在使用proguard-android-optimize.txt时未传递值为0的参数
【发布时间】:2019-05-26 08:50:42
【问题描述】:

我有一个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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    -optimizations !code/simplification/*
    

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-11-16
        • 2019-11-24
        • 1970-01-01
        • 2015-05-26
        • 1970-01-01
        • 2019-03-16
        • 1970-01-01
        相关资源
        最近更新 更多