【问题标题】:Samsung "App optimisation" feature kills background applications after 3 days三星“应用程序优化”功能在 3 天后杀死后台应用程序
【发布时间】:2016-09-27 20:50:11
【问题描述】:

我们目前正在开发一款 Android 应用,它是一款健身追踪器应用。它在后台持续运行,并且在大多数设备上运行良好,但我们一直遇到应用程序在某些三星设备上完全死机的问题。经过一番调查,似乎某些三星设备具有完全自定义的“应用程序优化”功能(http://forums.androidcentral.com/samsung-galaxy-s6/599408-app-optimisation-after-updating.html),这基本上是 Android 更高版本中存在的打盹功能的(非常)原始版本,基本上只是谋杀应用程序如果他们没有使用三天。

由于这个应用程序或多或少只做日志记录,并没有打开活动,它给我们带来了一个大问题,因为这个功能在许多三星设备上都预先启用了。这个问题是通过使用前台服务来解决的,但这是一个解决方案的大锤,需要通过不断的通知来打扰用户,我们真的不需要应用程序处于前台 - 我们对正常的电源很好安卓管理。

三星应用程序优化功能明确指出,如果应用程序三天未使用,它将“优化”它们。 有没有人了解三星认为“已使用”的东西,我可以以某种方式触发它吗?

Side-rant:在我看来,这是一个实施得很糟糕的功能,它使 Android 上的开发更加充满敌意。除了我们的用例之外,它还会破坏任何信使应用程序。如果不是因为 Facebook Messenger 和 Whatsapp 天生就可以豁免该应用程序,那么用户会发疯,因为这会破坏他们的体验。

【问题讨论】:

  • 2020 年出现同样的问题。你有没有解决这个问题?

标签: android android-service android-alarms android-wake-lock samsung-touchwiz


【解决方案1】:

我拥有(并且目前拥有)三星设备,所以我从用户的角度了解它的工作原理。技术规格及其在内部的工作方式是一个完全独立的问题,我无法回答。

系统可以检测您是否打开了应用程序。三星在他们的应用程序优化中使用了这一点,并将节省超过三天未使用的应用程序的电量。这是一个糟糕的系统。

它会忽略可能对应用程序至关重要的后台进程,即使它是您积极使用的应用程序,例如健身追踪器,它也会出现问题。引用应用优化列表中的内容:

“为节省电池电量,超过 3 天未使用的应用将被指定为省电。指定为省电的应用可能不会显示通知”

(挪威语的粗略翻译,最初取自运行 Android 6 的 S6)

因此,手动设置或自动设置(3 天不使用)的应用程序可能会给后台进程带来各种问题。但请记住,用户可以将任何应用程序设置为从不节省电池,并忽略自动设置。因此,考虑到这一点,让我们考虑可能的解决方案。

在一种情况下您无需担心应用和应用优化:应用优化完全禁用时。

除此之外,您实际上只能做两件事:

  1. 要求三星用户为您的应用禁用电池优化以防止出现问题

  2. 正如@MinaSamy 建议的那样(在他们现在已删除的答案中),SyncAdapter 并具有定期同步。请注意,我没有测试过这个,所以我不知道它是否有效。

还有第三个选项,它确实不是一个解决方案,但你可以忽略它,赌应用优化被禁用,或者根本不关心它。

有没有人了解三星认为“使用”的东西,我可以以某种方式触发它吗?

据我所知,除非三星添加一些防止意外打开的保护措施或添加某种最低活动要求,否则打开就足够了。它似乎是一个“愚蠢”的功能,它运行在硬编码规则上,而不是一个动态系统,它实际检测应用程序的使用并设置与之相关的省电。它“易于启用”,但幸运的是也很容易禁用。

意味着你不能触发一个让它保持活动的事件(除非 SyncAdapter 能做到这一点)

为了澄清事实,来自@Neil's answer

看起来用户可以做到这一点,所以必须有一些数据库或设置控制它。

有点。总共有四个设置,其中三个是特定于应用程序的,它存储在数据库中(或其他形式的数据存储)。这四个设置虽然非常浅,但可以用来改变应用优化的行为:

  • 始终优化
  • 自动优化
  • 从不优化
  • 禁用应用优化

前三个选项基于每个应用,这意味着每个应用都可以有单独的设置。禁用应用程序优化正是您所期望的:它会禁用所有应用程序的整个功能。如果它被完全禁用,则不会进行任何优化。

There's also a website 按品牌列出绕过优化的方法。三星的入口或多或少就是我所说的:告诉用户手动禁用优化。没有开发者解决方案。

【讨论】:

  • 感谢您的回复。我有一个类似的问题,在清单中注册的广播接收器(用于蓝牙连接事件)似乎在 3 天后出现故障(未接收所有事件)。将我的应用程序添加到三星电池设置中的“未监控的应用程序”列表可以解决这个问题吗?这是唯一的解决方案吗?谢谢!
  • @dor506 假设这是三星独有的问题,是的。如果您在其他设备上看到它,则可能是您的代码有问题(假设该设备没有类似于三星的“功能”,看看打瞌睡)
  • 感谢您的快速回复。我很确定这在我的代码中不是问题,因为我唯一要做的就是将事件写入日志文件。日志显示事件在大约 3 天内收到正常。在这段时间之后,根据日志,事件并不总是被接收 - 这似乎与这里描述的三星 3 天有关。似乎在这段时间之后,接收器优先级正在降级
【解决方案2】:

在设置>设备运行状况>电池中有一个选项可以“让未使用的应用进入睡眠状态”。您可以将其关闭,或更改所需时间,默认为 3 天。

听起来这是你的问题。

https://forums.androidcentral.com/samsung-galaxy-s10-s10-plus/964083-whats-disabling-some-my-apps-background.html

【讨论】:

    【解决方案3】:

    您是否有理由无法将您的服务添加到“不优化”列表中?

    看起来用户可以做到这一点,所以必须有一些数据库或设置控制它。

    或者,如果您检测到您正在其中一台设备上进行安装,请打开优化活动页面,并显示一条消息“不要优化我们!”。

    【讨论】:

    • "看起来用户可以做到这一点,所以必须有一些数据库或设置控制它。"这是一个想法,但那会是什么数据库呢?我怎么能知道呢?
    • 我要做的第一件事是挖掘其中一部受影响手机的文件系统。可能有一些简单的东西,比如一个逗号分隔的优化应用列表(可能不是,但你永远不知道)。
    • 很遗憾,我无法直接使用这些手机。我可能不得不购买一个。
    • 听起来你有一个购买新手机的绝佳借口:-)
    • 这不是我在 Galaxy S10 上的选择
    【解决方案4】:

    作为一种解决方法,我实现了 SyncAdapter 机制,使用此链接作为一个很好的起点:https://github.com/bmeike/MiniSync 它不能完美运行(为了测试,在我的应用程序中,我每 1 小时编写一次日志,3 天后,它开始不遵守此调度),但至少 3 天后它不会停止,无需放置应用处于忽略优化模式。

    更新:更新到 android PIE 后,调度在 3 天后再次停止。 在另一台设备上,与 Android Oreo 相同的应用程序,调度正在工作(即使没有完全遵守)。

    【讨论】:

      【解决方案5】:

      在三星手机上,罪魁祸首是这个睡眠设置:

      您必须将您的用户带到此系统设置屏幕并要求他们关闭该功能。

      【讨论】:

        【解决方案6】:

        在我看来,您应该实现一个“广播接收器”,它侦听自定义“意图”,并且这个“意图”将由“服务”的“onDestroy()”方法中的“服务”广播,因为当'System' kill 'Service' 这个方法肯定会被调用。 当“广播接收器”收到“意图”时,您应该再次启动“服务”。 为了区分您停止“服务”或“系统”停止“服务”,只需使用存储在“SharedPreferences”中的一些“布尔值”,然后在“广播接收器”中决定是否激活“服务”

        【讨论】:

        • 被杀死的应用没有收到任意广播
        【解决方案7】:

        我们对 Android 的正常电源管理没问题

        你是吗?来自 Android 文档

        但是,由于用户不直接了解后台服务,因此在该状态下,它被认为是有效的终止候选者,您应该为这种情况的发生做好准备。特别是,长时间运行的服务将越来越有可能被终止,并且如果它们保持启动足够长的时间,它们肯定会被终止(并在适当的情况下重新启动)。

        三天好像属于“长跑……保证被杀”。

        如果问题不是你的服务被杀死而是它没有重新启动,你可以使用 AlarmManager 定期检查你的服务的状态并在必要时重新启动。

        【讨论】:

        • 我很清楚现有的 Android 电源管理是如何工作的,并且服务会被随机终止并重新启动。没事儿。我们有许多具有相同版本号的 android 的非三星设备可以正常运行很多天。但三星 App Optimiser 所做的是不同的 - 恰好在三天后,它完全杀死整个应用程序。永久性。它永远不会重新启动它。它甚至无法接收 GCM 消息,或接收包更新事件。它与普通的 Android 电源管理不同。
        • 所以服务不能像START_REDELIVER_INTENT这样的常量按预期工作,是吗?
        • 不,他们没有。应用程序已完全关闭(在 Android 设置中禁用了强制退出按钮),除了再次按下应用程序图标外,似乎没有什么能让它再次出现。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-05-15
        • 2020-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-23
        相关资源
        最近更新 更多