2012-03-28 11 views
15

¿Hay alguna manera de ver dinámicamente la caché específica de la aplicación en Android? Estoy guardando imágenes en el caché (/ data/data/my_app_package/cache) y estoy 99% seguro de que están guardando allí, pero no estoy seguro de cuánto tiempo se quedan.¿Cómo veo el caché específico de la aplicación Android?

Cuando miro en el caché utilizando el DDMS File Explorer dentro de Eclipse, siempre está vacío. También intenté examinar el directorio de caché apropiado en ADB y nuevamente siempre está vacío.

¿Alguna sugerencia?

Respuesta

8

A menos que ADB se ejecute como root (como lo haría en un emulador), generalmente no se puede ver nada en/data a menos que una aplicación propietaria lo haya hecho legible. Además, no puede navegar por la estructura del directorio; solo puede listar los archivos una vez que llega a un directorio donde tiene acceso, al ingresar explícitamente su ruta.

términos generales tiene cinco opciones:

  • hacer en la investigación dentro de la aplicación propietaria

  • Marcar los archivos en cuestión como pública, y usar algo (adb shell o tirón ADB) donde puede introducir un nombre de ruta completa, en lugar de tratar de navegar por el árbol

  • tienen la aplicación poseer copiar todo el directorio de la tarjeta SD

  • utilizar un emulador o dispositivo arraigado en adb (y por lo tanto el acceso del navegador DDMS) se puede ejecutar como root (o use un explorador de archivos raíz o un dispositivo arraigado)

  • uso ADB y el período previo como herramienta con una Debuggable apk para obtener un shell de línea de comandos que se ejecuta como id de usuario de la aplicación.Para aquellos familiarizados con la línea de comandos de Unix, esto puede ser el más eficaz (aunque el sh caja de herramientas en android es limitado, y utiliza su pequeño vocabulario de los mensajes de error de forma engañosa)

+0

Esta es una respuesta incorrecta, como se puede acceder a los datos de su propia aplicación a través de 'adb' sin privilegios de root, es decir, también de dispositivos desbloqueados reales. Ver mi respuesta – Tamas

+3

@Tamas: no, esta es una respuesta correcta, y ** ya menciona ** la posibilidad de ejecutar como herramienta, incluida su ** limitación ** de requerir una depuración, algo que no mencionaste. –

2

archivos almacenados en caché se almacenan de hecho en/data/data/my_app_package/cache

Asegúrese de almacenar los archivos usando el siguiente método:

String cacheDir = context.getCacheDir(); 
File imageFile = new File(cacheDir, "image1.jpg"); 
FileOutputStream out = new FileOutputStream(imageFile); 
out.write(imagebuffer, 0, imagebufferlength); 

donde imagebuffer [] contiene datos de imagen en formato de byte y imagebufferlength es la longitud del contenido que se escribirá en FileOutputStream.

Ahora, puede mirar DDMS File Explorer o hacer un "shell adb" y cd a/data/data/my_app_package/cache y hacer un "ls". Encontrará los archivos de imagen que ha almacenado a través del código en este directorio.

Por otra parte, a partir de la documentación de Android:

Si desea almacenar en caché algunos datos, en lugar de almacenarla forma persistente, se debe utilizar getCacheDir() para abrir un archivo que representa el directorio interno en el que la aplicación debe guardar archivos temporales de caché

Cuando el dispositivo tiene poco espacio de almacenamiento interno, Android puede eliminar estos archivos de caché para recuperar espacio. Sin embargo, no debe confiar en que el sistema limpie estos archivos por usted. Siempre debe mantener los archivos de caché usted mismo y mantenerse dentro de un límite razonable de espacio consumido, como 1 MB. Cuando el usuario desinstala su aplicación, estos archivos son eliminados.

0

Aquí está el código: sustituir package_name por su nombre de paquete específico.

Intent i = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS); 
i.addCategory(Intent.CATEGORY_DEFAULT); 
i.setData(Uri.parse("package:package_name")); 
startActivity(i); 
20

Usted puede utilizar este comando para listar los archivos para su propio depurable apk:

adb shell run-as com.corp.appName ls /data/data/com.corp.appName/cache 

Y este script para tirar de la caché:

#!/bin/sh 
adb shell "run-as com.corp.appName cat '/data/data/com.corp.appNamepp/$1' > '/sdcard/$1'" 
adb pull "/sdcard/$1" 
adb shell "rm '/sdcard/$1'" 

Luego se puede tirar un archivo desde caché como este:

./pull.sh cache/someCachedData.txt 

No se requiere raíz.

+1

Sí, run-as puede ser útil pero solo funciona con una depuración. Además, la herramienta está completamente rota en al menos una versión de Android. –

+1

Prefiero esta variación de script de shell, que me permite extraer de cualquier directorio anidado y volcar a un nombre de archivo de salida diferente. ¡Gracias! 'adb shell" run-as $ 1 cat '/ data/data/$ 1/$ 2'> '/ sdcard/$ 3' "; pull de adb "/ sdcard/$ 3"; adb shell "rm '/ sdcard/$ 3'" ' – qix

+1

buen script, pero ¿por qué' cat' el archivo en lugar de simplemente copiarlo a través de 'cp'? 'cat' a veces puede arruinar líneas nuevas por lo que parece que' cp' sería más seguro. – gMale

1

Pregunta: ¿Dónde está el caché específico de la aplicación ubicado en Android?

respuesta: /datos/datos

Cuestiones relacionadas