멀티 사용자 테스트

이 페이지에서는 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 이상에서 샌드박스되었으므로 콘텐츠 제공업체를 사용하여 비시스템 사용자의 모든 테스트 데이터를 푸시 또는 풀해야 합니다. 다음과 같은 경우 이 작업은 필요하지 않습니다.

  • adbdadb root를 통해 루트로 실행됩니다(이는 userdebug 또는 usereng 빌드를 사용할 때만 가능함).

  • Trade Federation(Tradefed)의 ITestDevice를 사용하여 파일을 푸시 및 풀합니다. 이 경우 테스트 구성에서 /sdcard/ 경로를 사용하세요(예: NativeDevice.java에서 pushFile의 소스 코드 참고).

콘텐츠 제공업체가 보조 사용자에서 실행되고 있다면 적절한 user, uri 및 다른 지정된 매개변수와 함께 adb shell content 명령어를 사용하여 액세스할 수 있습니다.

앱 개발자를 위한 해결 방법

push 또는 pull 명령어 대신 adb contentContentProvider 인스턴스를 사용하여 테스트 파일과 상호작용합니다.

  1. 필요한 경우 파일을 제공 및 저장할 수 있는 앱에서 호스팅하는 ContentProvider의 인스턴스를 만듭니다. 앱의 내부 저장소를 사용합니다.
  2. 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(상태 검사기에서 설명)를 사용하세요. 테스트 후에 테스트가 올바르게 정리하도록 하기 때문입니다.