1. 程式人生 > >Android 動態載入dex

Android 動態載入dex

為什麼要學習這個,動態載入dex,因為學習android外掛化必須要了解這個才行。

  Android使用Dalvik虛擬機器載入可執行程式,所以不能直接載入基於class的jar,而是需要將class轉化為dex位元組碼,從而執行程式碼。優化後的位元組碼檔案可以存在一個*.jar中,只要其內部存放的是*.dex即可使用。

       將class的jar包轉化為dex需要用到命令dx(在*\android-sdk\build-tools\version[23.0.1] 或 *\android-sdk\platform-tools下能找到);命令使用方式為:dx --dex --output=output.jar origin.jar,該命令將包含class的origin.jar轉化為包含dex的output.jar檔案。

 Android支援動態載入的兩種方式是:DexClassLoader和PathClassLoader,DexClassLoader可載入jar/apk/dex,且支援從SD卡載入;PathClassLoader據說只能載入已經安裝在Android系統內APK檔案

 public void loadDex(View view){
        String dexpath = Environment.getExternalStorageDirectory().toString() + File.separator + "output.jar";
        File dexOutputDir = getDir("dex", 0);
         DexClassLoader loader = new DexClassLoader(dexpath, dexOutputDir.getAbsolutePath(), null, getClassLoader());
        Class libProviderClazz = null;
        try {
            libProviderClazz = loader.loadClass("com.example.DynamicImp");
            IDynamic lib = (IDynamic)libProviderClazz.newInstance();
            Toast.makeText(MainActivity.this, lib.helloWorld(), Toast.LENGTH_SHORT).show();
        } catch (Exception exception) {
             exception.printStackTrace();
        }

    }