1. Bootloader : 기본적인 hw initialize
2. Load linux
3. Start kernel - /init/main.c
4. Android initialization process - /etc/init.rc
-> Start android services: Colsole, adbd, service manager, debuggerd, mountd, rild, zygote, mediaserver, installd, flash_recovery
아래는 init.rc의 process를 도식화한것이다.
/dev노드 아래에 %hardware%.rc를 참조하여 디바이스노드를 생성해낸다.
console : shell을 시작한다.
service manager : binder IPC service manager를 시작한다.
mountd : 모든 filesystem을 마운트한다.
debuggerd : debug system을 시작한다.
rild : Radio Interface Layer daemon을 시작한다.
zygote : Android Java VM runtime을 시작하고 system server를 시작한다. 가장 중요한 프로세스이다.
media server : Audio/Surface flinger, MediaPlayerService, Camera service를 시작한다.
Installd : install package daemon을 시작한다.
- 모든 안드로이드 어플리케이션은 zygote process에 의해 fork된다.
- system_servier는 fork된 zygote에 의해 최초로 적재되는 특별한 프로세스이며 Core service들을 시작한다.
- ActivityManager, WindowsManager, PackageManager, ...
- 다른 안드로이드프로세스는 ActivityManagerService에 의해 생성된다.
ActivityManagerService.systemReady에서 persistent application을 부팅시 시작하도록 되어 있다. 따라서 AndroidManifest.xml에서 아래와 같이 정의된 Application은 부팅시 실행된다.
<application android:name="PhoneApp" android:persistent="true" android:label="@string/dialerIconLabel" android:icon="@drawable/ic_launcher_phone"> |
intent.CATEGORY_HOME으로 설정된 component가 적재된다.
intent.ACTION_BOOT_COMPLETED로 설정된 component가 부팅 완료후 적재된다.
receiver component중 android.enabled와 android.exported가 false이면 ACTION_BOOT_COMPLETED가 set되어 있더라도 적재되지 않는다.
<receiver android:name=".service.BootReceiver" android:enabled="false"> <receiver android:name=".DownloadReceiver" android:exported="false"> |