三星的“应用程序优化”功能会在3天后关闭后台应用程序。

37
我们目前正在开发一款健身追踪应用的Android应用程序。它在后台不断运行,在大多数设备上运行良好,但是我们在一些三星设备上遇到了应用程序完全崩溃的问题。经过一些调查,似乎一些三星设备具有完全定制的“应用优化”功能(http://forums.androidcentral.com/samsung-galaxy-s6/599408-app-optimisation-after-updating.html),这基本上是后来版本的Android中存在的Doze功能的(非常)原始版本,如果应用程序未使用三天,它就会将其关闭。
由于此应用程序或多或少只是进行日志记录,并且不打开活动,因此对我们来说带来了很大的问题,因为这个功能在许多三星设备上预先启用。通过使用前台服务可以解决这个问题,但这是一个非常笨重的解决方案,需要通过不断的通知来打扰用户,而我们真的不需要将应用程序置于前台 - 我们对Android的正常电源管理感到满意。
Samsung应用程序优化功能明确表示,如果应用程序未使用三天,它将“优化”应用程序。有人知道Samsung认为什么是“使用”,我是否可以以某种方式触发它?
顺便说一下:在我看来,这是一项糟糕的实现功能,使得Android上的开发更加敌对。除了我们的使用情况外,它还会破坏任何信使应用程序。如果不是因为Facebook Messenger和Whatsapp已经被硬编码为免于该应用程序,用户会因为应用程序破坏他们的体验而变得疯狂。

2
2020年了,我也遇到了同样的问题。你有找到解决方法吗? - Keyne Viana
7个回答

7
我拥有(并且目前拥有)三星设备,因此从用户的角度来看,我了解一些它的工作方式。技术规格以及内部运作是完全不同的问题,我无法回答。

系统可以检测您是否打开了应用程序。三星在其应用程序优化中使用这一功能,并将节省那些未使用超过三天的应用程序的电力。然而,这是一个很糟糕的系统。

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

“为了节省电池电量,已经超过3天没有使用的应用程序将被指定为节能模式。被指定为节能模式的应用程序可能不会显示通知”

(从挪威语翻译而来,最初取自运行Android 6的S6)

因此,已经手动或自动设置(3天未使用)的应用程序可能会在后台进程方面出现各种问题。但请记住,用户可以将任何应用程序设置为永不节省电池,并忽略自动设置。因此,在考虑可能的解决方案时,请记住这一点。

有一种情况您不需要担心应用和应用优化:当完全禁用应用优化时。
除此之外,您实际上只能做两件事:
1. 请求使用三星手机的用户禁用您的应用程序的电池优化以防止问题。 2. 如@MinaSamy建议(在他们现在被删除的答案中),使用SyncAdapter并进行定期同步。请注意,我尚未测试过这一点,因此不知道它是否有效。
还有第三个选项,并不是解决方案,但您可以忽略它并赌博应用程序优化已被禁用,或者根本不关心它。
“有人了解三星认为什么是”使用“吗?我怎样才能触发它?
据我所知,除非三星添加了一些防止意外开启的保护措施或添加了某种最低活动要求,否则打开就足够了。它似乎是一个“愚蠢”的功能,它运行硬编码规则而不是实际检测应用程序使用并相对于此设置节能的动态系统。它很“容易启用”,但幸运的是也很容易禁用。

意思是您无法触发保持应用程序处于活动状态的事件(除非 SyncAdapter 成功)。

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

似乎用户可以这样做,因此必须有一些数据库或设置控制它。

确实存在这种情况。总共有四个设置,其中三个是应用程序特定的,并存储在数据库中(或其他形式的数据存储中)。虽然极浅,但这四个设置可以用于改变应用程序优化的行为:

  • 始终进行优化
  • 自动优化
  • 从不优化
  • 禁用应用程序优化

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

还有一个网站列出了按品牌绕过优化的方法。三星的条目与我说的差不多:告诉用户手动禁用优化。没有开发者解决方案。


感谢您的回复。我遇到了类似的问题,即在清单中注册的广播接收器(用于蓝牙连接事件)在3天后似乎出现故障(未接收到所有事件)。将我的应用程序添加到三星电池设置中的“未监视的应用程序”列表中是否可以解决此问题?这是唯一的解决方案吗?谢谢! - dor506
@dor506 假设这是一个仅限三星设备的问题,是的。如果您在其他设备上看到它,很可能是您的代码存在问题(假设该设备没有类似于三星“功能”的东西,不考虑Doze)。 - Zoe stands with Ukraine
谢谢您的快速回复。我非常确定这不是我的代码问题,因为我所做的唯一的事情就是将事件写入日志文件中。日志显示,在大约三天时间内,事件被成功接收。在此之后,根据日志,事件并不总是被正确接收 - 这似乎与三星公司在此处描述的三天问题有关。看起来在这段时间之后,接收器优先级降低了。 - dor506

2

1

你为什么不能将你的服务添加到“不优化”列表中?

看起来用户可以这样做,因此肯定有一些数据库或设置控制它。

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


似乎用户可以这样做,因此必须有某个数据库或设置来控制它。这是一个想法,但那会是哪个数据库呢?我该如何找到它? - Mattias Petter Johansson
我会首先在受影响手机的文件系统中搜索一番。可能会找到一些简单的东西,比如逗号分隔的已优化应用程序列表(也许不太可能,但你永远不知道)。 - Neil
不幸的是,我没有直接访问这些手机的权限。我可能需要采购一台。 - Mattias Petter Johansson
听起来你有一个非常好的借口来买一部新手机 :-) - Neil
这在Galaxy S10上没有给我选项。 - IgorGanapolsky

0
在三星手机上,罪犯就是这个睡眠设置:

enter image description here

你需要带领用户进入系统设置屏幕,并要求他们关闭该功能。


0

作为一种解决方法,我实现了SyncAdapter机制,并使用此链接作为良好的起点:https://github.com/bmeike/MiniSync 它并不完美(为了测试,在我的应用程序中,我每隔1小时写一次日志,经过3天后,它开始不遵守这个计划),但至少它不会在3天后停止,而无需将应用程序置于被忽略的优化模式。

更新:升级到Android PIE后,调度再次在3天后停止。 在另一台设备上,具有Android Oreo的相同应用程序正在运行调度(即使不完全符合要求)。


-2
在我看来,你应该实现一个“广播接收器”,它监听自定义的“Intent”,并且这个“Intent”由“Service”的“onDestroy()”方法广播,因为当“系统”杀死“Service”时,这个方法一定会被调用。 当“Broadcast Receiver”接收到“Intent”时,你应该重新启动“Service”。 为了区分你停止“Service”还是“系统”停止“Service”,只需使用存储在“SharedPreferences”中的一些布尔值,然后在“Broadcast Receiver”中决定是否激活“Service”。

一个已经被杀死的应用程序将不会接收任意广播。 - Tim

-3
我们对Android的正常电源管理没有问题。
你确定吗?来自Android文档:
然而,由于用户并不直接知道后台服务,在这种状态下被认为是一个可以被终止的有效候选项,因此您应该做好准备。特别是,长时间运行的服务将越来越容易被杀死,并且如果它们保持启动足够长的时间,则保证被杀死(并在适当时重新启动)。
三天似乎属于“长时间运行...保证被杀死”。
如果问题不是您的服务被杀死,而是它没有重新启动,那么您可以使用AlarmManager定期检查您的服务的状态并重新启动(如果必要)。

我非常清楚原生Android的电源管理方式,以及服务的随机杀死和重启。这没问题。我们有许多非三星设备,运行着相同版本号的Android系统,已经正常工作了很多天。但是三星应用程序优化器所做的不同 - 正好在三天后,它会完全杀死整个应用程序。永久性地。它甚至无法接收GCM消息或接收包更新事件。这与原生Android的电源管理不同。 - Mattias Petter Johansson
那么使用常量START_REDELIVER_INTENT时,服务不能按预期工作,是吗? - Maxim G
不,它们不会。该应用程序完全关闭(在Android设置中强制退出按钮被禁用),除了实际按下应用程序图标之外,似乎没有任何方法可以使其再次启动。 - Mattias Petter Johansson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接