마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

젤리빈과 킷캣 Service OOM Killer & android:persistent 속성 관련 질문

0 추천

이번에 배터리 사용량 테스트 하던 중 앱 죽이고

서비스만 띄운 상태에서의 배터리를 테스트 하게 되었습니다. 

 

그런데 갤4와 갤노트2에서 30분정도 있다가 자꾸 서비스가 죽는 현상이 발견되서(갤3에서는 안그러는데)

테스트 프로젝트를 하나 만들어서 서비스 죽는현상을 막아보려고 하다가 잘되지 않아 질문드립니다.

 

질문 요약

1. Service를 죽이지 않고 계속 돌리려면 어떻게 해야하나요.

 

2. 갤럭시S4(KitKat)에서 Service를 자꾸 죽이는데 킷캣에서 OOM Kill관련하여 바뀐점이 있는지 궁급합니다.

 

3. android:persistent="true" 속성 값을 주었는데도 shell dump 에서 "PERS"로 안나오고 "Proc"로 나오는 이유가 뭔가요.

 

테스트 환경

단말1. 갤럭시s3 (JellyBean ver15. 4.1.2)

단말2. 갤럭시s4 (KitKat ver16. 4.3) -> 갤노트2(안드로이드 버전 같음)에서도 테스트 결과 동일합니다.

 

테스트 방법

테스트 프로젝트 올린뒤 액티비티 종료하고 방치

 

테스트 코드

AndroidManifest.xml(persistent 속성 넣은거 빼고는 없습니다.)

(생략)

<uses-sdk
        android:minSdkVersion="15"
        android:targetSdkVersion="16" />

<application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:persistent="true"
        android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" >
        <activity android:name="com.dinnoplus.testservice.activity.TestActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name="com.dinnoplus.testservice.service.TestService"></service>
    </application>

(생략)

----------------------------------------------------------

TestActivity.java (별다른 소스 없습니다.)

(생략)

protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  Log.i(TAG, "onCreate() " + this);
  setContentView(R.layout.main);
  mContext = this;
  Intent intent = new Intent(mContext, TestService.class);
  startService(intent);
 }

(생략)

----------------------------------------------------------

TestService.java (마찬가지로 별다른 소스 없습니다.)

(생략)

public int xxonStartCommand(Intent intent, int flags, int startId) {
  Log.i(TAG, "xxonStartCommand() " + this);
  if(mThread == null) {
   mThread = new Thread(new Runnable() {
    @Override
    public void run() {
     try {
      while(!Thread.currentThread().isInterrupted()) {
       Log.d(TAG, "xxonStartCommand() mCount: " + ++mCount );
       Thread.sleep(5000);
      }
     } catch(Exception e) {
      Log.e(TAG, "xxonStartCommand() mCount: " + ++mCount );
     }
    }
   });
   mThread.start();
  }
  return START_REDELIVER_INTENT;
 }

(생략)

----------------------------------------------------------

 테스트 결과

단말1. (갤3 젤리빈)

몇시간동안 서비스 죽지 않고 계속 잘 돕니다.

단말2. (갤4 킷캣)

Activity onDestroy 약 30분 경과후 Service죽습니다.

>> 아무런 로그가 보이지 않는것으로 보아 OS에서 죽인것 같습니다. 아래는 로그 찍힌 시간과 내용입니다.

16:14:35.791 activity onDestroy
16:14:36.796 service count 4
16:44:57.231 service count 368
16:45:02(예정) service count 369 안찍힘 (???)
16:45:05.336 dalvik GC (WAIT_FOR_CONCURRENT_GC blocked 1ms)

 

adb shell dumpsys activity 결과

단말1.(갤3 젤리빈)

Proc #47: adj=bak+2/B  trm= 0 7249:com.dinnoplus.testservice/u0a179 (started-bg-ui-services)

단말2. (갤4 킷캣)

Proc #23: adj=bak  /B  trm= 0 571:com.dinnoplus.testservice/u0a10163 (started-bg-ui-services)

appappapp (180 포인트) 님이 2014년 3월 12일 질문

2개의 답변

+1 추천
startForeground 를 사용해도 그런가요?
익명사용자 님이 2014년 5월 28일 답변
0 추천
Persistent 속성은 System App에서 사용 가능한 것으로 알고 있습니다.
익명사용자 님이 2014년 5월 28일 답변
...