Android AWS LambdaFunctionException仅在发布时发布

时间:2017-06-15 06:24:52

标签: android amazon-web-services aws-lambda

我正在使用AsyncTask从我的代码调用lambda函数。它在没有Proguard的情况下在调试或发布时工作正常但是当它与Proguard一起发布时会抛出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)

以下是我的Proguard规则:

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

我在这里缺少什么?

运行函数('login')的代码是:

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);
}

1 个答案:

答案 0 :(得分:0)

我遇到了同样的错误,发现这是由于Proguard模糊了模型类 - 在你的情况下检查“LambdaData”是否被混淆。如果是这种情况,请在模型类上使用@Keep注释,或在Proguard规则中添加“-keep”规则。

请参阅here