Just An Application

September 27, 2011

Android Internals: Binary XML – Part Eight: The CDATA Chunk

1.0 Example

There are no CDATA chunks in the main.xml layout example and by default it is unlikely that the Binary XML version of any layout will contain any unless you go out of your way to do something like this.

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        This is some character data
    
        <![CDATA[This is some more character data]]>
        <![CDATA[<tag>As is this</tag>]]>
    </LinearLayout>

which will get you this

    0000000 03 00 08 00 cc 01 00 00 01 00 1c 00 04 01 00 00
    0000010 07 00 00 00 00 00 00 00 00 01 00 00 38 00 00 00
    0000020 00 00 00 00 00 00 00 00 0f 00 00 00 1f 00 00 00
    0000030 29 00 00 00 56 00 00 00 59 00 00 00 68 00 00 00
    0000040 0c 0c 6c 61 79 6f 75 74 5f 77 69 64 74 68 00 0d
    0000050 0d 6c 61 79 6f 75 74 5f 68 65 69 67 68 74 00 07
    0000060 07 61 6e 64 72 6f 69 64 00 2a 2a 68 74 74 70 3a
    0000070 2f 2f 73 63 68 65 6d 61 73 2e 61 6e 64 72 6f 69
    0000080 64 2e 63 6f 6d 2f 61 70 6b 2f 72 65 73 2f 61 6e
    0000090 64 72 6f 69 64 00 00 00 00 0c 0c 4c 69 6e 65 61
    00000a0 72 4c 61 79 6f 75 74 00 61 61 20 54 68 69 73 20
    00000b0 69 73 20 73 6f 6d 65 20 63 68 61 72 61 63 74 65
    00000c0 72 20 64 61 74 61 0a 20 20 20 20 0a 20 20 20 20
    00000d0 54 68 69 73 20 69 73 20 73 6f 6d 65 20 6d 6f 72
    00000e0 65 20 63 68 61 72 61 63 74 65 72 20 64 61 74 61
    00000f0 0a 20 20 20 20 3c 74 61 67 3e 41 73 20 69 73 20
    0000100 74 68 69 73 3c 2f 74 61 67 3e 0a 00 80 01 08 00
    0000110 10 00 00 00 f4 00 01 01 f5 00 01 01 00 01 10 00
    0000120 18 00 00 00 02 00 00 00 ff ff ff ff 02 00 00 00
    0000130 03 00 00 00 02 01 10 00 4c 00 00 00 02 00 00 00
    0000140 ff ff ff ff ff ff ff ff 05 00 00 00 14 00 14 00
    0000150 02 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00
    0000160 ff ff ff ff 08 00 00 10 ff ff ff ff 03 00 00 00
    0000170 01 00 00 00 ff ff ff ff 08 00 00 10 ff ff ff ff
    0000180 04 01 10 00 1c 00 00 00 05 00 00 00 ff ff ff ff
    0000190 06 00 00 00 08 00 00 00 00 00 00 00 03 01 10 00
    00001a0 18 00 00 00 0b 00 00 00 ff ff ff ff ff ff ff ff
    00001b0 05 00 00 00 01 01 10 00 18 00 00 00 0b 00 00 00
    00001c0 ff ff ff ff 02 00 00 00 03 00 00 00    

The bytes in blue are the chunk header and those in green the chunk body.

2.0 Chunk Header

The chunk header is an instance of struct ResXMLTree_node.

The header.type field is 0x0104 (RES_XML_CDATA_TYPE).

3.0 Chunk Body

The chunk body is an instance of this C++ struct (see frameworks/base/include/ResourceTypes.h lines 520-527)

    struct ResXMLTree_cdataExt
    {
        // The raw CDATA character data.
        struct ResStringPool_ref data;
    
        // The typed value of the character data if this is a CDATA node.
        struct Res_value typedData;
    };

3.1 data

The data field specifies the raw character data as in index into the StringPool chunk of the containing XML chunk.

3.2 typedData

The typedData field specifies the value of the character data contained in this chunk.

It is not clear in what circumstances this field is going to contain an actual value and how that value is derived from the character data and there are no clues in the source code.

4.0 The Example Annotated

This is an annotated version of full Binary XML file shown above

    00000000 03 00       // type [XML]
    00000002 08 00       // header size
    00000004 cc 01 00 00 // chunk size
    --------------------

    ++++++++++++++++++++

    00000008 01 00       // type [STRING_POOL]
    0000000a 1c 00       // header size
    0000000c 04 01 00 00 // chunk size
    --------------------

    00000010 07 00 00 00 // stringCount
    00000014 00 00 00 00 // styleCount
    00000018 00 01 00 00 // flags
    0000001c 38 00 00 00 // stringsStart (address 00000040)
    00000020 00 00 00 00 // stylesStart  (address 00000008)
    ++++++++++++++++++++

    00000024 00 00 00 00 // string[0]
    00000028 0f 00 00 00 // string[1]
    0000002c 1f 00 00 00 // string[2]
    00000030 29 00 00 00 // string[3]
    00000034 56 00 00 00 // string[4]
    00000038 59 00 00 00 // string[5]
    0000003c 68 00 00 00 // string[6]

    00000040 0c 0c 6c 61 // [0] "layout_width"
    00000044 79 6f 75 74
    00000048 5f 77 69 64
    0000004c 74 68 00 0d // [1] "layout_height"
    00000050 0d 6c 61 79
    00000054 6f 75 74 5f
    00000058 68 65 69 67
    0000005c 68 74 00 07 // [2] "android"
    00000060 07 61 6e 64
    00000064 72 6f 69 64
    00000068 00 2a 2a 68 // [3] "http://schemas.android.com/apk/res/android"
    0000006c 74 74 70 3a
    00000070 2f 2f 73 63
    00000074 68 65 6d 61
    00000078 73 2e 61 6e
    0000007c 64 72 6f 69
    00000080 64 2e 63 6f
    00000084 6d 2f 61 70
    00000088 6b 2f 72 65
    0000008c 73 2f 61 6e
    00000090 64 72 6f 69
    00000094 64 00 00 00 // [4] ""
    00000098 00 0c 0c 4c // [5] "LinearLayout"
    0000009c 69 6e 65 61
    000000a0 72 4c 61 79
    000000a4 6f 75 74 00
    000000a8 61 61 20 54 // [6] " This is some character data
    
        This is some more character data
        <tag>As is this</tag>
    "
    000000ac 68 69 73 20
    000000b0 69 73 20 73
    000000b4 6f 6d 65 20
    000000b8 63 68 61 72
    000000bc 61 63 74 65
    000000c0 72 20 64 61
    000000c4 74 61 0a 20
    000000c8 20 20 20 0a
    000000cc 20 20 20 20
    000000d0 54 68 69 73
    000000d4 20 69 73 20
    000000d8 73 6f 6d 65
    000000dc 20 6d 6f 72
    000000e0 65 20 63 68
    000000e4 61 72 61 63
    000000e8 74 65 72 20
    000000ec 64 61 74 61
    000000f0 0a 20 20 20
    000000f4 20 3c 74 61
    000000f8 67 3e 41 73
    000000fc 20 69 73 20
    00000100 74 68 69 73
    00000104 3c 2f 74 61
    00000108 67 3e 0a 00
    ==================== [End of STRING_POOL]

    0000010c 80 01       // type [XML_RESOURCE_MAP]
    0000010e 08 00       // header size
    00000110 10 00 00 00 // chunk size
    --------------------

    ++++++++++++++++++++

    00000114 f4 00 01 01 // [0]
    00000118 f5 00 01 01 // [1]
    ==================== [End of XML_RESOURCE_MAP]

    0000011c 00 01       // type [XML_START_NAMESPACE]
    0000011e 10 00       // header size
    00000120 18 00 00 00 // chunk size
    --------------------

    00000124 02 00 00 00 // lineNumber
    00000128 ff ff ff ff // comment
    ++++++++++++++++++++

    0000012c 02 00 00 00 // prefix
    00000130 03 00 00 00 // uri
    ==================== [End of XML_START_NAMESPACE]

    00000134 02 01       // type [XML_START_ELEMENT]
    00000136 10 00       // header size
    00000138 4c 00 00 00 // chunk size
    --------------------

    0000013c 02 00 00 00 // lineNumber
    00000140 ff ff ff ff // comment
    ++++++++++++++++++++

    00000144 ff ff ff ff // ns
    00000148 05 00 00 00 // name [LinearLayout]
    0000014c 14 00       // attributeStart
    0000014e 14 00       // attributeSize
    00000150 02 00       // attributeCount
    00000152 00 00       // idIndex
    00000154 00 00       // classIndex
    00000156 00 00       // styleIndex
    00000158 03 00 00 00 // attribute[0] ns
    0000015c 00 00 00 00 // attribute[0] name [layout_width]
    00000160 ff ff ff ff // attribute[0] rawValue
    00000164 08 00       // size
    00000166 00          // 0
    00000167 10          // dataType
    00000168 ff ff ff ff // data
    0000016c 03 00 00 00 // attribute[1] ns
    00000170 01 00 00 00 // attribute[1] name [layout_height]
    00000174 ff ff ff ff // attribute[1] rawValue
    00000178 08 00       // size
    0000017a 00          // 0
    0000017b 10          // dataType
    0000017c ff ff ff ff // data
    ==================== [End of XML_START_ELEMENT]

    00000180 04 01       // type [XML_CDATA]
    00000182 10 00       // header size
    00000184 1c 00 00 00 // chunk size
    --------------------

    00000188 05 00 00 00 // lineNumber
    0000018c ff ff ff ff // comment
    ++++++++++++++++++++

    00000190 06 00 00 00 // data
    00000194 08 00       // size
    00000196 00          // 0
    00000197 00          // dataType
    00000198 00 00 00 00 // data
    ==================== [End of XML_CDATA]

    0000019c 03 01       // type [XML_END_ELEMENT]
    0000019e 10 00       // header size
    000001a0 18 00 00 00 // chunk size
    --------------------

    000001a4 0b 00 00 00 // lineNumber
    000001a8 ff ff ff ff // comment
    ++++++++++++++++++++

    000001ac ff ff ff ff // ns
    000001b0 05 00 00 00 // name [LinearLayout]
    ==================== [End of XML_END_ELEMENT]

    000001b4 01 01       // type [XML_END_NAMESPACE]
    000001b6 10 00       // header size
    000001b8 18 00 00 00 // chunk size
    --------------------

    000001bc 0b 00 00 00 // lineNumber
    000001c0 ff ff ff ff // comment
    ++++++++++++++++++++

    000001c4 02 00 00 00 // prefix
    000001c8 03 00 00 00 // uri
    ==================== [End of XML_END_NAMESPACE]

    ==================== [End of XML]

Copyright (c) 2011 By Simon Lewis. All Rights Reserved.

Blog at WordPress.com.