본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[android] Background Optimization ( 백그라운드 최적화 )

by 돼지왕 왕돼지 2018. 10. 8.
반응형


action_new_picture, action_new_video, addtriggercontenturi, allow, Android, Android 5.0, Android 7.0, android los, android nougat, api 21, api 24, background optimization, background service, broadcast, cmd appops set, ConnectivityManager, connectivity_action, contentprovider, FLAG_NOTIFY_FOR_DESCENDANTS, GCMNetworkManager, gmscore service, implicit broadcast, job condition, jobinfo, jobinfobuilder, JobParameters, jobscheduler, JobService, JOB_SCHEDULER_SERVICE, manifest, networkcapabilities, networkrequest, networkrequest.builder, network_type_unmetered, NOS, registernetworkcallback, registerreceiver, runtime broadcast, runtime receiver, run_in_background ignore, setrequiredcharging, setRequirednetworkType, targetsdk 24, task.network_state_unmetered, triggercontenturi, [android] Background Optimization ( 백그라운드 최적화 ), 누가, 백그라운드 최적화


-

Background process 는 User 가 알 수 없게 cpu, memory, battery 등을 소모한다.

Android 7.0 ( API 24 ) 부터는 다음과 같은 제약이 추가되었다.

    targetSdk 24 이상인 앱의 경우 manifest 에 CONNECTIVITY_ACTION 를 등록해도 broadcast 를 받지 못한다. Context.registerReceiver() 를 통한 Runtime receiver 를 등록한 경우에만 받을 수 있다.

    앱은 ACTION_NEW_PICTURE 나 ACTION_NEW_VIDEO broadcast 를 보내거나 받을 수 없다. ( 이것은 Android 7.0 target 이 아닌 단말 기준으로 모든 앱에 작동한다. )



-

만약 위에 명시된 Action 들을 사용하고 있었다면 JobScheduler 나 GcmNetworkManager 가 그 대안이 될 수 있다. 

JobScheduler 를 이용해 ContentProvider 의 변경에 반응할 수도 있다.

JobInfo 는 JobScheduler 가 사용하는 parameter 들을 캡슐화시킨 것이다.

Job condition 이 만족하면 system 은 JobService 를 수행시켜 해당 job 을 수행한다.




Restrictions on CONNECTIVITY_ACTION


-

무제한 이용가능한 network 를 사용하는 경우는 아래와 같이 대응할 수 있다.

public static void scheduleJob(Context context){

    JobScheduler js = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);

    JobInfo job = new JobInfoBuilder(MY_BACKGROUND_JOB, new ComponentName(context, MyJobService.class))

            .setRequirednetworkType(JobInfo.NETWORK_TYPE_UNMETERED)

            .setRequiredCharging(true)

            .build();

    js.schedule(job);

}


JobInfo 의 조건이 충족되면 JobService 의 onStartJob() 이 불린다.


Android 5.0 ( API 21 ) 이하의 앱이나 GMSCore service 를 사용하는 앱은 GcmNetworkManager 와 Task.NETWORK_STATE_UNMETERED 를 이용해서 구현할 수 있다.



-

App 이 Running 중에는 Runtime broadcast 를 이용해서 해당 action 을 listen 할 수도 있지만 ConnectivityManager 의 api 를 이용해서도 listen 할 수도 있다. 그리고 이 방법이 더 추천된다.


NetworkRequest 는 NetworkCapabilities callback 에 관련된 param 들을 담고 있다.

NetworkRequest.Builder 를 이용해서 해당 instance 를 만들고 registerNetworkCallback() 에 전달하면, 조건이 맞을 때 ConnectivityManager.NetworkCallback 의 callback 이 불린다.




NEW_PICTURE, NEW_VIDEO


-

Android 7.0 ( API 24 ) 부터는 JobInfo 에 기능이 추가되었다.

JobInfo.TriggerContentUri()

    Uri change 에 의해 trigger 가 되도록 한다.


JobInfo.Builder.addTriggerContentUri()

    위의 함수와 동일하지만, Builder 를 통해 한다. 

    여러 개를 등록 할 수도 있다.

    TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS flag 를 주면 Uri 의 descendants 가 변화되었을 때도 불린다.



-

public static void scheduleJob(Context context){

    JobScheduler js = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);

    JobInfo job = new JobInfoBuilder(MY_BACKGROUND_JOB, new ComponentName(context, MediaContentJob.class))

            .addTriggerContentUri( new JobInfo.TriggerContentUri(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS))

            .build();

    js.schedule(job);

}



-

Android 7.0 ( API 24 ) 부터 JobParameters 가 확장되었다.

Uri[] getTriggeredContentUris()

String[] getTriggeredContentAuthorities()




Further Optimizing your App


-

Android 7.0 ( API 24 ) 부터, ADB 를 이용해서 다음을 테스트할 수 있다.


implicit broadcast 와 background service 를 unavailable 하게 만들려면

$ adb shell cmd appops set <package_name> RUN_IN_BACKGROUND ignore


반대로 다시 available 하게 만들려면

$ adb shell cmd appops set <package_name> RUN_IN_BACKGROUND allow




참고 자료

https://developer.android.com/topic/performance/background-optimization.html




끝!




반응형

댓글