Android JNI可以欺骗封装吗?

时间:2012-10-13 02:01:13

标签: android oop android-ndk java-native-interface encapsulation

根据Java规则,当天的惊人发现:Android lets you access object fields上的JNI,你是not supposed to

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

据我所知,依赖未发布的对象字段本质上是危险的,可能会随时中断;这不是问题。

2 个答案:

答案 0 :(得分:1)

该问题已在2006年发表的article, or rather proposal中进行了描述甚至解决。

请注意,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中安全隔离不受信任的代码。

重点是他们的

如果您正在寻找更强大的词语,以确保在下一版Android中访问JNI的原生字段和方法不会消失,祝您好运。

另一方面,Android的某些未来版本将更改某些私有字段和方法的名称或签名的可能性更高。此外,他们可以改变实施,使得该文件仍然存在,但必须以不同方式使用。

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

答案 1 :(得分:0)

  

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

缩写JNI不会出现在the question and answers that you linked to中的任何位置,除非作为此问题的动态生成链接。

  

这是否记录在任何地方?

关于Java开发的任何体面的书都应涵盖publicprivate等。

  

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

都不是。

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

  

这是一种未定义的行为吗?

这取决于你想要与代词“this”联系的基础名词或概念。

如果“this”是“访问私有等东西”,那么行为不是未定义的。

如果“this”是“访问Android框架中的特定私有内容”,则 未定义。围绕着许多版本的Android,以及许多版本的框架类。他们的内部实现并不完全相同。任何未通过Android SDK公开的内容都有资格由Google,设备制造商,ROM mod维护者等进行更改。