C语言 从 Android 8 中的本机访问 ro.serialno



我需要一些帮助。我有一个主要用本机 C 代码编写的应用程序。我使用 __system_property_get(const char * name, char * value) 方法来读取串行 nr。在我的本机代码中的各个点的设备。使用Android 8,我现在总是收到"访问被拒绝"消息。
libc:查找属性"ro.serialno"
的访问被拒绝有没有办法让我仍然能够读取序列号。在安卓 8 中?我尝试切换到目标SDK版本<26,但它仍然给我"访问被拒绝"消息。如果我将 Java 与 Build.SERIAL一起使用(无论 SDK 版本如何),如果我授予 READ_PHONE_STATE 权限,我会在 SDK 版本 26 中Build.getSerial(),我会得到正确的值。但是我无法在 Java 中读取这些值并将它们传递给本机代码,而无需对本机代码进行大量重写。

有什么帮助吗?

我也遇到了这个问题。最后,我找到了问题的根本原因。在Android O中,SELinux在系统属性上设置了很多限制。在这种情况下,除了白名单中的某些域外,有一个永远不允许限制读取序列号。

有关更具体的信息,您可以阅读system/sepolicy/public/domain.te中的代码:

neverallow {
  domain
  -adbd
  -dumpstate
  -hal_drm
  -init
  -mediadrmserver
  -recovery
  -shell
  -system_server
} serialno_prop:file r_file_perms;

如果你有 AOSP:

  1. android:sharedUserId="android.uid.system"置于AdnroidMainfest
  2. system_app一样运行应用程序。
  3. Android.mk的变化 . LOCAL_MODULE_PATH := $(TARGET_OUT)/app .

或者,您可以复制该属性。

我认为您没有在UI线程上调用它,因此会发生此错误。

如果在非 ui 线程上调用它,则应首先创建 opengl 上下文。

最新更新