Tuesday 31 May 2022

Android Boot Optimization using BootChart

 Hi Guys!!!

Hope you are doing well !. After long time I am back. Sorry for late to add new blogs. 

Today I am sharing details on Boot optimization using BootChart .  

First What is boot process. I have written one blog in 2017 with complete details on bootprocess. 

Android Boot Process 

Here is summary :-

The boot process is a chain of actions starting from the boot ROM, followed by the Bootloader, Kernel, Init, Zygote, and System Server (bold indicates Android-specific boot process).

 In the automotive-specific boot process, early services such as rearview camera must start during the Kernel boot.


Now coming to the point. Below are the few avilable point to do optimization .
  • Bootloader
  • Device kernel
  • I/O tuning
  • init.*.rc
  • Boot animation
  • SELinux policy
Tool and methods
Today I am discussing BootChart. 
Bootchart provides CPU and I/O load breakdown of all processes for the whole system.
To enable bootchart:

1. In Current User-debug Build 
To enable bootchart in current flashed user-debug build
adb shell 'touch /data/bootchart/enabled'
adb reboot
After boot up, fetch boot chart:
$ANDROID_BUILD_TOP/system/core/init/grab-bootchart.sh
When finished, delete /data/bootchart/enabled to prevent collecting the data every time.

2. Enable at compile time
$ Android_Build_Top_Dir/system/core/init 

In bootchar.h modification BootChart :
#ifndef BOOTCHART # define BOOTCHART 1 #endif

$ touch init.c
$ mm INIT_BOOTCHART=true
Triggering bootchart functionality on system boot
adb shell 'echo 120 > /data/bootchart-start' 
Retrieving the collected data from the system
system/core/init/grab-bootchart.sh
Analyzing the results
Use any image viewer to examine the graphic.Things to look for
  •  Start and top times of the various processes, and 
  • Their CPU utilization. 
Long gaps with low utilization may indicate a timeout or some other problem.
Once you have identified the processes that are using time during the initialization, you can further analyze these by looking at system logs, using strace, and examining the system source code.

Mostly usual suspects

1. In Kernel Init
  • ip_auto_config
  • USB init
  • Flash driver initialization 

2. In Zygote
Preloading Android Framework has thousands of Java classes Preloaded by Zygote and instantiated in its heap To improve Application startup time and save memory Controlled by resource
 frameworks/base/preloaded-classes
Zygote Class Preloading Can use the tool in framework to adjust the list: 
$ adb logcat > logcat.txt 
$ java -p preload.jar Compile logcat.txt logcat.compiled 
$ java -p preload.jar PrintCsv logcat.compiled 

3. In PackageManager
Package Scannig Every APK is scanned at boot time Package management code is inefficient Uses mmaped files means each access will cause page fault ParseZipArchive() scans entire APK for only one AndroidManifest.xml file

4. In System Services
Starting Last stage of Android boot Start every base service Zygote start SystemServer process Start native service (SurfaceFlinger, AudioFlinger) first Start each service sequentially

Thanks
Saurabh
Happy Coding!!!!

Build a Custom Kernel Module for Android

Hi Guys!!!Hope you are doing well !!!. Today I will describe how you can write a custom kernel module(Hello world) for Android and load it a...