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 MyClass
aus 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 MyClass
geladen:
ein ... kreieren DexClassLoader
Verwenden Sie es, um die Klasse MyClass
aus 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 MyClass
und doSomething()
die erstellte Instanz aufgerufen.
Und es funktioniert ... Ich sehe die MyClass
in 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 Object
Casts, Method.invoke()
hässliche Calls ...), aber es muss möglich sein, mit Interface
s 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