【问题标题】:Access ro.serialno from native in Android 8?在 Android 8 中从本机访问 ro.serialno?
【发布时间】:2018-03-31 05:11:21
【问题描述】:
我需要一些帮助。我有一个主要用本机 C 代码编写的应用程序。我使用__system_property_get(const char * name, char * value) 方法读取序列号。在我的本机代码中的各个点上的设备。在 Android 8 中,我现在总是收到“拒绝访问”消息。
libc:访问被拒绝查找属性“ro.serialno”
有没有办法让我仍然能够阅读序列号。在安卓 8 中?我尝试切换到 targetSDKversion Build.SERIAL(无论 SDK 版本如何)和 SDK 版本 26 中的 Build.getSerial() 一起使用(如果我授予 READ_PHONE_STATE 权限),我确实会得到正确的值。但是我无法在 Java 中读取这些值并将它们传递给本机代码,而无需大量重写本机代码。
有什么帮助吗?
【问题讨论】:
标签:
android
c
permissions
native
【解决方案1】:
我也遇到了这个问题。最后我找到了问题的根本原因。在 Android O 中,SELinux 在系统属性上设置了很多限制。在这种情况下,除了白名单中的某些域之外,还有一个neverallow来限制读取序列号。
更具体的信息可以阅读system/sepolicy/public/domain.te中的代码:
neverallow {
domain
-adbd
-dumpstate
-hal_drm
-init
-mediadrmserver
-recovery
-shell
-system_server
} serialno_prop:file r_file_perms;
【解决方案2】:
如果您掌握 AOSP:
- 将
android:sharedUserId="android.uid.system" 转为AdnroidMainfest
- 运行类似
system_app 的应用程序。
- 更改
Android.mk。 LOCAL_MODULE_PATH := $(TARGET_OUT)/app。
或者您可以复制该属性。
【解决方案3】:
我认为你没有在 UI 线程上调用它,所以出现了这个错误。
如果你在非ui线程上调用它,你应该首先创建opengl上下文。