본문 바로가기
Programming/Android Kernel,Native

Android StartUp

by 개Foot/Dog발?! 2014. 10. 14.

URL : http://samse.tistory.com/84


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를 도식화한것이다.



init : init.rc를 해석하여 수행하고 초기화한다.

       /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에 의해 생성된다.


더 자세한 정보를 원한다면 /frameworks/base/services/java/com/android/server/am/ActivityManagerService.java 와 /frameworks/base/core/java/android/os/Process.java


** 부팅시 앱을 실행하는 방법

1. android:persistent 속성사용

ActivityManagerService.systemReady에서 persistent application을 부팅시 시작하도록 되어 있다. 따라서 AndroidManifest.xml에서 아래와 같이 정의된 Application은 부팅시 실행된다.


 <application android:name="PhoneApp"

    android:persistent="true"

    android:label="@string/dialerIconLabel"

    android:icon="@drawable/ic_launcher_phone"> 

* 이 방법은 System에 의해 어플리케이션이 항상 실행 상태로 유지할지 여부를 결정하는 것이다.

유지할경우 "true", 유지하지 않을 경우 "false". 기본값은"false" 이다.

항상 실행상태를 유지하기 위해 자동으로 실행되는 방식인 것이다.

그러나, 앱을 실행시키고 죽이지 않을 대상은 System App일때만 가능한 방법이다.

일반 앱은 이 옵션을 사용하더라도 이 속성이 적용되지 않는다. 즉, 죽을 수도 있다.


2. ACTION_BOOT_COMPLETED Intent

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">