상세 컨텐츠

본문 제목

앱 개발 방법 - 앱 리소스 (Android가 가장 잘 일치하는 리소스를 찾는 방법 [리소스 선택 논리 구조])

안드로이드 프로그래밍/앱 리소스

by green post it 2022. 1. 8. 14:12

본문

반응형

Android가 가장 잘 일치하는 리소스를 찾는 방법

개발자가 대체를 제공하는 리소스를 요청하면 Android가 현재 기기 구성에 따라 런타임에 어느 대체 리소스를 사용할지 선택합니다. Android가 대체 리소스를 선택하는 방법을 보여주기 위해 다음 드로어블 디렉토리에 같은 이미지의 서로 다른 번전이 들어 있다고 가정하겠습니다.

drawable/
drawable-en/
drawable-fr-rCA/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/

그리고 기기의 구성은 다음과 같습니다.

  1. 로케일 = en-GB
  2. 화면 방향 = port
  3. 화면 픽셀 밀도 = hdpi
  4. 터치 스크린 유형 = notouch
  5. 기본 텍스트 입력 방법 = 12key

Android는 기기 구성을 이용 가능한 대체 리소스와 비교하여 drawable-en-port에서 드로어블을 선택합니다.

 

시스템은 다음과 같은 논리에 따라 어느 리소스를 사용할지 결정합니다.

Android가 가장 잘 일치하는 리소스를 찾는 방법

1. 기기 구성과 충돌하는 리소스 파일을 제거합니다.
drawable-fr-rCA/ en-GB 로테일과 충돌하므로 제거되었습니다.

 

drawable/
drawable-en/
drawable-fr-rCA/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/

 

예외 : 화면 픽셀 밀도 한정자 하나만은 충돌을 이유로 제거되지 않습니다. 기기의 화면 밀도가 hdpi라도 현 시점에서는 모든 화면 밀도가 일치로 간주되므로 drawable-port-ldpi를 제거하지 않습니다.

 

2. 목록"리소스 구성 한정자 이름"에서(그 다음으로) 우선순위가 가장 높은 한정자를 선택합니다.(MCC부터 시작해서 아래로 내려가세요.)

 

3. 리소스 디렉토리 중에 이 한정자를 포함한 것이 있나요?

  • 없을 경우 2단계로 돌아가 다음 한정자를 살펴보세요(이 예시의 경우 언어 한정자에 도달할 때 까지 답은 "없습니다"입니다.
  • 있는 경우 4단계로 계속 진행합니다.

4. 이 한정자를 포함하지 않는 리소스 디렉토리는 제외합니다. 이 예시에서는 시스템이 언어 한정자를 포함하지 않는 디렉토리를 모두 제거합니다.

 

drawable/

drawable-en/

drawable-en-port/

drawable-en-notouch-12key/

drawable-port-ldpi/

drawable-port-notouch-12key/

 

예외 : 문제의 한정자가 화면 픽셀 밀도라면 Android는 기기 화면 밀도와 가장 가깝게 일치하는 옵션을 선택합니다. 일반적으로 Android는 작은 원 이미지를 확대하는 것보다 큰 원본 이미지를 축소하는 것을 선호합니다.

 

5. 뒤로 돌아가 디렉토리가 한 개만 남을 때까지 2, 3, 4단계를 반복합니다. 이 예시에서 일치하는 것이 있는 다음 한정자는 화면 방향입니다. 따라서 화면 방향을 지정하지 않는 리소스 제거됩니다.

drawable-en/

drawable-en-port/

drawable-en-notouch-12key/

 

남은 디렉토리는 drawable-en-port 입니다.

 

이 절차는 요청된 각 리소스에 대해 실행하지만 시스템이 몇 가지 측면을 추가로 최적화합니다. 예를 들어 시스템이 기기 구성을 확인하고 나서 절대 일치할 가능성이 없는 대체 리소스를 제거합니다. 가령 구성 언어가 영어("en")라면 영어 이외의 다른 언어 한정자로 설정된 리소스 디렉토리는 절대 확인된 리소스 풀에 포함되지 않습니다.(언어 한정자가 포함되지 않는 리소스 디렉토리는 여전히 포함됩니다.)

 

화면 크기 한정자에 기초하여 리소스를 선택할 때 시스템은 가장 잘 일치하는 리소스가 없다면 현재 화면보다 작은 화면에 지정된 리소스를 사용합니다.(예를 들어 큰 화면은 필요에 따라 일반 크기 화면 리소스를 사용합니다.) 그러나 사용 가능한 리소스 현재 화면보다 더 크다면 시스템은 이를 사용하지 않습니다. 기기 구성과 일치하는 다른 리소스가 없는 경우 앱의 작동 중단됩니다.(예를 들어 모든 레이아웃 리소스가 xlarge 한정자로 태깅되어 있지만 기기가 보통 크기 화면인 경우)

 

참고 : 한정자의 우선순위"리소스 구성 한정자 이름"가 기기와 정확하게 일치하는 한정자 수보다 더 중요합니다. 예를 들어 위의 4단계에서 목록의 마지막 선택 항목에 기기와 정확히 일치하는 한정자가 세 개 포함되어 있지만(방향, 터치 스크린유형, 입력 방법) drawable-en에는 일치하는 매개변수가 하나뿐입니다.(언어) 다만 언어가 이러한 다른 한정자보다 우선순위가 높기 때문에 drawable-port-notouch-12key는 탈락합니다.

 

-리소스 선택 논리 구조-
기기 구성과 충돌하는 리소스 파일을 제거우선순위가 가장 높은 한정자를 선택리소스 디렉토리 중에 이 한정자를 포함한 것이 있나요?이 한정자를 포함하지 않는 리소스 디렉토리는 제외디렉토리가 한 개만 남을 때까지 2, 3, 4단계를 반복

 

반응형

관련글 더보기