Ank*_*wal 6 reflection android
甚至可以通过使用反射来访问我班级的私人成员/功能setAccessible(true).有没有办法阻止外部代码的这种访问?
我读了一些关于堆栈溢出的东西,我可以用它SecurityManager来防止applet中的反射(不知道它是如何工作的),但是Android也有类似的机制吗?也许是注释或聪明的编程?
dan*_*uzz 13
退后一步,您所观察到的是安全理念的差异,最初体现在Sun的JVM中的Java执行模型与Android的执行模型之间.
原始Java VM设计旨在用于这样的系统,其中多个相互可疑的应用程序(或Java术语中的"applet")将同时驻留在单个VM中运行的单个地址空间中.因为设计人员不希望一个应用程序能够与另一个应用程序混乱,所以他们经历了巨大的痛苦来定义VM内部安全模型,该模型将禁止诸如一个对象触摸另一个类的另一个对象的私有字段之类的事物.
也就是说,Java库最终在安全模型中出现了各种"逃逸舱口".setAccessible()正如你所注意到的那样,其中一个就是反射物体.
Android的模型不同:Android使用进程作为安全边界和应用程序隔离单元,而不是像传统JVM那样试图将其隐藏到流程中.这使得整个Java安全模型变得毫无用处,除了它有助于应用程序"将其从自身中保存".也就是说,没有一个对象进入另一个对象的私有部分是一个很好的设计,默认的Java安全模型就是这样.
撇开人们修改代码的问题,使用Android作为应用程序作者,您可以控制最终在应用程序进程中运行的所有代码.如果您选择包含调用的代码setAccessible()那是您的事.你可能会用脚射击自己,但你肯定不会射击任何其他应用程序的脚,因为Android安全模型在进程层运行时本身就不会让这种情况发生.同样地,使用本机代码将完全打破Java对象模型,这样就可以让事情在这个过程中变得非常肮脏,但也可以让你以比Java更高效的方式表达一些东西.这是一种权衡,但它是每个应用程序开发人员的权衡,而不是特别影响手机/设备上发生的任何其他事情的权衡.
我知道这并没有直接回答你的问题,但我希望它提供了一些有用的背景.
有没有办法阻止外部代码的这种访问?
并不真地。
Android 也有类似的机制吗?
即使有(我不知道存在这样的东西),任何人都可以通过反编译您的代码(假设他们还没有您的源代码)、摆脱保护并重新编译代码来删除它。
请记住,ProGuard 如果使用得当,将会混淆您的生产 APK 构建的私有类和方法。再加上缺乏文档,任何人访问这些私有类和方法都会变得乏味。