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

时间:2014-06-19 19:41:04

标签: android json adt proguard spring-android

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

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

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

以下是两种情况:

案例1:工作正常

  1. 直接从ADT运行应用程序(运行方式:Android应用程序)
  2. 用户点按一个按钮,该按钮将调用sendMessage(..)方法。
  3. Controller(在服务器上)获取请求和数据(UserMessage)。
  4. 创建了一个包含UserMessage的条目。
  5. 服务器向应用程序发送201响应(请求已完成)。
  6. 案例2:问题

    1. 打包应用(Android工具 - &gt;导出已签名的应用包..)
    2. 通过命令行(adb install xxx.apk)将其安装在设备上
    3. 启动应用。
    4. 用户点按一个按钮,该按钮将调用sendMessage(..)方法。
    5. 控制器(在服务器上)获取请求但没有数据
    6. 创建空UserMessage 的条目。
    7. 服务器向应用程序发送201响应(请求已完成)。
    8. 我已经尝试在我的设备和网络服务器上记录,我可以确认案例2收到了空数据,而且我无法弄清楚为什么它在我打包时不发送数据?< / p>

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

3 个答案:

答案 0 :(得分:3)

我猜这是由proguard造成的。 Proguard可能会混淆你代码的某些部分,但这个代码是由Spring动态调用的(杰克逊?你没有提到它)。 (一旦它混淆了:动态调用失败)

所以试着:

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

    -keep class com.company.UserMessage ** {*; }

答案 1 :(得分:1)

我有同样的问题,并且在2行以下提交

// rinkresources为真

// minifyEnabled为真

enter image description here

答案 2 :(得分:0)

以上答案对我没有用,可能是2014年正确的答案 对于2019年,当我将compileSdkVersion 28设置为有效时。