3

当我运行发布版本(签名,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;
}

下面是2个场景:

案例 1:运行良好

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

案例 2:问题

  1. 打包应用程序(Android 工具 -> 导出签名的应用程序包..)
  2. 通过命令行将其安装在设备上(adb install xxx.apk)
  3. 启动应用程序。
  4. 用户点击一个按钮,该按钮将调用sendMessage(..)方法。
  5. 控制器(在服务器上)获取请求但没有数据
  6. 创建了一个带有空 UserMessage的条目。
  7. 服务器向应用程序发送 201 响应(请求已完成)。

我尝试在我的设备和网络服务器上登录,我可以确认收到了案例 2 的空数据,但我无法弄清楚为什么打包时它不发送数据?

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

4

3 回答 3

4

我猜它是由proguard引起的。Proguard 可能混淆了你的代码的某些部分,但是这段代码是由 Spring 动态调用的(和 jackson ?你没有提到它)。(所以一旦它被混淆:动态调用失败)

所以尝试:

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

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

于 2014-06-19T19:53:01.007 回答
1

我有同样的问题,我承诺低于 2 行

// 收缩资源 true

// minifyEnabled true

在此处输入图像描述

于 2019-12-21T04:15:31.457 回答
0

The above answer didnt work for me may be it was correct on 2014 For 2019 when I set the compileSdkVersion 28 it works.

于 2019-12-01T16:26:58.680 回答