在不卸载 [INSTALL_FAILED_UPDATE_INCOMPATIBLE] 的情况下将 Android 本机应用程序更新为 Flutter

Update Android Native app to Flutter without uninstalling [INSTALL_FAILED_UPDATE_INCOMPATIBLE]

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

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

我使用 Google Play 版本的另一个原因是我丢失了旧项目的最新更新文件。没有欺诈不用担心:)

我尝试了什么:

在我执行上述步骤后,第一次构建停留在 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

您检查过您应用的 applicationId 了吗?如果它们相同,那可能会让 OS 认为您正在再次安装相同的应用程序。 在 Flutter 中,您的 applicationId 位于 android\app\build.gradle 文件中。您可以通过地址 here 获取文档。

我意识到 Google 除了您的密钥库签名外,Play 还拥有自己的签名系统。事情可能与我所说的不完全相同,但因此 apks Google Play 和使用您的密钥库签名的 apks 没有相同的证书。意识到这一点后,我想出了一个解决方案。

  1. 从 Google Play 商店安装应用程序。
  2. adb adb shell pm path ataberkw.packagename 获取 base.apk.
  3. 的路径
  4. ./adb pull base-apk-path destination-path 获取基础 apk
  5. base.apk 重命名为 base.zip 并打开它。
  6. 删除 base.zip 中的 META-INF 文件夹并将其重命名为 base.apk 回来。现在你有未签名的 apk。
  7. 我也用过这个automatic apk signer but you can use manual ways
  8. 在 Native 应用程序中复制数据,现在您可以安装 signed(使用相同的 jks 文件)Flutter 应用程序而无需卸载。