1<!-- 2 Copyright (C) 2020 The Android Open Source Project 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License 15 --> 16 17# Android permissions for system developers 18 19This document targets system developers. App developers should refer to the [public 20 documentation](https://developer.android.com/guide/topics/permissions/overview). 21 22## Definitions 23 24Each app (often called package) has a unique name called package name. Each package has a manifest 25file describing properties of the package. The android system server is in a special package named 26"android". 27 28When a package gets installed the package is (usually) assigned a unique identifier called [uid 29](../os/Users.md#int-uid). 30This is the same as a uid in Linux, but this often leads to confusion. It is easiest to see a uid 31as a unique identifier for a package. 32 33Usually an app is running in a container called a process. Each process has a unique id called 34pid, but unlike the uid the pid changes each time the process is restarted and app that are not 35currently running don't have a pid. The process container makes sure that other apps cannot 36negatively interact with an app. Processes can only interact via controlled interactions called 37remote procedure calls (RPCs). Android’s RPC mechanism is called _Binder_. 38 39As no app code can be trusted the permission need to be checked on the receiving side of the 40Binder call. 41 42For more details please take a look at [Android's security model](../os/Users.md#security-model). 43 44## Permissions for regular apps 45 46### Install time permissions 47 48The purpose of install time permissions is to control access to APIs where it does not makes sense 49to involve the user. This can be either because the API is not sensitive, or because additional 50checks exist. 51 52Another benefit of install time permissions is that is becomes very easy to monitor which apps can 53access certain APIs. E.g. by checking which apps have the `android.permission.INTERNET` permission 54you can list all apps that are allowed to use APIs that can send data to the internet. 55 56#### Defining a permission 57 58Any package can define a permission. For that it simply adds an entry in the manifest file 59`<permission android:name="com.example.myapp.myfirstpermission" />` 60 61Any package can do this, including the system package. When talking about [permissions for system 62 apps](#permissions-for-system-apps) we will see that it is important which package defines a 63permission. 64 65It is common good practice to prefix the permission name with the package name to avoid collisions. 66 67#### Requesting a permission 68 69Any app can request any permission via adding an entry in the manifest file like 70`<uses-permission android:name="com.example.myapp.myfirstpermission" />` 71 72A requested permission does not necessarily mean that the permission is granted. When and how a 73permission is granted depends on the protection level of the permission. If no protection level is 74set, it will default to `normal` and the permission will always be granted if requested. Such 75`normal` permissions can still be useful as it will be easy to find apps using a certain 76functionality on app stores and by checking `dumpsys package`. 77 78#### Checking a permission 79 80`Context.checkPermission(permission, pid, uid)` returns if the pid/uid has the permission. By far 81the most common case is to check the permission on the receiving end of a binder call. In this case 82the pid can be read as `Binder.callingPid()` and the uid as `Binder.callingUid()`. The uid is a 83mandatory argument as permissions are maintained per uid. The pid can be set to -1 84if not pid is available. The context class contains handy wrappers for `checkPermission`, such as 85`enforeCallingPermission` which calls checkPermission with `Binder.callingPid`/`Binder.callingUid` 86and throws a SecurityException when the permission is not granted. 87 88#### Verifying an app has an install time permission 89 90In `dumpsys package my.package.name` there are two sections. In requested permissions all 91permissions of the `uses-permission` tags are listed. In install permission the permissions with 92their grant state are listed. If an install time permission is not listed here, it is not granted. 93 94``` 95Packages: 96 Package [com.android.packageinstaller] (2eb7062): 97 userId=10071 98 [...] 99 requested permissions: 100 android.permission.MANAGE_USERS 101 android.permission.INSTALL_PACKAGES 102 android.permission.DELETE_PACKAGES 103 android.permission.READ_INSTALL_SESSIONS 104 android.permission.RECEIVE_BOOT_COMPLETED 105 android.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS 106 android.permission.USE_RESERVED_DISK 107 android.permission.UPDATE_APP_OPS_STATS 108 android.permission.MANAGE_APP_OPS_MODES 109 android.permission.INTERACT_ACROSS_USERS_FULL 110 android.permission.SUBSTITUTE_NOTIFICATION_APP_NAME 111 android.permission.PACKAGE_USAGE_STATS 112 install permissions: 113 android.permission.USE_RESERVED_DISK: granted=true 114 android.permission.INSTALL_PACKAGES: granted=true 115 android.permission.RECEIVE_BOOT_COMPLETED: granted=true 116 android.permission.INTERACT_ACROSS_USERS_FULL: granted=true 117 android.permission.PACKAGE_USAGE_STATS: granted=true 118 android.permission.SUBSTITUTE_NOTIFICATION_APP_NAME: granted=true 119 android.permission.READ_INSTALL_SESSIONS: granted=true 120 android.permission.MANAGE_USERS: granted=true 121 android.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS: granted=true 122 android.permission.MANAGE_APP_OPS_MODES: granted=true 123 android.permission.UPDATE_APP_OPS_STATS: granted=true 124 android.permission.DELETE_PACKAGES: granted=true 125``` 126 127#### End-to-end: Protecting an RPC call via a permission 128 129##### Service Manifest 130 131```xml 132<manifest xmlns:android="http://schemas.android.com/apk/res/android" 133 package="com.android.example.myservice"> 134 <!-- Define a permission --> 135 <permission android:name="com.android.example.myservice.MY_PERMISSION" /> 136 <application> 137 <service android:name=".MyService" android:exported="true" /> 138 </application> 139</manifest> 140``` 141 142##### Service code 143 144```kotlin 145class MyService : Service() { 146 override fun onBind(intent: Intent?): IBinder? { 147 return object : IMyService.Stub() { 148 override fun doSomething() { 149 // Verify that calling UID has the permission 150 enforceCallingPermission( 151 "com.android.example.myservice.MY_PERMISSION", 152 "Need to hold permission" 153 ) 154 // do something 155 } 156 }.asBinder() 157 } 158} 159``` 160 161##### Caller Manifest 162 163```xml 164<manifest xmlns:android="http://schemas.android.com/apk/res/android" 165 package="com.android.example.myapp"> 166 <!-- request a permission --> 167 <uses-permission android:name="com.android.example.myservice.MY_PERMISSION" /> 168 <application /> 169</manifest> 170``` 171 172### Runtime permissions 173 174Runtime permission must be granted by the user during runtime. This is needed if the API protects 175data or functionality that is sensitive for the user. E.g. the users current location is protected 176by a runtime permission. 177 178Users want a system that is secure and privacy focused by default. User can also often not make a 179good choice when asked at the wrong time without enough context. Hence in general runtime 180permissions should be avoided and the API should be built in a way where no private data needs to be 181leaked. 182 183#### Defining a runtime permission 184 185Runtime permissions are defined in the same way as install time permissions. To tag them as runtime 186permissions the `protectionLevel` needs to be set to dangerous. Dangerous is a synonym for 187runtime permissions in the Android platform. 188 189```xml 190<uses-permission android:name="com.example.myapp.myfirstruntimepermission" 191 android:protectionLevel="dangerous" /> 192``` 193 194#### Requesting a runtime permission 195 196Similar to install time permissions any app can request a runtime permission by adding the 197`<uses-permission android:name="com.example.myapp.myfirstruntimepermission" />` 198to the manifest. 199 200By default runtime permissions are not granted. The app needs to call `Activity.requestPermissions` 201during runtime to ask the user for the permission. The user might then grant or deny and once the 202decision is made the activity is called by via `Activity.onPermissionGranted`. 203 204During development and testing a runtime permission can be granted via the `pm` shell command or by 205using the `UiAutomator.grantRuntimePermission` API call. Please note that this does _not_ grant the 206[app-op](#runtime-permissions-and-app_ops) synchronously. Unless the app needs to test the actual 207permission grant flow it is recommended to grant the runtime permissions during install using 208`adb install -g /my/package.apk`. 209 210#### Checking a runtime permission 211 212For runtime permissions defined by 3rd party apps it is fine to check a runtime 213permission like an install time permission. For system defined permissions you need to check all 214runtime permissions by using the `PermissionChecker` utility. It is good practice to use the tool 215anywhere possible. 216 217The permission checker might return `PERMISSION_DENIED_APP_OP` which should lead to a silent 218failure. This can only happen for system defined runtime permissions. 219 220##### Runtime permissions and app-ops 221 222> See [App-ops](../app/AppOps.md). 223 224The PermissionChecker code fundamentally looks like this: 225 226```kotlin 227class PermissionChecker { 228 fun checkCallingPermission(context: Context, permission: String) { 229 if (isRuntimePermission(permission)) { 230 if (context.checkPermission(uid, permission) == DENIED) { 231 return PERMISSION_DENIED 232 } 233 234 val appOpOfPermission = AppOpsManager.permissionToOp(permission) 235 if (appOpOfPermission == null) { 236 // not platform defined 237 return PERMISSION_GRANTED 238 } 239 240 val appOpMode = appOpsManager.noteOp(appOpOfPermission) 241 if (appOpMode == AppOpsManager.MODE_ALLOWED) { 242 return PERMISSION_GRANTED 243 } else { 244 return PERMISSION_DENIED_APP_OP 245 } 246 } else { 247 return PERMISSION_DENIED 248 } 249 } 250} 251``` 252 253For each platform defined runtime permission there is a matching app-op. When calling 254`AppOpsManager.noteOp` this returns either `MODE_ALLOWED` or `MODE_IGNORED`. 255 256This value is then used to decide between `PERMISSION_DENIED_APP_OP` and `PERMISSION_GRANTED`. 257 258The primary purpose of the special `PERMISSION_DENIED_APP_OP` state was to support apps targeting an 259SDK lower than 23. These apps do not understand the concept of denied runtime permissions. Hence 260they would crash when getting a `SecurityException`. To protect the users' privacy while still not 261crashing the app the special `PERMISSION_DENIED_APP_OP` mandates that the API should somehow 262silently fail. 263 264A secondary use case of the `AppOpsManager.noteOp` calls is to 265[track](../app/AppOps.md#app_ops-for-tracking) which apps perform what runtime protected actions. 266 267#### Verifying an app has a runtime time permission 268 269In `dumpsys package my.package.name` the runtime permissions are listed per uid. I.e. different 270users might have different runtime permission grants and shared uids share a grant-set. If a runtime 271permission is listed as requested but not in the runtime permission section it is in its initial 272state, i.e. not granted. 273 274``` 275Packages: 276 Package [com.google.android.GoogleCamera] (ccb6af): 277 userId=10181 278 [...] 279 requested permissions: 280 android.permission.ACCESS_COARSE_LOCATION 281 android.permission.ACCESS_FINE_LOCATION 282 android.permission.ACCESS_NETWORK_STATE 283 android.permission.ACCESS_NOTIFICATION_POLICY 284 android.permission.ACCESS_WIFI_STATE 285 android.permission.BIND_WALLPAPER 286 android.permission.CAMERA 287 android.permission.CHANGE_WIFI_STATE 288 android.permission.INTERNET 289 android.permission.GET_PACKAGE_SIZE 290 android.permission.NFC 291 android.permission.READ_SYNC_SETTINGS 292 android.permission.RECEIVE_BOOT_COMPLETED 293 android.permission.RECORD_AUDIO 294 android.permission.SET_WALLPAPER 295 android.permission.USE_CREDENTIALS 296 android.permission.VIBRATE 297 android.permission.WAKE_LOCK 298 android.permission.WRITE_EXTERNAL_STORAGE [ ... ] 299 android.permission.WRITE_SETTINGS 300 android.permission.WRITE_SYNC_SETTINGS 301 com.google.android.elmyra.permission.CONFIGURE_ASSIST_GESTURE 302 com.google.android.providers.gsf.permission.READ_GSERVICES 303 android.permission.FOREGROUND_SERVICE 304 com.google.android.googlequicksearchbox.permission.LENSVIEW_BROADCAST 305 android.permission.READ_EXTERNAL_STORAGE [ ... ] 306 [...] 307 User 0: [ ... ] 308 overlay paths: 309 runtime permissions: 310 android.permission.ACCESS_FINE_LOCATION: granted=false [ ... ] 311 android.permission.READ_EXTERNAL_STORAGE: granted=true [ ... ] 312 android.permission.ACCESS_COARSE_LOCATION: granted=false [ ... ] 313 android.permission.CAMERA: granted=true [ ... ] 314 android.permission.WRITE_EXTERNAL_STORAGE: granted=true [ ... ] 315 android.permission.RECORD_AUDIO: granted=true[ ... ] 316``` 317 318#### End-to-end: Protecting an RPC call via a runtime permission 319 320##### Service Manifest 321 322```xml 323<manifest xmlns:android="http://schemas.android.com/apk/res/android" 324 package="com.android.example.myservice"> 325 <!-- Define a runtime permission --> 326 <permission android:name="com.android.example.myservice.MY_RUNTIME_PERMISSION" 327 android:protectionLevel="dangerous" /> 328 <application> 329 <service android:name=".MyService" android:exported="true" /> 330 </application> 331</manifest> 332``` 333 334##### Service code 335 336```kotlin 337class MyService : Service() { 338 override fun onBind(intent: Intent?): IBinder? { 339 return object : IMyService.Stub() { 340 override fun doSomething(callingPackage: String?, callingFeatureId: String?) { 341 Objects.requireNonNull(callingPackageName) 342 343 // Verify that calling UID has the permission 344 when (run { 345 PermissionChecker.checkCallingPermission( 346 this@MyService, 347 "com.android.example.myservice.MY_RUNTIME_PERMISSION", 348 callingPackageName, 349 callingFeatureId, 350 "Did something" 351 ) 352 }) { 353 PERMISSION_GRANTED -> /* do something */ 354 PERMISSION_DENIED_APP_OP -> /* silent failure, do nothing */ 355 else -> throw SecurityException( 356 "Cannot do something as caller is missing " 357 + "com.android.example.myservice.MY_RUNTIME_PERMISSION" 358 ) 359 } 360 } 361 }.asBinder() 362 } 363} 364``` 365 366##### Caller Manifest 367 368```xml 369<manifest xmlns:android="http://schemas.android.com/apk/res/android" 370 package="com.android.example.myapp"> 371 <!-- request a permission --> 372 <uses-permission android:name="com.android.example.myservice.MY_RUNTIME_PERMISSION" /> 373 <application /> 374</manifest> 375``` 376 377##### Caller code 378 379```kotlin 380class MyActivity : Activity { 381 fun callDoSomething() { 382 if (checkSelfPermission("com.android.example.myservice.MY_RUNTIME_PERMISSION") == PERMISSION_DENIED) { 383 // Interrupt operation and request permission 384 requestPermissions(arrayOf("com.android.example.myservice.MY_RUNTIME_PERMISSION"), 23) 385 } else { 386 myService.doSomething(this@MyActivity.opPackageName, this@MyActivity.featureId) 387 } 388 } 389 390 override fun onRequestPermissionsResult( 391 requestCode: Int, 392 permissions: Array<String>, 393 grantResults: IntArray 394 ) { 395 if (requestCode == 23 && grantResults[0] == PERMISSION_GRANTED) { 396 // Finish operation 397 callDoSomething() 398 } 399 } 400} 401``` 402 403#### Restricted permissions 404 405Some runtime permissions are restricted. They are annotated in the platforms `AndroidManifest.xml` 406as `hardRestricted` or `softRestricted`. 407 408Restricted permissions behave uncommon when not whitelisted. When whitelisted the permissions 409behave normally. What uncommon means depends on the whether they are hard or soft restricted. 410 411They can either be whitelisted during upgrade P->Q by the system or need to be whitelisted by the 412installer via `PackageInstaller.SessionParams.setWhitelistedRestrictedPermissions`. If this method 413is not used all permissions will be whitelisted. 414 415Afterwards the app that originally installed the app can change the whitelisting state via 416`PackageManager.addWhitelistedRestrictedPermission` and 417`PackageManager.removeWhitelistedRestrictedPermission`. 418 419The system tracks the source of the whitelisting by having three different flags 420 `RESTRICTION_SYSTEM_EXEMPT`, `RESTRICTION_UPGRADE_EXEMPT`, and `RESTRICTION_INSTALLER_EXEMPT`, 421 422The flags can be checked in `dumpsys package my.package.name` 423 424``` 425User 0: 426 [...] 427 runtime permissions: 428 android.permission.READ_EXTERNAL_STORAGE: granted=false, flags=[ RESTRICTION_UPGRADE_EXEMPT ] 429 android.permission.ACCESS_FINE_LOCATION: granted=true, flags=[ RESTRICTION_SYSTEM_EXEMPT|RESTRICTION_UPGRADE_EXEMPT ] 430``` 431 432##### Hard restricted 433 434Hard restricted permissions need to be whitelisted to be grant-able. 435 436##### Soft restricted 437 438The behavior of non-whitelisted soft restricted permissions is not uniform. The behavior is 439defined in the `SoftRestrictedPermissionPolicy`. 440 441#### System fixed permission 442 443Some runtime permissions are required for normal operation of the device. In this case the system 444can grant the permission as `SYSTEM_FIXED`. In this case the permission can be seen in the 445[permission management settings](#settings) but cannot be revoked by the user. 446 447The flag can be checked in `dumpsys package my.package.name` 448``` 449User 0: 450 [...] 451 runtime permissions: 452 android.permission.READ_EXTERNAL_STORAGE: granted=true, flags=[ SYSTEM_FIXED|GRANTED_BY_DEFAULT ] 453``` 454 455#### Background access 456 457Whether the app is currently visible to the user is reflected in the `ActivityManager`'s proc state. 458There is a lot of granularity to this, but runtime permissions are using the [app-ops services' 459](../app/AppOps.md) definition of foreground and background. 460 461Most runtime permissions are not affected by foreground/background-ness. Microphone and Camera are 462foreground-only while Location is usually foreground-only, but background access can be added by 463granting the `ACCESS_BACKGROUND_LOCATION` modifier runtime permission. 464 465##### Microphone and Camera 466 467Currently these only allow access while the app is in foreground. There is a manual whitelist 468for e.g. the voice interaction service. 469 470This is currently (Mar 2020) reworked and will behave like [location](#location) soon. 471 472##### Location 473 474As described [above](#runtime-permissions-and-app_ops) the app-op mode for granted permissions is 475`MODE_ALLOWED` to allow access or `MODE_IGNORED` to suppress access. 476 477The important case is the case where the permission is granted and the app-op is `MODE_IGNORED`. In 478the case of location this state causes the `LocationManagerService` to stop delivering locations to 479the app. This is not a breaking behavior as the same scenario happens if e.g. no satellites 480could be found. 481 482This behavior is used to implement the foregound/background behavior for location. If the app is 483in the foreground the app-op mode is `MODE_ALLOWED` and works normally. If the app goes into 484background the app-op mode changes to `MODE_IGNORED`. This means that locations are delivered while 485the app is in foreground and while the app is background, the app won't get any locations. 486 487The automatic switching between `MODE_ALLOWED` and `MODE_IGNORED` is done inside of 488 [`AppOpsManager`](../app/AppOps.md#foreground). 489 490Background access can be enabled by also granting the `ACCESS_BACKGROUND_LOCATION` to the app. In 491this case the app-op mode will always be `MODE_ALLOWED`. 492 493#### UI 494 495##### Granting 496 497An app following the best practices does not ask for any runtime permissions until absolutely 498needed. Once needed the request should be made in context. I.e. the user should understand from the 499current state of the app and the user's action why the request is made. E.g. if the user presses 500a "show me the next ATM"-button the user is most likely expecting a request for the location 501permission. 502 503This is central premise to the runtime permission UI. It is the app's responsibility to avoid 504showing permission requests dialogs to the user which might get denied. These dialogs are not 505meant to be user-choices, they are meant to be user-confirmations. 506 507Hence any denied permission dialog is probably due to the app asking for permissions the user 508does not expect. If too many permission requests get denied the app is apparently trying to get 509more than the user wants to give to the app. In this case the permission gets permanently denied 510and all future requests will be denied automatically without showing a UI. 511 512`Context.requestPermission` calls for more than one permission are allowed and might result in 513multiple dialogs in sequence. This might make sense for e.g. getting microphone and camera 514permission when starting a video call. 515 516Each time the the user makes a choice (either to grant or the deny) a permission request the 517permission is marked as `USER_SET`. If a permission gets permanently denied the permission is marked 518as `USER_FIXED`. 519 520This can be found in `dumpsys package my.package.name` 521``` 522User 0: 523 [...] 524 runtime permissions: 525 android.permission.READ_EXTERNAL_STORAGE: granted=false, flags=[ USER_SET|USER_FIXED ] 526 android.permission.ACCESS_FINE_LOCATION: granted=true, flags=[ USER_SET ] 527``` 528 529##### Settings 530 531By far most interactions with the permission system are via the [permission grant flow](#granting). 532The main purpose of the permission settings is to show the user the previous choices and allow 533the user to revisit previous choices. In reality few users do that. 534 535##### Grouping 536 537There are too many runtime permissions for the user to individually manage. Hence the UI bundles the 538permissions into groups. **Apps should never assume the grouping**. The grouping might change 539with SDK updates, but also at any other time. Certain form factors or locales might use other 540permission models and sometimes some of the permissions of a group cannot be granted for various 541reasons. The grouping is defined inside the permission controller app. 542 543If two permissions belong to a group and the first permission is already granted the second one 544will be granted on request of the app without user interaction. For that reason a permission 545group with at least one individual permission granted will show up as granted in the UI. 546 547##### Alternate permission management 548 549It is not allowed to build alternate permission management UIs. While restricting innovation is not 550a good choice this is a required one to enforce a consistent, predictable, but flexible permission 551model for users and app developers. 552 553Further some data needed for permission management (e.g. the grouping) is not available outside 554the permission controller app. 555 556Hence all permission management UI needs to be integrated with AOSP. 557 558#### Pre granting 559 560Runtime permissions protect user private data. It is a violation of user trust to give the data 561to an app without explicit user consent (i.e. the user [granting](#granting) the permission). 562Still the user expects certain functionality (e.g. receiving a phone call) to work out of the 563box. 564 565Hence the `DefaultPermissionGrantPolicy` and roles allow to grant permission without the user 566. The default permission grant policy grants permissions for three categories of apps 567- Apps running in well defined [uids](../os/Users.md#int-uid) as they are considered as part of 568 the platform 569- Apps that are in certain predefined categories, e.g. the browser and the SMS app. This is 570 meant for the most basic phone functionality, not for all pre-installed apps. 571- Apps that are explicitly mentioned as pre-grant-exceptions. This is meant to be used for setup 572 and other highly critical use cases, not to improve the user experience. The exceptions are listed 573 in xml files in `etc/` and follow the following syntax 574```xml 575<exceptions> 576 <exception package="my.package.name"> 577 <permission name="android.permission.ACCESS_FINE_LOCATION" fixed="false"/> 578 </exception> 579</exceptions> 580``` 581 582Pre-granted runtime permissions can still be revoked by the user in [settings](#settings) unless 583they are granted as `SYSTEM_FIXED`. 584 585Whether a permission was granted by the default can be checked in the permission flags of 586`dumpsys package my.package.name` 587 588``` 589User 0: 590 [...] 591 runtime permissions: 592 android.permission.ACCESS_FINE_LOCATION: granted=true, flags=[ GRANTED_BY_DEFAULT ] 593``` 594 595### Permission restricted components 596 597As [publicly documented](https://developer.android.com/guide/topics/permissions/overview#permission_enforcement) 598it is possible to restrict starting an activity/binding to a service by using permission. 599 600It is a common pattern to 601 602- define a permission in the platform as `signature` 603- protect a service in an app by this permission using the `android:permission` attribute of the 604 `<service>` tag 605 606Then it is guaranteed that only the system can bind to such service. This is used for services 607that provide extensions to platform functionality, such as auto-fill services, print services, and 608accessibility services. 609 610This does not work for app-op or runtime permissions as the way to check these permissions is 611more complex than install time permissions. 612 613#### End-to-end A service only the system can bind to 614 615Make sure to set the `android:permission` flag for this service. As developers can forget this it is 616a good habit to check this before binding to the service. This makes sure that the services are 617implemented correctly and no random app can bind to the service. 618 619The result is that the permission is granted only to the system. It is not granted to the service's 620package, but this has no negative side-effects. 621 622##### Permission definition 623 624frameworks/base/core/res/AndroidManifest.xml: 625 626```xml 627<manifest> 628[...] 629 <permission android:name="android.permission.BIND_MY_SERVICE" 630 android:label="@string/permlab_bindMyService" 631 android:description="@string/permdesc_bindMyService" 632 android:protectionLevel="signature" /> 633[...] 634</manifest> 635``` 636 637##### Service definition 638 639Manifest of the service providing the functionality: 640 641```xml 642<manifest> 643 <service android:name="com.my.ServiceImpl" 644 android:permission="android.permission.BIND_MY_SERVICE"> 645 <!-- add an intent filter so that the system can find this package --> 646 <intent-filter> 647 <action android:name="android.my.Service" /> 648 </intent-filter> 649 </service> 650</manifest> 651``` 652 653##### System server code binding to service 654 655```kotlin 656val serviceConnections = mutableListOf<ServiceConnection>() 657 658val potentialServices = context.packageManager.queryIntentServicesAsUser( 659 Intent("android.my.Service"), GET_SERVICES or GET_META_DATA, userId) 660 661for (val ri in potentialServices) { 662 val serviceComponent = ComponentName(ri.serviceInfo.packageName, ri.serviceInfo.name) 663 664 if (android.Manifest.permission.BIND_MY_SERVICE != ri.serviceInfo.permission) { 665 Slog.w(TAG, "$serviceComponent is not protected by " + 666 "${android.Manifest.permission.BIND_MY_SERVICE}") 667 continue 668 } 669 670 val newConnection = object : ServiceConnection { 671 ... 672 } 673 674 val wasBound = context.bindServiceAsUser(Intent().setComponent(serviceComponent), 675 serviceConnection, BIND_AUTO_CREATE, UserHandle.of(userId)) 676 if (wasBound) { 677 serviceConnections.add(newConnection) 678 } 679} 680``` 681 682## Permissions for system apps 683 684System apps need to integrate deeper with the system than regular apps. Hence they need to be 685able to call APIs not available to other apps. This is implemented by granting permissions to 686these system apps and then enforcing the permissions in the API similar to other [install time 687permissions](#checking-a-permission). 688 689System apps are not different from regular apps, but the protection flags (e.g. 690[privileged](#privileged-permissions), [preinstalled](#preinstalled-permissions)) mentioned in this 691section are more commonly used by system apps. 692 693### Permission protection level 694 695Every permission has a protection level (`android:protectionlevel`), which is a combination of one 696required protection (`PermissionInfo.getProtection()`) and multiple optional protection flags 697(`PermissionInfo.getProtectionFlags()`). 698 699The protection can be one of the following: 700 701- [`normal`](#requesting-a-permission): The permission will be granted to apps requesting it in 702their manifest. 703- [`dangerous`](#runtime-permissions): The permission will be a runtime permission. 704- [`signature`](#signature-permissions): The permission will be granted to apps being signed with 705the same certificate as the app defining the permission. If the permission is a platform permission, 706it means those apps need to be platform-signed. 707- `internal`: This is a no-op protection so that it won't allow granting the permission by itself. 708However, it will be useful when defining permissions that should only be granted according to its 709protection flags, e.g. `internal|role` for a role-only permission. 710 711There are various optional protection flags that can be added to protection level, in addition to 712the required protection, e.g. [appop](#app_op-permissions), 713[preinstalled](#preinstalled-permissions), [privileged](#privileged-permissions), 714[installer](#limited-permissions), [role](#role-protected-permissions) and 715[development](#development-permissions). 716 717The permission will be granted to an app if it meets _any_ of the protection or protection flags (an 718`OR` relationship). For example, `signature|privileged` allows the permission to be granted to 719platform-signed apps as well as privileged apps. 720 721### App-op permissions 722 723> See [App-ops](../app/AppOps.md). 724 725App-op permissions are user-switchable permissions that are not runtime permissions. This should 726be used for permissions that are really only meant to be ever granted to a very small amount of 727apps. Traditionally granting these permissions is intentionally very heavy weight so that the 728user really needs to understand the use case. For example one use case is the 729`INTERACT_ACROSS_PROFILES` permission that allows apps of different users within the same 730[profile group](../os/Users.md#profile-group) to interact. Of course this is breaking a very basic 731security container and hence should only ever be granted with a lot of care. 732 733**Warning:** Most app-op permissions follow this logic, but most of them also have exceptions 734and special behavior. Hence this section is a guideline, not a rule. 735 736#### Defining an app-op permission 737 738Only the platform can reasonably define an app-op permission. The permission is defined in the 739platforms manifest using the `appop` protection flag: 740 741```xml 742<manifest package="android"> 743 <permission android:name="android.permission.MY_APPOP_PERMISSION" 744 android:protectionLevel="signature|appop" /> 745</manifest> 746``` 747 748#### Checking an app-op permission 749 750The `PermissionChecker` utility can check app-op permissions with the [same syntax as runtime 751permissions](#checking-a-runtime-permission). 752 753The permission checker internally follows this flow 754 755```kotlin 756class PermissionChecker { 757 fun checkCallingPermission(context: Context, permission: String) { 758 if (isAppOpPermission(permission)) { 759 val appopOfPermission = AppOpsManager.permissionToOp(permission) 760 if (appopOfPermission == null) { 761 // not platform defined 762 return PERMISSION_DENIED 763 } 764 765 val appopMode = appOpsManager.noteOp(appopOfPermission) 766 when (appopMode) { 767 AppOpsManager.MODE_ALLOWED -> return PERMISSION_GRANTED 768 AppOpsManager.MODE_IGNORED -> return PERMISSION_DENIED 769 AppOpsManager.MODE_DEFAULT -> { 770 if (context.checkPermission(uid, permission) == GRANTED) { 771 return PERMISSION_GRANTED 772 } else { 773 return PERMISSION_DENIED 774 } 775 } 776 } 777 } else { 778 return PERMISSION_DENIED 779 } 780 } 781} 782``` 783 784#### Granting an app-op permission 785 786The permission's grant state is only considered if the app-op's mode is `MODE_DEFAULT`. This 787allows to have default grants while still being overridden by the app-op. 788 789The permission is then granted by setting the app-op mode. This is usually done via dedicated APIs 790for each use case. Similarly whether and how an app can request the permission is different for 791each app-op permission. 792 793When implementing a new app-op permission, make sure to set the app-op mode using 794`AppOpsManager.setUidMode` to make sure the permission is granted on the uid as this is the 795security domain. 796 797During development app-ops can be grated to app via the `appops set` shell command. E.g. 798 799``` 800adb shell appops set 10187 INTERACT_ACROSS_PROFILES allow 801``` 802 803sets the `INTERACT_ACROSS_PROFILES` app-op for uid 10187 to allow thereby granting apps in this 804uid the ability to interact across profiles. 805 806##### UI 807 808Most UIs for app-op permissions are in the "Special app access" section of the settings app. 809 810In most cases the permission should only be granted with the user's explicit agreement, usually by 811allowing the app to directly open the "Special app access" page for this permission and app. 812 813To repeat: this is a guideline for app-op permissions and there are many exceptions. 814 815### Signature permissions 816 817Only apps signed with the defining app's certificate will be granted the permission. This is 818used to restrict APIs to apps of the same developer. 819 820This is frequently used to restrict permissions defined by the platform to apps also signed with 821the platform's certificate. As this is a very tight restriction this is recommended for 822permissions that are only used by apps built out of AOSP which are signed with the platform 823certificate. 824 825Please note that OEMs sign their platform themselves. I.e. OEMs can implement new apps using these 826permissions. It is unlikely that 3rd party apps will be able to use APIs protected by signature 827permissions as they are usually not signed with the platform certificate. 828 829If possible, [role protected permissions](#role-protected-permissions) should also be considered as 830an alternative to better restrict which apps may get the permission. 831 832Such permissions are defined and checked like an install time permission. 833 834### Preinstalled permissions 835 836This means that the app has to be pre-installed. There is no restriction what apps are pre-installed 837on a particular device install there. Hence it can be really any app including 3rd party apps. 838 839Hence this permission level is discouraged unless there are 840[further restrictions](#restricted-by-tests). 841 842If possible, [role protected permissions](#role-protected-permissions) should also be considered as 843an alternative to better restrict which apps may get the permission. 844 845Such permissions are defined and checked like an install time permission. 846 847### Privileged permissions 848 849This means that the app has to be pre-installed and in the `system/priv` directory in the 850filesystem. There is no restriction what apps are in this directory on a particular device. 851Hence it can be really any app including 3rd party apps. 852 853An app is only ever granted privileged permissions requested by the pre-installed apk. I.e. 854privileged permissions added in updates will never be granted. 855 856Hence this permission level is discouraged unless there are 857[further restrictions](#restricted-by-tests). 858 859If possible, [role protected permissions](#role-protected-permissions) should also be considered as 860an alternative to better restrict which apps may get the permission. 861 862Such permissions are defined and checked like an install time permission. 863 864#### Restricted by tests 865 866As all apps that might get preinstalled or privilidged permissions need to be pre-installed and new 867images need to pass compliance tests it is possible to use a test to whitelist the apps that can 868request the permission. 869 870Example of such a test: 871```kotlin 872/* Add new whitelisted packages to this list */ 873private val whitelistedPkgs = listOf("my.whitelisted.package") 874 875@Test 876fun onlySomeAppsAreAllowedToHavePermissionGranted() { 877 assertThat(whitelistedPkgs).containsAtLeastElementsIn( 878 context.packageManager.getInstalledPackages(MATCH_ALL) 879 .filter { pkg -> 880 context.checkPermission(android.Manifest.permission.MY_PRIVILEGED_PERMISSION, -1, 881 pkg.applicationInfo.uid) == PERMISSION_GRANTED 882 /* The permission is defined by the system and hence granted to it */ 883 }.filter { pkg -> pkg.applicationInfo.uid != SYSTEM_UID } 884 .map { it.packageName } 885 ) 886} 887``` 888 889#### Whitelist 890 891As mentioned above it is not suggested, but still common practice to install 3rd party apps as 892privileged. To verify and restrict which privileged permissions those apps get granted all 893privileged permissions need to be explicitly whitelisted in a file `/etc`. 894 895```xml 896<permissions> 897 <privapp-permissions package="my.privileged.package"> 898 <!-- allow the app to request a permission --> 899 <permission name="android.permission.MY_PRIVILEGED_PERMISSION"/> 900 901 <!-- Even though the app requests the permission, do not grant it --> 902 <deny-permission name="android.permission.MY_OTHER_PRIVILEGED_PERMISSION"/> 903 </privapp-permissions> 904</permissions> 905``` 906 907If the pre-installed apk of an app requests a privileged permission that is not mentioned in any 908whitelist or that is not denied the system will refuse to boot. As mentioned above privileged 909permissions added in updates to the pre-installed app will never be granted. 910 911### Limited permissions 912 913E.g. installer, wellbeing, documenter, etc... This allows the system to restrict the permission to a 914well defined app or set of apps. It is possible to add new types in `PackageManagerService`. 915 916Which apps qualify for such a permission level is flexible and custom for each such level. Usually 917they refer to a single or small set of apps, usually - but not always - apps defined in AOSP. 918 919This type of permission is deprecated in favor of 920[role protected permissions](#role-protected-permissions). 921 922These permissions are defined and checked like an install time permission. 923 924### Role protected permissions 925 926See 927[Using role for permission protection](../../../../../../packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/role/RolePermissionProtection.md). 928 929### Development permissions 930 931> Not recommended 932 933By adding the `development` protection flag to any permissions the permission can be granted via 934the `pm grant` shell command. This appears to be useful for development and testing, but it is very 935highly discouraged. Any user can grant them permanently via adb, hence adding this tag removes 936all guarantees the permission might otherwise provide. 937 938### Other protection flags 939 940There are other levels (such as `runtime`) but they are for special purposes on should not be 941used by platform developers. 942