/ 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.