可以创建具有相同名称的类。但是,它们不会取代现有的类。
每个类都由类加载器加载。类加载器形成一个层次结构,“引导”类加载器位于最顶层。加载应用程序类的类加载器由 Android 应用程序框架创建;它是“系统”类加载器的子类,它是引导加载器的子类。
当您的应用程序引用一个类时,它会要求其类加载器按名称查找它。每个加载器要么返回它定义的类,要么要求其父类找到它。(默认行为是先询问父级,但单个加载器可以覆盖它。)
javax.crypto.Cipher
是 的一部分core.jar
,由引导类加载器加载。因此,除非您的应用程序的类加载器决定Cipher
用自己的版本替换,否则您将获得系统版本。
(JNIFindClass
调用实际上有点奇怪。根据您调用它的位置,它实际上可能最终出现在系统类加载器中,而不是您的应用程序的加载器中。请参阅JNI 提示中的本节以获取解释。)
假设你真的想更换Cipher
. 您可以提供自己的版本,您的应用程序代码会愉快地使用它。但是,当您尝试将其传递给 中的其他代码时core.jar
,您的应用程序将失败。这是因为在 VM 中加载的类不是名称唯一的,而是名称和类加载器的组合。所以你不能将 a 传递给Cipher+MyAppLoader
期望 a 的东西Cipher+bootstrap
。
无论如何,如果有人修改了您的 APK,他们将不得不重新签名;由于他们没有您的私钥,因此它看起来不像来自您的应用程序。
如果有人修改了设备并Cipher
用他们自己的版本替换了系统,他们可以为所欲为。