Android/System Service 등록 방법
안드로이드 시스템 서비스 등록
환경 Ubuntu 10.04 64bit using Vmware workstation 7.0.1 (참고 : Ubuntu 10.04의 경우 32bit에선 원할한 빌드가 이루어지지 않을 수 있음)
Step 1. 다음의 파일을 준비한다
① MetaService.java :서비스 stub 구현 파일 ② IMetaService.java : stub 파일 ③ IMetaService.aidl : 서비스 인터페이스
Step 2. 파일의 package를 수정한다
Ex) dislab.hufs.metaservice -> com.android.server
(dislab.hufs.metaservice같은) 특정 패키지를 import 해서 사용하는 방법을 찾고 있지만 아직까지 확실한 방법이 보이지 않음. 임시 방편형태지만 com.android.server 패키지로 등록시키는 편법을 사용
소스코드의 모든 dislab.hufs.metaservice 구문을 수정해야 한다. 현재로썬 원하는 패키지명으로 서비스를 등록하는 방법을 찾지 못한상태로 com.android.server 패키지로 등록하자
IMetaService.java (stub파일)의 경우 수정해야할 부분이 많다
Step 3. 파일을 다음의 디렉토리에 복사한다
/SRC_DIR/frameworks/base/services/java/com/android/server/..
Step 4. 다음의 파일을 수정한다
/SRC_DIR/frameworks/base/services/java/com/android/server/SystemServer.java
위 파일이 부팅시에 서비스를 등록해주는 코드가 들어있다. 이곳에 원하는 서비스를 추가한다. 추가하는 방법은 다음과 같다
ServiceManager.addService("metaservice", new MetaService(context));
위 코드를 추가하면 “metaservice”라는 이름으로 시스템서비스가 등록된다.
현재 상황에서 문제가 되는 부분은 아랫부분과같이 import를 해주는 부분이다.
만약 사용자가 원하는 패키지를 추가하고자 할 때 import문을 추가할텐데 이때 소스코드를 어떤 디렉토리에 위치 시켜야 되는지 명확하지 않다.
여러 차례 시도를 해 보았지만 Makefile을 통해 수정해야 하는지 현재로썬 답을 찾지 못하고 편법으로 등록시키게 되었다.
Step 5. Build
SRC_DIR 에서 make 명령을 실행
빌드가 성공하게되면 위와 같은 화면이 나오고 이미지 파일이 생성되게 된다. 이 이미지 들을 이용하여 에뮬레이터를 동작하게되면 등록한 시스템 서비스를 사용 할 수 있다
Step 6. 이미지 교체
안드로이드 SDK가 설치되어 있다면 다음의 디렉토리에 있는 이미지들을 교체해준다 플랫폼디렉토리에는 android-2 ~ android-8 까지의 디렉토리가 있는데 API level과 매칭이 된다
Ex> SDK_DIR/platforms/android-8/images Ramdis.img System.img Userdata.img
위 세파일을 생성된 이미지료 교체하면된다 생성된 이미지들은 SRC_DIR/out/target/product/generic 폴더에 저장되어있다
교체한 이미지로 AVD를 실행한다
에뮬레이터를 실행하고 adb shell 명령어로 접속한 후 service list 명령어를 통해 서비스 리스트를 확인한다
등록된 시스템 서비스는 SystemManager 클래스를 사용해 편리하게 사용 할 수 있다. 하지만 SystemManager는 레퍼런스가 공개된 클래스가 아니기 때문에 안드로이드 소스에서 추출해주어야 한다. 다음의 소스폴더를 jar파일로 만들어 추가시켜주면된다.
/SRC_DIR/framework/base/core/java/android/os* /SRC_DIR/framework/base/core/java/com/android/*
등록된 시스템 서비스는 다음과 같이 사용할 수 있다
IBinder b = ServiceManager.getService("metaservice"); IMetaService sService = IMetaService.Stub.asInterface(b); try { sService.setMetaText("test"); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); }