Android Code-Remote-Laden
-
05-07-2019 - |
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?
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.