diff options
author | 2021-02-17 07:44:54 +0000 | |
---|---|---|
committer | 2021-02-17 07:44:54 +0000 | |
commit | 857efd19a413356c102d5b5451f94c301cf4db6b (patch) | |
tree | 3d5ac8d585a254e2216668b2d413dcd9972b90cb | |
parent | 37dbb4e5d5e850b665dc7db7c91291e1048a2c6c (diff) | |
parent | 97f66fd20ca69d72d03db5f3f11a6db78dca0357 (diff) |
Merge changes from topic "sensor_sampling_rate_throttling-sc-dev" into sc-dev
* changes:
Throw SecurityException regarding sampling rates.
Add support for retrieving the Debuggable flag.
Add HIGH_SAMPLING_RATE_SENSORS permission.
-rw-r--r-- | core/api/current.txt | 1 | ||||
-rw-r--r-- | core/java/android/hardware/SystemSensorManager.java | 50 | ||||
-rw-r--r-- | core/res/AndroidManifest.xml | 9 | ||||
-rw-r--r-- | core/res/res/values/strings.xml | 5 | ||||
-rw-r--r-- | services/core/java/com/android/server/pm/PackageManagerService.java | 11 |
5 files changed, 74 insertions, 2 deletions
diff --git a/core/api/current.txt b/core/api/current.txt index 2f09ce11aeff..c2a5a27af35a 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -88,6 +88,7 @@ package android { field @Deprecated public static final String GET_TASKS = "android.permission.GET_TASKS"; field public static final String GLOBAL_SEARCH = "android.permission.GLOBAL_SEARCH"; field public static final String HIDE_OVERLAY_WINDOWS = "android.permission.HIDE_OVERLAY_WINDOWS"; + field public static final String HIGH_SAMPLING_RATE_SENSORS = "android.permission.HIGH_SAMPLING_RATE_SENSORS"; field public static final String INSTALL_LOCATION_PROVIDER = "android.permission.INSTALL_LOCATION_PROVIDER"; field public static final String INSTALL_PACKAGES = "android.permission.INSTALL_PACKAGES"; field public static final String INSTALL_SHORTCUT = "com.android.launcher.permission.INSTALL_SHORTCUT"; diff --git a/core/java/android/hardware/SystemSensorManager.java b/core/java/android/hardware/SystemSensorManager.java index 376503e79cfc..1ffd18fc1ac8 100644 --- a/core/java/android/hardware/SystemSensorManager.java +++ b/core/java/android/hardware/SystemSensorManager.java @@ -16,11 +16,18 @@ package android.hardware; +import static android.content.pm.PackageManager.PERMISSION_GRANTED; + +import android.compat.Compatibility; +import android.compat.annotation.ChangeId; +import android.compat.annotation.EnabledAfter; import android.compat.annotation.UnsupportedAppUsage; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; import android.os.Build; import android.os.Handler; import android.os.Looper; @@ -54,6 +61,19 @@ public class SystemSensorManager extends SensorManager { private static final boolean DEBUG_DYNAMIC_SENSOR = true; private static final int MIN_DIRECT_CHANNEL_BUFFER_SIZE = 104; private static final int MAX_LISTENER_COUNT = 128; + private static final int CAPPED_SAMPLING_PERIOD_US = 5000; + private static final int CAPPED_SAMPLING_RATE_LEVEL = SensorDirectChannel.RATE_NORMAL; + + private static final String HIGH_SAMPLING_RATE_SENSORS_PERMISSION = + "android.permisison.HIGH_SAMPLING_RATE_SENSORS"; + /** + * For apps targeting S and above, a SecurityException is thrown when they do not have + * HIGH_SAMPLING_RATE_SENSORS permission, run in debug mode, and request sampling rates that + * are faster than 200 Hz. + */ + @ChangeId + @EnabledAfter(targetSdkVersion = Build.VERSION_CODES.R) + static final long CHANGE_ID_SAMPLING_RATE_SENSORS_PERMISSION = 136069189L; private static native void nativeClassInit(); private static native long nativeCreate(String opPackageName); @@ -98,6 +118,8 @@ public class SystemSensorManager extends SensorManager { // Looper associated with the context in which this instance was created. private final Looper mMainLooper; private final int mTargetSdkLevel; + private final boolean mIsPackageDebuggable; + private final boolean mHasHighSamplingRateSensorsPermission; private final Context mContext; private final long mNativeInstance; @@ -111,9 +133,16 @@ public class SystemSensorManager extends SensorManager { } mMainLooper = mainLooper; - mTargetSdkLevel = context.getApplicationInfo().targetSdkVersion; + ApplicationInfo appInfo = context.getApplicationInfo(); + mTargetSdkLevel = appInfo.targetSdkVersion; mContext = context; mNativeInstance = nativeCreate(context.getOpPackageName()); + mIsPackageDebuggable = (0 != (appInfo.flags & ApplicationInfo.FLAG_DEBUGGABLE)); + PackageManager packageManager = context.getPackageManager(); + mHasHighSamplingRateSensorsPermission = + (PERMISSION_GRANTED == packageManager.checkPermission( + HIGH_SAMPLING_RATE_SENSORS_PERMISSION, + appInfo.packageName)); // initialize the sensor list for (int index = 0;; ++index) { @@ -542,10 +571,18 @@ public class SystemSensorManager extends SensorManager { } int sensorHandle = (sensor == null) ? -1 : sensor.getHandle(); + if (Compatibility.isChangeEnabled(CHANGE_ID_SAMPLING_RATE_SENSORS_PERMISSION) + && rate > CAPPED_SAMPLING_RATE_LEVEL + && mIsPackageDebuggable + && !mHasHighSamplingRateSensorsPermission) { + Compatibility.reportChange(CHANGE_ID_SAMPLING_RATE_SENSORS_PERMISSION); + throw new SecurityException("To use the sampling rate level " + rate + + ", app needs to declare the normal permission" + + " HIGH_SAMPLING_RATE_SENSORS."); + } int ret = nativeConfigDirectChannel( mNativeInstance, channel.getNativeHandle(), sensorHandle, rate); - if (rate == SensorDirectChannel.RATE_STOP) { return (ret == 0) ? 1 : 0; } else { @@ -745,6 +782,15 @@ public class SystemSensorManager extends SensorManager { Sensor sensor, int rateUs, int maxBatchReportLatencyUs) { if (mNativeSensorEventQueue == 0) throw new NullPointerException(); if (sensor == null) throw new NullPointerException(); + if (Compatibility.isChangeEnabled(CHANGE_ID_SAMPLING_RATE_SENSORS_PERMISSION) + && rateUs < CAPPED_SAMPLING_PERIOD_US + && mManager.mIsPackageDebuggable + && !mManager.mHasHighSamplingRateSensorsPermission) { + Compatibility.reportChange(CHANGE_ID_SAMPLING_RATE_SENSORS_PERMISSION); + throw new SecurityException("To use the sampling rate of " + rateUs + + " microseconds, app needs to declare the normal permission" + + " HIGH_SAMPLING_RATE_SENSORS."); + } return nativeEnableSensor(mNativeSensorEventQueue, sensor.getHandle(), rateUs, maxBatchReportLatencyUs); } diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index fbc1d4fe0ea2..6456e4e2a59a 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -1403,6 +1403,15 @@ android:description="@string/permgroupdesc_sensors" android:priority="800" /> + <!-- Allows an app to access sensor data with a sampling rate greater than 200 Hz. + <p>Protection level: normal + --> + <permission android:name="android.permission.HIGH_SAMPLING_RATE_SENSORS" + android:permissionGroup="android.permission-group.SENSORS" + android:label="@string/permlab_highSamplingRateSensors" + android:description="@string/permdesc_highSamplingRateSensors" + android:protectionLevel="normal" /> + <!-- Allows an application to access data from sensors that the user uses to measure what is happening inside their body, such as heart rate. <p>Protection level: dangerous --> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index af5e406979ad..9ebe23af2c59 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -1830,6 +1830,11 @@ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. --> <string name="permdesc_startViewPermissionUsage">Allows the holder to start the permission usage for an app. Should never be needed for normal apps.</string> + <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. [CHAR_LIMIT=NONE] --> + <string name="permlab_highSamplingRateSensors">access sensor data at a high sampling rate</string> + <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this.[CHAR_LIMIT=NONE] --> + <string name="permdesc_highSamplingRateSensors">Allows the app to sample sensor data at a rate greater than 200 Hz</string> + <!-- Policy administration --> <!-- Title of policy access to limiting the user's password choices --> diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index fc18ddb0c7a3..e6789d4ba8ac 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -25925,6 +25925,17 @@ public class PackageManagerService extends IPackageManager.Stub } @Override + public boolean isPackageDebuggable(String packageName) throws RemoteException { + int callingUser = UserHandle.getCallingUserId(); + ApplicationInfo appInfo = getApplicationInfo(packageName, 0, callingUser); + if (appInfo != null) { + return (0 != (appInfo.flags & ApplicationInfo.FLAG_DEBUGGABLE)); + } + + throw new RemoteException("Couldn't get debug flag for package " + packageName); + } + + @Override public boolean[] isAudioPlaybackCaptureAllowed(String[] packageNames) throws RemoteException { int callingUser = UserHandle.getUserId(Binder.getCallingUid()); |