在发布模式下构建后 Flutter Secure Storage 无法正常工作

Posted

技术标签:

【中文标题】在发布模式下构建后 Flutter Secure Storage 无法正常工作【英文标题】:Flutter Secure Storage not working after build in release mode 【发布时间】:2021-03-03 08:45:25 【问题描述】:

在调试模式下一切正常并在模拟器上发布,但在物理设备上从FlutterSecureStorage 读取值失败。当我使用 FlutterSecureStorage 发表评论时,应用程序中的其他功能正常工作。

在设备上安装 .apk 文件并启动应用程序后,它使用FlutterSecureStorage 获取用户是否登录的信息以及其他值。当然,我希望在第一次运行时为 null,但 storage.read(key) 接缝在返回任何值之前会失败。

在 main/androidManifest.xml 中添加了备份标签

<application
       ...
        android:allowBackup="false"
        android:fullBackupContent="false">

添加启动时删除键

final FlutterSecureStorage storage = FlutterSecureStorage();

Future<void> checkIfUserIsSignedIn() async 
    storage.deleteAll();

    try
      isUserSignedIn = await storage.read(key: _isLoggedIn);
    
    catch (e)
      print(e);
    
    setState(() );
  

尝试使用FlutterSecureStorage v.3.3.3FlutterSecureStorage v.3.2.0,但没有任何变化。 我检查了我设备的 SDK 版本 (Honor 10) - 29。还在其他设备 (Samsung Galaxy S9+) 上检查了,但问题也出现了。

运行 flutter run --release 会导致警告:

Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
Note: C:\Users\karo\flutter\.pub-cache\hosted\pub.dartlang.org\flutter_secure_storage-3.2.0\android\src\main\java\com\it_nomads\fluttersecurestorage\FlutterSecureStoragePlugin.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.

和错误:

Installing build\app\outputs\flutter-apk\app.apk...                376ms
Error: ADB exited with exit code 1
Performing Streamed Install

adb: failed to install C:\Users\karo\idom_mobile\build\app\outputs\flutter-apk\app.apk: Failure [INSTALL_FAILED_UPDATE_INCOMPATIBLE: Package com.project.idom signatures do not match previously installed version; ignoring!]
Uninstalling old version...
Installing build\app\outputs\flutter-apk\app.apk...                 6.9s

但在模拟器上成功安装了应用程序,一切都按预期工作。 问题是当我在物理设备上安装应用程序时。要生成 .apk,我使用 flutter build apk --release 并使用构建日志中所述的 app-release.apk 文件进行安装:

flutter build apk --release
You are building a fat APK that includes binaries for android-arm, android-arm64, android-x64.
If you are deploying the app to the Play Store, it's recommended to use app bundles or split the APK to reduce the APK size.
    To generate an app bundle, run:
        flutter build appbundle --target-platform android-arm,android-arm64,android-x64
        Learn more on: https://developer.android.com/guide/app-bundle
    To split the APKs per ABI, run:
        flutter build apk --target-platform android-arm,android-arm64,android-x64 --split-per-abi
        Learn more on:  https://developer.android.com/studio/build/configure-apk-splits#configure-abi-split
Running Gradle task 'assembleRelease'...
Running Gradle task 'assembleRelease'... Done                      69.9s
√ Built build\app\outputs\flutter-apk\app-release.apk (48.9MB).

我的flutter doctor -v

flutter doctor -v
[√] Flutter (Channel dev, 1.24.0-10.2.pre, on Microsoft Windows [Version 10.0.18362.1198], locale en-GB)
    • Flutter version 1.24.0-10.2.pre at C:\Users\karo\flutter
    • Framework revision 022b333a08 (27 hours ago), 2020-11-18 11:35:09 -0800
    • Engine revision 07c1eed46b
    • Dart version 2.12.0 (build 2.12.0-29.10.beta)

[√] Android toolchain - develop for Android devices (Android SDK version 30.0.2)
    • Android SDK at C:\Users\karo\AppData\Local\Android\sdk
    • Platform android-30, build-tools 30.0.2
    • Java binary at: C:\Program Files\Android\Android Studio\jre\bin\java
    • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b01)
    • All Android licenses accepted.

[√] Android Studio (version 4.1.0)
    • Android Studio at C:\Program Files\Android\Android Studio
    • Flutter plugin can be installed from:
       https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
       https://plugins.jetbrains.com/plugin/6351-dart
    • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b01)

[√] Connected device (1 available)
    • Android SDK built for x86 64 (mobile) • emulator-5554 • android-x64 • Android 10 (API 29) (emulator)

• No issues found!

我尝试确保我的项目迁移到 AndroidX 并收到一条消息:No Usages Found in the Project

我没有更多的想法,你能帮帮我吗?

编辑

我尝试使用SharedPreferences 作为临时解决方法,但它仍然不起作用 - 我猜,包没有初始化。

在阅读了https://github.com/flutter/flutter/issues/65334 这个帖子后,我使用flutter build apk --release --no-shrink 构建了我的应用程序。

然后用我使用FlutterSecureStorage 的应用程序版本尝试了flutter build apk --release --no-shrink,它成功了。

我真的应该将其视为一个有效的修复程序并始终以这种方式构建我的应用程序吗?

【问题讨论】:

我遇到了同样的问题,但我发现它不仅适用于少数设备(我的三星 Galaxy S20 FE Android 版本 11、One UI 3.1 和我的朋友 OnePlus 8T Android 11)。但它适用于运行 Android 11 的许多其他设备。因此,实际问题尚不清楚。我会试试你的解决方法,如果它解决了我的问题,我会告诉你。 不行,但我已经发布了解决方案作为答案 【参考方案1】:

你是如何初始化包的?该问题似乎发生在应用程序在后台运行时,A workaround posted in this thread 是通过在 Android 的 MainActivity 上注册插件 - 这增加了 FlutterSecureStoragePlugin

class MainActivity: FlutterActivity() 
  override fun configureFlutterEngine(flutterEngine: FlutterEngine) 
    GeneratedPluginRegistrant.registerWith(flutterEngine)
  

【讨论】:

以上是关于在发布模式下构建后 Flutter Secure Storage 无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 发布模式下构建 Flutter 应用

将flutter从master切换到stable后无法构建发布apk

在调试模式下构建 Flutter 应用程序时,Gradle 详细日志在哪里?

Flutter:一个程序在调试模式下运行良好,但在发布后就不行,为啥?

在 Debug 模式下工作正常 vs Build APK 不工作,Flutter

由于 icon_tree_shaker,Flutter 无法在 Android 上构建