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

问题描述

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

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

编辑:下面关于 AppOps 的答案非常有用,但是我已经提交了一个更新,解决了以这种方式发现的每个问题,但我仍然遇到 Play 商店由于后台位置而拒绝更新的问题.那么有没有其他方法可以解决这个问题?也许在旧版本的 Android 上有什么东西?

解决方法

如果您有权访问 Android 11 设备,则可以利用 new data access APIs 来了解您的应用中的哪些内容使用了这样的 dangerous 权限。

this sample project(在 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 子类中其他代码的一部分)

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