Android перехватывает загрузку класса
Можно ли перехватить загрузку класса Android по умолчанию и условно избежать загрузки класса?
Моя мотивация состоит в том, чтобы перехватить процесс загрузки класса по умолчанию в Android и избежать загрузки класса в зависимости от условия, что-то вроде
if (!fooScope) {
throw IllegalStateException("Trying to load class from FooScope");
}
Я не собираюсь менять, откуда загружаются классы, но иметь точный контроль над тем, какие классы могут быть загружены в какой момент времени, что я называю строгой загрузкой классов. При этом любой класс, который не должен загружаться до тех пор, пока не будут выполнены определенные условия, загружаться не должен. Я ищу способы перехватить загрузку класса для достижения этой цели.
1 ответ
Вы, вероятно, должны будете использовать какую-то библиотеку Hooking. как эта библиотека ( https://github.com/cmzy/ZHookLib), которая поддерживает только до Android 4.4
тогда вам нужно подключить метод loadClass(String name) класса ClassLoader.class, чтобы увидеть все загруженные классы.
но все же есть проблема порядка, в котором классы загружаются. Вы можете попробовать сделать это из класса, который расширяет приложение, которое может быть загружено первым, но я не уверен...
public class MyApplication extends Application {
static {
// code in static block is executed when the class is loaded
Set<Unhook> unhooks2 = ZHook.hookAllMethods(ClassLoader.class, "loadClass", new MethodHook() {...});
}
как только вы подключили loadClass к ClassLoader, вы сможете делать то, что вам нравится. помните, что существует более одного ClassLoader, а также я не уверен, что произойдет, если вы выбросите исключение.
Я надеюсь, что это помогает