繁体   English   中英

Flutter build release APK 得到 NoSuchMethodException 错误

[英]Flutter build release APK get NoSuchMethodException error

升级Flutter SDK时遇到问题。 我以前用的是1.9.x (下面没有问题)。 现在我升级到v1.12.13 + hotfix.9或者1.17.0来重现这个问题(我只试过这两个版本),问题如下:

现在我使用v1.17.0 SDK 创建插件,然后在插件中使用反射调用方式。 代码如下:

Flutterplugin17Plugin.java

  @Override
  public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
    if (call.method.equals("personName")) { // Reflection call method
      person.execute(call.method);
      result.success("success");
    }
  }

人 class 如下:

人.java

public class Person {
    private static final String TAG = "Person";

    // This method will be called by reflection
    public void personName() {
        Log.e(TAG, "personName: call personName method....");
    }

    public void execute(String methodName) {
        try {
            Method method = Person.class.getDeclaredMethod(methodName);
            method.invoke(Person.this);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Flutter的部分代码如下

flutterplugin17.dart

static Future<void> callMethod() async{
  await _channel.invokeMethod("personName");
}

// The method is called when the button is clicked
await Flutterplugin17.callMethod();

然后如果直接运行(在Android Studio中点击调试按钮运行)就OK了,反射方法就可以正确调用了。

使用Android Studio到package Release APK(发布)也没有问题。

构建 -> 生成签名包或 APK

但是当我使用Flutter命令package APK(release)时,此时无法调用插件中的反射方法。 adb logcat如下:

打包命令:flutter build apk --release

错误.png

也有出现上述问题的情况。 当一个插件中使用了另一个库,并且对这个库进行了混淆,这个时候如果调用这个混淆库中的方法就会出现上述错误。

flutter博士:

医生.jpg

我不知道为什么在使用 flutter 命令 package 发布 APK 时会出现此问题,谢谢。

github 仓库: https://github.com/liusilong/flutter_plugin_17


我使用了以下三种方式对 package apk 然后在 android studio 中打开这些 apk 进行比较:

  1. flutter 版本为1.17 ,使用 Android studio 打包(Build -> Generate Signed Bundle or APK),dex文件解析如下:

图像.png

  1. flutter 版本为1.17 ,打包了 Flutter 命令(flutter build apk --release),dex文件解析如下:

图像.png

  1. flutter 版本为1.9.1+hotfix.6 ,打包了 Flutter 命令(flutter build apk --release),dex文件解析如下:

图像.png

我知道问题是什么。 I am using Android Studio3.6, the documentation says When you use Android Studio 3.4 or Android Gradle plugin 3.4.0 and higher, R8 is the default compiler

解决方法有两种:

proguard-rules.pro文件添加到project/app/proguard-rules.pro

第一个解决方案(不使用 R8):

  1. project/gradle.properties文件中,将该属性android.enableR8设置为false ,如下:
org.gradle.jvmargs=-Xmx1536M
android.enableR8=false
android.useAndroidX=true
android.enableJetifier=true
  1. project/app/proguard-rules.pro文件中,自定义要保留的代码:
-keep class com.lsl.flutterplugin17.* {*;}
  1. project/app/build.gradle文件中,添加如下代码:
android {
   ...

    buildTypes {
        release {
            ...
            // add new line
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

        }
    }
   ...
}

使用 flutter 命令flutter build apk --release进行打包,dex文件解析如下:

图像.png

第二种解决方案(使用 R8):

1.在project/app/proguard-rules.pro文件中,添加如下代码:

-dontobfuscate
-dontshrink
  1. project/app/build.gradle文件中,添加如下代码:
android {
   ...

    buildTypes {
        release {
            ...
            // add new line
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

        }
    }
   ...
}

使用 flutter 命令flutter build apk --release进行打包,dex文件解析如下:

图像.png

也许您需要接受 android 许可证来构建发布 apk?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM