3

リリース バージョン (署名済み、Proguard パック済み) を実行すると、アプリがデータをサーバーに送信しません。しかし、ADT から直接実行すると、サーバー上のデータが表示されます。

1 つは署名済みで、もう 1 つは直接実行される同じコードであるため、奇妙です。コードは次のとおりです(を使用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 Tools -> Export Signed Application Package..)
  2. コマンドラインからデバイスにインストールします (adb install xxx.apk)
  3. アプリを起動します。
  4. ユーザーがボタンをタップすると、sendMessage(..)メソッドが呼び出されます。
  5. コントローラ (サーバー上) はリクエストを取得しますが、データは取得しません
  6. 空の UserMessageを持つエントリが作成されます。
  7. サーバーは 201 応答 (要求が満たされた) をアプリに送信します。

デバイスと Web サーバーの両方にログインしようとしましたが、ケース 2 で空のデータが受信されたことを確認できました。また、パックしたときにデータが送信されない理由がわかりません。

デバッグ パッケージと比較して、パック/リリース (Signed + Proguard) アプリの動作は異なりますか?

4

3 に答える 3

4

プロガードが原因だと思います。Proguard はおそらくコードの一部を難読化していますが、このコードは Spring によって動的に呼び出されます (そして、jackson ? あなたはそれについて言及しませんでした)。(そして、難読化されると、動的呼び出しが失敗しました)

だから試してみてください:

  • プロガードを無効にして、それが問題の原因であることを確認します
  • 確認された場合: json でシリアル化されたクラス (つまり UserMessage) を難読化しないように構成してみてください:

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

于 2014-06-19T19:53:01.007 に答える