2009-06-16 9 views
15

Estoy desarrollando una biblioteca para Android que requiere actualizaciones frecuentes de un servidor central. Estaba pensando en lo bueno que sería si mi biblioteca pudiera actualizarse a sí misma, o si solo pudiera lanzar una biblioteca de rutina de arranque que descargue la biblioteca de destino cuando la aplicación esté instalada.código de control remoto de Android cargando

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

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

Respuesta

13

He utilizado con éxito DexClassLoader. Es importante proporcionar un dexOutputDir que su aplicación puede escribir realmente, así 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"); 

Class.forName() Para hacer el trabajo, usted podría intentar Thread.setContextClassLoader() (que no tengo).

+0

Hola, ¿pueden agregar el código fuente completo? Será una gran ayuda. Gracias de antemano. –

+1

no es un trabajo para lollipop android5 y superior debido a ART: http://stackoverflow.com/questions/27349097/load-dex-file-dynamically-on-android-5-0 – gturedi

3

De hecho, lo que quiere es compatible y funciona. DexClassLoader no funciona como esperaba, 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 cuestión del mercado, no veo ningún problema con esto, pero debe leer el EULA para estar seguro.

+0

Esto funciona, pero crear un objeto File es contraproducente: DexFile tomará el camino y lo abrirá solo. Puede usar el constructor que toma una ruta de Cadena. –

+0

Hola, quizás tengas razón, pero cuando respondí, esta fue la única forma en que funciona. –

2

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

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

El área de datos de la aplicación y el privado (obtener la ruta de Context.getFilesDir()) es más seguro, y también tiene la ventaja de ser limpiado automáticamente si la aplicación se desinstala. Este es el enfoque recomendado.

+4

También creo que cargar código fuera la tarjeta SD sería algo insegura. – CommonsWare

+0

NUNCA escriba su archivo dex en la ruta de la tarjeta SD. Esto creará una vulnerabilidad de seguridad. http://www.symantec.com/connect/blogs/android-class-loading-hijacking – ajma

+0

Actualizado para abordar problemas de seguridad. – fadden

Cuestiones relacionadas