OSDN Git Service

Guard retrievePreRebootSecurityLogs with config flag
authorRubin Xu <rubinxu@google.com>
Wed, 4 May 2016 18:01:07 +0000 (19:01 +0100)
committerRubin Xu <rubinxu@google.com>
Thu, 5 May 2016 11:00:50 +0000 (12:00 +0100)
Bug: 28160645
Change-Id: Ifce884c319019758dfaaa39bc239e9f30962c920

core/java/android/app/admin/DevicePolicyManager.java
core/res/res/values/config.xml
core/res/res/values/symbols.xml
services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java

index b0e86f4..451acf3 100644 (file)
@@ -6150,23 +6150,28 @@ public class DevicePolicyManager {
     /**
      * Called by device owners to retrieve device logs from before the device's last reboot.
      * <p>
-     * <strong> The device logs are retrieved from a RAM region which is not guaranteed to be
-     * corruption-free during power cycles, due to hardware variations and limitations. As a result,
-     * this API is provided as best-effort and the returned logs may be empty or contain corrupted
-     * data. </strong>
+     * <strong> This API is not supported on all devices. Calling this API on unsupported devices
+     * will result in {@code null} being returned. The device logs are retrieved from a RAM region
+     * which is not guaranteed to be corruption-free during power cycles, as a result be cautious
+     * about data corruption when parsing. </strong>
      * <p>
      * There must be only one user on the device, managed by the device owner. Otherwise a
      * {@link SecurityException} will be thrown.
      *
      * @param admin Which device owner this request is associated with.
-     * @return Device logs from before the latest reboot of the system.
+     * @return Device logs from before the latest reboot of the system, or {@code null} if this API
+     *         is not supported on the device.
      * @throws SecurityException if {@code admin} is not a device owner.
      */
     public List<SecurityEvent> retrievePreRebootSecurityLogs(@NonNull ComponentName admin) {
         throwIfParentInstance("retrievePreRebootSecurityLogs");
         try {
             ParceledListSlice<SecurityEvent> list = mService.retrievePreRebootSecurityLogs(admin);
-            return list.getList();
+            if (list != null) {
+                return list.getList();
+            } else {
+                return null;
+            }
         } catch (RemoteException re) {
             throw re.rethrowFromSystemServer();
         }
index e73fa9a..2a83d88 100644 (file)
          remote provider -->
     <string name="config_tvRemoteServicePackage" translatable="false"></string>
 
+    <!-- True if the device supports persisting security logs across reboots. -->
+    <bool name="config_supportPreRebootSecurityLogs">false</bool>
 </resources>
index 14c17f3..c64a934 100644 (file)
 
   <!-- TV Remote Service package -->
   <java-symbol type="string" name="config_tvRemoteServicePackage" />
+
+  <java-symbol type="bool" name="config_supportPreRebootSecurityLogs" />
 </resources>
index 764ac05..d0128b7 100644 (file)
@@ -8871,6 +8871,10 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
         Preconditions.checkNotNull(admin);
         ensureDeviceOwnerManagingSingleUser(admin);
 
+        if (!mContext.getResources().getBoolean(R.bool.config_supportPreRebootSecurityLogs)) {
+            return null;
+        }
+
         ArrayList<SecurityEvent> output = new ArrayList<SecurityEvent>();
         try {
             SecurityLog.readPreviousEvents(output);