Sir Codesalot
Sir Codesalot

Reputation: 7293

Android AWS LambdaFunctionException on release only

I'm invoking a lambda function from my code using an AsyncTask. It works fine in debug or in release without Proguard but when it runs in release with Proguard it throws a LambdaFunctionException.

Failed to invoke lambda function
                                    com.amazonaws.mobileconnectors.lambdainvoker.LambdaFunctionException: Handled
                                        at com.amazonaws.mobileconnectors.lambdainvoker.LambdaInvocationHandler.a(Unknown Source)
                                        at com.amazonaws.mobileconnectors.lambdainvoker.LambdaInvocationHandler.invoke(Unknown Source)
                                        at java.lang.reflect.Proxy.invoke(Proxy.java:813)
                                        at $Proxy1.a(Unknown Source)
                                        at il.co.napps.bnotified.hareutkarmiel.u$2.a(Unknown Source)
                                        at il.co.napps.bnotified.hareutkarmiel.u$2.a(Unknown Source)
                                        at a.a.a.a.a.c.a$2.call(Unknown Source)
                                        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                                        at a.a.a.a.a.c.a$c$1.run(Unknown Source)
                                        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
                                        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
                                        at java.lang.Thread.run(Thread.java:761)

Here are my Proguard rules:

-keep class my.package.ILambdaFunctions
-keepnames class com.amazonaws.**
-keepnames class com.amazon.**
-keep class com.amazonaws.services.**.*Handler
-dontwarn com.fasterxml.jackson.**
-dontwarn org.apache.commons.logging.**
-dontwarn org.apache.http.**
-dontwarn com.amazonaws.http.**
-dontwarn com.amazonaws.metrics.**

-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 org.codehaus.**                             { *; }
-keepattributes Signature,*Annotation*

-dontwarn javax.xml.stream.events.**
-dontwarn org.codehaus.jackson.**
-dontwarn org.apache.commons.logging.impl.**
-dontwarn org.apache.http.conn.scheme.**

What am I missing here?

The code for running the function ('login') is:

AWSCredentials awsCredentials = new BasicAWSCredentials(..., ...);
AWSCredentialsProvider credentialsProvider = new StaticCredentialsProvider(awsCredentials);

LambdaInvokerFactory factory = new LambdaInvokerFactory(
            context.getApplicationContext(),
            Regions.US_EAST_1,
            credentialsProvider);

lambdaFunctions = factory.build(ILambdaFunctions.class);

public static void login(String password, final ILoginListener listener){
    Log.d(TAG, "login: ");
    final LambdaData data = new LambdaData(password);
    new AsyncTask<Void, Void, Integer>() {

        @Override
        protected Integer doInBackground(Void... lambdaDatas) {
            try {
                lambdaFunctions.login(data);
                return SUCCESS;
            } catch (LambdaFunctionException lfe) {
                Log.e(TAG, "Failed to invoke lambda function", lfe);
                return LAMBDA_EXCEPTION;
            } catch (AmazonServiceException ase) {
                // invalid credentials, incorrect AWS signature, etc
                Log.e(TAG, "Amazon service exception", ase);
                return INVELID_CREDENTIALS;
            } catch (AmazonClientException ace) {
                // Network issue
                Log.e(TAG, "Network Issue");
                return NETWORK_ISSUE;
            }
            return ERROR;
        }
    }.execute();
}

public interface ILambdaFunctions {
    @LambdaFunction(functionName = "login")
    void login(LambdaData lambdaData);
}

Upvotes: 1

Views: 330

Answers (1)

Manish
Manish

Reputation: 146

I faced the same error and found this was due to Proguard obfuscating the model classes - in your case check if "LambdaData" is being obfuscated. If that is the case, use @Keep annotation on the model class or add "-keep" rule in Proguard rules.

See here

Upvotes: 1

Related Questions