- 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/
来自documentation : The name of a Linux user ID that will be shared with other applications. By defaul
常识似乎是在开始开发新应用程序时应立即设置 sharedUserId 属性。查看 list "To Do" list before publishing android app to market 即
我有一个 Android 应用程序,我需要它才能访问所有其他应用程序。我的设备已 Root 。另外,我使用 ES File Explorer 将该应用程序放置在 /system/app 中,使其成为系
这听起来像是一个模糊的问题,但我不得不问。 我是一名初学者 android 开发人员,刚刚开始了解 android 中进程间通信的工作原理。如果在 2 个应用程序中使用相同的 shareduserid
在 Android 中,您可以指定您的应用程序应在哪个 Linux 用户下运行。在 list 中,您只需将 android:sharedUserId 分配给所需的用户 ID。 问:您会为这个用户 ID
我目前在市场上有一款付费应用。现在我想提供一个免费的应用程序供用户先试用。我还希望能够确保免费应用的用户创建的数据在升级到付费应用后可见。 浏览了 Android 文档后,似乎在 Manifest 中
我有一个应用程序已经上市,我们称它为“旧应用程序”。我想创建一个“新应用”,与我决定使用 SharedID 的旧应用共享数据。 我更改了新应用的 list ,添加了以下行: android:share
我有两个应用,包名如下: com.blah.a com.blah.b 他们获得了 sharedUserId“com.blah.shared”。在我设备的/data/data 中,他们都有一个包含数据的
我正在做一个项目,我有一个核心应用程序和多个不同 apk 的插件。我想在我的不同模块之间共享一些数据(例如用户名或他的电子邮件地址)。我试图通过将其添加到他们的 list 中来为他们提供相同的 sha
我的 annotator generator用于制作 Android 网络浏览器应用程序,为中文文本添加发音辅助。根据您想要的地区发音(例如普通话拼音、粤语 Sidney Lau、温州语……),可以使
我对 sharedUserID 感到困惑。sharedUserId 的用途是什么?如何使用?在 android 中在哪里使用? 最佳答案 默认情况下,Android 会为应用程序分配一个用户 ID。它
我正在处理一个在 Manifest 中具有 android:sharedUserId 值的应用程序, 并且此 android:sharedUserId 值触发的权限存在问题。 在尝试解决问题时,我查看
我有两个应用程序。我在其中一个应用程序中有一个 xml 文件。如何使用 shareduserID 访问其他应用程序中的同一个 xml 文件? 谢谢 最佳答案 我假设您的意思是您的 XML 文件位于您应
对于我们应用程序的下一个版本,我想更改 sharedUserId,因为我们现在使用一个内部控制仪表板应用程序,该应用程序必须写入其他应用程序的设置文件。 但是由于该应用程序已经安装在许多手机上,这会是
我正在尝试创建一个 AccountAuthenticator 以用于我们的多个应用程序(因此多个应用程序使用的系统设置中的一个帐户)。就像所有 Google 应用程序在系统上使用相同的帐户一样。 问题
我正在为 Android 自定义构建开发一个应用。 本应用需要在Android的AudioManager中订阅AudioDeviceCallback。 我正在使用: mAudioManager.reg
在 list 中我放了 android:sharedUserId="xxxx.xxxx.xxxx"和 android:sharedUserLabel="@string/shared_user_labe
文档 ( http://developer.android.com/guide/topics/manifest/manifest-element.html#uid ) 只说明我不能使用原始字符串和它添
我所有的应用程序都具有相同的 sharedUserId。我想使用我当前应用程序的类启动另一个应用程序的类。我想使用 intent extras 但我不想使用 intent URL。我也希望不必更改我的
我是一名优秀的程序员,十分优秀!