원문은 여기서 확인 가능하며, 블로그 리뷰에는 이승민(GDE)님이 참여해주셨습니다.
최근 출시된 WorkManager 2.5.0은 다중 프로세스 환경에서 더 쉽게 사용할 수 있고 안정성 측면에서도 여러 가지로 개선되었습니다.
따라서 여러 프로세스를 관리하는 앱이 있는데 (더 이상의 초기화 오류 없이 ️️⚠) 백그라운드 작업을 관리할 확실한 방법이 필요하다면 이번 릴리스가 안성맞춤입니다.
몇 가지 필수적인 코드 변경 사항이 있으므로 이 게시물에서 자세히 확인해보세요. 아울러 다른 동작 변경 사항과 WorkManager 라이브러리 최신 버전에 추가된 내용도 소개해드리겠습니다.
work-multiprocess
이번 새로운 다중 프로세스 아티팩트는 작업 일정 예약을 단일 프로세스로 통합함으로써 성능 개선을 이루어냈습니다. 시작하려면 앱에 이 아티팩트를 추가하세요.
Implementation "androidx.work:work-multiprocess:2.5.0"
이제 WorkManager가 WorkRequest를 큐에 넣기 위해 사용하는 지정된 프로세스를 선택하고 프로세스 내 스케줄러를 실행할 수 있습니다.
Configuration.Provider를 사용하는 구성은 다음과 같이 보일 수 있습니다.
class MyApplication() : Application(), Configuration.Provider { override fun getWorkManagerConfiguration() =
Configuration.Builder()
.setProcessName("com.example:remote")
.build()
}
*참고: setProcessName의 매개변수에 앱 패키지 이름, 콜론, 호스트 프로세스 이름으로 구성된 전체 프로세스 이름(예: com.example:remote)을 전달해야 합니다.
work-multiprocess를 사용할 때 작업 요청을 관리하기 위해 WorkManager 대신 RemoteWorkManager 를 사용하길 원하실 겁니다. RemoteWorkManager는 자동으로 작업을 큐에 넣도록 지정된 프로세스까지 항상 연결하며, 이를 통해 호출 프로세스에서 새 WorkManager를 우연히 초기화하지 않도록 보장합니다. 프로세스 내 스케줄러는 똑같은 지정된 프로세스에서도 실행됩니다.
이점(Benefits)
WorkManager가 이처럼 구성되어 있을 때 RemoteWorkManager를 사용해 작업을 예약하면 다중 프로세스 앱에서 작업을 더 빠르고 안정적으로 관리할 수 있습니다. 이는 (더 이상 파일 기반 잠금에 의존하지 않으므로) SQLite 경합을 대폭 줄일 수 있기 때문이며, 앱이 개발자가 지정할 수 있는 프로세스에서 작동하는 WorkManager 인스턴스를 단 하나만 가질 것이므로 더 이상 여러 프로세스 간의 작업 매칭(Job reconciliation)이 필요하지 않기 때문입니다.
동작 변경 사항(Behavior changes) 🔀
작업 조정(Job reconciliation)
이전에는 ActivityManager가 작업을 시작하기 위해 JobService를 인스턴스화할 수 없을 때 플랫폼에 있는 기본 버그 때문에 그 작업이 자동으로 삭제되었을 것입니다. 이제는 WorkRequest 객체를 작업과 매칭함으로써(Job reconciliation) Application 인스턴스가 생성될 때 WorkManager가 모든 단일 WorkRequest에 대한 지원 스케줄러 작업이 있도록 보장합니다.
내부 데이터베이스 성장 제한(Limit internal database growth)
앱 비정상 종료의 원인 중 하나가 기기의 저장용량이 부족해졌기 때문이라는 사실을 알았습니다. 이 문제는 주로 처음부터 저장용량이 부족했던 기기에서 발생했습니다. 하지만 앱이 많은 작업을 예약할 때 기기가 저장용량이 부족한 상태로 작동하는 데 대해 WorkManager에 일부 책임이 있었습니다.
완료된 작업은 기본적으로 7일 동안의 분량이 내부 WorkManager 데이터베이스에 기록되었습니다. 그런데 이 시간이 1일로 줄어 데이터베이스 크기가 대폭 줄었습니다.
버퍼 지속 기간을 단축했지만, keepResultsForAtLeast() API를 사용해 작업을 저장해야 할 기간을 제어할 수 있습니다.
새로운 테스트 API (New testing API)✨
WorkManager와 함께 ListenableFuture를 사용 중이라면 테스트가 더욱 쉬워졌습니다. TestListenableWorkerBuilder Kotlin 확장 프로그램이 이제는 ListenableWorker를 확장하는 클래스를 받아들여 테스트 도중 더 많은 유연성을 제공합니다.
버그 수정 (Bug fixes)🐛
새로운 기능 외에, 이 릴리스에는 WorkManager의 안정성, 신뢰성, 성능을 높여주는 여러 가지 버그 수정도 포함됩니다. 출시 노트에서 수정된 버그뿐 아니라 모든 변경 사항도 확인할 수 있습니다.
WorkManager 개선을 위해 할 수 있는 일
GitHub를 통해 WorkManager에 기여하기 👩💻
WorkManager는 물론이고 다른 여러 Jetpack 라이브러리도 GitHub를 통한 기여를 허용할 수 있습니다.
Alan Viverette이 전체 프로세스에 대한 전반적인 내용이 담긴 블로그 게시물을 작성했습니다.
잘못된 점이 있으면 알려주세요 📝
2.5.0 버전에서 버그는 대부분 공개 Issue Tracker에서 입력된 데이터를 통해 수정되었습니다.
저희가 버그를 수정할 수 있는 최선의 방법은 재현 가능한 문제를 만드는 것입니다. 여러분께서 WorkManager 샘플을 사용하시거나 문제 설명에서 안내를 포함하여 자체 샘플 코드를 제공해주시면 문제 재현에 많은 도움이 됩니다.
이제 여러분의 앱에서도 해당 라이브러리 버전의 업데이트를 관리해보세요.