我有一个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
请为此提出任何补救措施。
答案 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>();
}