Zdalne Ładowanie kodu na Androida
Rozwijam bibliotekę dla Androida, która wymaga częstych aktualizacji z centralnego serwera. Myślałem, jak miło byłoby, gdyby moja biblioteka mogła się zaktualizować -- lub gdybym mógł po prostu wydać bibliotekę bootstrap, która pobiera bibliotekę docelową, gdy aplikacja jest zainstalowana.
Widzę tę klasę w 1.5 o nazwie "DexClassLoader", ale wydaje się, że w sieci jest niewiele cennego poza dokumentami API. Czy ktoś wykorzystał to z powodzeniem do scenariusza, który opisałem?
Także, czy warunki Android Market na to pozwalają?
3 answers
Z powodzeniem użyłemDexClassLoader . Ważne jest, aby dostarczyć dexOutputDir
, który jest faktycznie zapisywalny przez Twoją aplikację, więc Nie /data/dalvik-cache
. W przeciwnym razie log pokaże jedną lub dwie linijki o braku zapisu, po których następuje 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");
Aby Class.forName()
zadziałało, możesz spróbować wątku.setContextClassLoader () (nie mam).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-24 13:24:43
Rzeczywiście to, czego chcesz, jest wspierane i działa. DexClassLoader nie działa zgodnie z oczekiwaniami, ale poniższy kod działa dobrze.
DexFile df = new DexFile(new File("/data/app/my_downloaded_lib.apk"));
ClassLoader cl = getClassLoader();
Class clazz = df.loadClass("com/my/lib/MyClass", cl);
Jeśli chodzi o pytanie dotyczące rynku, nie widzę w tym żadnego problemu, ale musisz przeczytać EULA, aby się upewnić.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-16 22:54:34
DexClassLoader
to właściwa odpowiedź. Aplikacje nigdy nie powinny używać DexFile
Bezpośrednio (ma być używana przez class loaders).
Możesz użyć zewnętrznej pamięci masowej (/sdcard
), lub prywatnego obszaru danych aplikacji, dla parametru dexOutputDir
. Pamięć zewnętrzna jest zwykle większa, ale jeśli karta zostanie wyrzucona, aplikacja zostanie zabita, a ze względu na brak egzekwowania uprawnień do plików, strona trzecia może łatwo zastąpić Twój kod. Może to umożliwić złośliwym aplikacjom wykonywanie dowolnych działań. (Jeśli i tak chcesz to zrobić, pobierz ścieżkę przez Environment.getExternalStorageDirectory()
; wymaga pozwolenia WRITE_EXTERNAL_STORAGE
.)
Context.getFilesDir()
) jest bezpieczniejszy, a także ma tę zaletę, że jest czyszczony automatycznie po odinstalowaniu aplikacji. Jest to zalecane podejście.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-16 18:24:13