Closed ctjhai closed 10 years ago
I tried with S3_TransferManager sample code and it also crashed with the same exception. The same works fine in debug, i.e. without Proguard.
What's going on? Any clue people? Very frustrating.
The error message from LogCat:
08-28 21:38:12.013: W/dalvikvm(19950): Exception Ljava/lang/IllegalStateException; thrown while initializing Lcom/amazonaws/internal/config/InternalConfig$Factory; 08-28 21:38:12.013: D/AndroidRuntime(19950): Shutting down VM 08-28 21:38:12.013: W/dalvikvm(19950): threadid=1: thread exiting with uncaught exception (group=0x418de378) 08-28 21:38:12.033: E/AndroidRuntime(19950): FATAL EXCEPTION: main 08-28 21:38:12.033: E/AndroidRuntime(19950): java.lang.ExceptionInInitializerError 08-28 21:38:12.033: E/AndroidRuntime(19950): at com.amazonaws.ServiceNameFactory.getServiceName(Unknown Source) 08-28 21:38:12.033: E/AndroidRuntime(19950): at com.amazonaws.AmazonWebServiceClient.computeServiceName(Unknown Source) 08-28 21:38:12.033: E/AndroidRuntime(19950): at com.amazonaws.AmazonWebServiceClient.getServiceNameIntern(Unknown Source) 08-28 21:38:12.033: E/AndroidRuntime(19950): at com.amazonaws.AmazonWebServiceClient.computeSignerByURI(Unknown Source) 08-28 21:38:12.033: E/AndroidRuntime(19950): at com.amazonaws.AmazonWebServiceClient.setEndpoint(Unknown Source) 08-28 21:38:12.033: E/AndroidRuntime(19950): at com.amazonaws.services.cognitoidentity.AmazonCognitoIdentityServiceClient.setEndpoint(Unknown Source) 08-28 21:38:12.033: E/AndroidRuntime(19950): at com.amazonaws.services.cognitoidentity.AmazonCognitoIdentityServiceClient.init(Unknown Source) 08-28 21:38:12.033: E/AndroidRuntime(19950): at com.amazonaws.services.cognitoidentity.AmazonCognitoIdentityServiceClient.(Unknown Source) 08-28 21:38:12.033: E/AndroidRuntime(19950): at com.amazonaws.auth.CognitoCredentialsProvider. (Unknown Source) 08-28 21:38:12.033: E/AndroidRuntime(19950): at com.amazonaws.android.auth.CognitoCredentialsProvider. (Unknown Source) 08-28 21:38:12.033: E/AndroidRuntime(19950): at com.amazonaws.android.auth.CognitoCredentialsProvider. (Unknown Source) 08-28 21:38:12.033: E/AndroidRuntime(19950): at com.amazonaws.demo.s3_transfer_manager.Util.getCredProvider(Unknown Source) 08-28 21:38:12.033: E/AndroidRuntime(19950): at com.amazonaws.demo.s3_transfer_manager.network.NetworkService.onCreate(Unknown Source) 08-28 21:38:12.033: E/AndroidRuntime(19950): at android.app.ActivityThread.handleCreateService(ActivityThread.java:2384) 08-28 21:38:12.033: E/AndroidRuntime(19950): at android.app.ActivityThread.access$1600(ActivityThread.java:138) 08-28 21:38:12.033: E/AndroidRuntime(19950): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1289) 08-28 21:38:12.033: E/AndroidRuntime(19950): at android.os.Handler.dispatchMessage(Handler.java:99) 08-28 21:38:12.033: E/AndroidRuntime(19950): at android.os.Looper.loop(Looper.java:213) 08-28 21:38:12.033: E/AndroidRuntime(19950): at android.app.ActivityThread.main(ActivityThread.java:4787) 08-28 21:38:12.033: E/AndroidRuntime(19950): at java.lang.reflect.Method.invokeNative(Native Method) 08-28 21:38:12.033: E/AndroidRuntime(19950): at java.lang.reflect.Method.invoke(Method.java:511) 08-28 21:38:12.033: E/AndroidRuntime(19950): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 08-28 21:38:12.033: E/AndroidRuntime(19950): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556) 08-28 21:38:12.033: E/AndroidRuntime(19950): at dalvik.system.NativeStart.main(Native Method) 08-28 21:38:12.033: E/AndroidRuntime(19950): Caused by: java.lang.IllegalStateException: Fatal: Failed to load the internal config for AWS Java SDK 08-28 21:38:12.033: E/AndroidRuntime(19950): at com.amazonaws.internal.config.InternalConfig$Factory. (Unknown Source) 08-28 21:38:12.033: E/AndroidRuntime(19950): ... 24 more 08-28 21:38:12.033: E/AndroidRuntime(19950): Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of com.amazonaws.internal.config.Builder, problem: abstract types either need to be mapped to concrete types, have custom deserializer, or be instantiated with additional type information 08-28 21:38:12.033: E/AndroidRuntime(19950): at [Source: jar:file:/data/app/com.amazonaws.demo.s3_transfer_manager-1.apk!/awssdk_config_default.json; line: 9, column: 18] (through reference chain: com.amazonaws.internal.config.InternalConfigJsonHelper["serviceSigners"]->com.amazonaws.internal.config.JsonIndex["config"]) 08-28 21:38:12.033: E/AndroidRuntime(19950): at com.fasterxml.jackson.databind.DeserializationContext.instantiationException(Unknown Source) 08-28 21:38:12.033: E/AndroidRuntime(19950): at com.fasterxml.jackson.databind.deser.AbstractDeserializer.deserialize(Unknown Source) 08-28 21:38:12.033: E/AndroidRuntime(19950): at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(Unknown Source) 08-28 21:38:12.033: E/AndroidRuntime(19950): at com.fasterxml.jackson.databind.deser.impl.FieldProperty.deserializeAndSet(Unknown Source) 08-28 21:38:12.033: E/AndroidRuntime(19950): at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(Unknown Source) 08-28 21:38:12.033: E/AndroidRuntime(19950): at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(Unknown Source) 08-28 21:38:12.033: E/AndroidRuntime(19950): at com.fasterxml.jackson.databind.deser.std.ObjectArrayDeserializer.deserialize(Unknown Source) 08-28 21:38:12.033: E/AndroidRuntime(19950): at com.fasterxml.jackson.databind.deser.std.ObjectArrayDeserializer.deserialize(Unknown Source) 08-28 21:38:12.033: E/AndroidRuntime(19950): at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(Unknown Source) 08-28 21:38:12.033: E/AndroidRuntime(19950): at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(Unknown Source) 08-28 21:38:12.033: E/AndroidRuntime(19950): at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(Unknown Source) 08-28 21:38:12.033: E/AndroidRuntime(19950): at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(Unknown Source) 08-28 21:38:12.033: E/AndroidRuntime(19950): at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(Unknown Source) 08-28 21:38:12.033: E/AndroidRuntime(19950): at com.fasterxml.jackson.databind.ObjectMapper.readValue(Unknown Source) 08-28 21:38:12.033: E/AndroidRuntime(19950): at com.amazonaws.internal.config.InternalConfig.loadfrom(Unknown Source) 08-28 21:38:12.033: E/AndroidRuntime(19950): at com.amazonaws.internal.config.InternalConfig.load(Unknown Source) 08-28 21:38:12.033: E/AndroidRuntime(19950): ... 25 more 08-28 21:38:12.043: W/ActivityManager(458): Force finishing activity com.amazonaws.demo.s3_transfer_manager/.MainActivity
For this project, this is my Proguard settings:
# This is a configuration file for ProGuard. # http://proguard.sourceforge.net/index.html#manual/usage.html # Optimizations: If you don't want to optimize, use the # proguard-android.txt configuration file instead of this one, which # turns off the optimization flags. Adding optimization introduces # certain risks, since for example not all optimizations performed by # ProGuard works on all versions of Dalvik. The following flags turn # off various optimizations known to have issues, but the list may not # be complete or up to date. (The "arithmetic" optimization can be # used if you are only targeting Android 2.0 or later.) Make sure you # test thoroughly if you go this route. -optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/* -optimizationpasses 5 -allowaccessmodification -dontpreverify # The remainder of this file is identical to the non-optimized version # of the Proguard configuration file (except that the other file has # flags to turn off optimization). -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -verbose -keepattributes *Annotation* -keep public class com.google.vending.licensing.ILicensingService -keep public class com.android.vending.licensing.ILicensingService # For native methods, see http://proguard.sourceforge.net/manual/examples.html#native -keepclasseswithmembernames class * { native; } # keep setters in Views so that animations can still work. # see http://proguard.sourceforge.net/manual/examples.html#beans -keepclassmembers public class * extends android.view.View { void set*(***); *** get*(); } # We want to keep methods in Activity that could be used in the XML attribute onClick -keepclassmembers class * extends android.app.Activity { public void *(android.view.View); } # For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } -keepclassmembers class **.R$* { public static ; } # The support library contains references to newer platform versions. # Don't warn about those in case this app is linking against an older # platform version. We know about them, and they are safe. -dontwarn android.support.** # These options are the minimal options for a functioning application # using Proguard and the AWS SDK for Android -keep class org.apache.commons.logging.** { *; } -keep class com.amazonaws.services.sqs.QueueUrlHandler { *; } -keep class com.amazonaws.javax.xml.transform.sax.* { public *; } -keep class com.amazonaws.javax.xml.stream.** { *; } -keep class com.amazonaws.services.**.model.*Exception* { *; } -keep class com.amazonaws.internal.** { *; } -keep class org.codehaus.** { *; } -keep class org.joda.time.tz.Provider { *; } -keep class org.joda.time.tz.NameProvider { *; } -keepattributes Signature,*Annotation*,EnclosingMethod -keepnames class com.fasterxml.jackson.** { *; } -keepnames class com.amazonaws.** { *; } -dontwarn com.fasterxml.jackson.databind.** -dontwarn javax.xml.stream.events.** -dontwarn org.codehaus.jackson.** -dontwarn org.apache.commons.logging.impl.** -dontwarn org.apache.http.conn.scheme.** -dontwarn org.apache.http.annotation.** -dontwarn org.ietf.jgss.** -dontwarn org.joda.convert.** -dontwarn org.w3c.dom.bootstrap.** -dontnote com.amazonaws.services.sqs.QueueUrlHandler
Hello! Sorry to hear that you're having trouble with the SDK.
We're looking into the issue, but while we do that, could you give us some more information as far as your development environment goes? I suspect it will be helpful to help us reproduce the issue.
Thanks!
Weirdly enough, using the ProGuard config you posted I am unable to compile the S3 Transfer Manager Sample. After some very small modifications I got it working but I am not getting any errors. I am wondering if it has to do with differences in the way we are building them.
If you could give us some details as to how you are building it, what version you are targeting, and what ProGuard version you are using that would be awesome.
Sorry again that you're having issues. Hopefully we'll be able to get this resolved quickly.
And in case you are curious, I am compiling it with ant(through command line) targeting Android 10 with ProGuard 4.7 and my config looks like this..
# This is a configuration file for ProGuard.
# http://proguard.sourceforge.net/index.html#manual/usage.html
# Optimizations: If you don't want to optimize, use the
# proguard-android.txt configuration file instead of this one, which
# turns off the optimization flags. Adding optimization introduces
# certain risks, since for example not all optimizations performed by
# ProGuard works on all versions of Dalvik. The following flags turn
# off various optimizations known to have issues, but the list may not
# be complete or up to date. (The "arithmetic" optimization can be
# used if you are only targeting Android 2.0 or later.) Make sure you
# test thoroughly if you go this route.
-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*
-optimizationpasses 5
-allowaccessmodification
-dontpreverify
# The remainder of this file is identical to the non-optimized version
# of the Proguard configuration file (except that the other file has
# flags to turn off optimization).
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose
-keepattributes *Annotation*
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService
# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native
-keepclasseswithmembernames class * {
native <methods>;
}
# keep setters in Views so that animations can still work.
# see http://proguard.sourceforge.net/manual/examples.html#beans
-keepclassmembers public class * extends android.view.View {
void set*(***);
*** get*();
}
# We want to keep methods in Activity that could be used in the XML attribute onClick
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
-keepclassmembers class **.R$* {
public static *;
}
# The support library contains references to newer platform versions.
# Don't warn about those in case this app is linking against an older
# platform version. We know about them, and they are safe.
-dontwarn android.support.**
# These options are the minimal options for a functioning application
# using Proguard and the AWS SDK for Android
-keep class org.apache.commons.logging.** { *; }
-keep class com.amazonaws.services.sqs.QueueUrlHandler { *; }
-keep class com.amazonaws.javax.xml.transform.sax.* { public *; }
-keep class com.amazonaws.javax.xml.stream.** { *; }
-keep class com.amazonaws.services.**.model.*Exception* { *; }
-keep class com.amazonaws.internal.** { *; }
-keep class org.codehaus.** { *; }
-keep class org.joda.time.tz.Provider { *; }
-keep class org.joda.time.tz.NameProvider { *; }
-keepattributes Signature,*Annotation*,EnclosingMethod
-keepnames class com.fasterxml.jackson.** { *; }
-keepnames class com.amazonaws.** { *; }
-dontwarn com.fasterxml.jackson.databind.**
-dontwarn javax.xml.stream.events.**
-dontwarn org.codehaus.jackson.**
-dontwarn org.apache.commons.logging.impl.**
-dontwarn org.apache.http.conn.scheme.**
-dontwarn org.apache.http.annotation.**
-dontwarn org.ietf.jgss.**
-dontwarn org.joda.convert.**
-dontwarn org.w3c.dom.bootstrap.**
-dontwarn com.amazonaws.services.s3.**
-dontwarn com.amazonaws.services.sqs.**
-dontnote com.amazonaws.services.sqs.QueueUrlHandler
Hello, I finally got it to work after days of struggling.
I am using Proguard v5.0. I tried with v4.7 but failed, hence I upgraded hoping that it could solve the issue I had.
It turned out that as long as I turn off shrinking, the produced APK could run without crashing.
The final Proguard configuration that I have is as follows. As you can see, it is pretty obvious that I tried by turning off all optimisation features and enabled them one by one until I got it to work.
Another point, I reverted to v1.7.1 version of AWS SDK.
# To enable ProGuard in your project, edit project.properties # to define the proguard.config property as described in that file. # # Add project specific ProGuard rules here. # By default, the flags in this file are appended to flags specified # in ${sdk.dir}/tools/proguard/proguard-android.txt # You can edit the include path and order by changing the ProGuard # include property in project.properties. # # For more details, see # http://developer.android.com/guide/developing/tools/proguard.html # Add any project specific keep options here: # These options are the minimal options for a functioning application # using Proguard and the AWS SDK for Android -dontskipnonpubliclibraryclasses -dontskipnonpubliclibraryclassmembers -keepdirectories -verbose # Don’t shrink, optimise and obfuscate are okay. # Shrinking will cause AWS Android SDK to crash with "Unable to load internal config" -dontshrink #-dontobfuscate -dontpreverify -dontusemixedcaseclassnames #-dontoptimize -optimizations !code/simplification/arithmetic,!code/simplification/cast -optimizations !field/removal/writeonly,!field/marking/private,!class/merging/*,!code/allocation/variable -optimizationpasses 2 -allowaccessmodification #-keeppackagenames ** -keepparameternames -keep enum org.apache.** { *; } -keep class org.apache.** { *; } -keep interface org.apache.** { *; } -keep enum org.codehaus.** { *; } -keep class org.codehaus.** { *; } -keep interface org.codehaus.** { *; } -keep enum com.amazonaws.** { *; } -keep class com.amazonaws.** { *; } -keep interface com.amazonaws.** { *; } -keep enum org.joda.time.tz.Provider { *; } -keep class org.joda.time.tz.Provider { *; } -keep interface org.joda.time.tz.Provider { *; } -keep enum org.joda.time.tz.NameProvider { *; } -keep class org.joda.time.tz.NameProvider { *; } -keep interface org.joda.time.tz.NameProvider { *; } -keep enum com.fasterxml.jackson.** { *; } -keep class com.fasterxml.jackson.** { *; } -keep interface com.fasterxml.jackson.** { *; } -keep enum android.support.** { *; } -keep class android.support.** { *; } -keep interface android.support.** { *; } -keepclassmembers enum org.apache.** { *; } -keepclassmembers class org.apache.** { *; } -keepclassmembers interface org.apache.** { *; } -keepclassmembers enum org.codehaus.** { *; } -keepclassmembers class org.codehaus.** { *; } -keepclassmembers interface org.codehaus.** { *; } -keepclassmembers enum com.amazonaws.** { *; } -keepclassmembers class com.amazonaws.** { *; } -keepclassmembers interface com.amazonaws.** { *; } -keepclassmembers enum org.joda.time.tz.Provider { *; } -keepclassmembers class org.joda.time.tz.Provider { *; } -keepclassmembers interface org.joda.time.tz.Provider { *; } -keepclassmembers enum org.joda.time.tz.NameProvider { *; } -keepclassmembers class org.joda.time.tz.NameProvider { *; } -keepclassmembers interface org.joda.time.tz.NameProvider { *; } -keepclassmembers enum com.fasterxml.jackson.** { *; } -keepclassmembers class com.fasterxml.jackson.** { *; } -keepclassmembers class com.fasterxml.jackson.** { *; } -keepclassmembers enum android.support.** { *; } -keepclassmembers class android.support.** { *; } -keepclassmembers interface android.support.** { *; } -keepattributes Signature,*Annotation*,EnclosingMethod,InnerClasses,Deprecated,Synthetic,MethodParameters,Exceptions -dontwarn org.apache.http.conn.scheme.** -dontwarn org.apache.http.annotation.** -dontwarn org.ietf.jgss.** -dontwarn org.joda.convert.** -dontwarn org.w3c.dom.bootstrap.** -dontwarn android.support.** #-keep class org.apache.commons.logging.** { *; } #-keep class com.amazonaws.services.sqs.QueueUrlHandler { *; } #-keep class com.amazonaws.javax.xml.transform.sax.* { public *; } #-keep class com.amazonaws.javax.xml.stream.** { *; } #-keep class com.amazonaws.services.**.model.*Exception* { *; } #-keep class com.amazonaws.internal.** { *; } #-keep class org.codehaus.** { *; } #-keep class org.joda.time.tz.Provider { *; } #-keep class org.joda.time.tz.NameProvider { *; } #-keepattributes Signature,*Annotation*,EnclosingMethod #-keepnames class com.fasterxml.jackson.** { *; } #-keepnames class com.amazonaws.** { *; } #-dontwarn com.fasterxml.jackson.databind.** #-dontwarn javax.xml.stream.events.** #-dontwarn org.codehaus.jackson.** #-dontwarn org.apache.commons.logging.impl.** #-dontwarn org.apache.http.conn.scheme.** #-dontwarn org.apache.http.annotation.** #-dontwarn org.ietf.jgss.** #-dontwarn org.joda.convert.** #-dontwarn org.w3c.dom.bootstrap.** #-dontnote com.amazonaws.services.sqs.QueueUrlHandler # If your project uses WebView with JS, uncomment the following # and specify the fully qualified class name to the JavaScript interface # class: #-keepclassmembers class fqcn.of.javascript.interface.for.webview { # public *; #}
I'm happy to hear it's working for you now.
It's unfortunate that we couldn't identify the source of the problem and that you had to turn off obfuscation to get it working, but if you are fine with that we can consider this issue closed.
Obfuscation and optimisation were okay, but shrinking that gave me problem.
Ah sorry shrinking.
-dontshrink is not a suitable workaround. We need to identify the actual classes/members we need to keep in the proguard file. Is this documented properly anywhere? I found the following article, but it is incomplete as I still get the error... http://mobile.awsblog.com/post/Tx2OC71PFCTC63E/Using-ProGuard-with-the-AWS-SDK-for-Android
I am using AWS S3 SDK (v2.0.5) on my Android project. It runs fine without Proguard, however, with Proguard it throws the following exceptions:
Any idea how to solve this?
The above exceptions were thrown regardless of whether I linked my app with the debug or release JAR files.
I saw that there is another issue on initialisation error https://github.com/aws/aws-sdk-android-v2/issues/2, I did try that, but no luck.
The settings of my Proguard are as follows:
Look forward to any suggestions/comments on this. Many thanks