Android 因 minifyEnabled 和 AWS 调用而崩溃

Posted

技术标签:

【中文标题】Android 因 minifyEnabled 和 AWS 调用而崩溃【英文标题】:Android crash with minifyEnabled and AWS call 【发布时间】:2021-04-23 22:59:15 【问题描述】:

使用各种 aws-android-sdk(版本 2.22.0)(包括 DynamoDB)。

使用minifyEnabled = true,Android 应用程序在 DynamoDB 调用中崩溃。如果我禁用该标志,应用程序不会崩溃。

这是我正在使用的 proguard 规则:

在 build.gradle(应用程序)中:

        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'

在 proguard-rules.pro 我有以下内容:

# Class names are needed in reflection
-keepnames class com.amazonaws.**
-keepnames class com.amazon.**

# 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.**

# Android 6.0 release removes support for the Apache HTTP client
-dontwarn org.apache.http.**

# The SDK has several references of Apache HTTP client
-dontwarn com.amazonaws.http.**
-dontwarn com.amazonaws.metrics.**

这是相关的调用堆栈:

E/AndroidRuntime: FATAL EXCEPTION: Thread-13
    Process: com.icefield.eventtruly, PID: 20298
    java.lang.IllegalArgumentException: Illegal query expression: No hash key condition is found in the query
        at com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.processKeyConditions(:2711)
        at com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.createQueryRequestFromExpression(:2671)
        at com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.query(:2438)
        at com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.query(:2399)
        at c.f.a.g.d$b.run(:339)
        at java.lang.Thread.run(Thread.java:919)

设置 minifyEnabled = false 会导致一切正常。

关于我还可以添加到 proguard 规则中的任何想法?

【问题讨论】:

【参考方案1】:

我建议使用以下 ProGuard 规则。

-keep class com.amazon.**  *; 
-keep class com.amazonaws.**  *; 
-keep class com.amplifyframework.**  *; 

我怀疑你会找到一个 ClassNotFoundException 或和/或 NoClassDefFoundError 在日志中的其他位置,这将有助于微调规则。

您看到的特定错误 arises when there are no key Conditions 包含在发送到 DyanmoDB 的请求中。

【讨论】:

以上是关于Android 因 minifyEnabled 和 AWS 调用而崩溃的主要内容,如果未能解决你的问题,请参考以下文章

Android minifyEnabled true 在调试和发布模式下不起作用

Android proguard minifyEnabled true + multidex = error

Android minifyEnabled true for firebase

Android Gradle 插件BuildType 编译类型配置 ④ ( minifyEnabled 配置 | multiDexEnabled | pseudoLocalesEnabled )

坑:Android Studio gradle minifyEnabled 为 true debug断点失效

坑:Android Studio gradle minifyEnabled 为 true debug断点失效