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ą?

Author: sehugg, 2009-06-16

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).

 13
Author: Chris Boyle,
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ć.

 3
Author: Lucas S.,
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.)

[[7]} app-private data area (get the path from Context.getFilesDir()) jest bezpieczniejszy, a także ma tę zaletę, że jest czyszczony automatycznie po odinstalowaniu aplikacji. Jest to zalecane podejście.
 2
Author: fadden,
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