Android AWS DynamoDB SDK (DynamoDBMapper.load()) 崩溃
Android AWS DynamoDB SDK (DynamoDBMapper.load()) Crash
需要帮助,现在,我们有一个生产应用程序,它正在使用 Android DynamoDB SDK。我正在尝试读取具有 @DynamoDBDocument 的 dynamodb table。以下是我的两个 class for table 和 dynamodbdocument。现在,问题是我在几个随机设备上遇到以下崩溃(附加堆栈跟踪)。我已经在 10 台设备上亲自测试了相同的代码,但没有出现任何崩溃。以下堆栈跟踪来自 Firebase 崩溃分析。我无法找出问题所在,为什么我会崩溃。我认为,这与嵌套 JSON dynamodb 文档的编组和解组有关。问题是它只出现在少数 phone 上,而不是所有 phone 上,这就是为什么我很难复制和找到解决方案。任何帮助或指示将不胜感激。非常感谢。
DynamoDBMapperConfig Config = new DynamoDBMapperConfig(DynamoDBMapperConfig.ConsistentReads.EVENTUAL);
GlobalSettings mGlobalSettingsServerDB = mDynamoDBMapper.load(GlobalSettings.class, "GlobalSettings",Config);
@DynamoDBTable(table名称="StaticContent")
public class 全局设置 {
private String Name;
private List<GlobalSettingsMap> globalSettingsMap;
@DynamoDBHashKey(attributeName = "Name")
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
@DynamoDBAttribute(attributeName="Values")
public List<GlobalSettingsMap> getGlobalSettingsMap() {
return globalSettingsMap;
}
public void setGlobalSettingsMap(List<GlobalSettingsMap> globalSettingsMap) {
this.globalSettingsMap = globalSettingsMap;
}
}
@DynamoDBDocument
public class GlobalSettingsMap{
public String VariableName;
public Integer VariableValue;
@DynamoDBAttribute(attributeName = "VariableName")
public String getVariableName() {
return VariableName;
}
public void setVariableName(String variableName) {
VariableName = variableName;
}
@DynamoDBAttribute(attributeName = "VariableValue")
public Integer getVariableValue() {
return VariableValue;
}
public void setVariableValue(Integer variableValue) {
VariableValue = variableValue;
}
}
Exception java.lang.RuntimeException: An error occured while executing doInBackground()
android.os.AsyncTask.done (AsyncTask.java:300)
java.util.concurrent.FutureTask.finishCompletion (FutureTask.java:355)
java.util.concurrent.FutureTask.setException (FutureTask.java:222)
java.util.concurrent.FutureTask.run (FutureTask.java:242)
android.os.AsyncTask$SerialExecutor.run (AsyncTask.java:231)
java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1112)
java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:587)
java.lang.Thread.run (Thread.java:841)
Caused by java.lang.NoClassDefFoundError: rx/Observable
java.lang.Class.getDeclaredMethods (Class.java)
java.lang.Class.getPublicMethodsRecursive (Class.java:894)
java.lang.Class.getMethods (Class.java:877)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBReflector.findRelevantGetters (DynamoDBReflector.java:72)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBReflector.getRelevantGetters (DynamoDBReflector.java:63)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.ConversionSchemas$StandardItemConverter.unconvert (ConversionSchemas.java:416)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.unmarshallers.ObjectUnmarshaller.unmarshall (ObjectUnmarshaller.java:55)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.unmarshallers.NullableUnmarshaller.unmarshall (NullableUnmarshaller.java:47)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.unmarshallers.ListUnmarshaller.unmarshall (ListUnmarshaller.java:56)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.unmarshallers.NullableUnmarshaller.unmarshall (NullableUnmarshaller.java:47)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.ConversionSchemas$StandardItemConverter.unmarshall (ConversionSchemas.java:572)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.ConversionSchemas$StandardItemConverter.setValue (ConversionSchemas.java:436)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.ConversionSchemas$StandardItemConverter.unconvert (ConversionSchemas.java:420)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.privateMarshallIntoObject (DynamoDBMapper.java:636)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.load (DynamoDBMapper.java:399)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.load (DynamoDBMapper.java:466)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.load (DynamoDBMapper.java:331)
com.css.selfhealing.SyncData.updateGlobalSettings (SyncData.java:623)
com.css.selfhealing.SyncData.startSyncingTasks (SyncData.java:67)
com.css.selfhealing.views.HomeActivity$FetchCardsTask.doInBackground (HomeActivity.java:1103)
com.css.selfhealing.views.HomeActivity$FetchCardsTask.doInBackground (HomeActivity.java:1054)
android.os.AsyncTask.call (AsyncTask.java:288)
java.util.concurrent.FutureTask.run (FutureTask.java:237)
android.os.AsyncTask$SerialExecutor.run (AsyncTask.java:231)
java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1112)
java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:587)
java.lang.Thread.run (Thread.java:841)
Caused by java.lang.ClassNotFoundException: Didn't find class "rx.Observable" on path: DexPathList[[zip file "/data/app/com.css.selfhealing-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.css.selfhealing-2, /system/lib, /system/lib/arm, /data/downloads]]
dalvik.system.BaseDexClassLoader.findClass (BaseDexClassLoader.java:56)
java.lang.ClassLoader.loadClass (ClassLoader.java:497)
java.lang.ClassLoader.loadClass (ClassLoader.java:457)
java.lang.Class.getDeclaredMethods (Class.java)
java.lang.Class.getPublicMethodsRecursive (Class.java:894)
java.lang.Class.getMethods (Class.java:877)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBReflector.findRelevantGetters (DynamoDBReflector.java:72)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBReflector.getRelevantGetters (DynamoDBReflector.java:63)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.ConversionSchemas$StandardItemConverter.unconvert (ConversionSchemas.java:416)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.unmarshallers.ObjectUnmarshaller.unmarshall (ObjectUnmarshaller.java:55)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.unmarshallers.NullableUnmarshaller.unmarshall (NullableUnmarshaller.java:47)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.unmarshallers.ListUnmarshaller.unmarshall (ListUnmarshaller.java:56)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.unmarshallers.NullableUnmarshaller.unmarshall (NullableUnmarshaller.java:47)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.ConversionSchemas$StandardItemConverter.unmarshall (ConversionSchemas.java:572)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.ConversionSchemas$StandardItemConverter.setValue (ConversionSchemas.java:436)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.ConversionSchemas$StandardItemConverter.unconvert (ConversionSchemas.java:420)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.privateMarshallIntoObject (DynamoDBMapper.java:636)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.load (DynamoDBMapper.java:399)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.load (DynamoDBMapper.java:466)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.load (DynamoDBMapper.java:331)
com.css.selfhealing.SyncData.updateGlobalSettings (SyncData.java:623)
com.css.selfhealing.SyncData.startSyncingTasks (SyncData.java:67)
com.css.selfhealing.views.HomeActivity$FetchCardsTask.doInBackground (HomeActivity.java:1103)
com.css.selfhealing.views.HomeActivity$FetchCardsTask.doInBackground (HomeActivity.java:1054)
android.os.AsyncTask.call (AsyncTask.java:288)
java.util.concurrent.FutureTask.run (FutureTask.java:237)
android.os.AsyncTask$SerialExecutor.run (AsyncTask.java:231)
java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1112)
java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:587)
java.lang.Thread.run (Thread.java:841)
这里的问题可能是你没有初始化 MultiDex Option
Multidex 支持 Android 5.0 及更高版本
Android 5.0 and higher uses a runtime called ART which natively supports loading multiple dex files from application APK files. ART performs pre-compilation at application install time which scans for classes(..N).dex files and compiles them into a single .oat file for execution by the Android device. For more information on the Android 5.0 runtime, see Introducing ART. This is the reason why your app is working fine on API level 21.
Android5.0
之前的 Multidex 支持
Versions of the platform prior to Android 5.0 use the Dalvik runtime for executing app code. By default, Dalvik limits apps to a single classes.dex bytecode file per APK. In order to get around this limitation, you can use the multidex support library, which becomes part of the primary DEX file of your app and then manages access to the additional DEX files and the code they contain.
所以,首先确保你导入了正确的依赖关系
dependencies {
compile 'com.android.support:multidex:1.0.0'
}
在您的清单中,将 multidex 支持库中的 MultiDexApplication class 添加到应用程序元素。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.multidex.myapplication">
<application
...
// This will solved the problem
android:name="YourAppName">
...
</application>
</manifest>
你也可以试试这个
public class YouAppName extends MultiDexApplication {
.. ..
}
祝一切顺利。
来自
需要帮助,现在,我们有一个生产应用程序,它正在使用 Android DynamoDB SDK。我正在尝试读取具有 @DynamoDBDocument 的 dynamodb table。以下是我的两个 class for table 和 dynamodbdocument。现在,问题是我在几个随机设备上遇到以下崩溃(附加堆栈跟踪)。我已经在 10 台设备上亲自测试了相同的代码,但没有出现任何崩溃。以下堆栈跟踪来自 Firebase 崩溃分析。我无法找出问题所在,为什么我会崩溃。我认为,这与嵌套 JSON dynamodb 文档的编组和解组有关。问题是它只出现在少数 phone 上,而不是所有 phone 上,这就是为什么我很难复制和找到解决方案。任何帮助或指示将不胜感激。非常感谢。
DynamoDBMapperConfig Config = new DynamoDBMapperConfig(DynamoDBMapperConfig.ConsistentReads.EVENTUAL);
GlobalSettings mGlobalSettingsServerDB = mDynamoDBMapper.load(GlobalSettings.class, "GlobalSettings",Config);
@DynamoDBTable(table名称="StaticContent") public class 全局设置 {
private String Name;
private List<GlobalSettingsMap> globalSettingsMap;
@DynamoDBHashKey(attributeName = "Name")
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
@DynamoDBAttribute(attributeName="Values")
public List<GlobalSettingsMap> getGlobalSettingsMap() {
return globalSettingsMap;
}
public void setGlobalSettingsMap(List<GlobalSettingsMap> globalSettingsMap) {
this.globalSettingsMap = globalSettingsMap;
}
}
@DynamoDBDocument public class GlobalSettingsMap{
public String VariableName;
public Integer VariableValue;
@DynamoDBAttribute(attributeName = "VariableName")
public String getVariableName() {
return VariableName;
}
public void setVariableName(String variableName) {
VariableName = variableName;
}
@DynamoDBAttribute(attributeName = "VariableValue")
public Integer getVariableValue() {
return VariableValue;
}
public void setVariableValue(Integer variableValue) {
VariableValue = variableValue;
}
}
Exception java.lang.RuntimeException: An error occured while executing doInBackground()
android.os.AsyncTask.done (AsyncTask.java:300)
java.util.concurrent.FutureTask.finishCompletion (FutureTask.java:355)
java.util.concurrent.FutureTask.setException (FutureTask.java:222)
java.util.concurrent.FutureTask.run (FutureTask.java:242)
android.os.AsyncTask$SerialExecutor.run (AsyncTask.java:231)
java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1112)
java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:587)
java.lang.Thread.run (Thread.java:841)
Caused by java.lang.NoClassDefFoundError: rx/Observable
java.lang.Class.getDeclaredMethods (Class.java)
java.lang.Class.getPublicMethodsRecursive (Class.java:894)
java.lang.Class.getMethods (Class.java:877)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBReflector.findRelevantGetters (DynamoDBReflector.java:72)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBReflector.getRelevantGetters (DynamoDBReflector.java:63)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.ConversionSchemas$StandardItemConverter.unconvert (ConversionSchemas.java:416)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.unmarshallers.ObjectUnmarshaller.unmarshall (ObjectUnmarshaller.java:55)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.unmarshallers.NullableUnmarshaller.unmarshall (NullableUnmarshaller.java:47)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.unmarshallers.ListUnmarshaller.unmarshall (ListUnmarshaller.java:56)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.unmarshallers.NullableUnmarshaller.unmarshall (NullableUnmarshaller.java:47)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.ConversionSchemas$StandardItemConverter.unmarshall (ConversionSchemas.java:572)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.ConversionSchemas$StandardItemConverter.setValue (ConversionSchemas.java:436)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.ConversionSchemas$StandardItemConverter.unconvert (ConversionSchemas.java:420)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.privateMarshallIntoObject (DynamoDBMapper.java:636)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.load (DynamoDBMapper.java:399)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.load (DynamoDBMapper.java:466)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.load (DynamoDBMapper.java:331)
com.css.selfhealing.SyncData.updateGlobalSettings (SyncData.java:623)
com.css.selfhealing.SyncData.startSyncingTasks (SyncData.java:67)
com.css.selfhealing.views.HomeActivity$FetchCardsTask.doInBackground (HomeActivity.java:1103)
com.css.selfhealing.views.HomeActivity$FetchCardsTask.doInBackground (HomeActivity.java:1054)
android.os.AsyncTask.call (AsyncTask.java:288)
java.util.concurrent.FutureTask.run (FutureTask.java:237)
android.os.AsyncTask$SerialExecutor.run (AsyncTask.java:231)
java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1112)
java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:587)
java.lang.Thread.run (Thread.java:841)
Caused by java.lang.ClassNotFoundException: Didn't find class "rx.Observable" on path: DexPathList[[zip file "/data/app/com.css.selfhealing-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.css.selfhealing-2, /system/lib, /system/lib/arm, /data/downloads]]
dalvik.system.BaseDexClassLoader.findClass (BaseDexClassLoader.java:56)
java.lang.ClassLoader.loadClass (ClassLoader.java:497)
java.lang.ClassLoader.loadClass (ClassLoader.java:457)
java.lang.Class.getDeclaredMethods (Class.java)
java.lang.Class.getPublicMethodsRecursive (Class.java:894)
java.lang.Class.getMethods (Class.java:877)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBReflector.findRelevantGetters (DynamoDBReflector.java:72)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBReflector.getRelevantGetters (DynamoDBReflector.java:63)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.ConversionSchemas$StandardItemConverter.unconvert (ConversionSchemas.java:416)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.unmarshallers.ObjectUnmarshaller.unmarshall (ObjectUnmarshaller.java:55)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.unmarshallers.NullableUnmarshaller.unmarshall (NullableUnmarshaller.java:47)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.unmarshallers.ListUnmarshaller.unmarshall (ListUnmarshaller.java:56)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.unmarshallers.NullableUnmarshaller.unmarshall (NullableUnmarshaller.java:47)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.ConversionSchemas$StandardItemConverter.unmarshall (ConversionSchemas.java:572)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.ConversionSchemas$StandardItemConverter.setValue (ConversionSchemas.java:436)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.ConversionSchemas$StandardItemConverter.unconvert (ConversionSchemas.java:420)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.privateMarshallIntoObject (DynamoDBMapper.java:636)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.load (DynamoDBMapper.java:399)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.load (DynamoDBMapper.java:466)
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.load (DynamoDBMapper.java:331)
com.css.selfhealing.SyncData.updateGlobalSettings (SyncData.java:623)
com.css.selfhealing.SyncData.startSyncingTasks (SyncData.java:67)
com.css.selfhealing.views.HomeActivity$FetchCardsTask.doInBackground (HomeActivity.java:1103)
com.css.selfhealing.views.HomeActivity$FetchCardsTask.doInBackground (HomeActivity.java:1054)
android.os.AsyncTask.call (AsyncTask.java:288)
java.util.concurrent.FutureTask.run (FutureTask.java:237)
android.os.AsyncTask$SerialExecutor.run (AsyncTask.java:231)
java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1112)
java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:587)
java.lang.Thread.run (Thread.java:841)
这里的问题可能是你没有初始化 MultiDex Option
Multidex 支持 Android 5.0 及更高版本
Android 5.0 and higher uses a runtime called ART which natively supports loading multiple dex files from application APK files. ART performs pre-compilation at application install time which scans for classes(..N).dex files and compiles them into a single .oat file for execution by the Android device. For more information on the Android 5.0 runtime, see Introducing ART. This is the reason why your app is working fine on API level 21.
Android5.0
之前的 Multidex 支持Versions of the platform prior to Android 5.0 use the Dalvik runtime for executing app code. By default, Dalvik limits apps to a single classes.dex bytecode file per APK. In order to get around this limitation, you can use the multidex support library, which becomes part of the primary DEX file of your app and then manages access to the additional DEX files and the code they contain.
所以,首先确保你导入了正确的依赖关系
dependencies {
compile 'com.android.support:multidex:1.0.0'
}
在您的清单中,将 multidex 支持库中的 MultiDexApplication class 添加到应用程序元素。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.multidex.myapplication">
<application
...
// This will solved the problem
android:name="YourAppName">
...
</application>
</manifest>
你也可以试试这个
public class YouAppName extends MultiDexApplication {
.. ..
}
祝一切顺利。
来自