Android에 전원을 켜고 시작하는 데몬을 추가하는 것이 비교적 편리한 방법

7183 단어
이 방법을 운용하는 전제는android 원본의 sdk를 이미 컴파일한 것이다.Android 소스 디렉토리에 다음과 같은 두 디렉토리가 있습니다.
./out/target/product/generic/ramdisk.img
및./out/host/linux-x86/sdk/android-sdk_eng.root_linux-x86/platforms/android-2.3.4/images/ramdisk.img
다음은 Android 시스템을 시작할 때 지정한 파일에 쓰기 위한 데몬을 시작합니다.
총 4단계: 1,ramdisk를 풀다.img2, c 언어로 실현할 기능 완성 3, 수정 init.rc, c 언어 실행 프로그램 시작 4,ramdisk.img
1. 스트레스 해소ramdisk.img:
안드로이드의 ramdisk를 압축을 풀고 수정합니다.img의 수동 방법:
ramdisk.img는 다른 디렉터리에 복사해서 이름을ramdisk로 변경합니다.img.gz 및 명령 사용
gunzip ramdisk.img.gz
그리고 ramdisk라는 폴더를 새로 만듭니다. 들어가서 명령 cpio -i -F./ramdisk.img은 람디스크를img에서 스트레스를 풀었고 ramdisk의 내용을 조작할 수 있습니다.
2、C 언어 프로그램 Hello를 완성합니다.c, 기능을 실현한다.
a.먼저 코드는 다음과 같습니다.
[cpp] view plain copy print ?
 
  •  

  •  
  • /*********************** 프로그램 시작******************************/
  •  
  • #include  

  •  
  • #include  

  •  
  • #include  

  • #include  
  • #include  

  • #include  
  • #include  

  • #include  
  •  

  • int main(void) 

  •  
  •     int i=0; 

  •  
  •     int fd; 

  •  
  •     pid_t pid; 

  •  
  •     struct rlimit rl; 

  •  
  •     char str[]="hello world..."; 

  •  
  •  

  •     umask(0); 
  •     if(getrlimit(RLIMIT_NOFILE,&rl)<0) 

  • printf ("getrlimit 함수 호출에 오류가 발생했습니다!"); 
  •     if((pid=fork())<0) 

  •     { 
  • printf("fork 오류 발생!"); 

  •         exit(1); 
  •     } 

  • else if(pid>0)//부모 프로세스 종료
  •     { 

  • printf ("부모 프로세스 종료, ID% d, 하위 프로세스 ID% d", getpid (),pid). 
  •         exit(0); 

  •     } 
  • //하위 프로세스
  •     sleep(2); 
  • printf("하위 프로세스 ID는%d", getpid(); 

  •  
  •     setsid(); 

  •     if((pid=fork())<0) 
  •     { 

  • printf("fork 오류 발생!"); 
  •         return -1; 

  •     } 
  • elseif(pid>0)//첫 번째 하위 프로세스 종료
  •     { 
  • printf("첫 번째 하위 프로세스 종료, ID%d, 하위 프로세스 ID%d", getpid(), pid),/*이 printf의 내용을 출력할 수 있습니다. 이 printf가 있는 프로세스가 터미널을 잃었지만 세션 그룹의 첫 번째 프로세스이기 때문에 printf가 있는 것을 보고 자신이 터미널을 신청한 것 같습니다. */ 

  •         exit(0); 
  •     } 

  •  
  • //두 번째 하위 프로세스
  • printf ("이 줄은 출력되지 않습니다.");/*이 printf의 내용은 화면에 출력되지 않습니다. 왜냐하면 이 프로세스가 세션 그룹의 첫 번째 프로세스가 아니기 때문에 터미널을 다시 신청할 수 없습니다. */ 
  •     chdir("/"); 

  •     if(rl.rlim_max==RLIM_INFINITY) 
  •         rl.rlim_max=1024; 

  •     printf("%d",(int)rl.rlim_max); 
  •     for(i=0;i
            close(i); 
  •     open("/dev/null",O_RDWR); 

  •     dup(0); 
  •     dup(0); 

  •     
  • //5s 간격으로 파일에 데이터 쓰기
  •     while(1) 
  •     { 

  •         fd=open("/data/hello.txt",O_WRONLY|O_CREAT|O_APPEND,0766);/*여기의/data는android시스템의/data 디렉터리*/를 가리킨다
  •         write(fd,str,sizeof(str)); 

  •         sleep(5); 
  •     } 

  •     close(fd); 
  •     exit(0); 

  •  

  •  
  • /*********************** 프로그램 종료******************************/
  •  
  •  
  • 
    
    
    /************************    **************************/
    
    #include <stdio.h>
    
    #include <stdlib.h>
    
    #include <unistd.h>
    #include <sys/time.h>
    #include <sys/resource.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    
    int main(void)
    {
    
        int i=0;
    
        int fd;
    
        pid_t pid;
    
        struct rlimit rl;
    
        char str[]="hello world...
    "; umask(0); if(getrlimit(RLIMIT_NOFILE,&rl)<0) printf("getrlimit !
    "); if((pid=fork())<0) { printf("fork !
    "); exit(1); } else if(pid>0)// { printf(" , ID %d, ID %d
    ",getpid(),pid); exit(0); } // sleep(2); printf(" ID %d
    ",getpid()); setsid(); if((pid=fork())<0) { printf("fork !
    "); return -1; } else if(pid>0)// { printf(" , ID %d, ID %d
    ",getpid(),pid); /* printf , , , printf , ?*/ exit(0); } // printf(" 。
    ");/* printf , , ?*/ chdir("/"); if(rl.rlim_max==RLIM_INFINITY) rl.rlim_max=1024; printf("%d",(int)rl.rlim_max); for(i=0;i<rl.rlim_max;i++) close(i); open("/dev/null",O_RDWR); dup(0); dup(0); // 5s while(1) { fd=open("/data/hello.txt",O_WRONLY|O_CREAT|O_APPEND,0766);/* /data android /data */ write(fd,str,sizeof(str)); sleep(5); } close(fd); exit(0); } /************************ **************************/

    b.그런 다음 이 프로그램을 android에서 실행 가능한 프로그램으로 컴파일합니다.
    현재 디렉토리에 Android를 설정합니다.mk 파일, 다음을 입력합니다.
    [cpp] view plain copy print ?
     
  •  

  • LOCAL_PATH:=$(call my-dir) 
  • include $(CLEAR_VARS) 

  • LOCAL_MODULE_TAGS := optional 
  • LOCAL_MODULE:=helloworld 

  • LOCAL_SRC_FILES:=hello.c 
  • include $(BUILD_EXECUTABLE) 

  •                                    
     
    
    
    LOCAL_PATH:=$(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_MODULE_TAGS := optional
    LOCAL_MODULE:=helloworld
    LOCAL_SRC_FILES:=hello.c
    include $(BUILD_EXECUTABLE)
                                        

    종료를 저장하고 cd를android 원본 디렉터리에make helloworld 명령을 실행합니다.만약 성공적으로 컴파일된다면 생성된 Helloworld는 디렉터리out/target/product/generic/system/bin/에서 생성된 Helloworld를
    파일push를 시뮬레이터의/data 디렉터리로 실행합니다.
    #adb push helloworld/data
    3. ramdisk 디렉터리에서 init를 수정한다.rc 파일은 Helloworld 프로그램을 시작하고 다음 코드를 추가합니다.
    [cpp] view plain copy print ?
     
  •  

  •  
  • #add by me on 2010-10-18     

  • service chpermission  /data/chpermission  
  • oneshot 
  • 
    
    
    #add by me on 2010-10-18    
    service chpermission   /data/ chpermission 
    oneshot

    4、ramdisk 만들기.img:
    init.rc 수정 후 다음 명령을 사용하여 미러 cpio -i -t -F./ramdisk.img > list   cpio -o -H newc -O lk.img ramdisk.img을 sdk가 가리키는 디렉터리로 복사합니다.
    시뮬레이터를 다시 시작합니다.

    좋은 웹페이지 즐겨찾기