Entschuldigung, ich bin spät dran und die Frage hat bereits eine akzeptierte Antwort, aber ja , Sie können externe Bibliotheken herunterladen und ausführen. So habe ich es gemacht:
Ich habe mich gefragt, ob dies machbar ist, also habe ich die folgende Klasse geschrieben:
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.");
}
}
Und ich habe es in eine DEX-Datei gepackt, die ich auf der SD-Karte meines Geräts gespeichert habe /sdcard/shlublu.jar.
Dann schrieb ich das "dumme Programm" unten, nachdem ich es MyClassaus meinem Eclipse-Projekt entfernt und bereinigt hatte:
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();
}
}
}
Grundsätzlich wird die Klasse folgendermaßen MyClassgeladen:
ein ... kreieren DexClassLoader
Verwenden Sie es, um die Klasse MyClassaus zu extrahieren"/sdcard/shlublu.jar"
und speichern Sie diese Klasse im "dex"privaten Verzeichnis der Anwendung (interner Speicher des Telefons).
Anschließend wird eine Instanz von erstellt MyClassund doSomething()die erstellte Instanz aufgerufen.
Und es funktioniert ... Ich sehe die MyClassin meinem LogCat definierten Spuren :

Ich habe sowohl einen Emulator 2.1 als auch mein physisches HTC-Handy (auf dem Android 2.2 ausgeführt wird und das NICHT gerootet ist) ausprobiert.
Dies bedeutet, dass Sie externe DEX-Dateien erstellen können, die von der Anwendung heruntergeladen und ausgeführt werden können. Hier wurde es auf die harte Tour gemacht (hässliche ObjectCasts, Method.invoke()hässliche Calls ...), aber es muss möglich sein, mit Interfaces zu spielen , um etwas sauberer zu machen.
Beeindruckend. Ich bin der erste überrascht. Ich hatte a erwartet SecurityException.
Einige Fakten zur weiteren Untersuchung:
- Mein DEX shlublu.jar wurde signiert, aber nicht meine App
- Meine App wurde über eine Eclipse / USB-Verbindung ausgeführt. Dies ist also eine nicht signierte APK, die im DEBUG-Modus kompiliert wurde