답변:
내 안드로이드 파일 시스템을 둘러 보면서 실제로 /etc/init.d/
디렉토리 가 있음을 알았습니다 . 거기에서 엿보기 후에 /etc/init.d/20userinit
다음 줄을 발견 했습니다.
if [ -e /data/local/userinit.sh ];
then
log -p -i -t userinit "Executing /data/local/userinit.sh";
busybux chmod +x /data/local/userinit.sh;
logwrapper /system/bin/sh /data/local/userinit.sh;
setprop cm.userinit.active 1;
fi;
이 존재는 물론, 정확히 내가 필요로 무엇을, 난 내 장치에 밀어 후 내 컴퓨터에서 다음 스크립트를 썼다 :
#!/system/bin/sh
dropbear -s -g
(을 통해 기기에 푸시 scp userinit.sh phone:/data/local/userinit.sh
, 당신을 생각하십시오 :])
장치를 다시 부팅 한 다음 실행 ps | grep "[d]ropbear"
하고 충분히 실행 중입니다. 시원함!
/data/init.sh
부팅 할 때 실행되며 루트가 있으면 원하는대로 편집 할 수 있습니다. 조심해 ;)
편집 : 분명히 편집 된 스크립트를 부팅 이미지에 삽입해야 할 수도 있습니다. 여기에 방법에 대한 정보 : http://forum.xda-developers.com/showthread.php?t=443994
find / -name "init.sh"
어떤 것이 바뀌는 지 볼 것이다 . 부팅시 실행되는 다른 스크립트가 있습니까?
/etc/init.rc
쉘을 시작하는 것이 있어야합니다 . init.sh를 호출해야하지만 그렇지 않은 경우 자신의 스크립트를 호출 할 수 있습니다.
/data
에는 /data/init/.sh
또는 이 없습니다 /etc/init.rc
. 그렙는 문자열의 흥미로운 예를 찾을 수없는 init
에서 /etc
(심지어 재귀).
/etc/
디렉토리를 찾으십시오 . 일반적 /system/
으로 RW로 마운트 할 수 있는 파티션에 배치됩니다 .
$ ls -l /etc
lrwxrwxrwx 1 root root 11 Jan 1 2009 /etc -> /system/etc
$ su
$ mount -o remount,rw /system
$ chmod o+w /system/etc # for "adb push"
위의 일부 단계는 다음으로 대체 될 수 있습니다.
$ adb root
$ adb remount
나중에 RO를 다시 마운트하십시오.
$ chmod o-w /system/etc
$ mount -o remount,ro /system
이제 *rc
목표를 달성하기 위해 수정 한 실행 파일 또는 파일 을 찾는 작업 :
$ find /etc -type f -perm +110
$ find /etc -name "*rc"
$ find /etc -name "init*"
$ grep -R /data /etc
$ grep -R /system /etc
이 파일이 어떻게 사용되었는지 알 수있는 각 후보에 대한 Google
커스텀 스크립트를 포함하는 좋은 후보는 다음과 같습니다.
$ grep service /init*.rc
각 기기마다 고유하므로 검색 기준에 대한 자체 추측이 필요할 수 있습니다.
예를 들어 /etc/mkshrc
Korn 쉘에서 사용한 것을 발견했습니다 . 이 파일을 업데이트하여 PATH
env var 를 확장 했으며 이제는 매번 adb shell
PATH에 Busybox 심볼릭 링크가 있습니다!
어려운 방법을 참조하십시오 ( 마법 파일 을 찾는 데 운이 없다면 ) : https : //.com/questions/9768103/make-persistent-changes-to-init-rc
/system
인 system.img
및 /etc
으로 심볼릭 링크이다 /system
.
나는이 모든 방법을 시도했지만 그들 중 누구도 나를 위해 일하지 않았다. 그러나 CM12.1 에서 부팅시 스크립트를 실행하는 방법은 여기에서 lord-ralf-adolf의 답변을 기반으로했습니다 .
기본적으로 파일을 찾고
/system/etc/install-recovery.sh
처음에 다음 줄을 추가하십시오.
/data/init.sh &
그때
touch /data/init.sh
chmod 755 /data/init.sh
끝난! 이제 원하는 것을 넣을 수 있으며 /data/init.sh
시작시 실행됩니다. 파일 /system/etc/install-recovery.sh
이 시스템에 없으면이 답변이 효과가 없습니다. 그것을 귀찮게하지 마십시오.
/system/etc/install-recovery.sh
존재하지 않는 시스템을 가지고 있지만 존재한다면 부팅시 여전히 실행되므로 점검 할 가치가 있습니다.
SELinux가 아닌 안드로이드 5 이전의 상황은 간단했습니다 enforcing
. 코드를 스크립트에 넣거나 바이너리를 부팅시 루트 권한으로 실행 된 스크립트로 바꿀 수 있습니다. 또 다른 방법은 init
특정 디렉토리에서 스크립트를 일괄 실행하도록 사용자 지정 서비스 를 정의하는 것 입니다.
이러한 접근 방식을 기반으로 사용자 정의 ROM 개발자는 다른 도입 사이비의init.d
같은 현상을 /etc/init.d/
, /etc/install-recovery.sh
, /etc/init.qcom.post_boot.sh
, /system/bin/debuggerd
, /data/init.sh
, /data/local/userinit.sh
, /data/local/init.d/
등
그러나 UID로 실행 0
되지만 제한된 SELinux 컨텍스트에서 실행되는 프로세스 는 무력합니다. context 로 init.rc
파일 에서 시작된 서비스는 심지어 쉘 스크립트 를 실행할 수 없으므로 Magisk define과 같은 무제한 컨텍스트 를 주입하기 위해 SELinux 정책을 패치해야 합니다 . 그 후 스크립트를 서비스로 또는 유사한 디렉토리 에서 직접 실행할 수 있습니다 .u:r:init:s0
/system/bin/
u:r:magisk:s0
init
init.d
자세한 내용은 부팅시 실행 파일을 실행하고 계속 실행하는 방법을 참조하십시오 .
간단한 방법 (작동) :
스크립트에서 부팅 후 명령을 준비합니다 (예 : / system / xbin / post-boot (set exec perm)).
/system/etc/init.qcom.post_boot.sh 끝에 위의 사용자 정의 스크립트 경로를 추가하십시오.
예 :
끝난!
qcom post_boot (Qualcomm 장치)를 찾을 수 없으면 post_boot 스크립트를 찾으십시오.
magisk를 설치 한 경우 .sh를 다음 위치에 배치 할 수 있습니다.
/sbin/.magisk/img/.core/service.d/
또는
/sbin/.magisk/img/.core/post-fs-data.d/
실행 파일로 만드는 것을 잊지 마십시오 : chmod +x your-script.sh
.
자세한 정보 : https://github.com/topjohnwu/Magisk/blob/master/docs/guides.md#boot-scripts