当天的惊人发现:根据 Java 规则, Android 上的 JNI允许您访问不应该访问的对象字段。
这种绕过访问限制的能力是否记录在任何地方?这是官方的 JNI 行为还是特定于 Android 风格的 JNI?这是未定义的行为吗?OOP 警察现在会来找我吗?
我了解依赖未发布的对象字段本质上是危险的,并且可能随时中断;这不是这里的问题。
更新:看起来以 API28 为目标的应用程序不再具有此功能。
当天的惊人发现:根据 Java 规则, Android 上的 JNI允许您访问不应该访问的对象字段。
这种绕过访问限制的能力是否记录在任何地方?这是官方的 JNI 行为还是特定于 Android 风格的 JNI?这是未定义的行为吗?OOP 警察现在会来找我吗?
我了解依赖未发布的对象字段本质上是危险的,并且可能随时中断;这不是这里的问题。
更新:看起来以 API28 为目标的应用程序不再具有此功能。
这个问题已经在一篇文章中进行了描述甚至解决,或者更确切地说是 2006 年发布的提案。
请注意,Javs 定义了SecurityManager类,但它将所有 JNI 调用都视为安全漏洞,因此从他们的角度来看,您的问题不是问题,例如问“为什么我只安装一些驱动程序/服务时可以获得管理员权限?” .
但在 Android 上,事情就更加明确了。官方文档用以下前言描述了这个类:
旧版安全码;不使用。
安全管理器不提供执行不受信任代码的安全环境。在 Dalvik VM 中无法安全地隔离不受信任的代码。
(重点是他们的)
如果您正在寻找更强有力的词来保证从 JNI 访问本机字段和方法不会在下一版本的 Android 中消失,那么祝您好运。
另一方面,某些未来版本的 Android 更改某些私有字段和方法的名称或签名的可能性更高。此外,他们可以更改实现以保留该字段,但必须以不同的方式使用。
最后请注意,所有这些注意事项不仅适用于私有或包私有方法,还适用于未包含在官方文档中的公共方法和字段!
当天的惊人发现:Android 上的 JNI 允许您根据 Java 规则访问不应该访问的对象字段。
缩写 JNI 不会出现在您链接到的问题和答案中的任何地方,除了作为该问题的动态生成链接。
这在任何地方都有记录吗?
任何关于 Java 开发的好书都应该涵盖public
,private
等。
这是官方的 JNI 行为还是特定于 Android 的?
两者都不。
Android 特有的是编译时步骤,使您难以在某些android
、java
和javax
包中添加代码。
这是未定义的行为吗?
这取决于您与代词“this”绑定的潜在名词或概念。
如果“this”是“访问私有等内容”,则该行为不是未定义的。
如果“this”是“在 Android 框架中访问特定的私有内容等”,那是未定义的。周围有很多很多版本的Android,也有很多很多版本的框架类。它们的内部实现并不相同。任何未通过 Android SDK 公开的内容都可以由 Google、设备制造商、ROM 模组维护者等进行更改。