Análisis incremental de encabezados de archivos Xdelta3
Recientemente se ha desarrollado la función de actualización incremental de la aplicación. Según investigaciones y análisis previos (consulte el artículo "Investigación sobre el esquema de actualización incremental de Android" para obtener más detalles), se utilizó el algoritmo Xdelta3. En este proceso, hay muchos problemas, tales como:
......
En investigaciones anteriores, Google buscó información sobre la introducción, el uso y los problemas de Xdelta3. Son muy pocos artículos. Aparte del sitio web oficial, el único artículo que lo presenta completamente es RFC3284 VCDIFF, por lo que solo podemos resolver el problema combinando el proyecto oficial de Github con RFC3284 VCDIFF y registrándolo aquí.
De la introducción en el sitio web oficial de xdetal, podemos saber que el formato de archivo delta generado por Xdelta3 sigue el formato de datos RFC3284 VCDIFF. Entre ellos, en el artículo "VC diff Formato de datos comprimidos y diferencial universal", el encabezado del archivo delta se muestra en la Figura 1:
Lo siguiente se genera en base a la figura anterior combinada con la fuente código y la herramienta Xdelta3 específica Descripción del encabezado del archivo incremental:
Los primeros tres bytes del encabezado del archivo son el número mágico de VCDIFF, que se reconoce como el formato de archivo VCDIFF, y su valor es 0xD6C3C4, como se muestra en la Figura 2.
Representa 1 (8 bits en 1 byte) y las letras del código ASCLL "V", "C" y "D", como se muestra en la Figura 3.
Es decir:
v' = 01010110, D6 = 11010110
C' = 01000011, C3 = 1100001
D' = 01000100 , C4 = 11000100
En el código fuente de Xdelta3, puede encontrar definiciones de macros relacionadas con números mágicos, como se muestra en la Figura 4.
El cuarto byte del encabezado del archivo es el número de versión de VCDIFF, que actualmente está fijo en 0.
En el código fuente de Xdelta3, puede encontrar la definición de la macro de versión, como se muestra en la Figura 6.
Al mismo tiempo, también se encontró en la función de decodificación del código fuente int xd3 _ decode _ input (xd3 _ stream * stream) que cuando el valor de su número de versión es mayor que 0, le indicará que no es compatible y la decodificación falló, como se muestra en la Figura 7.
El quinto byte del encabezado del archivo es el indicador de encabezado de VCDIFF y el valor predeterminado es 04 (00000100).
De los 8 bits de este byte, los tres primeros bits representan un significado específico.
1) El primer bit de orden inferior es VCD_DECOMPRESS, que indica si se habilita la compresión secundaria (porque Xdelta admite la compresión secundaria). Cuando la compresión secundaria está activada, su valor es 1 (es decir, 0000001) y el ID del algoritmo de compresión secundaria se agrega al byte después de este byte, como se muestra en la siguiente figura.
Xdelta3 tiene dos algoritmos de compresión integrados DJW (algoritmo de compresión secundario ID=1) y FGK (algoritmo de compresión secundario ID=2), así como un LZMA dependiente externamente (algoritmo de compresión secundario ID=16). Algoritmo de compresión.
2) El segundo bit de orden inferior es VCD_CODETABLE y su valor es 1 (es decir, 00000010). Es necesario agregar el significado específico.
3) El tercer bit de orden inferior indica si se incluye información del encabezado de la aplicación. Cuando se incluye la información del encabezado de la aplicación, su valor es 1 (es decir, 00000100 = 04). Los bytes después de este byte contienen la longitud de la información del encabezado de la aplicación. Esto también explica por qué el valor predeterminado en la Figura 8 es 04, que se analizará en. la siguiente sección.
La sección anterior analizó que cuando el tercer bit del indicador HDR_ (el indicador de encabezado de VC diff) es 1, el siguiente byte contiene la información del encabezado de la aplicación y la longitud de la información del encabezado de la aplicación.
Según el código fuente de Xdelta3, se establece mediante la función static int main_set_app header(xd3_stream*stream, main_file*input, main_file*sfile).
Entre ellos, cuando el usuario no personaliza la información del encabezado de la aplicación, se utilizará la información del encabezado de la aplicación predeterminada, como se muestra en la Figura 15:
1) Cuando el nombre del archivo fuente está vacío, la información del encabezado de la aplicación es el nombre del archivo de entrada/identificador de compresión extendida;
2) Cuando el nombre del archivo fuente no está vacío, la información del encabezado de la aplicación es el nombre del archivo fuente/identificador de compresión extendida/entrada nombre de archivo/identificador de compresión extendida.
Generalmente, los indicadores de expansión y compresión están vacíos, por lo que la información común del archivo de encabezado de la aplicación es: nombre de archivo nuevo//nombre de archivo antiguo/, como versión2.txt//versión1.txt como se muestra en la Figura 16. /,.
A su vez, aquí también quedan respondidas nuestras dudas anteriores. Diferentes nombres de archivo del mismo archivo dan como resultado valores MD5 inconsistentes de los archivos delta generados por las diferencias.
Para verificar el análisis anterior, se realizaron las siguientes pruebas reales:
1) Información del encabezado de la aplicación definida por el usuario 'xuzx' (longitud 4 bytes), -axoxx, los resultados experimentales son como se muestran en la figura 18 y la Figura 19.
2) Cierre la información del encabezado que contiene la aplicación (el indicador de encabezado del quinto byte del encabezado del archivo es 00 = 00000000), -A no toma parámetros. Los resultados experimentales se muestran en la Figura 20 y la Figura 21.
¡En este punto, se ha analizado la información sobre el encabezado del archivo incremental Xdelta3!
Artículo de referencia
RFC 3284 VC diff: https://tools.ietf.org/rfc/rfc3284.txt