이 페이지에서는 Android 플랫폼에서 멀티 사용자를 테스트하는 중요한 관점에 대해 설명합니다. 멀티 사용자 지원을 구현하는 방법에 관한 자세한 내용은 멀티 사용자 지원을 참조하세요.
기기 경로
다음 표에는 여러 기기 경로와 이 경로의 확인 방법이 나열되어 있습니다. 경로 열의 모든 값은 사용자별 샌드박스 저장소입니다. Android 저장소 스토리는 시간이 지남에 따라 변경되었습니다. 자세한 내용은 저장소 문서를 참조하세요.
경로 | 시스템 경로(선택사항) | 목적 |
---|---|---|
/data/user/{userId}/{app.path}
|
/data/data
|
앱 저장소 |
/storage/emulated/{userId}
|
/sdcard
|
공유된 내부 저장소 |
/data/media/{userId}
|
없음 | 사용자 미디어 데이터(예: 음악, 동영상) |
/data/system/users/{userId}
|
없음 | 사용자당 시스템 구성/상태
시스템 앱에서만 액세스 가능 |
다음은 사용자별 경로를 사용하는 예입니다.
# to access user 10's private application data for app com.bar.foo:
$ adb shell ls /data/user/10/com.bar.foo/
사용자 간 adb 상호작용
멀티 사용자를 처리할 때 유용한 adb
명령어가 몇 가지 있습니다. 이러한 명령어 중 일부는 Android 9 이상에서만 지원됩니다.
adb shell am instrument --user <userId>
는 특정 사용자에게 계측 테스트를 실행합니다. 기본적으로 현재 사용자를 사용합니다.adb install --user <userId>
는 특정 사용자의 패키지를 설치합니다. 패키지가 모든 사용자에게 설치되도록 하려면 모든 사용자에게 이 코드를 호출해야 합니다.adb uninstall --user <userId>
는 특정 사용자의 패키지를 제거합니다.--user
플래그 없이 호출하여 모든 사용자에게서 제거합니다.adb shell am get-current-user
는 현재(포그라운드) 사용자 ID를 가져옵니다.adb shell pm list users
는 모든 기존 사용자의 목록을 가져옵니다.adb shell pm create-user
는 신규 사용자를 만들고 ID를 반환합니다.adb shell pm remove-user
는 ID별로 특정 사용자를 삭제합니다.adb shell pm disable --user <userId>
는 특정 사용자의 패키지를 사용 중지합니다.adb shell pm enable --user <userId>
는 특정 사용자의 패키지를 사용 설정합니다.adb shell pm list packages --user <userId>
는 특정 사용자의 패키지를 나열합니다(사용 설정된 경우-e
, 사용 중지된 경우-d
). 기본적으로 시스템 사용자를 위해 항상 나열됩니다.
다음 정보는 adb
가 멀티 사용자와 함께 동작하는 방법을 설명하는 데 도움이 됩니다.
adb
(또는 더 정확하게는adbd
데몬)는 현재 사용자에 상관없이 시스템 사용자(사용자 ID = 0)로 항상 실행됩니다. 따라서 사용자 종속적인 기기 경로(예:/sdcard/
)는 항상 시스템 사용자로 확인됩니다. 자세한 내용은 기기 경로를 참조하세요.기본 사용자가 지정되지 않은 경우 각
adb
하위 명령어에는 다른 사용자가 있습니다.am get-current-user
로 사용자 ID를 검색하고 이를 지원하는 모든 명령어에--user <userId>
를 명시적으로 사용하는 것이 가장 좋습니다. 명시적인 사용자 플래그는 Android 9까지 모든 명령어에 지원되지는 않았습니다.보조 사용자의
/sdcard
경로 액세스가 Android 9부터 거부되었습니다. 테스트 중에 파일을 검색하는 방법에 관한 자세한 내용은 멀티 사용자 데이터를 위한 콘텐츠 제공업체를 참조하세요.
멀티 사용자 데이터를 위한 콘텐츠 제공업체
adb
는 시스템 사용자로 실행되고 데이터는 Android 9 이상에서 샌드박스되었으므로 콘텐츠 제공업체를 사용하여 비시스템 사용자의 모든 테스트 데이터를 푸시 또는 풀해야 합니다. 다음과 같은 경우 이 작업은 필요하지 않습니다.
adbd
가adb root
를 통해 루트로 실행됩니다(이는userdebug
또는usereng
빌드를 사용할 때만 가능함).Trade Federation(Tradefed)의
ITestDevice
를 사용하여 파일을 푸시 및 풀합니다. 이 경우 테스트 구성에서/sdcard/
경로를 사용하세요(예:NativeDevice.java
에서pushFile
의 소스 코드 참고).
콘텐츠 제공업체가 보조 사용자에서 실행되고 있다면 적절한 user
, uri
및 다른 지정된 매개변수와 함께 adb shell content
명령어를 사용하여 액세스할 수 있습니다.
앱 개발자를 위한 해결 방법
push
또는 pull
명령어 대신 adb content
와 ContentProvider
인스턴스를 사용하여 테스트 파일과 상호작용합니다.
- 필요한 경우 파일을 제공 및 저장할 수 있는 앱에서 호스팅하는
ContentProvider
의 인스턴스를 만듭니다. 앱의 내부 저장소를 사용합니다. adb shell content
read
또는write
명령어를 사용하여 파일을 푸시 및 풀합니다.
미디어 파일을 위한 해결 방법
미디어 파일을 SD 카드의 미디어 파티션에 푸시하려면 MediaStore
공개 API를 사용하세요. 예를 들면 다음과 같습니다.
# push MVIMG_20190129_142956.jpg to /storage/emulated/10/Pictures
# step 1
$ adb shell content insert --user 10 --uri content://media/external/images/media/ --bind _display_name:s:foo.jpg
# step 2
$ adb shell content query --user 10 --projection _id --uri content://media/external/images/media/ --where "_display_name=\'foo.jpg\'"
# step 3
$ adb shell content write --user 10 --uri content://media/external/images/media/8022 < MVIMG_20190129_142956.jpg
일반 콘텐츠 제공업체 설치
사용자별 /sdcard
경로에서 파일을 읽고 쓰는 기존 콘텐츠 제공자를 설치하고 사용합니다.
make TradefedContentProvider
를 사용하여 소스에서 TradefedContentProvider.apk
를 빌드합니다.
```
# install content provider apk
$ adb install --user 10 -g TradefedContentProvider.apk
# pull some_file.txt
$ adb shell content read --user 10 --uri content://android.tradefed.contentprovider/sdcard/some_file.txt > local_file.txt
# push local_file.txt
$ adb shell content write --user 10 --uri content://android.tradefed.contentprovider/sdcard/some_file.txt < local_file.txt
```
Trade Federation 멀티 사용자 지원
Tradefed는 공식 Android 테스트 하네스입니다. 이 섹션에서는 멀티 사용자 테스트 시나리오에 관한 Tradefed의 기본 지원을 요약합니다.
상태 검사기
시스템 상태 검사기(SSC)는 타겟 준비자 이전에 실행되고 검사기의 정리는 타겟 준비자 이후에 실행됩니다.
UserChecker
는 명시적으로 정의되어 멀티 사용자를 테스트할 때 개발자를 돕습니다. UserChecker는 테스트로 기기의 사용자 상태가 변경되었는지 추적합니다(예: 해체 시 삭제하지 않고 만들어진 사용자). 또한 user-cleanup
이 설정되어 있다면 테스트 후 자동으로 정리를 시도하면서 여전히 유용한 오류를 제공하여 테스트가 수정될 수 있습니다.
<system_checker class="com.android.tradefed.suite.checker.UserChecker" >
<option name="user-cleanup" value="true" />
</system_checker>
타겟 준비자
타겟 준비자는 특정 구성으로 기기를 설정하는 데 일반적으로 사용됩니다. 멀티 사용자 테스트의 경우 준비자는 특정 유형의 사용자를 만들 뿐 아니라 다른 사용자로 전환하는 데 사용될 수 있습니다.
보조 사용자가 없는 기기 유형의 경우 CreateUserPreparer
를 사용하여 만들고 AndroidTest.xml
의 보조 사용자로 전환할 수 있습니다. 테스트가 끝나면 준비자는 다시 전환하여 보조 사용자를 삭제합니다.
<target_preparer
class="com.google.android.tradefed.targetprep.CreateUserPreparer" >
</target_preparer>
원하는 사용자 유형이 이미 기기에 있다면 SwitchUserTargetPreparer
를 사용하여 기존 사용자로 전환하세요. user-type
의 일반적인 값에는 system
또는 secondary
가 포함됩니다.
<target_preparer
class="com.android.tradefed.targetprep.SwitchUserTargetPreparer">
<option name="user-type" value="secondary" />
</target_preparer>
호스트 기반 테스트
일부 경우에 테스트는 테스트 내에서 사용자를 전환해야 합니다. UI Automator와 같은 기기 측 테스트 프레임워크 내에서 전환하지 마세요. 테스트 프로세스가 언제든지 종료될 수 있습니다. 대신 ITestDevice
액세스 권한을 부여하는 Tradefed의 호스트 기반 테스트 프레임워크와 같은 호스트 측 테스트 프레임워크를 사용하세요. 그러면 필요한 사용자 조작을 할 수 있습니다.
사용자 상태를 변경하는 호스트 기반 테스트에는 UserChecker
(상태 검사기에서 설명)를 사용하세요. 테스트 후에 테스트가 올바르게 정리하도록 하기 때문입니다.