- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我的 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
以外的某种机制重新实现它)并且这不是一个非常优雅的解决方案。所以我发布这个问题是希望有人可以建议我在陷入困境后应该做什么。
最佳答案
我尝试了以下解决方法:
在星期一发布一个带有 sharedUserId
的版本,使用额外的启动代码来检查日期和 (a) 如果它在发布后的 7 天内,它说 下 周的更新可能是个问题,但不要担心,等待下周的更新,(b) 如果它在发布后的 14 天内,它会说 this一周的更新可能是个问题,但不要担心,等待下周的更新。
接下来的星期一,发布一个没有 sharedUserId
的版本,设置为工作几周然后完全停止工作,告诉用户他们必须卸载并重新安装该应用。
在那之后的星期一,发布一个带有 sharedUserId
的版本恢复正常。
我的计划是这会导致 (a) 设备不关心 sharedUserId
的用户将自动升级所有 3 个版本,除了版本 1 的消息(在他们的情况下是虚假的)之外什么都不会注意到), (b) 设备停留在 sharedUserId
之前版本的用户将获得版本 2,随后将被告知在版本 3 为最新版本后卸载并重新安装,(c) 设备为当前版本的用户停留在 post-sharedUserId
上将获得版本 1 和 3,并且在版本 2 的一周内只会注意到“更新失败”消息,版本 1 已警告他们。
根据 Play 商店的统计数据,实际发生的情况是:
sharedUserId
之前发布的最后一个版本上,另外还有 20% 的用户使用早期版本(因此超过 75%被“抛在后面”)。大约 15% 的活跃用户下载了警告第 2 周更新可能失败的版本。sharedUserId
困惑之前的最后一个版本”的活跃用户数量从 55% 下降到 16%。大约 45% 的活跃用户已升级到非 sharedUserId
第 2 周版本(如果第 3 周的版本未能自动替换它,则设置为告诉他们重新安装),另外 12%仍在使用第 1 周的版本,并被告知不要担心。我有大约 19% 的人坚持使用早期版本(低于 20%)。我开始怀疑 19% 的人大部分都禁用了他们的更新。所以这不是一个完美的答案,但就我而言,它至少帮助我告知超过四分之三的受影响用户他们现在需要重新安装,这总比他们不知道要好。
关于Android:我在一个已经发布的应用程序上更改了 sharedUserId,但我的一些用户无法更新。我现在应该怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49706936/
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 Improve th
所以我正在开发一个黑 jack 程序,但我有点卡住了。我会警告大家,我对编程真的很陌生,而且,我正在项目中期......所以有一些松散的结局和未使用的变量,以及一些不必要的逻辑(用于测试),但这就是我
我正在尝试创建一个可用作 OpenGL 测试工具的示例程序。到目前为止,我的那个似乎可以工作,但似乎忽略了通过统一变量 MVPMatrix 传递的 MVP 矩阵。当我添加代码以读回制服并检查它是否确实
感谢您帮助我,这是有关我的代码的部分。 printf("Thank you, now please enter the logic gate"); scanf("%s", &C); if (C ==
public static void ejemplosString(String palabra){ char[] letras = palabra.toCharArray();
所以,我有一个 php 应用程序,通过 cgi 和 nginx 运行。我有一个 .jar 程序,用于在条形码打印机(Zebra)上打印条形码,猜猜看是什么!。 我的 php 应用程序使用 exec()
我遇到的唯一问题是 getAll() 方法,它似乎在 PersonnelController 类中的位置立即运行。我也曾在其他很多地方尝试过,但都没有成功。 setAll() 方法看起来不错,我已经测
我是一名优秀的程序员,十分优秀!