47 votos

¿Por qué tengo que borrar la caché de Dalvik?

Cuando estoy actualizando una ROM personalizada, siempre hay una instrucción para borrar la caché de Dalvik . No veo una razón por la que esto sea necesariamente.

Observando el logcat mientras el sistema está arrancando puedo ver claramente que si una aplicación cambió, su dex se invalida el archivo y se regenera. Sin embargo, cuando menciono esto en cualquier lugar me encuentro con el silencio. Como si ni siquiera algunos desarrolladores de ROMs fueran conscientes de esto y sólo lo hicieran porque todo el mundo lo hace.

Así que las preguntas:

  • ¿Hubo alguna versión de Android en la que los archivos Dalvik no se invalidaran durante el arranque?
  • ¿Hay alguna ventaja en hacer esto uno mismo, en lugar de dejar que el sistema haga el trabajo que se supone que debe hacer?

Una respuesta ideal incluiría referencias al código correspondiente, para tener una referencia la próxima vez que esto surja.

45voto

Nick Pierpoint Puntos 7976

Para responder a sus preguntas:

  • No conozco ninguna versión de Android en la que el Dalvik no se haya invalidado en el arranque. Tal vez la versión inicial 1.0 tenía que, realmente no sé, han pasado por Eclair, Froyo, Gingerbread, Ice Cream Sandwich. Tienes que buscar en el árbol de fuentes y volver a basarte en CupCake o Donut (1.5 y 1.6 respectivamente)

  • La razón detallada :)

La razón por la que el Borrar la caché es porque todos los apks, incluidos los del sistema, tienen un dex Cuando la ROM se inicia por primera vez, el Dalvik de Android revisa todas y cada una de esas aplicaciones, extrae el archivo dex y lo coloca en la caché. /data/dalvik-cache acelerando así la ejecución de la propia aplicación.

La mayoría de las ROMs tienen apks que son odex 'ed, la caché se incluye en el propio apk como un archivo externo.

Muchos modders de ROMs personalizadas tendrían esos apks deodex 'd, lo que significa que el archivo dex es reemplazado y reempaquetado para hacer más fácil la tematización/modificación de un apk.

Cuando flasheas una ROM personalizada, y no limpias la caché, los apk's de las ROMs personalizadas más nuevas tendrán un dex adjunto, y cuando el Dalvik los revisa, ve el archivo dex existente en caché que se encuentra en el directorio, y se lo salta, entonces cuando ejecutas la aplicación, tienes garantizado un cierre forzado o ANR (Application Not Responding).

Usted no está perdiendo datos en sí, si se utiliza ClockWorkMod Recovery, y Borrar datos está seleccionado, entonces sí, todos los ajustes relacionados con las aplicaciones se borran limpiamente - mira en /data/app .

Así que puedes Borrar la caché pero no Borrar datos , lo que se hace efectivamente, es encajar los apks más nuevos en su lugar, en el que tiene la configuración retenida. Esto era un escenario bastante común con nightlies CyanogenMod donde una construcción inestable / prueba de ROM se parpadea, y los ajustes retenidos con la limpieza de la caché. El kilometraje variará dependiendo de lo que las aplicaciones descargadas desde el mercado (ajustes habría cambiado por la versión bump bastante probable).

Para obtener los mejores resultados, sería conveniente realizar ambos Borrar datos y Borrar la caché para garantizar la integridad y la ausencia de errores de programa dentro de la propia aplicación.

Sí, eso significaría que el tiempo de arranque sería más lento, pero su momento inicial de apagado. Después de eso sería el arranque más rápido. Realmente en una cáscara de nuez, limpiando explícitamente la memoria caché en sí a través de CWM en realidad ayuda a acelerar y asegurar ningún residuo de la versión anterior en el lugar que podría conseguir munged pulg (Ahora en esta etapa, me estoy dando cuenta de su pregunta por lo que en toda la justicia, no han visto realmente Android no realizar la invalidación de la memoria caché en sí en el arranque al parpadear una nueva ROM ..)

Utiliza la fuente Luke en serio! :D

frameworks/base/core/java/com/android/internal/os/ZygoteInit.java es el código de arranque para cada apk runtime. Interactúa con el código C nativo que se encuentra en el dalvik que contiene instrucciones específicas del chipset para interpretar el bytecode dentro del apk al conjunto de instrucciones nativas de la CPU. ARMv6 es más o menos una versión hackeada de ARMv5 (que era el chipset original en las versiones más antiguas de Android antes de Eclair), por lo que no verá ARMv6 en la fuente AOSP de google. CyanogenMod tendrá ese ARMv6 en su fuente.

0 votos

Por el bien de esta discusión vamos a suponer que estamos hablando de una versión oficial de CM7. Permítanme comenzar diciendo que nunca, nunca he limpiado mi caché dalvik y nunca experimentó problemas que se resolvería por hacerlo. Como no está odexado, no hay manera de que haya varios archivos (o)dex presentes, y por lo tanto en el arranque el archivo viejo es reemplazado por uno recién generado. Ah, y si es un gran problema, ¿por qué los desarrolladores no añaden esto en el script del actualizador? Comprobaré la fuente, gracias.

1 votos

En realidad se puede poner explícitamente que en el actualizador-script, pero que puede cabrear a los demás al flashear porque "Oh mierda, he perdido mi configuración / datos" y CM probablemente no quería ser quemado por las preguntas / respuestas de la llama como en "¿Por qué se borra mi caché al flashear una nueva versión de CM?" - Tal vez es la responsabilidad de CM por lo que dio esa opción al usuario final? Y ponerlo de nuevo en ellos para que si se flasheó sin wipe, y quejarse en los foros a lá "Hey mi aplicación se está estrellando", CM puede dar la vuelta y decir "¿Has limpiado?"

0 votos

No quise decir data/data pero data\dalvik-cache . Posiblemente sólo los del sistema.

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X