/ res와 / assets 디렉토리의 차이점


266

자산이 파일 시스템처럼 작동하는 동안 res디렉토리의 파일에 액세스 할 수 있다는 것을 알고 R.class있지만 일반적으로 하나를 사용하는 것이 가장 좋은시기를 알고 싶습니다.
res와 자산의 실제 차이점을 아는 사람이 있습니까?

답변:


284

리소스를 통해 여기에 설명 된대로 다양한 언어, OS 버전, 화면 방향 등에 대한 대안을 제공하기위한 기본 지원 기능이 있습니다 . 자산으로는 사용할 수 없습니다. 또한 API의 많은 부분에서 리소스 식별자 사용을 지원합니다. 마지막으로 리소스 이름은 컴파일 타임에 확인되는 상수 필드 이름으로 바뀌므로 코드와 리소스 자체간에 불일치가 발생할 가능성이 줄어 듭니다. 그 중 어느 것도 자산에 적용되지 않습니다.

그렇다면 왜 자산 폴더가 있습니까? 런타임에 사용하려는 자산을 계산하려면 매우 쉽습니다. 자원을 사용하면 사용할 수있는 모든 자원 ID 목록을 선언하고 색인을 목록으로 계산해야합니다. (개발주기에서 자원 세트가 변경되면 다소 어색하고 오류가 발생할 수 있습니다 getIdentifier.) 또한 자원이 지원하지 않는 폴더 계층 구조로 구성됩니다. 데이터를 관리하는 다른 방법입니다. 자원이 대부분의 경우를 다루지 만 자산은 때때로 사용됩니다.

또 다른 차이점 : 라이브러리 프로젝트에 정의 된 리소스는 라이브러리에 의존하는 응용 프로그램 프로젝트로 자동으로 가져옵니다. 자산의 경우에는 발생하지 않습니다. 자산 파일은 응용 프로그램 프로젝트의 자산 디렉토리에 있어야합니다. [편집 : Android의 새로운 Gradle 기반 빌드 시스템 (Android Studio와 함께 사용)에서는 더 이상 사실이 아닙니다. 라이브러리 프로젝트의 자산 디렉토리는 .aar 파일로 패키지되므로 라이브러리 프로젝트에 정의 된 자산은 응용 프로그램 프로젝트로 병합됩니다 (따라서 /assets참조 된 라이브러리에있는 경우 응용 프로그램의 디렉토리에있을 필요는 없습니다 ).

편집 : 응용 프로그램과 함께 사용자 정의 글꼴을 패키지하려는 경우 또 다른 차이점이 있습니다. 거기 API 호출 를 만들 Typeface파일 시스템 또는 앱에 저장된 글꼴 파일에서 assets/디렉토리. 그러나 디렉토리에 Typeface저장된 글꼴 파일 res/(또는 디렉토리 InputStream사용을 허용 하는) 에서 API를 만들 수는 없습니다 res/. [ 참고 : Android O (현재 알파 미리보기에서 사용 가능)를 사용하면 사용자 지정 글꼴을 리소스로 포함 할 수 있습니다. 이 기한이 지난 기능에 대한 설명은 여기 를 참조하십시오 . 그러나 최소 API 수준이 25 이하인 경우 사용자 지정 글꼴을 리소스가 아닌 자산으로 패키징해야합니다.]


1
res자원을 의미하는 것은 무엇을 assets의미 하는가 ??
Vivek Warde 2016 년

40
@vwvwvwvwvwvwvwvwvw-음 ... 아무것도 "수용하지 않습니다"; 그것은 단순히 "자산"을 의미합니다 (영어 단어 자산 의 복수형에서와 같이 : 유용하거나 가치있는 것 ).
Ted Hopp

1
raw/디렉토리 의 파일에 쓸 수 있습니까?
프린스

6
@Prince-아니요. /resand '/ assets'디렉토리의 모든 항목은 .apk 파일로 패키지되어 있으므로 읽기 전용입니다.
Ted Hopp

자산 폴더에 apk 파일을 넣을 수 있습니까? 사용자가 해당 UI를 클릭하면 해당 apk가 설치됩니까?
Vivek Mishra

63

둘 다 꽤 비슷합니다. 이 둘의 실제 주요 차이점은 res디렉토리에서 각 파일에 사전 컴파일 된 파일이 ID 있으며,이를 통해 쉽게 액세스 할 수 있습니다 R.id.[res id]. 이미지, 사운드, 아이콘에 빠르고 쉽게 액세스 할 수 있습니다.

assets디렉토리는 많은 파일 시스템처럼 당신이 거기에 원하는 모든 파일을 넣어 더 많은 자유를 제공합니다. 그런 다음 Java를 통해 파일 시스템의 파일에 액세스 할 때와 같이 해당 시스템의 각 파일에 액세스 할 수 있습니다. 이 디렉토리는 게임 세부 정보, 사전 등과 같은 것들에 좋습니다. 희망이 도움이됩니다.


5
앱에 external_fonts를 추가하려면 자산 폴더에 넣습니다.
Tushar Pandey

1
@TusharPandey 이제 Assets폴더에 글꼴을 넣을 필요가 없습니다 . Android 시스템에는 이제 fonts디렉토리 가 포함되어 있으며 여기에 사용자 정의 글꼴 파일을 넣거나 Android Studio에서 다운로드 할 수 있습니다.
CopsOnRoad

@Jack은 Oreo를위한 것입니다.
Tushar Pandey

1
@TusharPandey Oreo에 추가되었지만 API 레벨 16으로 돌아가 Android 지원 라이브러리로 다시 포팅되었습니다.
CopsOnRoad

36

나는 이것이 오래된 것을 알고 있지만, 분명히하기 위해 공식 안드로이드 문서에 각각에 대한 설명이 있습니다.

에서 http://developer.android.com/tools/projects/index.html

assets/

비어 있습니다. 원시 자산 파일을 저장하는 데 사용할 수 있습니다. 여기에 저장 한 파일은 그대로 .apk 파일로 컴파일되며 원래 파일 이름이 유지됩니다. URI를 사용하여 일반 파일 시스템과 동일한 방식으로이 디렉토리를 탐색하고 AssetManager를 사용하여 파일을 바이트 스트림으로 읽을 수 있습니다. 예를 들어, 이것은 텍스처와 게임 데이터를위한 좋은 위치입니다.

res/raw/

임의의 원시 자산 파일의 경우. 자산 / 디렉토리 대신 여기에 자산 파일을 저장하면 액세스하는 방식 만 다릅니다. 이러한 파일은 aapt에 의해 처리되며 R 클래스의 리소스 식별자를 사용하여 응용 프로그램에서 참조되어야합니다. 예를 들어, MP3 또는 Ogg 파일과 같은 미디어에 적합합니다.


4
텍스처와 ogg 파일은 모두 사용자 랜드 API (openGL / MediaPlayer)에 공급하는 데이터의 큰 덩어리입니다. 왜 여기에서 차별합니까?

9

다음은 몇 가지 핵심 사항입니다.

  1. 원시 파일 유효한 Java 식별자 이름이 있어야하지만 자산의 파일에는 위치 및 이름 제한이 없습니다. 즉, 원하는 디렉토리에 그룹화 할 수 있습니다
  2. 원시 파일 xml뿐만 아니라 Java에서도 쉽게 참조 할 수 있습니다 (즉, 매니페스트 또는 다른 xml 파일에서 원시로 파일을 참조 할 수 있음).
  3. asset / 디렉토리 대신 여기에 자산 파일을 저장하면 http://developer.android.com/tools/projects/index.html에 설명 된대로 파일에 액세스하는 방식 만 다릅니다 .
  4. 라이브러리 프로젝트에 정의 된 리소스는 라이브러리에 의존하는 응용 프로그램 프로젝트로 자동으로 가져옵니다. 자산의 경우에는 발생하지 않습니다. 자산 파일은 응용 프로그램 프로젝트의 자산 디렉토리에 있어야합니다.
  5. assets 디렉토리는 파일 시스템과 비슷하므로 원하는 파일을 자유롭게 넣을 수 있습니다. 그런 다음 Java를 통해 파일 시스템의 파일에 액세스 할 때와 같이 해당 시스템의 각 파일에 액세스 할 수 있습니다. 게임 데이터 파일, 글꼴, 텍스처 등
  6. 자원과 달리 자산은 자산 디렉토리의 하위 폴더로 구성 될 수 있지만 자산으로 수행 할 수있는 유일한 작업은 입력 스트림을 얻는 것입니다. 따라서 문자열 또는 비트 맵을 자산에 저장하는 것은별로 의미가 없지만 입력 수정 사전 또는 게임 맵과 같은 사용자 정의 형식 데이터를 저장할 수 있습니다.
  7. Raw는 R.java 파일을 생성하여 컴파일 시간을 확인할 수 있지만 데이터베이스를 개인 디렉토리에 복사하려는 경우 스트리밍 용 자산을 사용할 수 있습니다.

결론

  1. Android API에는 다양한 모바일 앱의 가장 일반적인 사용 사례에 최적화 된 매우 편안한 리소스 프레임 워크가 포함되어 있습니다. 리소스를 마스터하고 가능한 한 사용하십시오.
  2. 그러나 특별한 경우에 더 많은 유연성이 필요한 경우 자산에는 더 높은 수준의 자유로 리소스를 구성하고 처리 할 수있는 낮은 수준의 API가 제공됩니다.

허용되는 답변에 따르면, Gradle 빌드 시스템을 사용하는 프로젝트의 경우 포인트 4가 더 이상 사실이 아닙니다. 라이브러리의 자산은 응용 프로그램 프로젝트의 자산 모음에 번들로 제공됩니다.
Venryx

4

자바 코드 어딘가에서 그것들을 참조해야한다면, 파일을 "res"디렉토리에 넣을 것이다.

그리고 res 폴더의 모든 파일은 R 파일에서 색인화되므로 훨씬 빠르고 쉽게로드 할 수 있습니다.


6
Java에서도 자산의 파일에 액세스 할 수 있습니다
Heiko Rupp

2
그렇습니다. 그러나 색인화되지 않았습니다.-> 느려질 것입니다. 모바일 개발에서 실제 문제는 무엇입니까?
L.Butz

그렇다면 res / raw와 asset의 차이점은 무엇입니까? res / raw도 색인화됩니까?
anticafe

@TedHopp의 게시물 확인-그는 대답을 정말로 명확하게합니다.
L.Butz

1

파일 시스템과 같은 자산을 사용하여 모든 종류의 파일을 덤프하십시오. 그리고 res를 사용하여 만들어진 것, 레이아웃, 이미지, 값을 저장하십시오.


0

테드 홉 (Ted Hopp)은 이에 대해 꽤 잘 대답했다. opengl 텍스처 및 쉐이더 파일에 res / raw를 사용하고 있습니다. 계층 적 조직을 제공하기 위해 그것들을 자산 디렉토리로 옮기는 것에 대해 생각하고있었습니다.

이 스레드는하지 말라고 확신했습니다. 첫째, 고유 한 리소스 ID를 사용하는 것이 좋습니다. 두 번째는 InputStream / openRawResource 또는 BitmapFactory를 사용하여 파일을 읽는 것이 매우 간단하기 때문입니다. 셋째, 휴대용 라이브러리에서 사용할 수 있기 때문에 매우 유용합니다.


1
InputStreams 및 BitmapFactory 지원의 포인트 2는 리소스와 자산 모두에 해당됩니다 ( stackoverflow.com/a/8501428/2441655 참조 ). 포인트 3은 더 이상 적용되지 않습니다. (허용 대답 참조)
Venryx

-5

자산은 응용 프로그램에 텍스트, XML, 글꼴, 음악 및 비디오와 같은 임의의 파일을 포함하는 방법을 제공합니다. 이러한 파일을 "리소스"로 포함하려고하면 Android가 해당 파일을 리소스 시스템으로 처리하여 원시 데이터를 가져올 수 없습니다. 손대지 않은 데이터에 액세스하려면 자산을 사용하는 것이 좋습니다.


5
이것은 올바르지 않습니다. 에 데이터를 넣으면을 res/raw사용하여 원시 데이터를 얻을 수 있습니다 openRawResource(resourceName).
Ted Hopp

라이브러리에 opengles 텍스처 및 쉐이더 파일이 있습니다. 나는 반드시 고해상도 /를 저장하는 원료를 사용합니다. InputStream과 BitmapFactory를 사용하여 읽습니다. 이것을 독립적 인 의견으로 추가하겠습니다.
dturvene

Xamarin Microsoft 문서에서 복사 한 것 같습니다. 텍스트를 복사 할 때 소스를 제공하십시오. docs.microsoft.com/ko-kr/xamarin/android/app-fundamentals/…
Sjoerd Pottuit
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.