首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >颤振构建发布APK获得NoSuchMethodException错误

颤振构建发布APK获得NoSuchMethodException错误
EN

Stack Overflow用户
提问于 2020-05-09 15:37:42
回答 2查看 875关注 0票数 3

我在升级颤振SDK时遇到了一个问题。我以前使用1.9.x (下面没有问题)。现在我升级到v1.12.13 + hotfix.91.17.0来重现这个问题(我只试过这两个版本),问题如下:

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

Flutterplugin17Plugin.java

代码语言:javascript
复制
  @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");
    }
  }

个人类别如下:

Person.java

代码语言:javascript
复制
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

代码语言:javascript
复制
static Future<void> callMethod() async{
  await _channel.invokeMethod("personName");
}

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

如果直接运行(单击按钮以在Android中运行),则可以正确调用反射方法.

使用Android打包发布版APK (版本)也没有问题。

构建->生成有符号绑定或APK

但是当我使用命令打包APK (release)时,此时无法调用插件中的反射方法。亚行日志如下:

打包命令:颤振构建apk发布

也存在上述问题发生的情况。当在插件中使用另一个库,而这个库被混淆时,如果调用这个模糊库中的方法,则会发生上述错误。。

颤栗医生:

我不知道为什么在使用flutter命令打包发行版APK时会出现这个问题,谢谢。

github存储库:17

我使用了以下三种方法来打包apk,然后在android中打开这些apk进行比较:

  1. 颤振版本是1.17,与Android (Build或APK)一起打包,dex文件解析如下:

  1. 颤振版本是1.17,附带了flutter命令( Flutter ),该文件解析如下:

  1. 颤振版本是用1.9.1+hotfix.6,命令打包的(Release),dex文件解析如下:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-10 07:00:25

我知道问题出在哪里。我使用的是AndroidStudio3.6,当您使用AndroidStudio3.4或Android插件3.4.0或更高版本时,文档表示,R8是默认的编译器

解决这一问题有两种方法:

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

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

  1. project/gradle.properties文件中,将此属性android.enableR8设置为false,如下所示:
代码语言:javascript
复制
org.gradle.jvmargs=-Xmx1536M
android.enableR8=false
android.useAndroidX=true
android.enableJetifier=true
  1. project/app/proguard-rules.pro文件中,自定义代码以保持:
代码语言:javascript
复制
-keep class com.lsl.flutterplugin17.* {*;}
  1. project/app/build.gradle文件中,按如下方式添加代码:
代码语言:javascript
复制
android {
   ...

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

        }
    }
   ...
}

使用颤振命令flutter build apk --release打包,可以按以下方式解析dex文件:

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

1.在项目/app/proguard- file es.pro文件中,添加如下代码:

代码语言:javascript
复制
-dontobfuscate
-dontshrink
  1. project/app/build.gradle文件中,按如下方式添加代码:
代码语言:javascript
复制
android {
   ...

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

        }
    }
   ...
}

使用颤振命令flutter build apk --release打包,可以按以下方式解析dex文件:

票数 2
EN

Stack Overflow用户

发布于 2020-05-09 22:53:07

也许你需要接受android许可才能构建一个发布版apk?

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61699344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档