블로그 이미지
Every unexpected event is a path to learning for you. blueasa

카테고리

분류 전체보기 (2797)
Unity3D (853)
Programming (479)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (185)
협업 (61)
3DS Max (3)
Game (12)
Utility (68)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday

원문 : Unity Application.persistentDataPath のパスは Android のバージョンと Write Access によって異なる。

Unity Application.persistentDataPath의 경로는 Android의 버전과 Write Access에 따라 달라짐

Android에서 Application.persistentDataPath가 돌려주는 값이 Write Access에 따라 달라지기에 조사해봤습니다.
Unity 5.3.6에서 돌려주는 경로에 사양변경이 있었으므로, Unity 5.3.6 이전 버전에서 작성한 애플리케이션을 Unity 5.3.6 이후로 버전업할 때 주의를 기울이지 않으면 데이터가 사라질 위험이 있습니다.
갖고 있는 Android기기와 Unity 4.7.2f1, 5.3.6f1에서 검증했습니다.

Application.persistentDataPath

지속되는 데이터 디렉토리 경로.
세이브 데이터 등 유저 데이터를 저장하는 장소.
https://docs.unity3d.com/kr/current/ScriptReference/Application-persistentDataPath.html

Player Settings / Write Access

Internal Only로 지정해도 Application.persistentDataPath이 개발환경과 실제환경에서 돌려주는 값이 다를 수 있으므로 주의가 필요합니다!
외부 저장소라면 특별히 권한을 요구하지 않고 읽어들일 수 있으므로 디버그하기 쉽기 때문일지도?

External (SDCard)로 설정하면, SD 카드같은 외부 저장소에 대한 쓰기 접근을 가능하게 합니다. 개발 빌드(Development Build)에서는 자동적으로 켜집니다. https://docs.unity3d.com/kr/current/Manual/class-PlayerSettingsAndroid.html

External Storage

외부 저장소라고 불리는 영역이지만 SD 카드가 아니라 빼낼 수 없게 내장된 저장소를 참조하는 기기도 있음.
Android 4.4 이후에는 권한을 요구하지 않고 외부 저장소에 읽고 쓰기가 가능.

Windows PC를 예로 들면
오래된 Android 기기
C드라이브: 내장 드라이브 (Android 내부 저장소)
D드라이브: USB로 접속된 외장 하드디스크 (Android 외부 저장소)
최신 Android 기기
C드라이브: 내장 드라이브 파티션 0 (Android 내부 저장소)
D드라이브: 내장 드라이브 파티션 1 (Android 외부 저장소)
E드라이브: USB로 접속된 외장 하드디스크 (Android 외부 저장소)

모든 Android 호환 기기는 파일을 저장하는 데 사용할 수 있는 공유된 "외부 저장소"를 지원합니다. 해당 저장소는 제거할 수 있는 저장소 미디어(예: SD 카드) 또는 (제거할 수 없는) 내부 저장소일 수 있습니다.
https://developer.android.com/guide/topics/data/data-storage.html#filesExternal

Android 4.4 이상에서 앱 전용 디렉터리 파일 읽기 또는 쓰기는 READ_EXTERNAL_STORAGE 또는 WRITE_EXTERNAL_STORAGE 권한이 필요하지 않습니다.
https://developer.android.com/guide/topics/data/data-storage.html#AccessingExtFiles

일부 기기는 이동식 저장 장치 없이도 영구 저장소 공간을 "내부" 그리고 "외부" 파티션으로 나누어 항상 두 개의 저장소 공간을 제공하며, API의 동작은 외부 저장소의 이동식 유무에 상관없이 일관적입니다.
https://developer.android.com/training/basics/data-storage/files.html#InternalVsExternalStorage

Unity 5.3.6에서의 사양변경

Android: Application.temporaryCachePath and Application.persistentDataPath always return external paths starting KITKAT. (789870) https://unity3d.com/kr/unity/whats-new/unity-5.3.6

KITKAT은 Android 4.4의 코드네임. Android 4.4 이후에는 Write Access의 값에 관계없이 외부 저장소의 경로를 돌려주도록 사양변경. Android 4.4 이후 권한을 요구하지 않고 읽고 쓰기가 가능하게 되었기 때문일 것.

Player Settings / Write Access 별 Application.persistentDataPath의 값

Write Access: Internal Only

Unity 4.7.2

AndroidPath실체

4.1.2 (200SH) /data/data/{package name}/files/ 내부 저장소
4.2.2 (SO-02F) /data/data/{package name}/files/ 내부 저장소
5.0.2 (HTV31) /data/data/{package name}/files/ 내부 저장소
6.0.1 (SCV31) /data/user/0/{package name}/files/ -> /data/data/{package name}/files/ 내부 저장소

Unity 5.3.6

AndroidPath실체

4.1.2 (200SH) /data/data/{package name}/files/ 외부 저장소
4.2.2 (SO-02F) /data/data/{package name}/files/ 외부 저장소
5.0.2 (HTV31) /storage/emulated/0/Android/data/{package name}/files/ 외부 저장소
6.0.1 (SCV31) /storage/emulated/0/Android/data/{package name}/files/ 외부 저장소

Write Access: External (SDCard)

Unity 4.7.2

AndroidPath실체

4.1.2 (200SH) /storage/sdcard0/Android/data/{package name}/files/ SD 카드
4.2.2 (SO-02F) /storage/emulated/0/Android/data/{package name}/files/ 외부 저장소
5.0.2 (HTV31) /storage/emulated/0/Android/data/{package name}/files/ 외부 저장소
6.0.1 (SCV31) (Permissions Storage: ALLOW) /storage/emulated/0/Android/data/{package name}/files/ 외부 저장소
6.0.1 (SCV31) (Permissions Storage: DENY) /data/user/0/{package name}/files/ -> /data/data/{package name}/files/ 내부 저장소

Unity 5.3.6

AndroidPath실체

4.1.2 (200SH) /storage/sdcard0/Android/data/{package name}/files/ SD 카드
4.2.2 (SO-02F) /storage/emulated/0/Android/data/{package name}/files/ 외부 저장소
5.0.2 (HTV31) /storage/emulated/0/Android/data/{package name}/files/ 외부 저장소
6.0.1 (SCV31) (Permissions Storage: ALLOW) /storage/emulated/0/Android/data/{package name}/files/ 외부 저장소
6.0.1 (SCV31) (Permissions Storage: DENY) /storage/emulated/0/Android/data/{package name}/files/ 외부 저장소

결과

Write Access: External (SDCard)로 지정하면 androidmanifest.xml에 외부 저장소에 읽고 쓰기 권한 요구가 추가됩니다.
WRITE_EXTERNAL_STORAGE 권한으로 읽고 쓰기도 가능.

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

WRITE_EXTERNAL_STORAGE를 추가한 경우, Android 6 이후에는 Permissions Storage의 물음에서 ALLOW를 선택할 때까지는 기동할 때마다 물어봄.
ALLOW를 선택한 후에도 Application의 설정에서 Permissions Storage 허가의 변경은 가능.
4.1.2 (200SH): Write Access: External (SDCard) 만이 SD 카드의 경로를 돌려줌.
SD 카드를 뽑았을 경우에는 Internal Only와 같은 경로를 돌려줌.
그 외에는 내부 저장소를 참조.
Unity 4.7.2 Android 6.0.1는 Permissions Storage의 허가 유무로 돌려주는 경로가 달라짐.
Unity 5.3.6 Android 4.4 이후는 Permissions Storage의 허가 유무와 상관없이 돌려주는 값이 같음.

Unity 4.7.2에서 작성한 애플리케이션에서 Application.persistentDataPath에 저장한 데이터를 Unity 5.3.6에서 작성한 애플리케이션에서 덮어씌웠을 경우 읽어들일 수 있을까?

internal-storage: /data/data/{package name}/files/
external-storage: /storage/emulated/0/Android/data/{package name}/files/

Android 4.1.2 (200SH)

Unity 4.7.2 Write AccessUnity 5.3.6 Write Access읽기 가능?거동

Internal Only Internal Only
Internal Only External (SDCard)
External (SDCard) Internal Only UnauthorizedAccessException: Access to the path "/storage/sdcard0/Android/data/{package name}/files/{file name}" is denied. external-storage를 internal-storage에 복사하려고 해서 실패?
External (SDCard) External (SDCard)

Android 4.2.2 (SO-02F)

Unity 4.7.2 Write AccessUnity 5.3.6 Write Access읽기 가능?거동

Internal Only Internal Only
Internal Only External (SDCard)
External (SDCard) Internal Only UnauthorizedAccessException: Access to the path "/storage/sdcard0/Android/data/{package name}/files/{file name}" is denied. external-storage를 internal-storage에 복사하려고 해서 실패?
External (SDCard) External (SDCard)

Android 5.0.2 (HTV31)

Unity 4.7.2 Write AccessUnity 5.3.6 Write Access읽기 가능?거동

Internal Only Internal Only
Internal Only External (SDCard)
External (SDCard) Internal Only UnauthorizedAccessException: Access to the path "/{file name}" is denied. external-storage를 internal-storage에 복사하려고 해서 실패?
External (SDCard) External (SDCard)

Android 6.0.1 (SCV31)

Unity 4.7.2 Write AccessUnity 5.3.6 Write Access읽기 가능?거동

Internal Only Internal Only internal-storage를 external-storage에 복사
Internal Only External (Permissions Storage: ALLOW)
Internal Only External (Permissions Storage: DENY) internal-storage를 external-storage에 복사
External (Permissions Storage: ALLOW) Internal Only 같은 경로
External (Permissions Storage: ALLOW) External (Permissions Storage: ALLOW) 같은 경로
External (Permissions Storage: ALLOW) External (Permissions Storage: DENY) 같은 경로
External (Permissions Storage: DENY) Internal Only internal-storage를 external-storage에 복사
External (Permissions Storage: DENY) External (Permissions Storage: ALLOW)
External (Permissions Storage: DENY) External (Permissions Storage: DENY) internal-storage를 external-storage에 복사

결과

Internal Only, External (Permissions Storage: DENY)일 때에는 internal-storage를 external-storage에 복사한 후에 읽어들이도록 되어 있음.
external-storage로 변경해도 internal-storage는 복사 시점 그대로 변경은 되지 않음.

정리

Internal Only -> External (SDCard)로의 변경은 데이터를 이어받지 못하는 경우가 있음. 그 경우, 수동으로 /data/data/{package name}/files/ 를 복사하는 등의 대응이 필요.
External (SDCard) -> Internal Only로의 변경은 오래된 Android 기기기에서 정상으로 처리되지 않을 가능성이 있음.
Android 6 이후에는 Unity 4.7.2의 Write Access가 어느쪽이든 Unity 5.3.6의 Write Access: Internal Only로 해두면 데이터를 이어받아 읽고 쓰기가 가능.

 

 

[출처] gist.github.com/overworks/541fcb519bc23cd14cf622c2baa28d3b

 

유니티와 안드로이드 버전에 따른 Application.persistentDataPath의 경로 정리

유니티와 안드로이드 버전에 따른 Application.persistentDataPath의 경로 정리 - Unity-Android-persitentDataPath.md

gist.github.com

 

반응형
Posted by blueasa
, |