【问题标题】:Xamarin.Android: How to stop Visual Studio from removing the previous version of the app before deployingXamarin.Android:如何在部署之前阻止 Visual Studio 删除应用程序的早期版本
【发布时间】:2019-07-22 08:39:43
【问题描述】:

我正在将一个用 Java 编写的 Android 应用迁移到 Xamarin。

旧应用程序 (Java) 将一些数据存储在 AccountManager 和 SQLite 数据库中,我希望在现有用户安装新应用程序 (Xamarin) 作为更新时将其迁移到新格式,这样他们就不会释放他们现有的数据

我正在寻找测试迁移代码,因此我在物理设备上安装了旧应用程序的一个版本,然后我将新版本(更高版本)部署到同一设备,但每次我这样做时,Visual Studio 会在安装新应用之前删除旧应用,这使得无法调试迁移代码(包含数据的 AccountManager 条目在启动前卸载旧版本时被删除)。

在发帖之前我做了一些尝试:

似乎没有任何效果 - 我只需要在部署之间保留数据,以便我的迁移代码有机会运行。

如果相关,我正在使用 Visual Studio 2017 for Mac

【问题讨论】:

  • 您使用的是哪种模式?调试或发布。如果您在调试模式下部署您的应用程序。 VS 和 AS 会有不同的密钥库。
  • 我进入了项目选项并指定了用于发布和调试配置的密钥库和密码(在“Android 包签名”下)我已经在调试和发布模式下运行了它。它似乎没有什么不同。我什至尝试生成一个已签名的发布 APK 并尝试“adb -r app.apk”以希望模拟升级,但新应用似乎正在破坏 AccountManager 数据,即使在 VS 之外
  • 您使用的是什么类型的 Android?我的是带有 MIUI v.10.2 的 Android Q,并且操作系统在开发人员设置上具有优化功能,当禁用时,它会停止“重新安装”应用程序
  • 运行 Android 6.0 的标准三星 S6 和运行 Pie 的 Pixel 2。我没有看到开发人员设置下的任何内容听起来像您描述的那样。
  • 我的被称为“MIUI 优化”,因为我关闭了它,我没有任何部署问题,我想这只是我的一个特定情况

标签: android xamarin visual-studio-2017


【解决方案1】:

我认为有两种不同的东西:

部署时,Visual Studio 从不更新,而是卸载,然后重新安装应用程序。 Jonathan Prior 解释了它in 2017,今天仍然如此。据我所知,没有办法改变它,但这通常不是问题,因为您可以选择保留数据(VS 使用 adb uninstall -k)。

另一方面,如果您构建一个发布版 APK,并使用adb install -r 安装它,那么您使用的更新机制与在用户设备上部署您的应用所使用的更新机制完全相同。您的迁移代码将被执行,如果不执行则表示它不起作用。

【讨论】:

  • 感谢您的回答。使用 adb install -r 在 Java 应用程序之上安装 已签名(发布 apk)Xamarin 应用程序仍会擦除 AccountManager 数据。我无法解释的是为什么当我使用相同的 adb 命令升级具有相同 Java 应用程序(更高版本)的 Java 应用程序时似乎不会发生这种情况。似乎只有在使用使用 Xamarin 生成的 APK 时才会覆盖 AccountManager 数据。这就引出了一个问题:导致这种情况的 APK xamarin 生成有何不同?
  • 我将从比较完整清单开始。 Android Studio:合并清单选项卡,Visual Studio:obj/Release/*/android/AndroidManifest.xml。或者,您可以从 APK 中提取它:apkanalyzer manifest print some.apk
【解决方案2】:

如果一切都失败了,您可能只需将测试版发布到 Playstore 并从那里下载

我认为您可以做的是(尽管我自己从未尝试过)您可以更改一个应用程序的 applicationId,因此这两个应用程序将同时出现在您的手机中。那么由于两个app的底层文件结构应该是一样的,你可以把之前版本的存储内容复制到你现在的版本中

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.mynewversion"
        minSdkVersion 19
        targetSdkVersion 28
        versionCode 2
        versionName "1.0001"
    }

【讨论】:

  • 我已经过了这一点 - 新应用程序 (xamarin) 作为相同的应用程序 id 和版本代码比旧 (java) 应用程序高 +1,因此它应该替换应用程序升级。这两个应用程序也使用相同的密钥库进行签名。我仍然遇到的问题是从 VS 运行新应用程序首先卸载旧应用程序,然后删除与其关联的所有数据。需要一种模拟升级的方法,以便我可以调试迁移代码。
  • 那我想不出其他办法了,只能上传一个测试版到 Playstore。当然,您将无法调试它,但至少您可以检查您的应用是否具有预期的行为
【解决方案3】:

解决方案可以使用 Crashlytics 的 Beta 工具,答案如下: https://stackoverflow.com/a/46155893/4855062

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多