0

私はこれらのクラスを持っています:

public class OfferList {
   public List<Offer> offers;
}

public class Offer {
    public String offer_id;
    public String group_id;
    public String n_hours;
    public boolean is_new;
}

そして、このサービスを定義しました:

@Rest(rootUrl = "http://MYURL/json", converters = { GsonHttpMessageConverter.class })
//if defined, the url will be added as a prefix to every request
public interface EscolasPertoDeMimRESTService {

    @Get("/offers/{user_id}/{date}")
    @Accept(MediaType.APPLICATION_JSON)
    OfferList getOffers(String user_id, long date);
}

ここで呼び出されます:

(...)
@RestService
    OfferRestService offersService;

(...)
@Background
void loadListItems() {
    mLoadingOffers = true;
    showProgressDialog();

    OfferList ol = null;
    try {
        ol = offersService.getOffers(myPrefs.userID().get(), myPrefs.lastCheckedForOffers().get());

        showDebug("ol.offers.size(): " + ol.offers.size()); //OK shows ol.offers.size(): 24

        Offer o = ol.offers.get(0); //After exporting: Crash
    showDebug("ol.offers[0].group_id" + o.group_id);

    } catch (Exception e) {
        showDebug(e.getMessage()); //After exporting shows: "com.google.gson.internal.StringMap cannot be cast to com.humihara.escolaspertodemim.Offer"
    }

    setupAdapter(ol);
    mLoadingOffers = false;
}
(...)

デバッグではすべて正常に動作しますが、エクスポートして署名するとアプリがクラッシュします。

GET が送信され、サーバーからの応答は有効な JSON オファー リストです。どうやら私が得た結果は、Offer(s) の代わりに StringMap(s) を持つ OfferList です。

これは私のproguard-project.txtです(私はAndroid SDKのデフォルトとこれらを使用しています):

-keep public class com.humihara.escolaspertodemim.** { *; }
-keep public class org.springframework.** { *; }
-keep public class com.google.gson.** { *; }
-keep public class com.google.ads.** { *; }
-keep public class com.androidannotations.** { *; }
-keep public class org.acra.** { *; }

-keep public class * extends android.support.v4.app.FragmentActivity

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet); }
-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet, int); }

-dontwarn org.simpleframework.**
-dontnote org.simpleframework.**

-dontwarn org.codehaus.jackson.**
-dontnote org.codehaus.jackson.**

-dontwarn com.fasterxml.jackson.**
-dontnote com.fasterxml.jackson.**

-dontwarn com.google.code.rome.**
-dontnote com.google.code.rome.**

-dontwarn org.apache.commons.httpclient.**
-dontnote org.apache.commons.httpclient.**

メーリングリストとスタックオーバーフローを検索して、プロガードの追加の定義を見つけましたが、他に何をすべきかわかりません。コードまたは proguard-project.txt を機能させるために何を変更する必要があるか教えてください。

アップデート:

Proguard で最適化した後、Jackson Json パーサーが Android のすべてのオブジェクト メンバーで null を返すことを確認した後

私は行方不明だったと思います:

-dontskipnonpubliclibraryclassmembers

デフォルトの Android プロガードは以下を定義します。

-dontskipnonpubliclibraryclasses

そして、それらが同じ表現ではないことに気づきませんでした。

私はこのproguard-project.txtで終わった:

-keepattributes Signature,RuntimeVisibleAnnotations,AnnotationDefault

-dontskipnonpubliclibraryclassmembers

-keep class com.humihara.escolaspertodemim.** { *; }

-keep public class * extends android.support.v4.app.FragmentActivity

-dontwarn org.simpleframework.**
-dontnote org.simpleframework.**

-dontwarn org.codehaus.jackson.**
-dontnote org.codehaus.jackson.**

-dontwarn com.fasterxml.jackson.**
-dontnote com.fasterxml.jackson.**

-dontwarn com.google.code.rome.**
-dontnote com.google.code.rome.**

-dontwarn org.apache.commons.httpclient.**
-dontnote org.apache.commons.httpclient.**

そして今、すべてがうまくいきます。

4

1 に答える 1

1

リフレクションを使用して注釈にアクセスするコードの場合、注釈を保持する必要があります。

-keepattributes *Annotation*
于 2013-03-23T23:01:26.127 に答える