如果我在JNI C方法中调用socket()
函数,则应用程序仍会因权限错误而失败。如果我在AndroidManifest.xml中放置了一个uses-permission行,问题就解决了。
所以似乎在Dalvik虚拟机中没有实现Android权限检查,因为我正在调用本机C函数并且仍然会被检查。我想知道在Android内核中执行检查的方式,或者用ptrace
跟踪应用程序以拦截每个系统调用或任何其他方式。非常感谢。
答案 0 :(得分:19)
检查由Linux内核执行,使用组成员资格来确定访问权限。
如果你在VM中查看the zygote fork code,你可以使用setgroups()来设置补充组ID。如果你在app框架代码中追逐它,你可以看到它确定权限的位置并将它们传递给forkAndSpecialize()。
答案 1 :(得分:5)
本机代码在SDK应用程序使用的相同沙箱中运行,因此与SDK应用程序具有相同的安全模型。
如果您编写本机代码,那么您的 应用程序仍然打包成 一个.apk文件,它们仍然在里面运行 设备上的虚拟机。 基本的Android应用程序 模特不会改变。