The Android Developer Challenge is back! Submit your idea before December 2.

수십억 사용자를 위한 연결성

전 세계 사용자의 절반 이상이 2G 연결에서 앱을 사용합니다. 이들의 경험을 개선하려면 데이터 저장, 요청을 큐에 저장 및 최적의 성능을 위한 이미지 처리 등 저속 연결과 오프라인 작업을 위한 최적화가 필요합니다.

여기에 이러한 작업을 하는 방법에 대한 몇 가지 팁을 소개하였습니다.

이미지 최적화

이미지를 다운로드하기 쉽게 만드는 데에는 여러 가지 방법이 있습니다. 예를 들어 WebP 이미지 제공, 동적인 이미지 크기 조정 및 이미지 로드 라이브러리 사용 등이 대표적입니다.

WebP 이미지 제공

  • 네트워크에서 WebP 파일을 제공하여 이미지 로드 시간을 줄이고 네트워크 대역폭을 절약합니다. WebP 파일은 같은 이미지 화질의 PNG 및 JPG 파일에 비해 크기가 작은 경우가 많습니다. 손실 설정을 사용하더라도 WebP는 원본과 거의 같은 이미지를 도출할 수 있습니다. Android는 Android 4.0(API 레벨 14: Ice Cream Sandwich) 이상에서 손실 WebP를 지원하고 Android 4.2(API 레벨 17: Jelly Bean) 이상에서 무손실/투명 WebP를 지원합니다.

동적인 이미지 크기 조정

  • 앱이 기기 사양에 따라 대상 렌더링 크기로 이미지를 요청하도록 한 다음, 서버가 적절하게 크기를 조정한 이미지를 제공하도록 합니다. 이렇게 하면 네트워크를 통해 전송되는 데이터를 최소화하고 각 이미지를 보관하는 데 필요한 메모리 양을 줄여주므로 성능과 사용자 만족도가 향상됩니다.
  • 사용자가 이미지가 다운로드되기를 기다려야 하는 경우 사용자 환경이 저하됩니다. 적절한 이미지 크기를 사용하면 이러한 문제 해결에 도움이 됩니다. 네트워크 유형 또는 네트워크 품질에 따라서 이미지 크기를 다르게 요청해 보세요. 이 크기는 타겟 렌더링 크기보다 더 작을 수 있습니다.
  • 사전 계산된 팔레트 값 또는 저해상도 썸네일 이미지과 같은 동적 자리표시자는 이미지를 가져오는 동안 사용자 환경을 개선할 수 있습니다.

이미지 로드 라이브러리 사용

  • 앱은 같은 이미지를 두 번 이상 가져와서는 안 됩니다. GlidePicasso와 같은 이미지 로드 라이브러리는 이미지를 가져와서 캐시에 저장하고, 실제 이미지가 준비될 때까지 자리표시자 이미지를 표시하는 후크를 뷰에 제공합니다. 이미지는 캐시에 저장됩니다. 따라서 이들 라이브러리는 다음 번에 이미지가 요청되면 로컬 복사본을 반환합니다.
  • 이미지 로드 라이브러리는 자체 캐시를 관리하여 가장 최근의 이미지를 보관하므로 앱 저장량이 무한정으로 늘어나지는 않습니다.

네트워킹 최적화

최적의 네트워크 환경을 제공하여 사용자 환경을 향상할 수 있습니다. 예를 들어, 앱을 오프라인에서 사용할 수 있도록 하거나 GcmNetworkManager 및 콘텐츠 제공자를 사용하고 네트워크 요청의 중복을 제거할 수 있습니다.

오프라인에서 앱을 사용 가능하도록 만들기

  • 교외 지역이나 빈곤 지역에서는 기기의 네트워크 연결이 끊기는 경우가 흔합니다. 유용한 오프라인 상태를 만들면 사용자가 언제든지 앱과 상호작용할 수 있습니다. 이렇게 하려면 데이터를 로컬에 저장하고 데이터를 캐싱하며 연결이 복원되었을 때 아웃바운드 요청을 큐에 저장하면 됩니다.
  • 가능한 경우, 앱이 사용자에게 연결이 끊긴 사실을 알리지 않는 것이 좋습니다. 사용자가 연결이 필수적인 작업을 수행하고 있을 때만 알림을 제공해야 합니다.
  • 기기의 연결이 끊긴 경우, 앱은 사용자를 대신하여 연결이 복원되었을 때 실행할 수 있는 네트워크 요청을 일괄 처리해야합니다. 이러한 예로는 기기가 오프라인일 때도 사용자가 기존 메일을 작성, 보내기, 읽기, 이동 및 삭제할 수 있는 이메일 클라이언트를 들 수 있습니다. 이러한 작업을 캐시에 저장한 후 연결이 복원될 때 실행할 수 있습니다. 이렇게 하면 앱은 기기가 온라인이든 오프라인이든 유사한 사용자 환경을 제공할 수 있습니다.

GcmNetworkManager 및 콘텐츠 제공자 사용

  • 네트워크 조건에 상관없이 앱이 최적으로 수행되도록 하려면, 앱이 데이터베이스 또는 이와 유사한 구조를 사용하여 모든 데이터를 디스크에 저장하도록 하세요(예: SQLite + ContentProvider를 사용). GCM Network Manager(GcmNetworkManager)는 콘텐츠 제공자(ContentProvider)가 데이터를 캐시에 저장할 때 서버와 동기화하는 강력한 메커니즘과 함께, 유용한 오프라인 상태를 사용할 수 있도록 하는 아키텍처를 제공합니다.
  • 앱은 네트워크에서 가져온 콘텐츠를 캐시에 저장해야 합니다. 후속 요청을 수행하기 전에 앱이 로컬로 캐싱된 데이터를 표시해야 합니다. 이렇게 함으로써 기기가 오프라인이든 네트워크가 느리든 불안정하든 간에 앱이 작동하도록 보장합니다.

네트워크 요청 중복 제거

  • 오프라인 우선 아키텍처는 먼저 로컬 저장소에서 데이터 가져오기를 시도하고, 이 작업이 실패하면 네트워크로부터 데이터를 요청합니다. 네트워크에서 검색을 마친 데이터는 향후 검색을 위해 캐시에 로컬로 저장됩니다. 이렇게 하면 동일한 데이터 조각에 대해 네트워크 요청이 한 번만 발생하고 이후 요청은 로컬에서 충족되도록 합니다. 이를 실현하려면, 장기 보유 데이터(대개 android.database.sqlite 또는 SharedPreferences)에 로컬 데이터베이스를 사용하세요.
  • 이 아키텍처는 한 쪽에서는 네트워크에서 데이터를 캐시로 가져오고 다른 쪽에서는 캐시에서 데이터를 검색하여 사용자에게 표시하므로, 오프라인 상태와 온라인 상태 사이의 앱 흐름도 단순화해 줍니다.
  • 일시적인 데이터의 경우에는, DiskLruCache와 같은 제한된 디스크 캐시를 사용합니다. 일반적으로 변경되지 않는 데이터는 네트워크에서 한 번만 요청되고 향후 사용을 위해 캐시에 저장되어야 합니다. 이러한 데이터의 예로는 이미지와 일시적이 아닌 문서(예: 뉴스 기사 또는 소셜 게시물)가 있습니다.

데이터 전송 미세 조정

앱이 네트워크 조건에 적응하여 더 나은 사용자 환경을 제공하도록 하는 방법이 몇 가지 있습니다. 예를 들어 앱은 네트워크 요청의 우선순위를 정하여 사용자가 정보를 기다리는 시간을 최소화할 수 있습니다. 또한 네트워크 속도가 느릴 경우 이를 감지하여 네트워크 연결에서 발생 가능한 변동 사항에 적응할 수도 있습니다.

대역폭의 우선순위 지정

  • 개발자는 기기가 연결된 네트워크가 안정적이거나 연결이 오래 지속되리라고 가정해서는 안 됩니다. 이러한 이유로, 앱은 가장 유용한 정보를 최대한 빨리 사용자에게 표시하기 위해 네트워크 요청의 우선순위를 지정해야 합니다.
  • 불필요할 수도 있는 정보를 사용자가 기다리게 만드는 것보다 관련 정보를 즉각적으로 사용자에게 제공하는 것이 더 나은 사용자 환경입니다. 이렇게 하면 사용자가 기다려야 하는 시간이 줄어들고 속도가 느린 네트워크에서 앱의 유용성이 증가합니다.
  • 이를 실현하려면, 리치 미디어보다 텍스트를 먼저 가져오도록 네트워크 요청의 순서를 지정합니다. 텍스트 요청은 크기가 더 작고 압축이 더 잘되며 전송이 더 빠른 경향이 있으므로, 유용한 콘텐츠를 앱에서 즉시 표시할 수 있습니다. 네트워크 요청 관리에 대한 자세한 내용은, Android 교육 과정에서 네트워크 사용량 관리를 참조하세요.

더 느린 연결에서 더 적은 대역폭 사용

  • 앱이 적시에 데이터를 전송할 수 있는 성능은 네트워크 연결 속도에 달려있습니다. 네트워크의 품질을 감지하고 앱이 이 네트워크를 사용하는 방식을 조정하면 뛰어난 사용자 환경을 제공할 수 있습니다.
  • 다음 메서드를 사용하여 기본 네트워크 품질을 감지할 수 있습니다. 이러한 메서드의 데이터를 사용하면, 네트워크 사용을 최적화하여 사용자의 동작에 지속적으로 적시에 응답할 수 있습니다.
  • 연결이 느린 경우에는 저해상도 미디어만 다운로드하거나 아예 다운로드하지 않도록 해보세요. 이렇게 하면 느린 연결에서도 사용자가 앱을 사용할 수 있습니다. 이미지가 없거나 이미지가 아직 로딩 중인 경우에는 반드시 자리표시자를 표시해야 합니다. 팔레트 라이브러리를 사용해 타겟 이미지와 일치하는 자리표시자 색상을 생성하여 동적인 자리표시자를 만들 수 있습니다.
  • Android 7.0(API 레벨 24) 이상으로 구동되는 기기에서는 사용자가 데이터 절약 모드 설정을 켤 수 있으며 이 경우 데이터 사용량이 최소화됩니다. Android 7.0에서는 ConnectivityManager를 확장하여 데이터 절약 모드 설정을 감지합니다. 이 기능에 대한 자세한 내용은 데이터 절약 모드를 참조하세요.

네트워크 변경을 감지한 후 앱 동작 변경

  • 네트워크 품질은 고정된 것이 아니며 위치, 네트워크 트래픽 및 로컬 인구 밀도에 따라 변합니다. 앱은 네트워크의 변경사항을 감지하고 이에 따라 대역폭을 조정해야 합니다. 이를 통해 앱은 네트워크 품질에 맞게 사용자 환경을 최적화할 수 있습니다. 다음 메서드를 사용하여 네트워크 상태 감지:
  • 네트워크 품질이 저하됨에 따라 요청의 크기와 수를 줄입니다. 연결 품질이 개선됨에 따라 요청을 최적의 수준으로 늘릴 수 있습니다.
  • 고품질의 고정 요금제 네트워크에서는 데이터를 미리 사용할 수 있도록 데이터 프리페치를 고려해 보세요. 사용자 환경이라는 관점에서 이것은 뉴스 구독 앱이 2G 환경에서는 한 번에 기사를 3건만 가져오는 반면 Wi-Fi에서는 한 번에 기사를 20개 가져올 수 있다는 뜻입니다. 네트워크 변경에 따른 앱 동작 조정에 대한 자세한 내용은 Android 교육 과정에서 연결 상태 모니터링을 참조하세요.
  • 네트워크 연결이 변경되면 브로드캐스트 CONNECTIVITY_CHANGE가 전송됩니다. 앱이 포그라운드에 있는 경우, registerReceiver를 호출하여 이 브로드캐스트를 수신할 수 있습니다. 브로드캐스트를 수신한 후에는 현재 네트워크 상태를 재평가하고 UI 및 네트워크 사용량을 적절히 조정해야 합니다. Android 7.0(API 레벨 24) 이상에서는 이 수신기를 사용할 수 없으므로, 이를 매니페스트에 선언해서는 안 됩니다. 이에 관한 자세한 내용과 Android 7.0의 다른 변경사항에 대한 자세한 내용은 Android 7.0 변경 사항을 참조하세요.