Android/System Service 등록 방법

Retired DISLab
< Android
Swpark (토론 | 기여) 사용자의 2013년 12월 18일 (수) 12:29 버전
(비교) ← 이전 판 | 현재 판 (비교) | 다음 판 → (비교)
이동: 둘러보기, 찾기

안드로이드 시스템 서비스 등록

환경 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 패키지로 등록하자

Ubuntu 64-bit 10.04-2010-10-20-08-18-06.png

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));

Ubuntu 64-bit 10.04-2010-10-20-08-03-43.png

위 코드를 추가하면 “metaservice”라는 이름으로 시스템서비스가 등록된다.


현재 상황에서 문제가 되는 부분은 아랫부분과같이 import를 해주는 부분이다. 만약 사용자가 원하는 패키지를 추가하고자 할 때 import문을 추가할텐데 이때 소스코드를 어떤 디렉토리에 위치 시켜야 되는지 명확하지 않다. 여러 차례 시도를 해 보았지만 Makefile을 통해 수정해야 하는지 현재로썬 답을 찾지 못하고 편법으로 등록시키게 되었다.

Ubuntu 64-bit 10.04-2010-10-20-08-10-55.png


Step 5. Build

SRC_DIR 에서 make 명령을 실행

빌드가 성공하면 다음과 같은 화면이 나온다 Ubuntu 64-bit 10.04-2010-10-20-09-12-20.png

빌드가 성공하게되면 위와 같은 화면이 나오고 이미지 파일이 생성되게 된다. 이 이미지 들을 이용하여 에뮬레이터를 동작하게되면 등록한 시스템 서비스를 사용 할 수 있다

Step 6. 이미지 교체

안드로이드 SDK가 설치되어 있다면 다음의 디렉토리에 있는 이미지들을 교체해준다
플랫폼디렉토리에는 android-2 ~ android-8 까지의 디렉토리가 있는데 API level과 매칭이 된다
Ubuntu 64-bit 10.04-2010-10-21-01-38-14.png
Ex> SDK_DIR/platforms/android-8/images
Ramdis.img
System.img
Userdata.img

위 세파일을 생성된 이미지료 교체하면된다 생성된 이미지들은 SRC_DIR/out/target/product/generic 폴더에 저장되어있다

교체한 이미지로 AVD를 실행한다


에뮬레이터를 실행하고 adb shell 명령어로 접속한 후 service list 명령어를 통해 서비스 리스트를 확인한다

Ubuntu 64-bit 10.04-2010-10-21-01-44-41.png

등록된 시스템 서비스는 SystemManager 클래스를 사용해 편리하게 사용 할 수 있다. 하지만 SystemManager는 레퍼런스가 공개된 클래스가 아니기 때문에 안드로이드 소스에서 추출해주어야 한다. 다음의 소스폴더를 jar파일로 만들어 추가시켜주면된다.

/SRC_DIR/framework/base/core/java/android/os*
/SRC_DIR/framework/base/core/java/com/android/*

MetaAndroid.jar‎

등록된 시스템 서비스는 다음과 같이 사용할 수 있다

 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();
 		}
개인 도구
이름공간
변수
행위
둘러보기
구성원
연구
연구실
기타
도구모음
인쇄/내보내기