doc:appunti:android:logo_bootanimation
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
doc:appunti:android:logo_bootanimation [2019/10/07 09:01] – [log.bin] niccolo | doc:appunti:android:logo_bootanimation [2019/10/07 14:33] (current) – [Contents of bootanimation.zip] niccolo | ||
---|---|---|---|
Line 29: | Line 29: | ||
{{img-24.png? | {{img-24.png? | ||
- | ===== Web References ===== | + | ==== Unpack and repack the log.bin |
+ | Unfortunately the [[https:// | ||
+ | |||
+ | < | ||
+ | ./ | ||
+ | </ | ||
+ | |||
+ | Run the script into the same directory containing the **logo.bin** file; a **logo.d** directory will be created with compressed (.z) and uncompressed (.bin) files. | ||
+ | |||
+ | < | ||
+ | ./ | ||
+ | </ | ||
+ | |||
+ | For repacking, the script needs the original **logo.bin** and a **logo.d** directory containing the pictures. If the z-compressed picture exists, it will be used, otherwise the .bin one is used after z-compressing it. The resulting image is saved as **logo.repack.bin**. | ||
+ | |||
+ | Pictures are expected to be **raw RGB**, stored with **z-compression**. The pixel size (width x height) of each picture must be guessed. | ||
+ | |||
+ | Suppose that th e screen size is 720x1280 and the biggest, uncompressed picture is 3686400 bytes: | ||
+ | |||
+ | < | ||
+ | 3686400 / (720 * 1280) = 4 | ||
+ | </ | ||
+ | |||
+ | so we can desume that the picture is 4 bytes/ | ||
+ | |||
+ | < | ||
+ | ffmpeg -vcodec rawvideo -f rawvideo \ | ||
+ | -pix_fmt bgra -s 720x1280 -i " | ||
+ | -f image2 -vcodec png " | ||
+ | </ | ||
+ | |||
+ | Once edited, we can convert it back to raw BGRA with: | ||
+ | |||
+ | < | ||
+ | ffmpeg -vcodec png -i " | ||
+ | -vcodec rawvideo -f rawvideo -pix_fmt bgra " | ||
+ | </ | ||
+ | |||
+ | It is known that also 16bit raw formats are used (eg. bgr565le), you can guess it, if the size of the picture is 2 bytes per pixel. You can list all the pixel formats supprted by ffmpeg by running: | ||
+ | |||
+ | < | ||
+ | ffmpeg -pix_fmts | ||
+ | </ | ||
+ | ===== bootanimation.zip ===== | ||
+ | |||
+ | The logo contained into the **logo.bin** partition is displayed in the early stage of the boot process. Once the system partition is available, an animation is played for some seconds. That animation is contained into a zip file. In our case it turned out that the file is stored in **/ | ||
+ | |||
+ | There should be an executable responsible to actually run the animation, it should be **/ | ||
+ | |||
+ | * **/ | ||
+ | * **/ | ||
+ | * **/ | ||
+ | * **/ | ||
+ | |||
+ | If bootanimation.zip file is **not found**, the **framework-res.apk** package is searched into directories **/ | ||
+ | |||
+ | * assets/ | ||
+ | * assets/ | ||
+ | |||
+ | ==== Contents of bootanimation.zip ==== | ||
+ | |||
+ | Generally the animation is composed of **two parts**: the first is played just **once**, the second part is played in **loop** until the system is ready. This is controlled by the contents of the **desc.txt** file contained into the zip, here it is an example: | ||
+ | |||
+ | < | ||
+ | 720 1280 15 | ||
+ | p 1 0 part0 | ||
+ | p 0 0 part1 | ||
+ | </ | ||
+ | |||
+ | The first line tell us that the animation is **720x1280 pixels**, at **15 frames per second**. | ||
+ | |||
+ | The second line tell us that there is a part of **type p** to be executed **1** time. The following number (**0** in the example above) someone says that it is a pause to wait after the animation, in my case it is instead ununsed at all. The actual frames are contained into the **part0** subdirectory. | ||
+ | |||
+ | The last line defines another part **type p** to be executed in an endless (**0**) loop until the system is ready, with a zero **0** pause. The frames are into the **part1** subdirectory. | ||
+ | |||
+ | A **type p** means that the animation can be interrupted when the boot process is completed. If you want instead a part to be played as the final part of the animation (e.g. if you want a fade-out effect), you have to use a **tpye c**, which means //play at least once//. | ||
+ | |||
+ | < | ||
+ | 720 1280 15 | ||
+ | p 1 0 part0 | ||
+ | c 0 0 part1 | ||
+ | c 0 0 part2 | ||
+ | </ | ||
+ | |||
+ | In the above example, once the boot process is completed, the **part1** is interrupted, | ||
+ | |||
+ | Frames are actually **PNG images**, of the proper size (720x1280 in our case). | ||
+ | |||
+ | So the directories structure should be something like this: | ||
+ | |||
+ | < | ||
+ | . | ||
+ | ├── desc.txt | ||
+ | ├── part0 | ||
+ | │ ├── img_000.png | ||
+ | │ ├── ... | ||
+ | │ └── img_196.png | ||
+ | └── part1 | ||
+ | ├── img_197.png | ||
+ | ├── ... | ||
+ | └── img_207.png | ||
+ | </ | ||
+ | |||
+ | To pack eveything into a zip file you can use the command: | ||
+ | |||
+ | < | ||
+ | zip -r -Z store bootanimation.zip desc.txt part0 part1 | ||
+ | </ | ||
+ | |||
+ | Beware of the **%%-Z store%%** option: the zip archive must be created using the **store compression method**, not the //deflate// one. | ||
+ | ===== Web References ===== | ||
+ | * **[[https:// | ||
* **[[https:// | * **[[https:// | ||
+ | * **[[http:// |
doc/appunti/android/logo_bootanimation.txt · Last modified: 2019/10/07 14:33 by niccolo