diff options
| author | TreeHugger Robot <treehugger-gerrit@google.com> | 2019-01-11 12:37:33 +0000 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2019-01-11 12:37:33 +0000 |
| commit | cbdbc4d9c6d88904e990caef45a2cd5149e9cd3c (patch) | |
| tree | d2c173b203364f10dbe1a5f954b5c38c5edcecc0 /core/java/android | |
| parent | fc758be231a4652e4910c9f31842b29ae2f087bf (diff) | |
| parent | d11850cd44dcf1114f53bd0e12569a584d557039 (diff) | |
Merge "Add a privileged API for capturing and consuming bugreports"
Diffstat (limited to 'core/java/android')
| -rw-r--r-- | core/java/android/app/SystemServiceRegistry.java | 12 | ||||
| -rw-r--r-- | core/java/android/content/Context.java | 10 | ||||
| -rw-r--r-- | core/java/android/os/BugreportManager.java | 148 | ||||
| -rw-r--r-- | core/java/android/os/BugreportParams.java | 90 |
4 files changed, 260 insertions, 0 deletions
diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java index 74abe2ed4690..83c6fac6158e 100644 --- a/core/java/android/app/SystemServiceRegistry.java +++ b/core/java/android/app/SystemServiceRegistry.java @@ -122,6 +122,7 @@ import android.net.wifi.rtt.WifiRttManager; import android.nfc.NfcManager; import android.os.BatteryManager; import android.os.BatteryStats; +import android.os.BugreportManager; import android.os.Build; import android.os.DeviceIdleManager; import android.os.DropBoxManager; @@ -129,6 +130,7 @@ import android.os.HardwarePropertiesManager; import android.os.IBatteryPropertiesRegistrar; import android.os.IBinder; import android.os.IDeviceIdleController; +import android.os.IDumpstate; import android.os.IHardwarePropertiesManager; import android.os.IPowerManager; import android.os.IRecoverySystem; @@ -1082,6 +1084,16 @@ final class SystemServiceRegistry { return new IncidentManager(ctx); }}); + registerService(Context.BUGREPORT_SERVICE, BugreportManager.class, + new CachedServiceFetcher<BugreportManager>() { + @Override + public BugreportManager createService(ContextImpl ctx) + throws ServiceNotFoundException { + IBinder b = ServiceManager.getServiceOrThrow(Context.BUGREPORT_SERVICE); + return new BugreportManager(ctx.getOuterContext(), + IDumpstate.Stub.asInterface(b)); + }}); + registerService(Context.AUTOFILL_MANAGER_SERVICE, AutofillManager.class, new CachedServiceFetcher<AutofillManager>() { @Override diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index ce957415cae0..6f866eab56ea 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -4436,6 +4436,16 @@ public abstract class Context { public static final String STATS_MANAGER = "stats"; /** + * Service to capture a bugreport. + * @see #getSystemService(String) + * @see android.os.BugreportManager + * @hide + */ + // TODO: Expose API when the implementation is more complete. + // @SystemApi + public static final String BUGREPORT_SERVICE = "bugreport"; + + /** * Use with {@link #getSystemService(String)} to retrieve a {@link * android.content.om.OverlayManager} for managing overlay packages. * diff --git a/core/java/android/os/BugreportManager.java b/core/java/android/os/BugreportManager.java new file mode 100644 index 000000000000..1343d24d0d94 --- /dev/null +++ b/core/java/android/os/BugreportManager.java @@ -0,0 +1,148 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.os; + +import android.annotation.IntDef; +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.annotation.RequiresPermission; +import android.annotation.SystemService; +import android.content.Context; +import android.os.IBinder.DeathRecipient; + +import java.io.FileDescriptor; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * Class that provides a privileged API to capture and consume bugreports. + * + * @hide + */ +// TODO: Expose API when the implementation is more complete. +// @SystemApi +@SystemService(Context.BUGREPORT_SERVICE) +public class BugreportManager { + private final Context mContext; + private final IDumpstate mBinder; + + /** @hide */ + public BugreportManager(@NonNull Context context, IDumpstate binder) { + mContext = context; + mBinder = binder; + } + + /** + * An interface describing the listener for bugreport progress and status. + */ + public interface BugreportListener { + /** + * Called when there is a progress update. + * @param progress the progress in [0.0, 100.0] + */ + void onProgress(float progress); + + @Retention(RetentionPolicy.SOURCE) + @IntDef(prefix = { "BUGREPORT_ERROR_" }, value = { + BUGREPORT_ERROR_INVALID_INPUT, + BUGREPORT_ERROR_RUNTIME + }) + + /** Possible error codes taking a bugreport can encounter */ + @interface BugreportErrorCode {} + + /** The input options were invalid */ + int BUGREPORT_ERROR_INVALID_INPUT = 1; + + /** A runtime error occured */ + int BUGREPORT_ERROR_RUNTIME = 2; + + /** + * Called when taking bugreport resulted in an error. + * + * @param errorCode the error that occurred. Possible values are + * {@code BUGREPORT_ERROR_INVALID_INPUT}, {@code BUGREPORT_ERROR_RUNTIME}. + */ + void onError(@BugreportErrorCode int errorCode); + + /** + * Called when taking bugreport finishes successfully + * + * @param durationMs time capturing bugreport took in milliseconds + * @param title title for the bugreport; helpful in reminding the user why they took it + * @param description detailed description for the bugreport + */ + void onFinished(long durationMs, @NonNull String title, + @NonNull String description); + } + + /** + * Starts a bugreport asynchronously. + * + * @param bugreportFd file to write the bugreport. This should be opened in write-only, + * append mode. + * @param screenshotFd file to write the screenshot, if necessary. This should be opened + * in write-only, append mode. + * @param params options that specify what kind of a bugreport should be taken + * @param listener callback for progress and status updates + */ + @RequiresPermission(android.Manifest.permission.DUMP) + public void startBugreport(@NonNull FileDescriptor bugreportFd, + @Nullable FileDescriptor screenshotFd, + @NonNull BugreportParams params, @Nullable BugreportListener listener) { + // TODO(b/111441001): Enforce android.Manifest.permission.DUMP if necessary. + DumpstateListener dsListener = new DumpstateListener(listener); + + try { + mBinder.startBugreport(bugreportFd, screenshotFd, params.getMode(), dsListener); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + + // TODO(b/111441001) Connect up with BugreportListener methods. + private final class DumpstateListener extends IDumpstateListener.Stub + implements DeathRecipient { + private final BugreportListener mListener; + + DumpstateListener(@Nullable BugreportListener listener) { + mListener = listener; + } + + @Override + public void binderDied() { + // TODO(b/111441001): implement + } + + @Override + public void onProgressUpdated(int progress) throws RemoteException { + // TODO(b/111441001): implement + } + + @Override + public void onMaxProgressUpdated(int maxProgress) throws RemoteException { + // TODO(b/111441001): implement + } + + @Override + public void onSectionComplete(String title, int status, int size, int durationMs) + throws RemoteException { + // TODO(b/111441001): implement + } + } +} diff --git a/core/java/android/os/BugreportParams.java b/core/java/android/os/BugreportParams.java new file mode 100644 index 000000000000..4e696aed1fa8 --- /dev/null +++ b/core/java/android/os/BugreportParams.java @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.os; + +import android.annotation.IntDef; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * Parameters that specify what kind of bugreport should be taken. + * + * @hide + */ +// TODO: Expose API when the implementation is more complete. +// @SystemApi +public final class BugreportParams { + private final int mMode; + + public BugreportParams(@BugreportMode int mode) { + mMode = mode; + } + + public int getMode() { + return mMode; + } + + /** + * Defines acceptable types of bugreports. + */ + @Retention(RetentionPolicy.SOURCE) + @IntDef(prefix = { "BUGREPORT_MODE_" }, value = { + BUGREPORT_MODE_FULL, + BUGREPORT_MODE_INTERACTIVE, + BUGREPORT_MODE_REMOTE, + BUGREPORT_MODE_WEAR, + BUGREPORT_MODE_TELEPHONY, + BUGREPORT_MODE_WIFI + }) + public @interface BugreportMode {} + + /** + * Options for a bugreport without user interference (and hence causing less + * interference to the system), but includes all sections. + */ + public static final int BUGREPORT_MODE_FULL = IDumpstate.BUGREPORT_MODE_FULL; + + /** + * Options that allow user to monitor progress and enter additional data; might not + * include all sections. + */ + public static final int BUGREPORT_MODE_INTERACTIVE = IDumpstate.BUGREPORT_MODE_INTERACTIVE; + + /** + * Options for a bugreport requested remotely by administrator of the Device Owner app, + * not the device's user. + */ + public static final int BUGREPORT_MODE_REMOTE = IDumpstate.BUGREPORT_MODE_REMOTE; + + /** + * Options for a bugreport on a wearable device. + */ + public static final int BUGREPORT_MODE_WEAR = IDumpstate.BUGREPORT_MODE_WEAR; + + /** + * Options for a lightweight version of bugreport that only includes a few, urgent + * sections used to report telephony bugs. + */ + public static final int BUGREPORT_MODE_TELEPHONY = IDumpstate.BUGREPORT_MODE_TELEPHONY; + + /** + * Options for a lightweight bugreport that only includes a few sections related to + * Wifi. + */ + public static final int BUGREPORT_MODE_WIFI = IDumpstate.BUGREPORT_MODE_WIFI; +} |
