Date: 2015/8/31 Cate: Android, AWS, cocos2d-x, Java Tags: , ,  

cocos2d-xで開発していて、ユーザーデータの一部をAWSのDynamoDBに保存しているんですが、そこでDynamoDB上のデータにアクセスしようとしたらcom.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMappingException: No interface com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBHashKey annotation found in class class com.example.AwsManager$UserDataみたいなエラーがでました。

debugビルドではなんともなかったのにリリースビルドで落ちたので、もしやと思い確認するとやっぱりproguardが原因でした。

DynamoDBを使うときに、テーブルの構造とかの情報をもったクラスをつくるんですが、そのクラスがproguardによって名前がかわっててエラーがおきてたっぽいですね。

@DynamoDBTable(tableName = "UserData")
public static class UserData {
    private String UserId;
    private int IsActive;
    @DynamoDBHashKey(attributeName = "UserId")
    public String getUserId() {
        return UserId;
    }
    public void setUserId(String userId) {
        this.UserId = userId;
    }
    @DynamoDBAttribute(attributeName = "IsActive")
    public int getIsActive() {
        return IsActive;
    }
    public void setIsActive(int isActive) {
        this.IsActive = isActive;
    }
}

こういう感じのUserDataクラスを作ったとしたら、

-keep class com.example.AwsManager$UserData{ *; }

proguardでこういうかんじでUserDataクラスが変わらないようにしないとダメでした。

最初は、

-keep class com.example.AwsManager{ *; }

ってやってもうまくいかなくて、$UserDataって指定しないとダメなのを知らずに結構はまってしまったのでメモ。

Leave a Reply