Android動態載入技術(外掛程式化技術)

來源:互聯網
上載者:User

標籤:就是   bsp   direct   try   它的   return   method   out   代理   

No1:

外掛程式化技術的好處:

1)減輕應用的記憶體和CPU佔用

2)實現熱插拔,即在不發布新版本的情況下更新某些模組

No2:

外掛程式化方案必須要解決三個基礎性問題:資源訪問、Activity生命週期的管理和ClassLoader的管理

No3:

宿主是指普通的apk,外掛程式一般指經過處理的dex或者apk。外掛程式化架構大多採用apk作為外掛程式,很多需要用到代理Activity,外掛程式Activity的啟動大多數是藉助一個代理Activity來實現的。

No4:

Activity的工作主要是通過ContextImpl來完成的,Activity中有一個交mBase的成員變數,它的類型就是ContextImpl。Context中有兩個抽象方法getAssets和getResources,通過它們來擷取資源的,真正實現在ContextImpl中。

No5:

資源訪問

載入apk中的資源

protected void loadResources(){    try{        AssetManager assetManager = AssetManager.class.newInstance();        Method addAssetPath = assetManager.getClass().getMethod("addAssetPath",String.class);        addAssetPath.invoke(assetManager,mDexPath);        mAssetManager = assetManager;    }catch(Exception e){        e.printStackTrace();    }    Resources superRes = super.getResources();    mResources = new Resources(mAssetManager,superRes.getDisplayMetrics(),superRes.getConfiguration());    mTheme = mResources.newTheme();    mTheme.setTo(super.getTheme());}

通過反射,調用AssetManager中addAssetPath方法,將一個apk中的資源載入到Resources對象中。然後通過AssetManager來建立一個新的Resources對象

public final int addAssetPath(String path){    synchronized(this){        int res = addAssetPathNative(path);        makeStringBlocks(mStringBlocks);        return res;    }}

接著在代理Activity中實現getAssets和getResources

@Overridepublic AssetManager getAssets(){    return mAssetManager == null?super.getAssets():mAssetManager;}@Overridepublic Resources getResources(){    return mResources == null?super.getResources():mResources;}

No6:

Activity生命週期的管理

反射方式

@Overrideprotected void onResume(){    super.onResume();    Method onResume = mActivityLifecircleMethods.get("onResume");    if(onResume!=null){        try{            onResume.invoke(mRemoteActivity,new Object[]{ })        }catch(Exception e){            e.printStackTrace();        }    }}@Overrideprotected void onPause(){    Method onPause = mActivityLifecircleMethods.get("onPause");    if(onPause!=null){        try{            onPause.invoke(mRemoteActivity,new Object[]{ })        }catch(Exception e){            e.printStackTrace();        }    }    super.onPause();}

介面方式

public interface DLPlugin{    public void onStart();    public void onRestart();    public void onResume();    public void onPause();    public void onStop();    public void onDestroy();    ...}

代理Actvitiy中調用

...@Overrideprotected void onStart(){    mRemoteActivity.onStart();    super.onStart();}@Overrideprotected void onRestart(){    mRemoteActivity.onRestart();    super.onRestart();}@Overrideprotected void onResume(){    mRemoteActivity.onResume();    super.onResume();}

mRemoteActivity就是DLPlugin的實現

No7:

外掛程式ClassLoader的管理

public class DLClassLoader extends DexClassLoader{    private static final String TAG ="DLClassLoader";    private static final HashMap<String,DLClassLoader> mPluginClassLoaders = new HashMap<String,DLClassLoader>();        protected DLClassLoader(String dexPath,String optimizedDirectory,String libraryPath,Classloader parent){        super(dexPath,optimizedDirectory,libraryPath,parent);    }        public static DLClassLoader getClassLoader(String dexPath,Context context,Classloader parentLoader){        DLClassLoader dLassLoader = mPluginClassLoaders.get(dexPath);        if(dLassLoader != null){            return DLClassLoader;        }                File dexOutputDir = context.getDir("dex",Context.MODE_PRIVATE);        final String dexOutputPath = dexOutputDir.getAbsolutePath();        dLClassLoader = new DLClassLoader(dexPath,dexOutputPath,null,parentLoader);        mPluginClassLoaders.put(dexPath,dLClassLoader);                return dLClassLoader;    }}

 

通過將不同外掛程式的ClassLoader儲存在一個HashMap中,這樣就可以保證不同外掛程式中的類彼此互不干擾。

Android動態載入技術(外掛程式化技術)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.