Android 사용자 정의 System Service 디버깅 및 문제 해결
Android에서 사용자 정의 System Service를 개발할 때, 서비스가 정상적으로 동작하지 않거나 예기치 않은 오류가 발생할 수 있습니다. 이를 해결하기 위해 Android에서 제공하는 다양한 디버깅 도구를 활용할 수 있습니다. 본 글에서는 logcat
과 dmesg
를 이용한 서비스 디버깅, 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를 디버깅하는 방법에 대해 설명하였습니다. logcat
과 dmesg
를 활용하여 서비스가 정상적으로 실행되는지 확인하고, dumpsys
를 통해 서비스의 상태를 점검하는 방법을 알아보았습니다. 또한, 서비스가 정상적으로 실행되지 않을 때 문제 해결 방법에 대해서도 다루었습니다.
System Service 개발 및 디버깅 과정에서 위에서 설명한 방법을 활용하면, 보다 효율적으로 문제를 해결할 수 있을 것입니다.
'Android > Custom System Service' 카테고리의 다른 글
Android 사용자 정의 System Service 만들기: 예제 프로젝트 및 유지 방법 (0) | 2025.06.12 |
---|---|
Android 사용자 정의 System Service 만들기 - HAL 연동 및 성능 최적화 (0) | 2025.06.11 |
Android 사용자 정의 System Service 만들기: SELinux 정책 추가 및 접근 제어 (0) | 2025.06.09 |
Android 사용자 정의 System Service 만들기 (0) | 2025.06.08 |
Android 사용자 정의 System Service 만들기 (0) | 2025.06.07 |