상세 컨텐츠

본문 제목

안드로이드 문서 정리 - 앱 리소스

안드로이드 문서 정리

by yebon.kim 2021. 4. 15. 01:49

본문

반응형

앱 리소스

원문 링크

이 문서에서는 앱 리소스에 대해서 간단히 다루고 각각 세세하게는 다른 문서에서 다룸.

주의 : 리소스 파일을 res/ 디렉토리에 직접 저장하면 컴파일러 오류가 발생한다.

대체 리소스 제공

구성한정자 값설명

구성 한정자 값설명
MCC 및 NCC mcc310
mcc310-mnc004
이동통신 국가 코드(MCC)에 선택적으로 이동통신 네트워크 코드(MNC)가 이어지는 형태로, 기기의 SIM 카드에서 가져온다.
언어 및 지역 en
en-rUS
b+en+US
앞 두 글자는 언어의 2글자코드이고 뒤의 두 글자는 지역코드의 2글자이다. 지역코드 앞에는 구분을 위해 r이 붙는다. 지역코드만을 지정할 수는 없다.
레이아웃 방향 ldrtl
ldltr
ldrtl는 "오른쪽에서 왼쪽 방향 레이아웃"을 나타낸다.
ldltr는 "왼쪽에서 오른쪽 방향 레이아웃"을 나타내며 기본값이다.
supportsRtl=true, targetSdkVersion >= 17 이상으로 설정되어있어야 한다.
smallestWidth sw<N>dp 기기의 smallestWidth는 해당 화면의 이용 가능한 높이와 너비의 가장 짧은 치수를 말한다. 이 값으로 태블릿인지 폰인지 여부를 가늠할 수 있다. smallestWidth 한정자를 여러 개 사용하는 앱의 경우 시스템은 smallestWidth에 가장 가깝지만 이를 초과하지 않는 값을 사용한다.
이용 가능한 너비 w<N>dp 리소스를 사용해야 하는 dp 단위에서 최소 이용 가능한 화면 너비를 지정합니다. 대개 이 방법은 다중 창 레이아웃의 사용 여부를 결정할 때 유용합니다
이용 가능한 높이 h<N>dp 리소스가 사용되어야 하는 최소한의 사용 가능한 화면 높이를 "dp" 단위로 나타냅니다. 대개 이 방법은 다중 창 레이아웃의 사용 여부를 결정할 때 유용합니다
화면크기 small
normal
large
xlarge
모든 리소스가 현재 화면 크기보다 큰 화면 크기의 한정자만을 갖는 경우 앱이 런타임에 중지될 수 있다.
넓은 색 공간 widecg
nowidecg
widecg: Display P3, AdobeRGB 등과 같은 넓은 색 공간으로 표시.
nowidecg: sRGB와 같은 좁은 색 공간으로 표시합니다

 

  • 아래 사진처럼 sRGB가 표현할 수 있는 색상이 더 적다.

Adobe RGB와 sRGB의 차이

구성 한정자 값설명
HDR(High Dynamic Range) highhdr
lowdr
highhdr: 높은 동적 범위로 표시합니다.
lowdr: 낮은/표준 동적 범위로 표시합니다.
화면방향 port
land
port : 세로모드
land : 가로모드
야간모드 night
nonight
night : 야간
nonight : 주간
화면픽셀밀도 ldpi
mdpi...
nodpi : 기기 밀도에 일치하도록 크기를 조정하지 않을 비트맵 리소스에 사용한다.
anydpi : 모든 화면 밀도와 일치하며 다른 한정자보다 우선한다. 벡터 드로어블에 유용하다. nnndpi : 표준이 아닌 밀도를 표현한다. 대부분의 경우 사용하면 안된다.
터치스크린 유형 notouch
finger
notouch : 기기에 터치스크린이 없음
finger : 기기에 터치 스크린이 있으며 이를 사용자의 손가락을 사용한 방향 지시 상호작용을 통해 쓰도록 되어 있다.
키보드 가용성 keysexposed keyshidden keyssoft keysexposed :기기에서 키보드를 사용할 수 있다. 소프트웨어 키보드가 활성화되어 있으며 하드웨어 키보드는 없거나 유저에게 보여지고 있지 않다. 소프트웨어 키보드가 제공되고 있지않다면 하드웨어 키보드가 사용자에게 보여지고 있다.
keyshidden : 기기에서 하드웨어 키보드를 사용할 수 있지만 숨겨져 있고 소프트웨어 키보드는 활성화되어 있지 않다.
keyssoft : 기기에 활성화된 소프트웨어 키보드가 있음.
기본 텍스트 입력 방법 nokeys
qwerty
12key
nokeys : 기기에 하드웨어 키가 없음.
qwerty : 기기에 하드웨어 쿼티 키보드가 있다.
12key : 기기에 하드웨어 12키 키보드가 있다.
  • 이 밖에 화면 비율, 원형 화면 여부, UI모드(차, 워치, TV 등), 등의 추가 리소스 한정자가 더 있다.

한정자 이름 규칙

  • 한정자의 순서는 정해진 순서를 따라야한다.
  • 대소문자를 구분하지 않음. 리소스 컴파일러가 디렉토리 이름을 모두 소문자로 바꾼다.

별칭 리소스 생성

  • 하나의 리소스를 여러 리소스 폴더에 넣고 싶을 경우에 똑같은 파일을 여러개 복사하지 않아도 된다.
  • 아래와 같이 원본 파일을 두고 다른 파일에서는 xml로 한 번 감싸서 사용한다.
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <drawable name="icon">@drawable/icon_ca</drawable>
</resources>
  • 레이아웃은 merge와 include를 활용하여 하나의 파일을 다른 파일에서 참조할 수 있다.
  • 문자열과 컬러값은 아래처럼 직접 언급이 가능하다.
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello</string>
    <string name="hi">@string/hello</string>
</resources>

앱 리소스 액세스

  • 모든 리소스는 aapt 도구가 자동으로 생성하는 프로젝트의 R 클래스에 정의됨.
  • 수동으로 R클래스를 수정하면 안됨.
  • 스타일 리소스 참조
    • 다른 리소스는 xml에서 @[<package_name>:]<resource_type>/<resource_name> 와 같은 형식을 따름
    • 스타일은 별개로 ?[<package_name>:][<resource_type>/ <resource_name> 형식을 따른다
  • 원본 파일에 직접 액세스 하고 싶은 경우 asset을 이용
    • 원시 데이터를 읽기만 하는 경우에는 res/raw 폴더 아래 리소스를 두고 사용할 수 있다.
  • 플랫폼 리소스 액세스
    • 안드로이드가 제공하는 리소스는 android.R..로 접근할 수 있다.

리소스와 연관된 최선의 기기 호환성 제공

  • 언어 리소스는 꼭 values 폴더 안에 기본값이 설정되어있어야 한다. 만약 지원하지 않는 언어의 핸드폰 설정일 경우 런타임 에러가 발생할 수 있다.
    • 레이아웃 방향에 대해서도 마찬가지이다. 세로 방향을 기본으로 제공하는 경우 세로 방향 xml들을 layout에 두고 가로 방향 xml들을 layout-land에 두면 된다.
  • 리소스 한정자의 minSdkVersion도 확인해야한다. 예를 들어 night, nonight 한정자에만 포함된 리소스를 제공할 경우 api level 8 미만에서 오류가 생길 수 있다. 따라서 drawable-nonight, drawable-night보다 drawable, drawable-night로 지원해야한다.
    • 화면 밀도 한정자는 예외이다. 기본 drawable이 없어도 시스템이 최적의 drawable을 고르고 필요할 경우 압축도 진행한다.

 

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

안드로이드가 가장 잘 일치하는 리소스 찾는 법

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

위와 같은 리소스가 제공되고 있을 때로 예를 들면,

 

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/

 

2. 대체리소스제공 상단 표에서 우선순위가 가장 높은 한정자를 찾는다. (MCC부터 아래로 내려오는 순서)

  • 리소스 디렉토리 중에 이 한정자를 포함한게 있다면 아래 단계로 진행한다.
  • 없을 경우 다음 우선순위의 한정자를 찾는다.

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

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

4. 위 작업을 디렉토리가 하나만 남을 때 까지 반복한다. 결과는 drawabe-en-port가 남는다.


  • 일반적으로는 위의 절차를 따르지만 시스템이 최적화하는 부분이 있다. 가령 구성 언어가 영어("en")라면 영어 이외의 다른 언어 한정자로 설정된 리소스 디렉토리는 절대 확인된 리소스 풀에 포함되지 않는다.
  • 화면 크기 한정자에 기초하여 리소스를 선택할 때 시스템은 가장 잘 일치하는 리소스가 없다면 현재 화면보다 작은 화면에 지정된 리소스를 사용한다. (예를 들어 큰 화면은 필요에 따라 일반 크기 화면 리소스를 사용한다). 그러나 사용 가능한 리소스가 현재 화면보다 더 크다면 시스템은 이를 사용하지 않는다.
반응형

관련글 더보기

댓글 영역