不需要卸载,将Android原生应用更新为Flutter应用 [INSTALL_FAILED_UPDATE_INCOMPATIBLE]。

3

我在谷歌应用商店有一个应用程序。我已经使用Flutter重写了该应用程序,但还没有发布。我不希望用户在更新时丢失他们的数据。为了解决这个问题,我想写一个转换系统,但我需要能够在Flutter应用程序启动时访问旧的数据库。

Android系统不允许安装具有相同包名的两个不同应用程序。当我尝试在已安装原生应用程序的设备上安装Flutter应用程序时,Visual Studio调试器会给出[INSTALL_FAILED_UPDATE_INCOMPATIBLE]错误消息。它会卸载原生应用程序并安装Flutter应用程序,因此我将无法访问原生应用程序的 SQLite 数据库。

另外,我使用谷歌应用商店版本的应用程序是因为我遗失了旧项目的最新更新文件,这并非欺诈,您可以放心:)

我尝试过的方法:

  • 使Flutter应用程序的包名与原生应用程序的名称相同。
  • 使用原生应用程序的密钥库文件对调试版本进行签名。
  • 将Flutter应用程序的版本设为高于原生应用程序的版本。

在完成以上步骤后,第一次构建进程停滞在Running Gradle task 'assembleDebug'...,输出保持不变(我等了几次,最长等待了30分钟):

Launching lib/main.dart on sdk gphone64 arm64 in debug mode...
✓  Built build/app/outputs/flutter-apk/app-debug.apk.

如果我清理项目,它会在30秒内构建,但是卸载本机应用程序并输出如下信息:
Running "flutter pub get" in projectname_2...
Launching lib/main.dart on sdk gphone64 arm64 in debug mode...
✓  Built build/app/outputs/flutter-apk/app-debug.apk.
Error: ADB exited with exit code 1
Performing Streamed Install

adb: failed to install /Users/xxxxxx/projectname/build/app/outputs/flutter-apk/app.apk: Failure [INSTALL_FAILED_UPDATE_INCOMPATIBLE: Package ataberkw.projectname signatures do not match previously installed version; ignoring!]
Uninstalling old version...
W/FlutterActivityAndFragmentDelegate(11073): A splash screen was provided to Flutter, but this is deprecated. See flutter.dev/go/android-splash-migration for migration steps.
Connecting to VM Service at ws://127.0.0.1:58745/lUE5l2_VlN4=/ws
2个回答

2
我意识到Google Play有自己的签名系统,除了您的密钥库签名之外。可能不完全是我说的那样,但结果是,Google Play上的apk和使用您的密钥库签名的apk没有相同的证书。在意识到这一点后,我想出了一个解决方案。
  1. 从Google Play商店安装应用程序。
  2. adb adb shell pm path ataberkw.packagename 获取base.apk的路径。
  3. ./adb pull base-apk-path destination-path 获取基本apk文件。
  4. base.apk重命名为base.zip并打开它。
  5. 删除base.zip中的META-INF文件夹,并将其重新命名为base.apk。现在您有未签名的apk。
  6. 我使用了这个自动apk签名工具,但您也可以使用手动方式
  7. 在Native应用程序中再现数据,现在您可以安装已签名(使用相同的jks文件)Flutter应用程序而无需卸载。

-1

你检查过应用程序的applicationId了吗?如果它们相同,操作系统可能会认为你正在重新安装同一个应用程序。 在Flutter中,你的applicationId位于android\app\build.gradle文件中。你可以参考这里的文档。


我已经说过包名是一样的。这意味着我已经检查了应用程序ID。 - Ataberk
我的意思是它们必须彼此不同,而不是相同的。但我很高兴你找到了解决方案。 - berkaykurkcu
请再次阅读问题。我不想删除应用程序,因此applicationId必须相同。 - Ataberk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接