Android拦截类加载

时间:2017-12-27 03:00:33

标签: android dex classloading

是否可以拦截Android的默认类加载并有条件地避免加载类?

我的动机是拦截Android的默认类加载过程,并避免根据条件加载类,如

if (!fooScope) {
  throw IllegalStateException("Trying to load class from FooScope");
}

我不打算改变加载类的位置,而是对在什么时间点加载哪些类进行细粒度控制,我称之为严格类加载。在此,不应加载任何在满足某些条件之前不应加载的类。我正在寻找拦截类加载的方法来实现这一点。

1 个答案:

答案 0 :(得分:0)

您可能需要使用某种挂钩库。 像这个只支持Android 4.4的库(https://github.com/cmzy/ZHookLib

然后你需要挂钩ClassLoader.class的loadClass(String name)方法 为了查看所有已加载的类。

但仍然存在加载类的顺序问题。 你可以尝试从扩展应用程序的类中做到这一点,该类可能首先加载但我不确定..

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() {...});
    }

一旦你连接了ClassLoader的loadClass,你应该能够做你喜欢的事情。 请记住,有多个ClassLoader并且我不确定如果抛出异常将会发生什么。

我希望它有所帮助