开启minifyEnabled后Android应用调用AWS DynamoDB崩溃,求补充ProGuard规则
minifyEnabled=true时崩溃的问题 从你的崩溃日志和配置来看,问题核心在于ProGuard混淆了DynamoDB实体类的关键注解或字段名,导致DynamoDBMapper无法识别查询所需的哈希键(Hash Key),从而抛出IllegalArgumentException: Illegal query expression: No hash key condition is found in the query错误。
你当前的ProGuard规则仅保留了AWS相关类的名称(-keepnames),但没有覆盖实体类的字段、方法以及DynamoDB核心注解的保留,这是导致崩溃的关键缺失。以下是需要补充的规则:
必须添加的ProGuard规则
保留你的DynamoDB实体类及其注解/字段
把com.yourpackage.dynamodb.models替换成你项目中实际存放DynamoDB实体类的包路径(比如com.icefield.eventtruly.db.entities):# Keep all DynamoDB entity classes, their fields, annotations and constructors -keep class com.yourpackage.dynamodb.models.** { @com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.* <fields>; @com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.* <methods>; <init>(...); }这条规则确保实体类的字段、带DynamoDB注解的方法,以及构造函数不会被混淆或移除——DynamoDBMapper正是通过这些信息识别哈希键和数据映射关系。
保留DynamoDBMapper核心类与注解
添加以下规则防止核心映射类和注解被ProGuard处理:# Keep DynamoDB mapper and related expression classes -keep class com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper { public <methods>; } -keep class com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBQueryExpression -keep class com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBScanExpression -keep class com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBHashKey -keep class com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBRangeKey -keep class com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBIndexHashKey -keep class com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBAttribute -keep class com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBTable优化原有基础规则
将你原有的-keepnames class com.amazonaws.**和-keepnames class com.amazon.**替换为更严格的-keep规则,同时保留所有注解:# Keep AWS SDK classes and annotations required for reflection -keep class com.amazonaws.** { *; } -keep class com.amazon.** { *; } -keepattributes *Annotation*-keepattributes *Annotation*是关键,它确保所有注解不会被ProGuard移除,而DynamoDB的映射逻辑完全依赖这些注解。
修改后的完整proguard-rules.pro示例
# Keep AWS SDK classes and annotations required for reflection -keep class com.amazonaws.** { *; } -keep class com.amazon.** { *; } -keepattributes *Annotation* # Keep DynamoDB entity classes, their fields, annotations and constructors -keep class com.yourpackage.dynamodb.models.** { @com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.* <fields>; @com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.* <methods>; <init>(...); } # Keep DynamoDB mapper and related expression classes -keep class com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper { public <methods>; } -keep class com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBQueryExpression -keep class com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBScanExpression -keep class com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBHashKey -keep class com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBRangeKey -keep class com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBIndexHashKey -keep class com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBAttribute -keep class com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBTable # Enums are not obfuscated correctly in combination with Gson -keepclassmembers enum * { *; } # Request handlers defined in request.handlers -keep class com.amazonaws.services.**.*Handler # The following are referenced but aren't required to run -dontwarn com.fasterxml.jackson.** -dontwarn org.apache.http.** -dontwarn com.amazonaws.http.** -dontwarn com.amazonaws.metrics.**
验证步骤
- 将规则中的
com.yourpackage.dynamodb.models替换为你项目的实际实体类包路径 - 确保
build.gradle中minifyEnabled = true - 重新构建并运行应用,测试DynamoDB查询功能,确认崩溃不再发生
内容的提问来源于stack exchange,提问作者icefield

