我的注释器生成器被用来制作 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
Run Code Online (Sandbox Code Playgroud)
进一步的搜索表明,普遍的共识是你永远不应该sharedUserId向已经发布的应用程序添加属性,否则用户会得到INSTALL_FAILED_UID_CHANGED(尽管该字符串不在这些特定日志中;我认为这取决于 Android 版本)。
但我不能只是删除sharedUserId现在,因为一些新用户在过去 5 周内重新安装了该应用程序,并且大概其中一些也在无法应对sharedUserId更新期间更改的 Android 版本上。
我很乐意告诉 Play 商店“如果任何用户的设备无法应对更新此应用程序,请卸载旧版本并重新安装”。(或者甚至“请无条件地将此更新重新安装”。)但似乎没有任何方法可以AndroidManifest在 Play 商店控制台中或在 Play 商店控制台上这样说。我找到了涉及应用程序本身代码的解决方案,但我的问题是我的应用程序在数据被擦除之前根本不会安装,而且我无法告诉用户除了通过在任何地方发布建议之外的方法来擦除数据可以并希望他们看到——很可能不会。
我能想到的唯一的解决办法是双方推出的更新与 sharedUserId 和不 sharedUserId 交替,等待每间一阵,希望受影响的设备将至少安装一个两个更新。这当然会牺牲共享书签功能(除非我首先使用除 之外的其他机制重新实现它sharedUserId)并且这不是一个非常优雅的解决方案。所以我发布这个问题是希望有人能建议我在陷入困境后应该做什么。
我尝试了以下解决方法:
在星期一发布 一个版本sharedUserId,带有额外的启动代码来检查日期,并且 (a) 如果是在发布后 7 天内,则表示下周的更新可能会出现问题,但不用担心,等待下周的更新, (b) 如果是在发布后 14 天内,则表示本周的更新可能会出现问题,但不用担心,等待下周的更新。
接下来的星期一,发布一个没有 的 sharedUserId版本,设置为工作几周,然后完全停止工作,告诉用户必须卸载并重新安装该应用程序。
之后的星期一,发布一个恢复 sharedUserId正常的版本。
我的计划是,这将导致 (a) 设备不关心的用户sharedUserId将自动升级所有 3 个版本,并且除了版本 1 的消息(在他们的情况下是虚假的)之外不会注意到任何内容,(b) 设备被卡住的用户之前的sharedUserId版本将获得版本 2,并且随后将被告知在版本 3 为最新版本后卸载并重新安装,(c) 设备卡在后期版本上的用户sharedUserId将获得版本 1 和 3,并且只会注意到“无法在版本 2 的一周内出现“更新”消息,版本 1 对此发出了警告。
根据 Play 商店的统计数据,实际发生的情况是:
sharedUserId,另外还有 20% 的活跃用户停留在早期版本(因此超过 75% 的人“落后”)。我的大约 15% 的活跃用户下载了警告第 2 周更新可能失败的版本。sharedUserId搞砸之前的最后一个版本”上的活跃用户数量已从 55% 下降到 16%。大约 45% 的活跃用户已升级到非sharedUserId第 2 周版本(如果第 3 周的版本无法自动替换,该版本将告诉他们重新安装),另外 12% 仍在使用第 1 周版本,被告知不要担心。我大约有 19% 的人停留在早期版本上(低于 20%)。我开始怀疑 19% 的人大部分都禁用了更新。所以这不是一个完美的答案,但就我而言,它至少帮助我通知了超过四分之三的受影响用户,他们现在需要重新安装,这比他们都不知道要好。