插件化原理分析

插件化原理分析
插件化要解决的三个核心问题:类加载、资源加载、组件生命周期管理。
类加载:Android中经常使用的两种类加载器:PathClassLoader和DexClassLoader,它们都继承于BaseDexClassLoader。
DexClassLoader的构造函数比PathClassLoader多了一个,optimizedDirectory参数,这个是用来指定dex的优化产物odex的路径,在源码注释中,指出这个参数从API 26后就弃用了。
PathClassLoader主要用来加载系统类和应用程序的类,在ART虚拟机上能够加载未安装的apk的dex,在Dalvik则不行。
DexClassLoader用来加载未安装apk的dex。
资源加载:Android系统经过Resource对象加载资源,所以只须要添加资源(即apk文件)所在路径到AssetManager中,便可实现对插件资源的访问。因为AssetManager的构造方法时hide的,须要经过反射区建立。
组件生命周期管理:对于Android来讲,并非说类加载进来就能够使用了,不少组件都是有“生命”的;所以对于这些有血有肉的类,必须给他们注入活力,也就是所谓的组件生命周期管理。
在解决插件中组件的生命周期,一般的作法是经过Hook相应的系统对象,实现欺上瞒下,后面将经过Activity的插件化来进行讲解。







android

    // 第一步:反射获得 ListenerInfo 对象
        Method getListenerInfo = View.class.getDeclaredMethod("getListenerInfo");
        //android.view.View$ListenerInfo android.view.View.getListenerInfo()
        getListenerInfo.setAccessible(true);
        Object listenerInfo = getListenerInfo.invoke(view);//View$ListenerInfo
        // 第二步:获得原始的 OnClickListener事件方法
        Class<?> listenerInfoClz = Class.forName("android.view.View$ListenerInfo");//class android.view.View$ListenerInfo
        Field mOnClickListener = listenerInfoClz.getDeclaredField("mOnClickListener");//public android.view.View$OnClickListener android.view.View$ListenerInfo.mOnClickListener
        mOnClickListener.setAccessible(true);
        View.OnClickListener originOnClickListener = (View.OnClickListener) mOnClickListener.get(listenerInfo);//MainActivity@4846
        // 第三步:用 Hook代理类 替换原始的 OnClickListener









ide


        View.OnClickListener hookedOnClickListener = new HookedClickListenerProxy(originOnClickListener);
        mOnClickListener.set(listenerInfo, hookedOnClickListener);
        
        
        
           @UnsupportedAppUsage
    static public INotificationManager getService()
    {
        if (sService != null) {
            return sService;
        }
        IBinder b = ServiceManager.getService("notification");
        sService = INotificationManager.Stub.asInterface(b);
        return sService;
    }
    
    
    public static Object newProxyInstance(ClassLoader loader,
                                          Class<?>[] interfaces,
                                          InvocationHandler h)
                                          




















函数

相关文章
相关标签/搜索