插件化原理分析

插件化原理分析
插件化要解決的三個核心問題:類加載、資源加載、組件生命週期管理。
類加載: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)
                                          




















函數

相關文章
相關標籤/搜索