如果我只在Google Play商店发布应用,那我是否需要android.permission.WAKE_LOCK权限来使用Google Play服务?

19

我正在尝试集成Android版的Google Analytics。根据此处文档,它要求添加android.permission.WAKE_LOCK(提供下面的注释)。我不是很清楚。如果我只发布应用到Google Play 商店,是否仍需要此权限?

如果没有必要,我真的不想向用户请求额外的权限。

<!-- Optional permission for reliable local dispatching on non-Google Play devices -->
<uses-permission android:name="android.permission.WAKE_LOCK" />

特别是,我不理解这个注释实际上是什么意思在这里:

可选地,可以请求WAKE_LOCK权限以改善在非Google Play设备上的调度。


1
它说“可选权限”。 - Carcigenicate
@Carcigenicate 是的,我理解了,只是不清楚为什么以及它如何有帮助? - user1406716
我不确定它对非Google Store有什么帮助,但这似乎无关紧要。如果他们说这是可选的并且用于你不打算使用的某些功能,那么我认为可以放心地忽略它。请注意,商店中许多应用程序没有唤醒锁权限。 - Carcigenicate
3个回答

42

更新:截至Android 6(API级别23),WAKE_LOCK被列为“普通”权限,这意味着该权限会自动授予。移除WAKE_LOCK权限往往会导致应用程序崩溃(请参见下文),因此我建议避免这样做。


我处于同样的位置。我不想添加额外的权限,因为这将显著减少使用最新版本应用程序的人数(因为新权限意味着用户必须明确选择接收应用程序更新)。

我相信我已经通过结合这个SO问题上的一些答案找到了解决方案。

首先,在应用程序清单中添加“tools”命名空间

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools">

其次,添加“WAKE_LOCK”权限,但使用删除选项

<uses-permission android:name="android.permission.WAKE_LOCK" tools:node="remove" />
现在,当我上传一个新的APK时,我可以看到没有再需要这个权限:

wake lock permission removed

重要提示

似乎这个解决方案现在可能不可行了。我现在得到了大量的RuntimeExceptions,其消息为“用户10182和当前进程都没有android.permission.WAKE_LOCK权限”。

Fatal Exception: java.lang.RuntimeException
Unable to start receiver com.google.android.gms.measurement.AppMeasurementReceiver: java.lang.SecurityException: Neither user 10182 nor current process has android.permission.WAKE_LOCK.

4
这是一个很棒的答案。如果Google能够记录如何避免使用唤醒锁权限就更好了。 - henrykodev
好的回答,非常感谢。顺便说一下,Google实际上已经记录了这些标志。据我所知,这是来自某个Google库(例如Google Play服务),并由Android Studio中的清单合并器生成。相关文档可以在http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger找到。 - gal
1
确实,它们已经被记录并标记为可选项。问题在于它们会自动包含在项目中。鉴于权限是可选的,你会认为谷歌希望开发者选择加入。 - Ian
我最初是手动添加了权限。但是当我删除了清单中的条目,然后将已签名的apk上传到Google Play时,我发现WAKE_LOCK权限仍然被合并了。这可能来自我后来添加的某个库。所以我最终还是不得不使用tools:node="remove"属性 :) - snark
@Tony 个人而言,我认为不必这样做,因为在 Android 6 及以上版本中会自动授予 WAKE_LOCK 权限(有关详细信息请参阅问题顶部)。不过,这可能取决于您的用户群(即是否有很多使用旧版 Android 的用户)。 - Ian
显示剩余10条评论

8

WAKE_LOCK

允许使用PowerManager WakeLocks防止处理器休眠或屏幕变暗。

在Google Play设备上,一个后台服务几乎总是作为“Google Play服务”运行,因此不需要WAKE_LOCK

在非Google Play设备上,WAKE_LOCK有助于保持Google Analytics的调度进程/服务处于活动状态,以便它有更多机会报告/上传数据。

编辑

https://commonsware.com/blog/2015/06/02/random-musings-m-developer-preview-bad.html

另外,用户无法通过设置控制的权限组中的危险权限的处理方式尚不清楚,例如SYSTEM_TOOLS


3
当移除WAKE_LOCK时,也要移除AnalyticsReceiver和AnalyticsService。
这个方法是在这个网站上写的。 http://coffeee.hatenablog.com/entry/2017/11/26/035828
  1. 打开AndroidManifest.xml
  2. 点击“Merged Manifest”选项卡 Merged Manifest
  3. 右键单击WAKE_LOCK并删除 Remove WAKE_LOCK
  4. 删除AnalyticsReceiver和AnalyticsService Remove Receiver and Service
祝好运!

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