Android에서는 rc 파일들이 존재하며 부팅 시 이 rc 파일을 이용하여 특정 명령이나 서비스를 실행시킬 수 있다. rc 파일은 /(root), /system/etc/init, /system/vendoor/ect/init 의 directory에 존재할 수 있다.

구분

  • /system/etc/init: 모든 안드로이드 기기에서 공통적으로 필요한 핵심 시스템 기능들을 정의한다. 예를 들어, 그래픽을 담당하는 surfaceflinger.rc나 앱 실행의 모태가 되는 zygote.rc 등이 이곳에 위치한다.

  • /system/vendor/etc/init: 특정 스마트폰 모델의 센서, 카메라, 오디오 같은 하드웨어를 구동하기 위한 HAL(Hardware Abstraction Layer) 서비스를 정의한다. 이는 제조사나 칩셋 모델마다 내용이 완전히 다르다.


my_script.rc

  • vim /system/etc/init/my_script.rc
    #!/system/bin/sh
    on property:sys.boot_completed=1
      exec - root root -- /data/local/tmp/my_script.sh
    
  • chmod 644 /system/etc/init/my_script.rc


my_script.sh

  • vim /data/local/tmp/my_script.sh
    #!/system/bin/sh
    echo my_script $(date) >> /data/local/tmp/my_script.txt
    
  • chmod +x /data/local/tmp/my_script.sh


test

  • 재부팅 이후 my_script.txt 파일이 존재하는지 확인한다.
    cat /data/local/tmp/my_script.txt
    
  • 부팅 이후 dmesg 명령어를 통하여 로그를 확인해 보도록 한다.
    dmesg | grep my_
    


SELinux

  • SELinux 설정이 Enforcing인 경우 (getenforce 명령어 결과 1) 해당 my_script.sh 파일이 제대로 실행되지 않을 수 있다. 이 경우 SELinux 설정을 Prermissive(getenforce 명령어 결과 0)값이 되도록 rc 파일을 추가한다.

  • vim /system/etc/init/my_selinux.rc
    on init
      write /sys/fs/selinux/enforce 0
    

    혹은

    on post-fs-data
      write /sys/fs/selinux/enforce 0
    
  • chmod 644 /system/etc/init/my_selinux.rc


uninstall

rm /system/etc/init/my_script.rc
rm /system/etc/init/my_selinux.rc
rm /data/local/tmp/my_script.sh
rm /data/local/tmp/my_script.txt