申し訳ありませんが、私は遅れており、質問にはすでに回答が受け入れられていますが、はい、外部ライブラリをダウンロードして実行できます。これが私がした方法です:
これが実現可能かどうか疑問に思っていたので、次のクラスを作成しました。
package org.shlublu.android.sandbox;
import android.util.Log;
public class MyClass {
public MyClass() {
Log.d(MyClass.class.getName(), "MyClass: constructor called.");
}
public void doSomething() {
Log.d(MyClass.class.getName(), "MyClass: doSomething() called.");
}
}
そして、デバイスのSDカードにとして保存したDEXファイルにパッケージ化しました/sdcard/shlublu.jar
。
MyClass
次に、Eclipseプロジェクトから削除してクリーンアップした後、以下の「愚かなプログラム」を作成しました。
public class Main extends Activity {
@SuppressWarnings("unchecked")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
try {
final String libPath = Environment.getExternalStorageDirectory() + "/shlublu.jar";
final File tmpDir = getDir("dex", 0);
final DexClassLoader classloader = new DexClassLoader(libPath, tmpDir.getAbsolutePath(), null, this.getClass().getClassLoader());
final Class<Object> classToLoad = (Class<Object>) classloader.loadClass("org.shlublu.android.sandbox.MyClass");
final Object myInstance = classToLoad.newInstance();
final Method doSomething = classToLoad.getMethod("doSomething");
doSomething.invoke(myInstance);
} catch (Exception e) {
e.printStackTrace();
}
}
}
基本的に、MyClass
そのようにクラスをロードします。
次に、のインスタンスを作成し、作成されたインスタンスMyClass
を呼び出しdoSomething()
ます。
そしてそれは機能します... MyClass
LogCatで定義されたトレースが表示されます。

エミュレーター2.1と物理的なHTC携帯電話(Android 2.2を実行していて、ルート化されていない)の両方で試しました。
これは、アプリケーションがダウンロードして実行するための外部DEXファイルを作成できることを意味します。ここでは難しい方法(醜いObject
キャスト、醜い呼び出し...)が行われましたが、何かをよりクリーンにするためMethod.invoke()
にsで遊ぶことが可能でなければなりません。Interface
わお。私は最初に驚いた。私は期待していたSecurityException
。
詳細調査に役立ついくつかの事実:
- 私のDEXshlublu.jarは署名されましたが、私のアプリは署名されていません
- 私のアプリはEclipse/USB接続から実行されました。つまり、これはDEBUGモードでコンパイルされた署名されていないAPKです。