Frage

ich eine Bibliothek für Android entwickle, die häufige Updates von einem zentralen Server erfordert. Ich dachte, wie schön es wäre, wenn meine Bibliothek selbst aktualisieren könnte -. Oder wenn ich könnte nur eine Bootstrap-Bibliothek freigeben, die die Ziel-Bibliothek herunterlädt, wenn die App installiert ist

Ich sehe diese Klasse in 1,5 genannten „DexClassLoader“, aber es scheint sehr wenig im Web neben der API-Dokumentation zu sein. Hat jemand dies erfolgreich für das Szenario verwendet, die ich beschrieben?

Auch, so die Bedingungen des Android Market erlauben etwas?

War es hilfreich?

Lösung

Ich habe erfolgreich verwendet DexClassLoader . Es ist wichtig, eine dexOutputDir zu schaffen, die tatsächlich beschreibbar durch Ihre Anwendung ist, so nicht /data/dalvik-cache. Andernfalls wird das Protokoll einer oder zwei Zeilen zeigt etwa dort zu schreiben versagt, gefolgt von ClassNotFoundException.

cl = new DexClassLoader("/full/path/com.example.apk",
                        getFilesDir().getAbsolutePath(),// /data/data/foo/files
                        null,  // native lib path, I haven't used this
                        MyClass.class.getClassLoader());
// This doesn't make Class.forName() work, instead I do this:
Class<?> foo = cl.loadClass("com.example.foo");

Um Class.forName() Arbeit zu machen, könnten Sie versuchen, Thread.setContextClassLoader () (ich habe nicht).

Andere Tipps

Tatsächlich, was Sie wollen unterstützt und arbeitet. DexClassLoader nicht funktioniert wie für mich erwartet, aber der folgende Code funktioniert gut.

DexFile df = new DexFile(new File("/data/app/my_downloaded_lib.apk"));
ClassLoader cl = getClassLoader();
Class clazz = df.loadClass("com/my/lib/MyClass", cl);

über den Markt Frage, ich sehe kein Problem mit diesem, aber Sie haben die EULA zu lesen um sicher zu sein.

DexClassLoader ist die richtige Antwort. Anwendungen sollten nie DexFile direkt verwenden (es soll durch Klassenlader verwendet werden).

könnten Sie verwenden externe Speicher (/sdcard) oder den privaten Datenbereich des App, für die dexOutputDir Parameter. Externer Speicher ist in der Regel größer, aber wenn die Karte, um Ihre App ausgeworfen wird, wird getötet, und aufgrund des Fehlens von Dateiberechtigungen Durchsetzung ist es einfach für einen Dritten Code zu ersetzen. Dies kann schädliche Apps kann Ihre App verursachen beliebige Aktionen auszuführen. (Wenn Sie es trotzdem tun, den Weg über Environment.getExternalStorageDirectory() erhalten;. Erfordert die WRITE_EXTERNAL_STORAGE Erlaubnis)

Der App-privater Datenbereich (den Weg von Context.getFilesDir() bekommt) ist sicherer, und hat auch den Vorteil, dass sie automatisch gereinigt, wenn die App deinstalliert wird. Dies ist die empfohlene Vorgehensweise.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top