Android 发布版本中的空json数据(使用proguard)

Android 发布版本中的空json数据(使用proguard),android,json,adt,proguard,spring-android,Android,Json,Adt,Proguard,Spring Android,当我运行发布版本(已签名,Proguard打包)时,我的应用程序不会将数据发布到服务器。但是如果我直接从ADT运行它,我会看到服务器上的数据 这很奇怪,因为它只是同一个代码,一个是签名的,另一个是直接执行的。下面是代码(使用org.springframework.web.client.restemplate): private静态字符串URL=”https://myappserver.com/abcservice/"; 公共响应发送消息(UserMessage us){ 私有RestTempla

当我运行发布版本(已签名,Proguard打包)时,我的应用程序不会将数据发布到服务器。但是如果我直接从ADT运行它,我会看到服务器上的数据

这很奇怪,因为它只是同一个代码,一个是签名的,另一个是直接执行的。下面是代码(使用org.springframework.web.client.restemplate):

private静态字符串URL=”https://myappserver.com/abcservice/";
公共响应发送消息(UserMessage us){
私有RestTemplate=getTemplate();
HttpEntity reqEntity=新的HttpEntity(美国,标题);
响应性结果=
template.postForEntity(URL、reqEntity、String.class);
返回结果;
}
以下是两种情况:

案例1:效果良好

  • 直接从ADT运行应用程序(运行方式:Android应用程序)
  • 用户点击一个按钮,该按钮将调用
    sendMessage(..)
    方法
  • 控制器(在服务器上)获取请求和数据(
    UserMessage
  • 将创建一个带有UserMessage的条目
  • 服务器向应用程序发送201响应(请求已完成)
  • 案例2:问题

  • 打包应用程序(Android工具->导出已签名的应用程序包..)
  • 通过命令行将其安装到设备上(adb Install xxx.apk)
  • 启动应用程序
  • 用户点击一个按钮,该按钮将调用
    sendMessage(..)
    方法
  • 控制器(服务器上)获取请求,但没有数据
  • 将创建一个用户消息为空的条目
  • 服务器向应用程序发送201响应(请求已完成)
  • 我已经尝试在我的设备和web服务器上登录,我可以确认接收到案例2的空数据,但我不知道为什么打包时它不发送数据


    与调试打包相比,打包/发布(已签名+Proguard)应用程序的行为是否有所不同?

    我猜这是由Proguard造成的。Proguard可能混淆了代码的某些部分,但这段代码是由Spring动态调用的(jackson?您没有提到)。(因此,一旦混淆:动态调用失败)

    因此,试着:

    • 禁用proguard以确认它是问题的原因
    • 如果确认:尝试对其进行配置,使其不会混淆在json中序列化的类(即UserMessage):

      -保留类com.company.UserMessage**{*;}


    上述答案对我不起作用,可能是2014年的答案是正确的
    2019年,当我设置CompileSDK版本28时,它可以正常工作。

    我也有同样的问题,我承诺在2行以下

    //真的吗

    //minifyEnabled true


    UserMessage是您定义的类吗?是的@JsonIgnoreProperties(ignoreUnknown=true)公共类UserMessage{..}是的,它是Spring+Jackson。同样使用
    org.springframework.http.converter.json.MappingJackson2HttpMessageConverter
    Correct,proguard把事情搞砸了。和
    -继续上课..
    帮助。谢谢。
    private static String URL = "https://myappserver.com/abcservice/";
    
    public ResponseEntity<String> sendMessage(UserMessage us) {
        private RestTemplate template = getTemplate();
        HttpEntity<UserMessage> reqEntity = new HttpEntity<UserMessage>(us, headers);
        ResponseEntity<String> result = 
                template.postForEntity(URL, reqEntity, String.class);
        return result;
    }