当天的惊人发现:根据Java规则,您是lets you access object fields的Android not supposed to上的JNI。
此功能绕过任何地方记录的访问限制吗?这是官方的JNI行为,还是特定于JNI的Android风格?这是未定义的行为吗? OOP警察现在随时会来找我吗?
我知道依赖未发布的对象字段具有内在的危险,并且随时可能中断;这不是这里的问题。
更新:看起来像针对API28的应用程序不再具有此功能。
今天的惊人发现:根据Java规则,Android上的JNI允许您访问不应使用的对象字段。
缩写JNI在the question and answers that you linked to中没有出现,只是作为动态生成的指向此问题的链接。
此文件记录在任何地方吗?
关于Java开发的任何体面的书都应涵盖public
,private
等
这是官方的JNI行为还是Android专有?
都不是
什么是[[is Android特有的编译时步骤,使您很难在某些android
,java
和javax
程序包中添加代码。
这是未定义的行为吗?
这取决于您要绑定到代词“ this”的基础名词或概念。
如果“此”是“正在访问私有等内容”,则该行为并非未定义。
如果“ this”是“正在访问Android框架中特定的私有对象等”,则
is
未定义。周围有很多很多版本的Android,还有很多版本的框架类。它们的内部实现方式并不相同。任何未通过Android SDK公开的内容都可以由Google,设备制造商,ROM mod维护者等进行更改。[请注意,Javs定义了SecurityManager类,但它会将所有JNI调用都视为security breach,因此从他们的角度来看,您的问题不是问题,就像问"why can I get elevation to Administrator when I only install some driver/service?"。
但是在Android上,情况更加明确。带有下列前言的正式文档describes this class:
旧版安全代码;不要使用。(安全管理者确实
不是提供了用于执行不受信任代码的安全环境。无法信任的代码无法在Dalvik VM中安全隔离。
[重点是他们的)
[如果您正在寻找更强的词以保证从JNI访问本机字段和方法不会在下一版Android中消失,那么祝您好运。另一方面,某些未来版本的Android会更改某些私有字段和方法的名称或签名的可能性更高。而且,他们可以更改实现,以便保留字段,但必须以不同的方式使用。
最后请注意,所有这些注意事项不仅适用于private或
package private
方法,而且还适用于未纳入官方文档的public方法和字段!