1

I want to use dex class loader in my application and I read developer.google guide and some question about it there but still, I can't find it out how to use dex class loader . I really appreciate it if anybody explains an example here. Thank you.

My code: this code is not workking

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    loadDexClassses("dex-" + getApplicationContext().getPackageName().hashCode());




}

public static void loadDexClassses(String optDexFolder) {
    if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
        Log.v("loadDexClassses", "LoadDexClasses is only available for ICS or up");
    }
    File[] files = new File("data/local/tmp/testjars/").listFiles();

    if (files == null) {
        Log.v("loadDexClasses", "There was no " + "data/local/tmp/testjars/");
        return;
    }

    Log.v("loadDexClasses", "Dex Preparing to loadDexClasses!");

    for (File file : files) {
        Log.v("loadDexClasses", "In for!");

        final File tmpDir = new File("data/local/tmp/optdexjars/" + optDexFolder + "/");

        tmpDir.mkdir();

        final DexClassLoader classloader = new DexClassLoader(
                file.getAbsolutePath(), tmpDir.getAbsolutePath(),
                "data/local/tmp/natives/",
                ClassLoader.getSystemClassLoader());

        Log.v("loadDexClasses", "Searching for class : "
                + "com.registry.Registry");

        Class<?> classToLoad = null;
        try {
            classToLoad = (Class<?>) classloader
                    .loadClass("com.registry.Registry");
            Field classesField = classToLoad.getDeclaredField("_classes");

            ArrayList<Class<?>> classes = (ArrayList<Class<?>>) classesField.get(null);

            for(Class<?> cls : classes) {
                Log.v("loadDexClasses", "Class loaded " + cls.getName());
            }

            for (Class<?> cls : classes) {
                Log.v("loadDexClasses", "Class loaded " + cls.getName());
                if (cls.getName().contains("ClassToBeImported")) {
                    Method m = cls.getMethod("method");

                    ClassLoader xb = (ClassLoader) m.invoke(null);

                    if (xb.equals(ClassLoader.getSystemClassLoader()))
                        Log.v("loadDexClasses", "Same ClassLoader");
                    else
                        Log.v("loadDexClasses", "Different ClassLoader");
                }
            }


        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }


    }
}

}

Ehsan
  • 2,676
  • 6
  • 29
  • 56

1 Answers1

0

Even after 3 long years, I'm leaving mine. That's your code, with slight changes:

DexClassLoader classloader = new DexClassLoader(
            **file**, tmpDir.getAbsolutePath(),
            "data/local/tmp/natives/",
            ClassLoader.getSystemClassLoader());

First argument of the DexClassLoader would be the dexPath - let's say you have some .dex files in that folder above ("data/local/tmp/testjars/") - or jar/apk files.

tanuk
  • 498
  • 9
  • 10