Pregunta

Estoy desarrollando una biblioteca para Android que requiere actualizaciones frecuentes desde un servidor central. Estaba pensando en lo bonito que sería si mi biblioteca pudiera actualizarse, o si pudiera lanzar una biblioteca de arranque que descargue la biblioteca de destino cuando se instale la aplicación.

Veo esta clase en 1.5 llamada " DexClassLoader " pero parece que hay muy poco en la web además de los documentos API. ¿Alguien lo ha utilizado con éxito para el escenario que describí?

Además, ¿los términos de Android Market permiten tal cosa?

¿Fue útil?

Solución

He utilizado con éxito DexClassLoader . Es importante proporcionar un dexOutputDir que su aplicación pueda escribir realmente, por lo que no / data / dalvik-cache . De lo contrario, el registro mostrará una o dos líneas sobre la falla al escribir allí, seguido de 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");

Para hacer que Class.forName () funcione, puedes probar Thread.setContextClassLoader () (no tengo).

Otros consejos

De hecho, lo que quieres es compatible y funciona. DexClassLoader no funciona como se esperaba para mí, pero el siguiente código funciona bien.

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

Sobre la pregunta del mercado, no veo ningún problema con esto, pero debe leer el EULA para estar seguro.

DexClassLoader es la respuesta correcta. Las aplicaciones nunca deben usar DexFile directamente (está destinado a ser usado por los cargadores de clases).

Puede usar almacenamiento externo ( / sdcard ), o el área de datos privados de la aplicación, para el parámetro dexOutputDir . El almacenamiento externo generalmente es más grande, pero si se expulsa la tarjeta, su aplicación se eliminará y, debido a la falta de cumplimiento de los permisos de archivos, es fácil que un tercero reemplace su código. Esto puede permitir que aplicaciones maliciosas hagan que su aplicación realice acciones arbitrarias. (Si desea hacerlo de todos modos, obtenga la ruta a través de Environment.getExternalStorageDirectory () ; requiere el permiso WRITE_EXTERNAL_STORAGE ).

El área de datos privados de la aplicación (obtener la ruta desde Context.getFilesDir () ) es más segura y también tiene la ventaja de que se limpia automáticamente si se desinstala la aplicación. Este es el enfoque recomendado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top