在不卸载 [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 版本的另一个原因是我丢失了旧项目的最新更新文件。没有欺诈不用担心:)
我尝试了什么:
- Flutter应用的包名与Native应用的包名相同
- 使用本机应用程序的密钥库文件签署调试版本。
- 给Flutter应用一个比Native应用更高的版本。
在我执行上述步骤后,第一次构建停留在 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 没有相同的证书。意识到这一点后,我想出了一个解决方案。
- 从 Google Play 商店安装应用程序。
adb adb shell pm path ataberkw.packagename
获取 base.apk. 的路径
./adb pull base-apk-path destination-path
获取基础 apk
- 将
base.apk
重命名为 base.zip
并打开它。
- 删除
base.zip
中的 META-INF
文件夹并将其重命名为 base.apk
回来。现在你有未签名的 apk。
- 我也用过这个automatic apk signer but you can use manual ways。
- 在 Native 应用程序中复制数据,现在您可以安装 signed(使用相同的 jks 文件)Flutter 应用程序而无需卸载。
我在 Google Play 商店上有一个应用程序。我在 Flutter 上重写了该应用程序,但尚未发布。我不希望用户在更新时丢失他们的数据。为了解决这个问题,我想编写一个转换系统,但我需要能够在 Flutter 应用程序启动时访问旧数据库。
Android 系统不允许安装两个具有相同包名的不同应用程序。当我尝试在具有本机应用程序的设备上安装 Flutter 应用程序时,Visual Studio 调试器给出 [INSTALL_FAILED_UPDATE_INCOMPATIBLE]
错误。它会卸载 Native 应用程序并安装 Flutter 应用程序,因此我将无法访问 Native 应用程序的 sqlite 数据库。
我使用 Google Play 版本的另一个原因是我丢失了旧项目的最新更新文件。没有欺诈不用担心:)
我尝试了什么:
- Flutter应用的包名与Native应用的包名相同
- 使用本机应用程序的密钥库文件签署调试版本。
- 给Flutter应用一个比Native应用更高的版本。
在我执行上述步骤后,第一次构建停留在 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 没有相同的证书。意识到这一点后,我想出了一个解决方案。
- 从 Google Play 商店安装应用程序。
adb adb shell pm path ataberkw.packagename
获取 base.apk. 的路径
./adb pull base-apk-path destination-path
获取基础 apk- 将
base.apk
重命名为base.zip
并打开它。 - 删除
base.zip
中的META-INF
文件夹并将其重命名为base.apk
回来。现在你有未签名的 apk。 - 我也用过这个automatic apk signer but you can use manual ways。
- 在 Native 应用程序中复制数据,现在您可以安装 signed(使用相同的 jks 文件)Flutter 应用程序而无需卸载。