• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# bootanimation format
2
3## zipfile paths
4
5The system selects a boot animation zipfile from the following locations, in order:
6
7    /system/media/bootanimation-encrypted.zip (if getprop("vold.decrypt") = '1')
8    /system/media/bootanimation.zip
9    /oem/media/bootanimation.zip
10
11## zipfile layout
12
13The `bootanimation.zip` archive file includes:
14
15    desc.txt - a text file
16    part0  \
17    part1   \  directories full of PNG frames
18    ...     /
19    partN  /
20
21## desc.txt format
22
23The first line defines the general parameters of the animation:
24
25    WIDTH HEIGHT FPS [PROGRESS]
26
27  * **WIDTH:** animation width (pixels)
28  * **HEIGHT:** animation height (pixels)
29  * **FPS:** frames per second, e.g. 60
30  * **PROGRESS:** whether to show a progress percentage on the last part
31      + The percentage will be displayed with an x-coordinate of 'c', and a
32        y-coordinate set to 1/3 of the animation height.
33
34It is followed by a number of rows of the form:
35
36    TYPE COUNT PAUSE PATH [FADE [#RGBHEX [CLOCK1 [CLOCK2]]]]
37
38  * **TYPE:** a single char indicating what type of animation segment this is:
39      + `p` -- this part will play unless interrupted by the end of the boot
40      + `c` -- this part will play to completion, no matter what
41      + `f` -- same as `p` but in addition the specified number of frames is being faded out while
42        continue playing. Only the first interrupted `f` part is faded out, other subsequent `f`
43        parts are skipped
44  * **COUNT:** how many times to play the animation, or 0 to loop forever until boot is complete
45  * **PAUSE:** number of FRAMES to delay after this part ends
46  * **PATH:** directory in which to find the frames for this part (e.g. `part0`)
47  * **FADE:** _(ONLY FOR `f` TYPE)_ number of frames to fade out when interrupted where `0` means
48              _immediately_ which makes `f ... 0` behave like `p` and doesn't count it as a fading
49              part
50  * **RGBHEX:** _(OPTIONAL)_ a background color, specified as `#RRGGBB`
51  * **CLOCK1, CLOCK2:** _(OPTIONAL)_ the coordinates at which to draw the current time (for watches):
52      + If only `CLOCK1` is provided it is the y-coordinate of the clock and the x-coordinate
53        defaults to `c`
54      + If both `CLOCK1` and `CLOCK2` are provided then `CLOCK1` is the x-coordinate and `CLOCK2` is
55        the y-coodinate
56      + Values can be either a positive integer, a negative integer, or `c`
57          - `c` -- will centre the text
58          - `n` -- will position the text n pixels from the start; left edge for x-axis, bottom edge
59            for y-axis
60          - `-n` -- will position the text n pixels from the end; right edge for x-axis, top edge
61            for y-axis
62          - Examples:
63              * `-24` or `c -24` will position the text 24 pixels from the top of the screen,
64                centred horizontally
65              * `16 c` will position the text 16 pixels from the left of the screen, centred
66                vertically
67              * `-32 32` will position the text such that the bottom right corner is 32 pixels above
68                and 32 pixels left of the edges of the screen
69
70There is also a special TYPE, `$SYSTEM`, that loads `/system/media/bootanimation.zip`
71and plays that.
72
73## clock_font.png
74
75The file used to draw the time on top of the boot animation. The font format is as follows:
76  * The file specifies glyphs for the ascii characters 32-127 (0x20-0x7F), both regular weight and
77    bold weight.
78  * The image is divided into a grid of characters
79  * There are 16 columns and 6 rows
80  * Each row is divided in half: regular weight glyphs on the top half, bold glyphs on the bottom
81  * For a NxM image each character glyph will be N/16 pixels wide and M/(12*2) pixels high
82
83## progress_font.png
84
85The file used to draw the boot progress in percentage on top of the boot animation. The font format
86follows the same specification as the one described for clock_font.png.
87
88## loading and playing frames
89
90Each part is scanned and loaded directly from the zip archive. Within a part directory, every file
91(except `trim.txt` and `audio.wav`; see next sections) is expected to be a PNG file that represents
92one frame in that part (at the specified resolution). For this reason it is important that frames be
93named sequentially (e.g. `part000.png`, `part001.png`, ...) and added to the zip archive in that
94order.
95
96## trim.txt
97
98To save on memory, textures may be trimmed by their background color.  trim.txt sequentially lists
99the trim output for each frame in its directory, so the frames may be properly positioned.
100Output should be of the form: `WxH+X+Y`. Example:
101
102    713x165+388+914
103    708x152+388+912
104    707x139+388+911
105    649x92+388+910
106
107If the file is not present, each frame is assumed to be the same size as the animation.
108
109## audio.wav
110
111Each part may optionally play a `wav` sample when it starts. To enable this, add a file
112with the name `audio.wav` in the part directory.
113
114## exiting
115
116The system will end the boot animation (first completing any incomplete or even entirely unplayed
117parts that are of type `c`) when the system is finished booting. (This is accomplished by setting
118the system property `service.bootanim.exit` to a nonzero string.)
119
120## protips
121
122### PNG compression
123
124Use `zopflipng` if you have it, otherwise `pngcrush` will do. e.g.:
125
126    for fn in *.png ; do
127        zopflipng -m ${fn}s ${fn}s.new && mv -f ${fn}s.new ${fn}
128        # or: pngcrush -q ....
129    done
130
131Some animations benefit from being reduced to 256 colors:
132
133    pngquant --force --ext .png *.png
134    # alternatively: mogrify -colors 256 anim-tmp/*/*.png
135
136### creating the ZIP archive
137
138    cd <path-to-pieces>
139    zip -0qry -i \*.txt \*.png \*.wav @ ../bootanimation.zip *.txt part*
140
141Note that the ZIP archive is not actually compressed! The PNG files are already as compressed
142as they can reasonably get, and there is unlikely to be any redundancy between files.
143