0

当天的惊人发现:根据 Java 规则, Android 上的 JNI允许您访问不应该访问的对象字段。

这种绕过访问限制的能力是否记录在任何地方?这是官方的 JNI 行为还是特定于 Android 风格的 JNI?这是未定义的行为吗?OOP 警察现在会来找我吗?

我了解依赖未发布的对象字段本质上是危险的,并且可能随时中断;这不是这里的问题。

更新:看起来以 API28 为目标的应用程序不再具有此功能。

4

2 回答 2

1

这个问题已经在一篇文章中进行了描述甚至解决,或者更确切地说是 2006 年发布的提案。

请注意,Javs 定义了SecurityManager类,但它将所有 JNI 调用都视为安全漏洞,因此从他们的角度来看,您的问题不是问题,例如问“为什么我只安装一些驱动程序/服务时可以获得管理员权限?” .

但在 Android 上,事情就更加明确了。官方文档用以下前言描述了这个类:

旧版安全码;不使用。

安全管理器提供执行不受信任代码的安全环境。在 Dalvik VM 中无法安全地隔离不受信任的代码。

重点是他们的

如果您正在寻找更强有力的词来保证从 JNI 访问本机字段和方法不会在下一版本的 Android 中消失,那么祝您好运。

另一方面,某些未来版本的 Android 更改某些私有字段和方法的名称或签名的可能性更高。此外,他们可以更改实现以保留该字段,但必须以不同的方式使用。

最后请注意,所有这些注意事项不仅适用于私有或包私有方法,还适用于未包含在官方文档中的公共方法和字段!

于 2012-10-13T14:53:41.407 回答
0

当天的惊人发现:Android 上的 JNI 允许您根据 Java 规则访问不应该访问的对象字段。

缩写 JNI 不会出现在您链接到的问题和答案中的任何地方,除了作为该问题的动态生成链接。

这在任何地方都有记录吗?

任何关于 Java 开发的好书都应该涵盖public,private等。

这是官方的 JNI 行为还是特定于 Android 的?

两者都不。

Android 特有的是编译时步骤,使您难以在某些androidjavajavax包中添加代码。

这是未定义的行为吗?

这取决于您与代词“this”绑定的潜在名词或概念。

如果“this”是“访问私有等内容”,则该行为不是未定义的。

如果“this”是“在 Android 框架中访问特定的私有内容等”,那未定义的。周围有很多很多版本的Android,也有很多很多版本的框架类。它们的内部实现并不相同。任何未通过 Android SDK 公开的内容都可以由 Google、设备制造商、ROM 模组维护者等进行更改。

于 2012-10-13T11:27:57.243 回答