3

私は現在、ノードがサーバーからjarファイルとdexファイルをダウンロードして実行時の動作を変更できる分散システムを開発しています。Android 以外のノードは、次のコードを使用して jar を追加し、ClassLoader によって提供される addURL メソッドを呼び出します。

File f = new File(fileName);
URL u = f.toURI().toURL();

URLClassLoader sysloader = (URLClassLoader) ClassLoader.getSystemClassLoader();

Class<?> sysclass = URLClassLoader.class;

try {
    Method method = sysclass.getDeclaredMethod("addURL", parameters);
    method.setAccessible(true);
    method.invoke(sysloader, new Object[] { u });
} catch (Throwable t) { }

Androidノードのdexファイルで同じことを行うことは可能ですか? DexClassLoader および PathClassLoader は、addURL などのメソッドを提供しません。リフレクションを使用して単一のクラスを追加できることはわかっていますが、dex ファイル全体を追加する方法がわかりません。問題は、dex にすべてのクラスを 1 つずつ追加すると、欠落している依存関係の例外が発生することです。これは、クラスが別のクラスに依存している可能性があり、そのクラスがまだ追加されていないためです。とにかく、単一のクラスを追加するために使用するコードは次のとおりです。

File f = new File(pathToSaveFile + dexFile);
Object obj = null;
final File optimizedDexOutputPath = context.getDir("outdex", 0);

DexClassLoader classLoader = new DexClassLoader(
    f.getAbsolutePath(),
    optimizedDexOutputPath.getAbsolutePath(), null,
    context.getClassLoader());

String path = pathToSaveFile + dexFile;

try {
    DexFile dx = DexFile.loadDex(
        path,
        File.createTempFile("opt", "dex", context.getCacheDir()).getPath(),
        0);
    Class<?> myClass = classLoader.loadClass(className);
} catch (Exception e) { }

動的コード オフロードを実行する際のセキュリティ上の問題は認識していますが、これは単なる研究プロジェクトです。

4

1 に答える 1

1

https://gist.github.com/nickcaballero/7045993でコードを試してください

このメソッドは、新しく作成した DexClassLoader を既存のものに追加します。

リフレクションを使用しているため、すべての Android バージョンで機能するとは限りません。少なくとも、私の SDK19 では動作します。

于 2014-10-20T03:08:30.793 に答える