2025년 3월 27일부터 AOSP를 빌드하고 기여하려면 aosp-main
대신 android-latest-release
를 사용하는 것이 좋습니다. 자세한 내용은 AOSP 변경사항을 참고하세요.
맞춤 사용자 유형 구현
컬렉션을 사용해 정리하기
내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.
Android 11부터 Android 멀티 사용자 기능에서 허용되는 모든 유형의 사용자를 나타내는 잘 정의된 사용자 유형이라는 개념이 도입되었습니다. OEM은 이 기능을 사용하여 사전 정의된 AOSP 사용자 유형을 맞춤설정하고 새로운 프로필 유형을 정의할 수 있습니다. 자세한 내용은 사용자 유형 섹션을 참조하세요.
이 페이지에서는 사용자 유형을 맞춤설정하는 데 필요한 구현 가이드라인을 자세히 설명합니다.
맞춤설정
AOSP 사용자 유형을 맞춤설정하고 새로운 프로필 유형을 정의하려면 OEM이 config_user_types.xml
을 원하는 맞춤설정으로 오버레이해야 합니다. config_user_types.xml
파일에는 구성 가능 속성의 포괄적인 목록과 참조 구현이 있습니다.
config_user_types.xml
파일에 지정된 모든 속성(예: default-restrictions
)은 AOSP 기본값을 덮어씁니다. 지정되지 않은 모든 속성은 AOSP 기본값을 따릅니다. 프로필 유형의 배지 속성 등 대부분의 속성은 변경하면 이 사용자 유형의 기존 사용자에게 영향을 미칩니다.
단, default-restrictions
는 사용자가 생성된 시점에만 적용되므로, OTA가 config_user_types.xml
파일을 변경한 경우 이 속성을 수정해도 기존 사용자에게 영향을 미치지 않습니다. 마찬가지로, 최대 사용자 수를 지정하는 것은 신규 사용자 생성 시에만 적용되며, 기존 사용자는 삭제되지 않습니다.
현재 각 사용자 유형에 적용되는 맞춤설정 제한사항은 다음과 같습니다.
- 프로필은 완전히 맞춤설정 및 정의할 수 있습니다. 이 경우 AOSP는 사전 정의된 AOSP 사용자 유형만 지원하므로 OEM은 Android에서 맞춤 프로필이 지원되도록 하는 데 필요한 플랫폼 수정을 적용해야 합니다.
- 전체 사용자는 정의할 수 없으며
default-restrictions
속성만 맞춤설정할 수 있습니다.
- 시스템 사용자는 이 메커니즘을 사용하여 맞춤설정할 수 없습니다. 이 경우
default-restrictions
는 com.android.internal.R.array.config_defaultFirstUserRestrictions
를 사용하여 설정할 수 있습니다. 자세한 내용은 config.xml
을 참고하세요.
기존 사용자 유형 수정
기존 사용자 유형은 다음 코드 샘플과 같이 속성을 재정의하여 맞춤설정할 수 있습니다.
<user-types version="0">
<full-type name="android.os.usertype.full.SECONDARY" >
<default-restrictions no_sms="true" />
</full-type>
<profile-type
name='android.os.usertype.profile.MANAGED'
max-allowed-per-parent='2'
icon-badge='@android:drawable/ic_corp_icon_badge_case'
badge-plain='@android:drawable/ic_corp_badge_case'
badge-no-background='@android:drawable/ic_corp_badge_no_background' >
<badge-labels>
<item res='@android:string/managed_profile_label_badge' />
<item res='@android:string/managed_profile_label_badge_2' />
</badge-labels>
<badge-colors>
<item res='@android:color/profile_badge_1' />
<item res='@android:color/profile_badge_2' />
</badge-colors>
<default-restrictions no_sms="true" no_outgoing_calls="true" />
</profile-type>
</user-types>
이 코드 샘플에서는 다음과 같은 AOSP 사용자 유형이 지원되는 속성을 수정하여 맞춤설정되었습니다.
이러한 속성의 의미와 기본값은 UserTypeFactory.java
및 UserTypeDetails.java
를 참고하세요.
맞춤 프로필 유형 정의
다음 코드 샘플은 새로운 맞춤 프로필 유형이 정의되는 방법을 보여줍니다.
<user-types version=&qu>ot;1&<quot;
profile-type
name="com.example.profilename"
max-allo>wed-pe<r-parent="2" /
change-user-type
from="android.os.usertype.profile.MANAGED"
to="com.exam>p<le.profilen>a
me"
whenVersionLeq="1" /
/user-types
이 코드 샘플에서 com.example.profilename
프로필 유형은 다음과 같이 정의됩니다.
max-allowed-per-parents
를 2
로 설정하여 상위 사용자당 두 개의 프로필을 허용합니다.
change-user-type
: OTA를 통해 <= 1
인 user-type
버전에서 기기를 업그레이드할 때 유형이 android.os.usertype.profile.MANAGED
인 모든 기존 관리형 프로필을 새로운 com.example.profilename
유형으로 변환합니다.
이 페이지에 나와 있는 콘텐츠와 코드 샘플에는 콘텐츠 라이선스에서 설명하는 라이선스가 적용됩니다. 자바 및 OpenJDK는 Oracle 및 Oracle 계열사의 상표 또는 등록 상표입니다.
최종 업데이트: 2025-08-30(UTC)
[[["이해하기 쉬움","easyToUnderstand","thumb-up"],["문제가 해결됨","solvedMyProblem","thumb-up"],["기타","otherUp","thumb-up"]],[["필요한 정보가 없음","missingTheInformationINeed","thumb-down"],["너무 복잡함/단계 수가 너무 많음","tooComplicatedTooManySteps","thumb-down"],["오래됨","outOfDate","thumb-down"],["번역 문제","translationIssue","thumb-down"],["샘플/코드 문제","samplesCodeIssue","thumb-down"],["기타","otherDown","thumb-down"]],["최종 업데이트: 2025-08-30(UTC)"],[],[],null,["Android 11 has introduced the concept of well-defined\nuser types, representing all the different types of users allowed by the\nAndroid Multi-user feature. With this feature, OEMs can customize predefined\nAOSP user types and define new profile types. See the section on\n[user types](/docs/devices/admin/multi-user#user_types) for more information.\n\nThis page details the implementation guidelines needed to customize user types.\n\nCustomization\n\nIn order to customize AOSP user types and to define new profile types, the OEM\nmust overlay\n[`config_user_types.xml`](https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/base/core/res/res/xml/config_user_types.xml?q=config_user_types.xml)\nwith the preferred customizations. The `config_user_types.xml` file\ncontains a reference implementation and a comprehensive list of configurable\nattributes.\n\nAny attribute, such as `default-restrictions`, that is specified in the\n`config_user_types.xml` file, overwrites the AOSP default. Any attribute that is\nnot specified, obeys the AOSP default. Changing most attributes, such as a\nprofile type's badge attributes, affects pre-existing users of that user type.\nHowever, because `default-restrictions` are only applied at the time a user is\ncreated, modifying this particular attribute, in the event the\n`config_user_types.xml` file is changed by OTA, has no effect on pre-existing\nusers. Similarly, specifying the maximum number of users only applies when\ncreating new users; existing users aren't removed.\n\nCurrent customization restrictions for each user type are as follows:\n\n- Profiles can be fully customized and defined. In this case, the OEM is responsible for making platform modifications as required for their custom profile to be supported in Android, since AOSP only supports the predefined AOSP user-types.\n- Full users cannot be defined and only their `default-restrictions` attribute can be customized.\n- The system user cannot be customized using this mechanism. In this case, `default-restrictions` can be set using `com.android.internal.R.array.config_defaultFirstUserRestrictions`. See [`config.xml`](https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/base/core/res/res/values/config.xml?q=config_defaultFirstUserRestrictions) for more information.\n\nModify existing user types\n\nExisting user types can be customized by overriding their attributes as shown\nin the following code sample: \n\n \u003cuser-types version=\"0\"\u003e\n \u003cfull-type name=\"android.os.usertype.full.SECONDARY\" \u003e\n \u003cdefault-restrictions no_sms=\"true\" /\u003e\n \u003c/full-type\u003e\n\n \u003cprofile-type\n name='android.os.usertype.profile.MANAGED'\n max-allowed-per-parent='2'\n icon-badge='@android:drawable/ic_corp_icon_badge_case'\n badge-plain='@android:drawable/ic_corp_badge_case'\n badge-no-background='@android:drawable/ic_corp_badge_no_background' \u003e\n \u003cbadge-labels\u003e\n \u003citem res='@android:string/managed_profile_label_badge' /\u003e\n \u003citem res='@android:string/managed_profile_label_badge_2' /\u003e\n \u003c/badge-labels\u003e\n \u003cbadge-colors\u003e\n \u003citem res='@android:color/profile_badge_1' /\u003e\n \u003citem res='@android:color/profile_badge_2' /\u003e\n \u003c/badge-colors\u003e\n \u003cdefault-restrictions no_sms=\"true\" no_outgoing_calls=\"true\" /\u003e\n \u003c/profile-type\u003e\n \u003c/user-types\u003e\n\nIn this code sample, the following AOSP user types are customized by modifying\nthe supported properties:\n\n- Full user `android.os.usertype.full.SECONDARY`:\n\n - The default restriction of `no_sms` is set to true by specifying `default-restrictions no_sms=\"true\"`.\n- Profile user `android.os.usertype.profile.MANAGED`:\n\n - Two profiles are allowed for each parent user by setting `max-allowed-per-parent='2'`.\n - Badge attributes are set to chosen values using `icon-badge`, `badge-plain`, `badge-no-background`, `badge-labels`, `badge-colors`.\n - The default restrictions of `no_sms` and `no_outgoing_calls` are set to true by specifying `default-restrictions no_sms=\"true\" no_outgoing_calls=\"true\"`.\n\nRefer to [`UserTypeFactory.java`](https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/base/services/core/java/com/android/server/pm/UserTypeFactory.java;drc=2b4306a8ecd64f6e03498104f314600f9cc7507c;l=77) and [`UserTypeDetails.java`](https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/base/services/core/java/com/android/server/pm/UserTypeDetails.java;drc=78a66d6c36451d8c91b2473e3b4ac8bafbd79b41;l=59)\nfor the meaning and default values of these properties.\n\nDefine custom profile types\n\nThe following code sample shows how new, custom profile types are defined: \n\n \u003cuser-types version=&qu\u003eot;1&\u003cquot;\n profile-type\n name=\"com.example.profilename\"\n max-allo\u003ewed-pe\u003cr-parent=\"2\" /\n\n change-user-type\n from=\"android.os.usertype.profile.MANAGED\"\n to=\"com.exam\u003ep\u003cle.profilen\u003eame\"\n whenVersionLeq=\"1\" /\n /user-types\n\nIn this code sample, the `com.example.profilename` profile type is\ndefined as follows:\n\n- `max-allowed-per-parents` is set to `2` for two profiles per parent user.\n\n- `change-user-type`: converts *all* existing managed profiles of the type\n `android.os.usertype.profile.MANAGED` to the new `com.example.profilename`\n type when upgrading the device from a `user-type` version of `\u003c= 1`\n through OTA."]]