当应用程序在后台尝试访问位置时,是否可以获取日志?

Is it possible to get logs for when an app is trying to access location while in the background?

Google 一直告诉我我的应用正在后台访问该位置。我的目标是 SDK 29,我没有 ACCESS_BACKGROUND_LOCATION 权限。我有 ACCESS_FINE_LOCATION.

我开始认为可能是广告网络在后台执行此操作,但我想通过查看日志来确认这一点。有办法吗?

编辑:下面关于 AppOps 的回答非常有用,但是我已经提交了一个更新来解决所有发现的问题,但我仍然遇到 Play 商店拒绝更新的问题,原因是背景位置。那么还有其他方法可以解决这个问题吗?也许旧版本 Android?

如果您可以访问 Android 11 设备,则可以使用 new data access APIs 可用的设备,您可以利用这些设备来了解您的应用程序中有什么正在使用这样的 dangerous 权限。

this sample project (profiled in this book) 中,我有一些代码可以记录所有 dangerous 权限使用的堆栈跟踪:

    getSystemService(AppOpsManager::class.java)
      ?.setOnOpNotedCallback(executor, object : AppOpsManager.OnOpNotedCallback() {
        override fun onNoted(op: SyncNotedAppOp) {
          Log.d(TAG, "onNoted: ${op.toDebugString()}")
          RuntimeException().printStackTrace(System.out)
        }

        override fun onSelfNoted(op: SyncNotedAppOp) {
          Log.d(TAG, "onSelfNoted: ${op.toDebugString()}")
          RuntimeException().printStackTrace(System.out)
        }

        override fun onAsyncNoted(op: AsyncNotedAppOp) {
          Log.d(TAG, "onAsyncNoted: ${op.toDebugString()}")
          RuntimeException().printStackTrace(System.out)
        }
      })

(作为自定义 Application 子类中其他代码的一部分)

在该示例的上下文中,它将记录应用正在从其视图模型获取位置的事实。但是,这只是基于示例 — 在更大的应用程序中,它会记录来自任何地方的权限使用,包括您的广告网络库。