Android/Custom System Service

Android 사용자 정의 System Service 디버깅 및 문제 해결

임베디드 친구 2025. 6. 10. 22:15
728x90
반응형

Android 사용자 정의 System Service 디버깅 및 문제 해결

Android에서 사용자 정의 System Service를 개발할 때, 서비스가 정상적으로 동작하지 않거나 예기치 않은 오류가 발생할 수 있습니다. 이를 해결하기 위해 Android에서 제공하는 다양한 디버깅 도구를 활용할 수 있습니다. 본 글에서는 logcatdmesg를 이용한 서비스 디버깅, dumpsys를 활용한 상태 확인, 그리고 서비스가 정상적으로 실행되지 않을 때 해결 방법에 대해 설명하겠습니다.

1. logcat과 dmesg를 이용한 서비스 디버깅

1.1 logcat을 활용한 디버깅

logcat은 Android의 표준 로그 시스템으로, 시스템 서비스가 실행되는 동안 발생하는 로그를 실시간으로 확인할 수 있습니다. System Service의 문제를 분석하기 위해 먼저 logcat을 활용하여 관련 로그를 확인하는 것이 중요합니다.

1.1.1 logcat 기본 사용법

logcat을 사용하여 특정 태그나 프로세스 ID(PID)에 해당하는 로그를 필터링할 수 있습니다.

adb logcat -s MyServiceTag

또는 특정 프로세스의 로그만 확인하려면 다음과 같이 실행할 수 있습니다.

adb shell ps | grep myservice
adb logcat --pid=<PID>

여기서 MyServiceTag는 System Service에서 Log.d(), Log.e() 등의 함수에서 사용하는 태그입니다. 서비스 코드에서 적절한 로그를 남기는 것이 중요하며, 예제는 다음과 같습니다.

import android.util.Log;

public class MyService extends SystemService {
    private static final String TAG = "MyService";

    public MyService(Context context) {
        super(context);
        Log.d(TAG, "MyService 생성됨");
    }

    @Override
    public void onStart() {
        Log.d(TAG, "MyService 시작됨");
    }
}

위 코드에서 Log.d(TAG, "MyService 시작됨"); 부분을 logcat에서 필터링하여 확인할 수 있습니다.

1.2 dmesg를 활용한 커널 로그 분석

dmesg는 Linux 커널에서 발생하는 로그를 출력하는 명령어로, System Service가 네이티브 코드(C/C++ JNI)와 연동되어 있다면 유용하게 활용할 수 있습니다.

adb shell dmesg | grep myservice

네이티브 코드에서 printf()__android_log_print() 등을 사용하여 로그를 남길 경우, dmesg를 통해 이를 확인할 수 있습니다.

#include <android/log.h>

#define TAG "MyService-Native"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__);

void my_native_function() {
    LOGD("네이티브 코드 실행됨");
}

위 코드에서 발생한 로그는 adb logcat -s MyService-Native 또는 adb shell dmesg | grep MyService-Native로 확인할 수 있습니다.

2. dumpsys를 활용한 System Service 상태 확인

dumpsys는 현재 실행 중인 Android 시스템 서비스의 상태를 확인하는 데 사용됩니다. dumpsys 명령어를 실행하면 특정 서비스의 상세 정보를 출력할 수 있습니다.

2.1 특정 서비스의 상태 확인

다음과 같이 dumpsys 명령어를 사용하면 특정 서비스의 현재 상태를 확인할 수 있습니다.

adb shell dumpsys myservice

또는 grep을 사용하여 필요한 정보만 필터링할 수도 있습니다.

adb shell dumpsys myservice | grep "상태"

2.2 dumpsys를 활용한 예제 코드

System Service에서 dump() 메서드를 오버라이드하여 dumpsys 명령어 실행 시 출력될 내용을 정의할 수 있습니다.

@Override
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
    pw.println("MyService 상태:");
    pw.println("현재 활성화됨: " + isActive);
}

이제 adb shell dumpsys myservice를 실행하면 해당 상태를 확인할 수 있습니다.

3. 서비스가 정상적으로 실행되지 않을 때 해결 방법

System Service가 정상적으로 실행되지 않을 때, 다음과 같은 방법을 시도해볼 수 있습니다.

3.1 서비스가 로드되지 않는 경우

  • frameworks/base/services/에 서비스가 정상적으로 추가되었는지 확인
  • Android.bp 파일에 빌드 규칙이 올바르게 정의되었는지 확인
  • adb logcat -s SystemServer를 통해 SystemServer에서 서비스가 등록되는지 확인

3.2 서비스가 비정상 종료되는 경우

  • adb logcat -s MyService를 통해 오류 메시지를 확인
  • adb shell dumpsys myservice로 상태를 확인
  • dmesg 로그를 통해 커널 관련 문제 확인

3.3 SELinux 정책 문제

System Service가 SELinux 정책에 의해 차단될 경우, dmesg에서 avc: denied 로그를 확인할 수 있습니다. 이를 해결하려면 sepolicy를 수정해야 합니다.

adb shell dmesg | grep avc

3.4 AOSP 빌드 및 로그 분석

AOSP를 빌드하여 직접 System Service를 추가한 경우, 빌드가 정상적으로 완료되었는지 확인해야 합니다.

source build/envsetup.sh
lunch aosp_arm64-userdebug
m -j8

빌드 후 adb logcat을 실행하여 정상적으로 동작하는지 확인합니다.

결론

본 글에서는 Android 사용자 정의 System Service를 디버깅하는 방법에 대해 설명하였습니다. logcatdmesg를 활용하여 서비스가 정상적으로 실행되는지 확인하고, dumpsys를 통해 서비스의 상태를 점검하는 방법을 알아보았습니다. 또한, 서비스가 정상적으로 실행되지 않을 때 문제 해결 방법에 대해서도 다루었습니다.

System Service 개발 및 디버깅 과정에서 위에서 설명한 방법을 활용하면, 보다 효율적으로 문제를 해결할 수 있을 것입니다.

728x90
반응형