我需要一些帮助。我有一个主要用本机 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:
android:sharedUserId="android.uid.system"
置于AdnroidMainfest
- 像
system_app
一样运行应用程序。 Android.mk
的变化 .LOCAL_MODULE_PATH := $(TARGET_OUT)/app
.
或者,您可以复制该属性。
我认为您没有在UI线程上调用它,因此会发生此错误。
如果在非 ui 线程上调用它,则应首先创建 opengl 上下文。