Android:我在一个已经发布的应用程序上更改了 sharedUserId,但我的一些用户无法更新。我现在应该怎么办?

标签 android

我的 annotator generator用于制作 Android 网络浏览器应用程序,为中文文本添加发音辅助。根据您想要的地区发音(例如普通话拼音、粤语 Sidney Lau、温州语……),可以使用不同种类的发音辅助工具,为了节省旧 Android 手机的存储空间,我们将每种辅助工具作为单独的应用程序发布,因为大多数用户不会需要不止一个。但在 2018 年 3 月开始时,应大众要求,我添加了书签功能,并愚蠢地放了一个 android:sharedUserId。我的属性 AndroidManifest.xml<manifest标记允许不同版本的应用程序为那些在不同类型的发音辅助之间切换的少数“高级用户”共享他们的书签。

但是我们已经有大约 5,000 名用户,一些(但不是全部)用户开始报告他们现在无法更新该应用程序。当然 Android 做了它通常的事情,只是告诉他们有问题,但没有提供任何可能让我知道我做错了什么的技术信息,所以我只是回复报告说尝试卸载并重新安装或清除Play Store 应用程序的数据,5 周后我终于见到了一个人,他的旧三星 Galaxy S2 (Android 4.1) 没有更新,我能够将它连接到我的开发盒并观看 adb记录并看到这个:

04-04 21:54:58.653: W/PackageManager(2127): Package org.ucam.ssb22.pinyinwol shared user changed from <nothing> to org.ucam.ssb22.annogen; replacing with new
04-04 21:54:58.708: I/BootTime(2127): Fail Safe scanning for:/mnt/asec/org.ucam.ssb22.pinyinwol-1/pkg.apk
04-04 21:54:58.708: W/PackageManager(2127): Package couldn't be installed in /mnt/asec/org.ucam.ssb22.pinyinwol-2/pkg.apk

进一步的搜索显示普遍的共识是你永远不应该添加 sharedUserId属性到一个已经发布的应用程序,否则用户将得到 INSTALL_FAILED_UID_CHANGED (尽管该字符串不在这些特定日志中;我认为这取决于 Android 版本)。

但我不能只删除 sharedUserId现在,因为一些新用户在过去 5 周内重新安装了该应用程序,并且可能其中一些用户也在无法应对不断变化的 Android 版本 sharedUserId在更新期间。

我很乐意告诉 Play 商店“如果任何用户的设备无法更新此应用,请卸载旧版本并重新安装”。 (或者甚至“请无条件地进行全新安装”。)但在 AndroidManifest 中似乎没有任何方式可以说明这一点。或在 Play 商店控制台上。我已经找到了涉及应用程序本身代码的解决方案,但我的问题是我的应用程序在数据被删除之前根本不会安装,而且除了在我的任何地方发布建议之外,我没有办法告诉用户删除数据可以并希望他们看到它——很可能不会。

我能想到的唯一解决方案是同时推出更新 sharedUserId 和没有 sharedUserId 交替,在每个更新之间等待一段时间,希望受影响的设备至少安装两个更新中的一个。这当然会牺牲共享书签功能(除非我首先使用 sharedUserId 以外的某种机制重新实现它)并且这不是一个非常优雅的解决方案。所以我发布这个问题是希望有人可以建议我在陷入困境后应该做什么。

最佳答案

我尝试了以下解决方法:

  1. 在星期一发布一个带有 sharedUserId 的版本,使用额外的启动代码来检查日期和 (a) 如果它在发布后的 7 天内,它说 周的更新可能是个问题,但不要担心,等待下周的更新,(b) 如果它在发布后的 14 天内,它会说 this一周的更新可能是个问题,但不要担心,等待下周的更新。

  2. 接下来的星期一,发布一个没有 sharedUserId 的版本,设置为工作几周然后完全停止工作,告诉用户他们必须卸载并重新安装该应用。

  3. 在那之后的星期一,发布一个带有 sharedUserId 的版本恢复正常。

我的计划是这会导致 (a) 设备不关心 sharedUserId 的用户将自动升级所有 3 个版本,除了版本 1 的消息(在他们的情况下是虚假的)之外什么都不会注意到), (b) 设备停留在 sharedUserId 之前版本的用户将获得版本 2,随后将被告知在版本 3 为最新版本后卸载并重新安装,(c) 设备为当前版本的用户停留在 post-sharedUserId 上将获得版本 1 和 3,并且在版本 2 的一周内只会注意到“更新失败”消息,版本 1 已警告他们。

根据 Play 商店的统计数据,实际发生的情况是:

  • 在第 1 周快结束时,超过 55% 的活跃用户停留在我在设置 sharedUserId 之前发布的最后一个版本上,另外还有 20% 的用户使用早期版本(因此超过 75%被“抛在后面”)。大约 15% 的活跃用户下载了警告第 2 周更新可能失败的版本。
  • 在第 2 周结束时,卡在“我的 sharedUserId 困惑之前的最后一个版本”的活跃用户数量从 55% 下降到 16%。大约 45% 的活跃用户已升级到非 sharedUserId 第 2 周版本(如果第 3 周的版本未能自动替换它,则设置为告诉他们重新安装),另外 12%仍在使用第 1 周的版本,并被告知不要担心。我有大约 19% 的人坚持使用早期版本(低于 20%)。我开始怀疑 19% 的人大部分都禁用了他们的更新。
  • 第 3 周过半,第 2 周版本开始告诉用户重新安装后 1 天,我有 44% 的人在第 2 周的版本上(并被告知他们必须重新安装才能更新,所以至少现在他们知道了),16 % 在第 3 周,13% 在“困惑前的最后一个版本”,仍然是旧版本的尾部。

所以这不是一个完美的答案,但就我而言,它至少帮助我告知超过四分之三的受影响用户他们现在需要重新安装,这总比他们不知道要好。

关于Android:我在一个已经发布的应用程序上更改了 sharedUserId,但我的一些用户无法更新。我现在应该怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49706936/

相关文章:

android - Opera Mini 和 WM6.1 上的视口(viewport)与 `device-width` 的 100% 不匹配

android - 如何声明一个对所有模块的 build.gradle 文件可见的常量?

Android 在上传到市场时在应用程序中隐藏日志

安卓 Proguard - ClassNotFoundException

android - 带圆边的 ActionBar

Android studio 在哪里安装 NDK 文件? (以 zip 格式下载)

android - RxScala/Java - 为什么我的 progressBar 没有显示?

android - 打开失败 :EROFS read only file system android

Java/Android - 我如何知道类的任何实例中的变量是否为真?

android - 尝试从应用程序内下载 .apk 文件。获取 "client identification header"错误