我正在使用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);
}
答案 0 :(得分:0)
我遇到了同样的错误,发现这是由于Proguard模糊了模型类 - 在你的情况下检查“LambdaData”是否被混淆。如果是这种情况,请在模型类上使用@Keep注释,或在Proguard规则中添加“-keep”规则。
请参阅here