Возможно создание классов с тем же именем. Однако они не заменяют существующие классы.
Каждый класс загружается загрузчиком классов. Погрузчики классов образуют иерархию, причем загрузчик классов «bootstrap» находится на самом верху. Класс-загрузчик, который загружает классы вашего приложения, создается платформой приложений Android; это дочерний элемент загрузчика класса «system», который является дочерним элементом загрузчика начальной загрузки.
Когда ваше приложение ссылается на класс, оно просит свой загрузчик классов найти его по имени. Каждый загрузчик либо вернет класс, который он определил, либо попросит своего родителя найти его. (Поведение по умолчанию состоит в том, чтобы сначала спросить родителя, но отдельный загрузчик может переопределить это.)
javax.crypto.Cipher
является частью core.jar
, который загружается загрузчиком класса начальной загрузки. Поэтому, если загрузчик классов вашего приложения не решит заменить Cipher
своей собственной версией, вы получите системную версию.
(The JNI FindClass
вызов на самом деле немного странно. В зависимости от того, где вы находитесь, когда вы называете его, он может на самом деле в конечном итоге в классе системы загрузчика, а не загрузчик вашего приложения. См this section in JNI Tips для объяснения.)
Предположим, вы действительно хотели заменить Cipher
. Вы можете предоставить свою собственную версию, и ваш код приложения будет с удовольствием использовать ее. Однако, когда вы пытаетесь передать его другому коду в core.jar
, ваше приложение завершится с ошибкой. Это связано с тем, что классы, загруженные в виртуальную машину, не уникальны по имени, а скорее сочетанием имени и загрузчика классов. Поэтому вы не можете передать Cipher+MyAppLoader
во что-то, что ожидает Cipher+bootstrap
.
В любом случае, если кто-то изменил ваш APK, им пришлось бы его повторно подписать; так как у них нет вашего личного ключа, это не похоже на приложение, которое пришло от вас.
Если кто-то изменил устройство и заменил систему Cipher
своей собственной версией, они могут делать все, что захотят.
Обычно компоненты в приложении, которые конфликтуют с именами компонентов платформы, отбрасываются при установке в пользу версий платформы. Возможно, можно переопределить это поведение, но даже если это не так, ваш байт-код, созданный вашим приложением, может быть изменен, чтобы вместо этого ссылаться на пользовательские компоненты с уникальными именами или поведение виртуальной машины, на которой он работает, может быть изменено или приложение может быть установленным на устройстве с модифицированной платформой, где системные версии этих пакетов были искажены. –