APK-файл выпуска сборки Flutter получает ошибку NoSuchMethodException - PullRequest
1 голос
/ 09 мая 2020

Я столкнулся с проблемой при обновлении 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");
    }
  }

Класс Person выглядит следующим образом:

Person. 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), все в порядке, и метод отражения может быть правильно вызван.

Использование Android Studio для упаковки Выпустить APK (релиз) тоже не проблема.

Build -> Generate Signed Bundle or APK

Но когда я использую команду Flutter для упаковать APK (релиз), метод отражения в плагине сейчас не может быть вызван. adb logcat выглядит следующим образом:

Команды упаковки: flutter build apk --release

error.png

Есть также ситуация, когда возникает вышеуказанная проблема. Когда в плагине используется другая библиотека, и эта библиотека запутана, на этот раз при вызове метода в этой обфусцированной библиотеке произойдет указанная выше ошибка.

flutter doctor:

doctor.jpg

Я не знаю, почему эта проблема возникает при использовании команды flutter для упаковки релизного APK, спасибо.

репозиторий github : https://github.com/liusilong/flutter_plugin_17


Я использовал следующие три способа упаковки apk, а затем открыл эти apk в студии android для сравнения:

  1. Версия флаттера: 1.17 , упакованный с Android studio (Build -> Generate Signed Bundle или APK), файл dex анализируется следующим образом:

image.png

Версия флаттера - 1.17 , упакована с командами Flutter (сборка flutter apk --release), dex-файл анализируется следующим образом:

image.png

Версия flutter: 1.9.1 + hotfix.6 , упакована с командами Flutter (flutter build apk --release), dex-файл анализируется следующим образом:

image.png

Ответы [ 2 ]

0 голосов
/ 10 мая 2020

Я знаю, в чем проблема. Я использую Android Studio3.6, в документации указано Когда вы используете Android Studio 3.4 или Android Gradle plugin 3.4.0 и выше, R8 является компилятором по умолчанию

Есть два способа решить эту проблему :

добавить 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
В файле project/app/proguard-rules.pro настройте сохраняемый код:
-keep class com.lsl.flutterplugin17.* {*;}
В файл 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 анализируется следующим образом :

image.png

Второе решение (используйте R8):

1. Добавьте в файл project / app / proguard-rules.pro следующий код. :

-dontobfuscate
-dontshrink
В файл 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 анализируется следующим образом :

image.png

0 голосов
/ 10 мая 2020

Может, вам нужно принять лицензии android для сборки релизного apk?

...